Commit Graph

50 Commits

Author SHA1 Message Date
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
Vinta Chen
d3070b735e
feat: add build date to footer
Displays the UTC date the site was last built in the footer so visitors
can see how fresh the data is.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 15:30:04 +08:00
Vinta Chen
97f18d295f
feat: add clear action to no-results message
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>
2026-03-22 15:28:25 +08:00
Vinta Chen
0308fd1b3c
feat: show category label on mobile in project name column
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>
2026-03-22 15:26:36 +08:00
Vinta Chen
73f77039f2
fix(template): show group tag before built-in source tag
Reorder tag buttons so the group tag appears before the source type tag,
giving it higher visual priority in the entry row.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 15:10:40 +08:00
Vinta Chen
3bfa49b24a
style(footer): redesign footer with dark background and brand label
Replace the light frosted-glass footer with a dark-themed one using
oklch colors. Add link hover states, a footer-brand element showing
'Awesome Python', and switch alignment to space-between to accommodate
the new brand label.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 14:57:13 +08:00
Vinta Chen
15df04ea23
copy: tighten website microcopy for clarity
Shorten metric labels, simplify section headings, rewrite
CTA and noscript message to be more direct and less verbose.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 14:45:16 +08:00
Vinta Chen
800d698b46
style: fix expand-content font size and unify CTA copy
Set explicit font-size on .expand-content to prevent it inheriting
a smaller size from context. Standardize the two call-to-action labels
to "Submit a project" (lowercase, consistent phrasing).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 14:31:16 +08:00
Vinta Chen
3e7ff12614
Fix sticky top button behavior 2026-03-22 14:17:17 +08:00
Vinta Chen
39a2abbfcc
style: polish website hero and table UI 2026-03-22 14:05:10 +08:00
Vinta Chen
06a5a701a0
style: refine website footer and heading 2026-03-22 08:05:25 +08:00
Vinta Chen
7d1d9e0af3
feat: redesign website homepage 2026-03-22 07:54:14 +08:00
Vinta Chen
49fafd3497
refactor(website): move back-to-top button into sticky table header
Replaces the fixed-position floating button with an inline button
inside the last column of the sticky table header. Removes the hidden
attribute toggle and float positioning in favour of opacity/pointer-
events toggling, keeping the visibility logic intact.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 02:28:16 +08:00
Vinta Chen
b6bcb2c7e3
feat(website): add entrance animations and CSS-based filter bar visibility
Replace hidden attribute on filter-bar with opacity/transform transition
driven by a .visible class, allowing smooth fade-in/slide-down when a
filter is active. Add staggered hero-in keyframe animations to the page
title, subtitle, action buttons, and search box. Polish sortable table
headers with color transition on hover and active states.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 02:22:07 +08:00
Vinta Chen
7aeb8fbb65
feat(website): add back-to-top button
Adds a fixed-position button that fades in after scrolling 600px and
smoothly scrolls back to the top on click. Hidden by default via the
HTML hidden attribute so noscript users never see it.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 02:17:57 +08:00
Vinta Chen
d3317bf3c9
feat(website): add Built-in category tag for stdlib entries
Stdlib entries now show a "Built-in" tag alongside their regular
category tag. The tag is clickable and filters to all 17 stdlib
entries. Added to data-cats attribute so existing filter logic works.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 02:12:51 +08:00
Vinta Chen
666f6e52d0
feat(website): add source type badges for non-GitHub entries
Detect the hosting source (stdlib, GitLab, Bitbucket, External) from
the entry URL and surface it as a small badge in the stars column where
a star count would otherwise show an em dash.

Stdlib entries also get their own sort tier — between starred entries
and other no-star entries — so the standard library is not buried at
the bottom of each category.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 02:03:00 +08:00
Vinta Chen
18011f86f3
feat: merge duplicate entries across multiple categories
Entries appearing in more than one category were previously emitted as
separate rows. They are now deduplicated in build.py by URL, collecting
all category and group names into lists.

The template encodes those lists as pipe-delimited data attributes
(data-cats, data-groups) and renders a tag button per category.
The JS filter is updated to split on '||' and check for membership,
so clicking any category tag correctly shows the merged row.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-20 17:02:22 +08:00
Vinta Chen
4ea3134ba3
fix: move group tag into category cell and hide on mobile
- Relocate group tag from expand row to category column so it appears inline beside the category tag
- Add margin between stacked tags with .col-cat .tag + .tag spacing rule
- Remove fixed width from .col-cat; narrow .col-name from 35% to 30% to give category column room
- Hide .tag-group on screens ≤900px and widen .col-name to 50% to reclaim space

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-19 02:36:40 +08:00
Vinta Chen
7b8002426d
feat(website): add co-maintainer credit and bump hero-sub font size
- Replace 'Curated by @vinta since 2014' with 'Maintained by @vinta
  and @JinyangWang27' to reflect the new co-maintainer
- Increase .hero-sub font size from --text-sm to --text-base for
  better readability

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-18 23:30:47 +08:00
Vinta Chen
280f250ce0
feat: migrate README parser to markdown-it-py and refresh website
Switch readme_parser.py from regex-based parsing to markdown-it-py for
more robust and maintainable Markdown AST traversal. Update build pipeline,
templates, styles, and JS to support the new parser output. Refresh GitHub
stars data and update tests to match new parser behavior.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-18 20:33:36 +08:00
Vinta Chen
95b6b3cc69
feat: improve table accessibility and mobile expand tags
- Add sr-only headings for search/filter and results regions
- Add role=region and aria-label to .table-wrap for landmark navigation
- Add tabindex=0 and focus outline to .table-wrap for keyboard reachability
- Add sr-only text to empty Details column header
- Add role=button to expandable rows
- Add .expand-tags-mobile to show category/group tags in expand row on mobile
- Show .expand-tags-mobile via media query at <=900px breakpoint

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-18 18:49:52 +08:00
Vinta Chen
15a38caaf9
style: simplify footer layout and update links
Replace two-column footer (links left, attribution right) with a
single inline row of slash-separated items. Update attribution text
to 'Made by Vinta' with a link to vinta.ws, align footer links to
match standard anchor color/hover behavior.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-18 18:43:08 +08:00
Vinta Chen
25ec0c3937
feat: extract inline favicon to static SVG file
Replace the inline data-URI emoji favicon with a proper Python-logo SVG
served from /static/favicon.svg. Avoids repeated base64 encoding overhead
and allows the icon to be cached and updated independently.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-18 18:34:15 +08:00
Vinta Chen
177183d9bd
add custom website build system
Replaces MkDocs with a bespoke Python site generator using Jinja2 templates
and Markdown. Adds uv for dependency management, GitHub Actions workflow for
deployment, and Makefile targets for local development (fetch_stars, build,
preview, deploy).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-18 13:48:49 +08:00