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>
Hardcoded oklch() values in footer rules are replaced with named tokens
(--footer-bg, --footer-text, --footer-link, --footer-link-hover,
--footer-muted, --footer-sep) declared in :root. No visual change.
Co-Authored-By: Claude <noreply@anthropic.com>
Suppressing the outline on a focus-visible rule is self-defeating —
it opts into the intent-based focus ring selector but then hides it.
The row already receives a visible inset box-shadow on focus, so the
outline:none was redundant and harmful to keyboard accessibility.
Co-Authored-By: Claude <noreply@anthropic.com>
Neither variable was referenced anywhere in the stylesheet.
Removing dead tokens keeps the design token surface minimal.
Co-Authored-By: Claude <noreply@anthropic.com>
.expand-meta links can overflow their container on narrow viewports.
Apply ellipsis truncation to keep the row tidy.
.expand-row td[colspan] gains symmetric inline padding on mobile to match
the surrounding table spacing.
Co-Authored-By: Claude <noreply@anthropic.com>
Drops the blur(14px) backdrop-filter on the sticky table header and
raises the background opacity from 0.92 to 0.97 so the header remains
clearly readable without the compositing overhead.
Co-Authored-By: Claude <noreply@anthropic.com>
Apply contain: layout style to .results-section and
contain: layout style paint to the detail panel element to reduce
browser layout recalculation scope during search interactions.
Co-Authored-By: Claude <noreply@anthropic.com>
Uses IntersectionObserver to toggle an .offscreen class on the hero
element, which sets animation-play-state: paused on the sheen, noise,
and scroll-cue animations. Avoids unnecessary GPU work while the hero
is not visible.
Co-Authored-By: Claude <noreply@anthropic.com>
Narrowed the Cormorant Garamond request to 600 only and Manrope to
400/600/700/800, removing the unused 500 and 700 variants. Added
font-weight: 600 to .final-cta h2 so the heading explicitly uses
the retained weight.
Co-Authored-By: Claude <noreply@anthropic.com>
- Add aria-sort attributes to table header on sort state changes
- Replace .table-wrap:focus outline:none with focus-visible outline
- Move noscript message above the fold into main, before content
- Upgrade hero-topbar div to nav with aria-label for landmark semantics
- Remove role=button from tr elements (invalid ARIA on native elements)
- Fix back-to-top button label and text (was labelled 'Back to search')
- Switch font-size from 16px to 100% to respect user browser preferences
- Add overflow-wrap and word-break to .col-name and description cells
Co-Authored-By: Claude <noreply@anthropic.com>
Both variables mapped to near-identical small-text sizes already covered
by --text-xs. Remove the redundant variables and migrate all call sites,
including two remaining hardcoded rem values, to the shared token.
Co-Authored-By: Claude <noreply@anthropic.com>
group_categories only ever appended a Resources group when the
resources list was non-empty. All call sites passed an empty list,
making it a no-op indirection. Inline parsed_groups directly and
remove the dead code along with its tests.
Co-Authored-By: Claude <noreply@anthropic.com>
Resources are no longer passed through parse_readme, group_categories,
or the index template — they are replaced with empty lists and the
unused variable is prefixed with an underscore.
Co-Authored-By: Claude <noreply@anthropic.com>
The project name in the entry was 'playwright' but the GitHub repository
is 'playwright-python', which is also how the Python package is referred
to. Updated the display name to match.
Co-Authored-By: Claude <noreply@anthropic.com>
Move display:grid and gap from .final-cta to .final-cta > .section-shell
so the grid context is applied to the correct container element, not the
outer section. Wrap final-cta content in index.html with a section-shell
div accordingly. Also fix .no-results bottom padding that was missing.
Co-Authored-By: Claude <noreply@anthropic.com>
When results are visible, clicking the button previously scrolled to
the results section. It now targets the search input instead, scrolls
it into view centered, and focuses it so the user can immediately type
a new query. Button label updated from 'Top' to 'Search' to reflect
the new destination.
Co-Authored-By: Claude <noreply@anthropic.com>
When a search or filter yields no results, the message now includes
an inline button that resets both the search input and the active
filter. Improves discoverability and reduces dead-end frustration.
Co-Authored-By: Claude <noreply@anthropic.com>
On narrow screens the category column is hidden. This adds a .mobile-cat
span inside the name cell that renders the first category below the
project name, giving mobile users the context they were missing.
Co-Authored-By: Claude <noreply@anthropic.com>