Replace the generic '#' sr-only text with 'Row number' so screen
readers announce a meaningful column header instead of a bare symbol.
Co-Authored-By: Claude <noreply@anthropic.com>
Expand the .tag::after pseudo-element inset and add explicit min-height/
min-width of 44px so the interactive hit area satisfies WCAG 2.5.5. Also
nudge mobile tag padding and font-size slightly for visual consistency.
Co-Authored-By: Claude <noreply@anthropic.com>
Appends a small northeast arrow (↗) after target="_blank" anchors
in hero subtitle, expand description, expand also-see, and footer
sections to signal outbound navigation to keyboard and sighted users.
Co-Authored-By: Claude <noreply@anthropic.com>
Move cursor/hover/user-select styles from .sort-btn to th[data-sort]
so the entire column header cell is the interactive target, not just
the button text node.
Co-Authored-By: Claude <noreply@anthropic.com>
col-cat and expand-row cells need different treatment on mobile:
- col-cat uses display:none (whole column hidden)
- expand-row first/last cells collapse via width/padding/overflow
rather than display:none to avoid breaking table layout
Co-Authored-By: Claude <noreply@anthropic.com>
Table sort triggers were bare th elements, which are not keyboard
focusable or announced as interactive by screen readers. Replace with
button elements inside th so keyboard users can activate sorting and
get proper focus-visible ring.
Co-Authored-By: Claude <noreply@anthropic.com>
Swap the hardcoded 'smooth' scroll behavior for a runtime check so users
who have enabled reduced-motion in their OS get instant (auto) scrolling
instead of the animated kind.
Co-Authored-By: Claude <noreply@anthropic.com>
The "Xk+ stars on GitHub / Updated ..." text at oklch(68%) on the dark
hero gradient (oklch 14-28%) could dip below 4.5:1 contrast at the
darkest portions. Raising to oklch(75%) ensures the ratio stays above
4.5:1 across the full gradient range.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Download Cormorant Garamond 600 and Manrope (variable, 400-800) woff2
files for latin + latin-ext subsets. Add @font-face declarations to
style.css and remove the Google Fonts <link> and preconnect hints from
base.html.
Eliminates the render-blocking CSS fetch to fonts.googleapis.com that
delayed First Contentful Paint by 100-300ms on typical connections.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrites the sponsorship page to be more direct and persuasive:
- Reframes intro as facts rather than first-person claims
- Renames 'By the Numbers' to 'Audience' and adds who the visitors are
- Expands tier descriptions with explicit bullet lists of deliverables
- Cleans up past sponsors section formatting
- Simplifies the closing call to action
Co-Authored-By: Claude <noreply@anthropic.com>
Add 23 design tokens to :root for colors previously hardcoded inline:
hero text (kicker, proof), hero background gradient, hero button gradient,
accent underline (shared across 3 rules), page background gradient,
table row states (hover, focus, open), sticky header bg, search shadows
and focus ring, tag states, and CTA background.
Decorative one-off values (hero noise, sheen, grid overlay) left inline
since they are tightly coupled to their visual effects.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds og-image.png and og-image.svg assets and wires up the og:image
meta tag in base.html so link previews on Twitter/X, Slack, and other
platforms render a branded image instead of a blank card.
Co-Authored-By: Claude <noreply@anthropic.com>
Bump margin-bottom from 0.9rem to 1.5rem and font-size from
--text-xs to --text-sm for .hero-kicker and .section-label to
improve readability and visual breathing room.
Co-Authored-By: Claude <noreply@anthropic.com>
Display the awesome-python repo's star count (formatted as '230k+') and
the last data refresh date below the hero CTA. Fetches the self-repo
star count by always including vinta/awesome-python in the stars fetch.
Also removes the footer date stamp, which is now surfaced in the hero.
Co-Authored-By: Claude <noreply@anthropic.com>
parse_readme now returns list[ParsedGroup] instead of a tuple. The
resources section (Newsletters, Podcasts), preview string, and
content_html rendering are no longer produced by the parser or consumed
by the build. Removes _render_section_html, _group_by_h2, and the
associated dead code and tests.
Co-Authored-By: Claude <noreply@anthropic.com>
Modernize variable declarations and string literals in main.js for
consistency and to signal immutability intent. Pure style change with
no behavioral differences.
Co-Authored-By: Claude <noreply@anthropic.com>
Type Checkers heading now reads 'Type Checkers - [awesome-python-typing](...)'
where a link follows the separator. The old code passed all inline children to
render_inline_text, which included the link URL in the label. Now we take only
the text nodes before the first link and strip trailing punctuation/separators
so the rendered subcategory label is clean.
Co-Authored-By: Claude <noreply@anthropic.com>
- Add ruff under Code Formatters
- Move Refactoring above Type Checkers
- Rename 'Static Type Checkers' to 'Type Checkers' and drop 'also see' inline text
- Rename 'Static Type Annotations Generators' to 'Type Annotations Generators'
- Rename 'Command-line Interface Development' to 'CLI Development'
- Rename 'Command-line Tools' to 'CLI Tools'
- Rename 'Office' subcategory to 'MS Office'
Co-Authored-By: Claude <noreply@anthropic.com>
The .tag-subcat class was removed from the HTML templates but its
CSS rules remained. Remove the orphaned base styles and clean up
the mobile media query that also referenced the class.
Co-Authored-By: Claude <noreply@anthropic.com>
Subcategories with the same name (e.g. 'Frameworks') across different
top-level categories were sharing a filter value, so clicking one
subcategory tag would match entries from unrelated categories.
Each subcategory now stores both a display name and a scoped value
('Category > Subcategory') used for data-cats matching. The template
renders the display name on tags and mobile-cat span, but uses the
scoped value for filtering. Subcategory tags are also moved before
category tags so the most-specific label appears first.
Co-Authored-By: Claude <noreply@anthropic.com>
Use the GitHub repo name as the display name per the entry format
guidelines, since trailofbits-skills is not on PyPI.
Co-Authored-By: Claude <noreply@anthropic.com>
Entries nested under a plain-text subcategory heading (e.g. "Frameworks"
inside Testing) now carry a subcategory field populated by the parser.
The build pipeline collects these into a subcategories list on each merged
entry, and the template renders them as tag-subcat buttons that plug into
the existing data-cats filter mechanism.
A dedicated .tag-subcat style distinguishes them visually from category
tags, and both are hidden on mobile alongside .tag-group.
Co-Authored-By: Claude <noreply@anthropic.com>
Shorter label that reads more naturally in the context of the Testing
section, which already scopes it to testing.
Co-Authored-By: Claude <noreply@anthropic.com>
Replace 'where Python developers discover tools' with 'in front of Python developers' for cleaner, more direct phrasing.
Co-Authored-By: Claude <noreply@anthropic.com>
Moves .table-wrap overflow-x rule from the 680px breakpoint to 768px
so the table becomes scrollable before it gets too narrow to read.
Co-Authored-By: Claude <noreply@anthropic.com>
Consolidate two conflicting mobile footer rules into one, setting
flex-direction to column, align-items to center, and text-align to
center so the footer is symmetrically centered on narrow viewports.
Co-Authored-By: Claude <noreply@anthropic.com>
Split hero-topbar and footer selectors to apply distinct responsive
styles. The topbar now uses a horizontal row layout with nowrap so
the nav link does not stack vertically, while hero-topbar-actions
and hero-topbar-link get auto widths to avoid stretching full-width.
Co-Authored-By: Claude <noreply@anthropic.com>
Reword the overview from 'curated list' to 'opinionated list' to better
reflect editorial intent. Rename 'pypi-name' placeholder to 'project-name'
and add a rule for projects not published on PyPI.
Co-Authored-By: Claude <noreply@anthropic.com>
Documents the website/ build pipeline, Makefile targets, pyproject.toml
tooling, and tightens the entry format example and key rules.
Co-Authored-By: Claude <noreply@anthropic.com>
cssutils is unmaintained; tinycss2 is the actively maintained
low-level CSS parser and generator for Python.
Co-Authored-By: Claude <noreply@anthropic.com>
The heading "Search every project in one place" already communicates
the section's purpose. The label above it was visual noise.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The "Jump to the list" anchor duplicated the "Browse the List" button.
Removes the element, its CSS rules, the scroll-line keyframe animation,
and cleans up the offscreen pause and focus-visible selector lists.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The projects/categories/topic groups stats added visual clutter to the
hero without contributing to the core purpose of the section.
Co-Authored-By: Claude <noreply@anthropic.com>
Sets the mobile browser toolbar color to match the dark footer/page
background (#1c1410), preventing a jarring white chrome flash on load.
Co-Authored-By: Claude <noreply@anthropic.com>