108 Commits

Author SHA1 Message Date
Vinta Chen 138059feeb feat(website): add Awesome Python and Sponsorship links to footer
Co-Authored-By: Claude <[email protected]>
2026-05-03 19:05:40 +08:00
Vinta Chen f57fc44295 style: bump tag font size to var(--text-xs) and codify 12px minimum font-size rule
Co-Authored-By: Claude <[email protected]>
2026-05-03 18:54:23 +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 <[email protected]>
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 <[email protected]>
2026-05-03 12:47:17 +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 <[email protected]>
2026-05-03 11:38:22 +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 <[email protected]>
2026-05-03 09:35:39 +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 <[email protected]>
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 <[email protected]>
2026-05-03 08:17:17 +08:00
Vinta Chen 03db91bcd0 style(website): left-align results note on category pages
Switch justify-self from end to start so the "Sorted by GitHub stars..."
note sits flush left under the heading instead of right-aligned.
2026-05-03 08:02:39 +08:00
Vinta Chen 1139402838 fix(website): stop category-page heading from wrapping
The results-intro grid (1fr + 28rem note column) squeezed the heading on
category pages with long names, e.g. "Python Projects in Environment
Management" wrapped onto two lines.

Scope a single-column override to .category-results so the heading takes
the full row and the note drops below right-aligned. Index page layout
is untouched since its heading is short.
2026-05-03 08:01:37 +08:00
Vinta Chen 20df47e1e9 style(website): add CSS for category-breadcrumb and assert absence on parent
Mirrors the .category-subtitle a underline style for visual cohesion in
the hero, and locks in the gating behavior with a negative assertion so
a regression that drops the page_kind guard would be caught.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-03 00:30:56 +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 e11afd1730 feat(website): generate static category pages 2026-05-02 23:31:08 +08:00
Vinta Chen 35aee20aa9 remove color 2026-04-19 22:51:25 +08:00
Vinta Chen 674c169efd fix(css): scope --accent-underline to sponsor-become hover; restore --line-strong at rest
Co-Authored-By: Claude <[email protected]>
2026-04-19 22:48:33 +08:00
Vinta Chen 7625d1f05d style: use --accent-underline on sponsor link underline
Swaps --line-strong for --accent-underline on the 'Become a sponsor'
text-decoration-color so the underline matches the tan hover underline
on project-name links like thealgorithms.

Co-Authored-By: Claude <[email protected]>
2026-04-19 22:47:37 +08:00
Vinta Chen 19496c2c93 refactor(css): replace sponsor-become border underline with text-decoration
Swap the border-bottom + padding-bottom fake underline on .sponsor-become
for a native text-decoration underline with text-underline-offset so the
line hugs the text at the same distance as the hero @vinta/@JinyangWang27
links, rather than sitting a fixed 0.2rem gap away.

Co-Authored-By: Claude <[email protected]>
2026-04-19 22:45:44 +08:00
Vinta Chen f3c8377bd4 chore: remove arrow from 'Become a sponsor' link and its CSS rules
Co-Authored-By: Claude <[email protected]>
2026-04-19 22:43:19 +08:00
Vinta Chen 257b69a932 style(sponsors): bump section-label to --text-lg within sponsor scope
Override font-size to var(--text-lg) inside .sponsor-meta so the
Sponsors heading is larger, while the shared .section-label class
remains --text-sm everywhere else.

Co-Authored-By: Claude <[email protected]>
2026-04-19 22:40:31 +08:00
Vinta Chen a4b7fc6878 adjust css 2026-04-19 21:34:14 +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 <[email protected]>
2026-04-19 21:10:50 +08:00
Vinta Chen 0b081100d2 fix(css): remove explicit flex layout from .hero-topbar mobile override
The flex properties (align-items, flex-direction, flex-wrap, justify-content)
were overriding the default layout unnecessarily on mobile.

Co-Authored-By: Claude <[email protected]>
2026-03-24 13:35:06 +08:00
Vinta Chen 80d9279f78 refactor(css): consolidate .sort-btn:focus-visible into shared focus-visible selector block
Co-Authored-By: Claude <[email protected]>
2026-03-24 13:34:57 +08:00
Vinta Chen 66242cf0c9 refactor(css): consolidate .expand-commit into shared mobile media query
Was in a standalone @media (max-width: 960px) block; now lives inside
the existing mobile breakpoint block alongside sibling expand-row rules.
No visual change.

Co-Authored-By: Claude <[email protected]>
2026-03-24 13:12:00 +08:00
Vinta Chen 53684e7c40 fix(css): increase sort button focus outline-offset from 2px to 3px
Gives the focus ring a bit more breathing room so it doesn't
overlap the button text at the new border-radius.

Co-Authored-By: Claude <[email protected]>
2026-03-24 13:11:51 +08:00
Vinta Chen 6cb0cac16d fix(css): increase footer font size from text-xs to text-sm
Footer text was too small to read comfortably. Bumping to --text-sm
improves legibility without breaking the footer layout.

Co-Authored-By: Claude <[email protected]>
2026-03-24 13:06:00 +08:00
Vinta Chen 856f436022 fix(css): consolidate table-wrap overflow-x into single breakpoint
Moves overflow-x: clip from the 680px breakpoint into the 960px
breakpoint, removing the duplicate rule. The value was applied twice
across two consecutive breakpoints with no override in between.

Co-Authored-By: Claude <[email protected]>
2026-03-24 13:03:01 +08:00
Vinta Chen cf9cde8e8f fix(css): use display:none for expand-row first/last cells on mobile
Replaces the width/padding/overflow hack with a clean display:none.
The previous approach collapsed the cells to zero size but kept them
in the layout flow; display:none removes them entirely.

Co-Authored-By: Claude <[email protected]>
2026-03-24 13:00:40 +08:00
Vinta Chen 63182f23ab Revert "feat(css): add external link indicator for inline text links"
This reverts commit 65bc88bb4e.
2026-03-24 12:56:47 +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 <[email protected]>
2026-03-24 12:56:04 +08:00
Vinta Chen ec5687a8f1 fix(css): use overflow-x clip on table-wrap instead of static thead on mobile
Co-Authored-By: Claude <[email protected]>
2026-03-24 12:54:37 +08:00
Vinta Chen 0e2c7fcd82 fix(a11y): enlarge tag touch target to meet 44px WCAG minimum
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 <[email protected]>
2026-03-24 12:53:43 +08:00
Vinta Chen 65bc88bb4e feat(css): add external link indicator for inline text links
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 <[email protected]>
2026-03-24 12:52:59 +08:00
Vinta Chen e06cb93fdc fix(css): expand sort header hit area to full th cell
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 <[email protected]>
2026-03-24 12:49:30 +08:00
Vinta Chen 088680e568 fix(css): correct mobile expand-row hiding for col-cat vs expand-row cells
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 <[email protected]>
2026-03-24 12:40:22 +08:00
Vinta Chen 2e5a56723d fix(css): limit hero sheen animation to 3 iterations
Co-Authored-By: Claude <[email protected]>
2026-03-24 12:39:12 +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 <[email protected]>
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 2bdd0c2c80 fix(a11y): bump hero-proof text lightness from 68% to 75% for WCAG AA contrast
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) <[email protected]>
2026-03-24 12:32:38 +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) <[email protected]>
2026-03-24 12:32:25 +08:00
Vinta Chen 60836d00a1 refactor(css): extract inline OKLCH values into CSS custom properties
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) <[email protected]>
2026-03-24 12:30:22 +08:00
Vinta Chen 4a1f899995 fix(css): increase kicker and section-label size and spacing
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 <[email protected]>
2026-03-23 02:09:36 +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 <[email protected]>
2026-03-23 01:56:15 +08:00
Vinta Chen 31fa9a4c38 fix(css): reduce tag badge size and spacing 2026-03-23 01:32:55 +08:00
Vinta Chen f6cea0599a fix(css): remove unused tag-subcat styles
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 <[email protected]>
2026-03-23 01:12:57 +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 <[email protected]>
2026-03-23 01:04:20 +08:00
Vinta Chen 3395b2e428 fix(css): enable table horizontal scroll at 768px breakpoint
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 <[email protected]>
2026-03-23 00:09:06 +08:00
Vinta Chen 88031d78a5 fix(css): center footer on mobile
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 <[email protected]>
2026-03-22 23:58:54 +08:00
Vinta Chen dbff2522c8 fix(css): hide last column in expand-row on mobile
Co-Authored-By: Claude <[email protected]>
2026-03-22 23:52:31 +08:00