Commit Graph

74 Commits

Author SHA1 Message Date
Vinta Chen
f3f92c691a feat(website): render subcategory, group, and source tags as anchor elements
Convert <button> tags for subcategory, group, and source filters to <a>
elements with href attributes so browsers surface URL preview on hover,
support open-in-new-tab, and allow middle-click navigation.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 18:49:34 +08:00
Vinta Chen
fc8d1ba35e feat(website): show desc-row on index page when a filter is active
On category pages desc-rows are always visible. On the index page they
were always hidden. Now they become visible whenever a tag/category
filter is applied, giving filtered results the same richness as category
pages.

Also tightens two related CSS rules: border-bottom suppression only
fires when the adjacent desc-row is actually visible, and the expand-row
description is hidden while the desc-row is already showing to avoid
duplicate text.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 13:08:27 +08:00
Vinta Chen
1468ae78ff feat(website): show project description as always-visible desc-row on category pages
Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 12:47:17 +08:00
Vinta Chen
38b54caabb fix(website): trim sponsorship page nav and hero stats
Remove the 'All projects' nav link and total_entries hero stat from the
sponsorship page. Rename 'View the repository' CTA to 'View on GitHub'.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 11:45:07 +08:00
Vinta Chen
ee01a0bade refactor(website): extract render_category, replace slugify filter with filter_urls map
- Extract render_category() helper to deduplicate the three category/group/builtin
  rendering blocks in build.py
- Replace synthetic dict literals with synthetic_category() helper
- Rewrite subcategory rendering to avoid O(n²) loop using precomputed dicts
- Pass filter_urls (not just JSON) to templates so Jinja can look up group URLs
  directly instead of applying the slugify filter at render time
- Remove slugify from env.filters (no longer used in templates)
- Replace isIndexPage() wrapper with isIndexDocument constant in main.js
- Fix: call applyFilters() on page load when activeFilter is set
- Remove dead else branch in tag click handler (category pages with no URL)
- Switch .hero-category-links from CSS columns to CSS grid for more even layout
- Remove max-width cap on .category-subtitle

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 11:38:22 +08:00
Vinta Chen
8a32d27ef5 fix(website): tighten sponsorship page copy for clarity
Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 09:46:50 +08:00
Vinta Chen
40913c3df3 fix double quotes 2026-05-03 09:38:28 +08:00
Vinta Chen
c68b985d7c feat(website): add /sponsorship/ landing page
Adds a dedicated sponsorship page at /sponsorship/ built from the Jinja2
template, with hero stats, tier cards, and CSS. Updates the index.html
sponsor sidebar link to point to /sponsorship/ instead of the GitHub
SPONSORSHIP.md. Adds the URL to the sitemap and test fixtures.

Also renames .impeccable.md to DESIGN.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 09:35:39 +08:00
Vinta Chen
64781112d8 feat(website): add Browse by category nav to group page hero
Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 09:08:37 +08:00
Vinta Chen
70a8255289 feat(website): add /categories/built-in/ page for Built-in tag filter
Register Built-in as a navigable filter path alongside regular category
and group slugs, emit the page during build, add it to the sitemap, and
wire the Built-in tag buttons in index.html and category.html to navigate
there via data-url.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 08:35:55 +08:00
Vinta Chen
d64b47b910 feat(website): mirror index layout on category pages
Add search input, filter chips, no-results block, and back-to-top
button to category/group/subcategory pages. Pass filter_urls_json to
all page types so tag-chip navigation works site-wide. Fix JS so
filter-clear and no-results-clear redirect to / on non-index pages
instead of trying to filter a non-existent local table. Remove the
now-redundant .category-results CSS overrides.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 08:26:37 +08:00
Vinta Chen
033694204c feat(website): move descriptions into expand row on category pages
Removes inline .category-row-desc from the name cell and renders
entry.description inside .expand-content instead, matching the
index page pattern. Drops the now-unused CSS rules for
.category-row-desc and the overridden .category-table .expand-content
padding.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 08:17:17 +08:00
Vinta Chen
8e00055c8c fix(website): remove duplicate tag on group/category pages
The category template rendered a tag for `category.name` plus a tag for
`entry.groups[0]`, which duplicated the group name on group pages where
those values are identical (e.g. /categories/python-language/ showing
"Python Language" twice). It also never rendered `entry.categories`, so
group pages omitted each project's actual category.

Mirror the index template's tag rendering on category, group, and
subcategory pages, and mark whichever tag matches the current page URL
as active. Pass `category_urls` and `current_path` to each render call
so the template can match by URL.
2026-05-03 07:51:39 +08:00
Vinta Chen
04a04a136b feat(website): add data-url to tag buttons for client-side routing
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 00:44:43 +08:00
Vinta Chen
e0e7fc9168 feat(website): embed filter-to-url map in index for client routing
Adds filter_urls dict (categories, groups, subcategories) in build.py,
passes filter_urls_json to the template, and injects a JSON script block
before the results section in index.html. Covered by a new test that
verifies all three URL types are present and correctly resolved.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 00:36:41 +08:00
Vinta Chen
03702231af feat(website): show parent category breadcrumb on subcategory pages
Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-03 00:27:22 +08:00
Vinta Chen
7fadbaf6fe feat(website): add homepage category directory 2026-05-02 23:44:27 +08:00
Vinta Chen
b00395a301 add missing links of category descriptions 2026-05-02 23:35:24 +08:00
Vinta Chen
c98cbe2cb1 style(website): clarify category section heading 2026-05-02 23:31:34 +08:00
Vinta Chen
e11afd1730 feat(website): generate static category pages 2026-05-02 23:31:08 +08:00
Vinta Chen
429c9b3d12 feat: generate llms.txt from template and annotate entries with star counts
- Add llms.txt Jinja2 template with a categories_md placeholder
- Extract categories body from README and inject it into the template
- Annotate bullet-entry lines with GitHub star counts (N GitHub stars)
  for the main index.md and bare numbers for llms.txt
- Add TestAnnotateEntriesWithStars unit tests

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-02 02:32:18 +08:00
Vinta Chen
d9f26a8635 Improve SEO/AEO discovery surface for awesome-python.com (#3103)
* update gitignore

* feat: tighten homepage metadata

* fix: trim generated HTML whitespace

* feat(website): add discovery files and markdown alternate

* feat(website): add sitemap lastmod

* feat(seo): add Content-Signal directive to robots.txt

Signals search, ai-input, and ai-train to crawlers
via the experimental Content-Signal header in robots.txt.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-05-02 01:53:19 +08:00
Vinta Chen
f3c8377bd4 chore: remove arrow from 'Become a sponsor' link and its CSS rules
Co-Authored-By: Claude <noreply@anthropic.com>
2026-04-19 22:43:19 +08:00
Vinta Chen
774ab69bcd feat(website): add sponsors section parsed from README
Parse the # Sponsors heading in README.md into structured data and
render a dedicated sponsor band above the library index on the site.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-04-19 21:10:50 +08:00
Vinta Chen
7b6829c26e style(html): reformat templates for consistent attribute and block spacing
Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 13:35:10 +08:00
Vinta Chen
4456783320 docs: update social handle from Twitter to X (twitter.com -> x.com)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 13:34:11 +08:00
Vinta Chen
d7a7e68475 refactor(js): simplify filter state to a plain string
Replace the { type, value } filter object with a plain string value.
Merge data-cats and data-groups row attributes into a single data-tags
attribute. Drop data-type from tag buttons. Consolidate category/group
URL params into a single filter param, keeping backward-compat fallback.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 13:18:26 +08:00
Vinta Chen
57e4adbeb1 style(html): reformat hero CTA anchor tag onto multiple lines
Long attribute list was exceeding line-length; split across lines
for readability. No behavior change.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 13:12:04 +08:00
Vinta Chen
eb5b37daf5 feat(ux): smooth-scroll hero CTA without updating URL hash
Add a data-scroll-to attribute to the hero 'Browse the List' anchor
and a JS handler that calls scrollIntoView instead of letting the
browser follow the href, so the URL hash is never written.
Respects prefers-reduced-motion.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 13:08:22 +08:00
Vinta Chen
8e360e82b7 style(html): reformat index.html for consistent indentation
No behavior change. Reformats inline Jinja2/HTML to follow consistent
two-space indentation and line-length conventions throughout the template.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 13:06:04 +08:00
Vinta Chen
7df2e36334 feat(mobile): show last commit date in expand row on mobile
Add an expand-commit span inside the expand row that displays the last
commit date. Hidden on desktop, visible only on mobile (max-width: 960px)
via media query, mirroring the commit column that appears in the full
table. Relative time formatting is applied via JS on page load.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 12:56:04 +08:00
Vinta Chen
f1799c2a44 perf(fonts): defer Google Fonts load to avoid render-blocking
Use media='print' + onload swap trick to load the stylesheet
non-blocking. Add noscript fallback for JS-disabled browsers.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-24 12:55:04 +08:00
Vinta Chen
6050b65fb7 fix(a11y): use descriptive screen reader label for row number column
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>
2026-03-24 12:54:05 +08:00
Vinta Chen
86885bc67a fix(a11y): wrap sort column headers in button elements
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>
2026-03-24 12:38:19 +08:00
Vinta Chen
db83de1b42 Revert "perf: self-host Google Fonts to eliminate render-blocking external request"
This reverts commit f91c8fa979.
2026-03-24 12:35:56 +08:00
Vinta Chen
f91c8fa979 perf: self-host Google Fonts to eliminate render-blocking external request
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>
2026-03-24 12:32:25 +08:00
Vinta Chen
8861bcc05d feat: add Open Graph image for social sharing
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>
2026-03-24 12:22:35 +08:00
Vinta Chen
f27b7c80fb feat(website): add social proof line to hero with star count and build date
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>
2026-03-23 01:56:15 +08:00
Vinta Chen
bb40861e0e refactor(html): remove tag-subcat class and inline button attributes 2026-03-23 01:26:26 +08:00
Vinta Chen
0c26d352f0 fix(website): scope subcategory filter values to parent category
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>
2026-03-23 01:11:35 +08:00
Vinta Chen
f2b4a7bc83 feat(website): surface subcategory labels as filterable tags
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>
2026-03-23 01:04:20 +08:00
Vinta Chen
a12fef4e54 refactor(results): remove redundant "Library index" section label
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>
2026-03-22 16:30:14 +08:00
Vinta Chen
014ba9e394 refactor(hero): remove redundant scroll cue
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>
2026-03-22 16:29:47 +08:00
Vinta Chen
321df7b78c refactor(hero): remove metrics block from hero section
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>
2026-03-22 16:28:44 +08:00
Vinta Chen
9447870715 feat(html): add theme-color meta tag for browser UI chrome
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>
2026-03-22 16:26:33 +08:00
Vinta Chen
e960d47b3f perf(fonts): trim Google Fonts to weights in use
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>
2026-03-22 16:12:10 +08:00
Vinta Chen
4bb9c1240b fix(website): accessibility and defensive layout improvements
- 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>
2026-03-22 16:10:14 +08:00
Vinta Chen
53d280ddcf fix(css): scope final-cta grid to inner section-shell wrapper
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>
2026-03-22 15:37:59 +08:00
Vinta Chen
1e8c432ec9 style(search): use 'projects' instead of 'libraries' in search placeholder
Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 15:31:41 +08:00
Vinta Chen
9d89df3e73 fix: back-to-top button scrolls to search input and focuses it
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>
2026-03-22 15:31:04 +08:00