Skip to main content

max / makenotwork

v0.6.10: fold landing-founder-banner into .alert; orphan CSS sweep - Landing hero founder callout now uses .alert.alert-important (charter primitive) with .alert-title + .text-sm.dimmed. Four bespoke .landing-founder-* rules deleted. - Orphan CSS sweep: 69 unused top-level rules removed from style.css (~8 KB). Kept charter primitives, docengine-generated classes, and JS-constructed runtime classes (.toast-*, .badge-*). - todo.md: collapsed completed UX audit sections, full record moved to todo_done.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-05-21 01:38 UTC
Commit: 05200f89373ea3c5302929c694679666cf41ca5a
Parent: 7eff0b4
6 files changed, +79 insertions, -362 deletions
@@ -3551,7 +3551,7 @@ dependencies = [
3551 3551
3552 3552 [[package]]
3553 3553 name = "makenotwork"
3554 - version = "0.6.9"
3554 + version = "0.6.10"
3555 3555 dependencies = [
3556 3556 "anyhow",
3557 3557 "argon2",
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "makenotwork"
3 - version = "0.6.9"
3 + version = "0.6.10"
4 4 edition = "2024"
5 5 license-file = "LICENSE"
6 6
@@ -2,13 +2,13 @@
2 2
3 3 ## Status
4 4
5 - v0.6.6 deployed 2026-05-20 (CSS dedup phases 2-5, no migrations; CSS-only refactor). Audit grade A (Run 26 was 2026-05-09). ~88K LOC, 1,504 lib tests, 0 warnings. Migration 116 applied (founder pricing) in 0.6.5. Sprints 1-9 + Library View Split + Founder Pricing engineering + UX consolidation pass + CSS dedup phases 2-5 complete (see `todo_done.md`). Content seeded: AF 0.4.0 + GO 0.3.1 on discover page.
5 + v0.6.6 deployed 2026-05-20 (CSS dedup phases 2-5, no migrations; CSS-only refactor). UX audit phases 0-8 + remediations + cleanup tasks all closed same day (see `todo_done.md` § "v0.6.6 UX audit"). Audit grade A (Run 26 was 2026-05-09). ~88K LOC, 1,504 lib tests, 0 warnings. Migration 116 applied (founder pricing) in 0.6.5. Sprints 1-9 + Library View Split + Founder Pricing engineering + UX consolidation pass + UX audit sweep complete. Content seeded: AF 0.4.0 + GO 0.3.1 on discover page.
6 6
7 7 Human tasks in `human_todo.md`. Completed items in `todo_done.md`.
8 8
9 9 **Stripe webhook delivery: RESOLVED 2026-05-17.** `evt_1TY98u0AcRNJbwd4vkSfLZZI` landed at 18:10:25 UTC, transaction completed, 0 pending in DB. Whatever was fixed in the Stripe Dashboard between 2026-05-16 and 2026-05-17 cleared it. No code change involved.
10 10
11 - **Next code work (LLM-doable):** UX audit sweep phases 0-8 complete (2026-05-20). 16 remediations landed across three same-day sessions (see `## UX audit sweep (phased)` § "UX audit remediations" → "Landed 2026-05-20"). All three charter decisions (button class, heading classes, BEM separator) resolved and codified as charter rules 10-12. Two original findings retracted as incorrect data. Remaining items are three cleanup tasks (`.sr-only` upgrade on file inputs, `.landing-founder-banner` fate, orphan CSS sweep). None are launch blockers.
11 + **Next code work (LLM-doable):** No outstanding UX audit items. Open tracks: Founder Pricing operational tail (Stripe Dashboard products/prices), Cloudflare Lean-In phases (post-launch), Stripe SDK 1.0 migration, Pre-1k Scaling cheap wins. See sections below.
12 12
13 13 ---
14 14
@@ -149,13 +149,12 @@ Note: "Appeals reviewed by same person" and "liability cap" are known one-person
149 149 - [ ] **Multipart upload**: chunked parallel upload for higher throughput. Current single-PUT caps ~300 Mbps. Needed for video creators on fast connections.
150 150 - [ ] **Desktop/CLI bulk upload**: power-user tool for many files/versions/large assets. Candidates: mnw-cli TUI, dedicated uploader. Uses multipart natively.
151 151
152 - ### UX audit sweep (phased)
152 + ### UX audit sweep (phased) — complete
153 153
154 - Full UX audit of the MNW server UI via the `ux-audit` skill (Norman/Tog/Raskin/HIG lineage; Askama + HTMX stack). Run one phase per session, clearing context between phases to keep findings sharp. Each phase produces a ranked findings report (Critical/Major/Minor/Polish) saved to `docs/ux-audit/phase-N.md`; fixes land in follow-up sprints, not during the audit itself.
154 + Full UX audit + remediation pass complete 2026-05-20 (phases 0-8). See `todo_done.md` § "v0.6.6 UX audit phases 0-8 + remediations" for the full record. Charter at `docs/design-system.md` (rules 10-12 codified from the three charter decisions resolved in this sweep). Phase reports at `docs/ux-audit/phase-{0..8}.md`.
155 155
156 - Method per phase: invoke `/ux-audit` with the phase's template list as scope. Skill does universal + Askama + HTMX + flat-design passes. Read route handlers adjacent to each template for task context.
157 -
158 - Status: Phase 0 audit complete (2026-05-19). Findings at `docs/ux-audit/phase-0.md`, charter at `docs/design-system.md`. Surface phases 1-8 are gated on the consolidation pass below.
156 + <details>
157 + <summary>Original detailed log (collapsed)</summary>
159 158
160 159 - [x] **Consolidation pass (pre-Phase-1).** Implement the two-part remediation plan at `docs/ux-audit/remediation-plan.md`: add spacing/radius/shadow tokens, build five missing shared partials (empty_state, loading_skeleton, form_field, confirm_dialog, pagination), fix brand breaches (checkmark glyphs, pure #000/#fff, Bootstrap yellow), then consolidate the 12 duplicate UX patterns the audit found — card family (12 -> 2), empty-state (7 -> 1), button family (14+ -> 3 + utilities), selected-state spelling (5 -> 1), hover recipe (3 -> 2 by component type), notification surface (4 -> 4 with disambiguated roles), status indicator, section header, hidden utility, page heading, page-isolated `<style>` blocks (3 -> 0), inline-style sweep (1,350 -> <100). Success criteria in the plan. Surface audits do not run until this completes.
161 160
@@ -190,9 +189,9 @@ Status: Phase 0 audit complete (2026-05-19). Findings at `docs/ux-audit/phase-0.
190 189 **All page-isolated `<style>` blocks killed (0 remaining in `templates/pages/` and `templates/dashboards/`).**
191 190
192 191 **Inline-style sweep complete (6 server-computed `{{pct}}%` exceptions; CSS dedup landed in same pass).**
193 - - [ ] `style="display: none"` → `.hidden` audit pass — most sites swept during the inline-style migration but a sweep for `.sr-only` accessibility upgrade on file inputs is still pending.
194 - - [ ] Delete `.landing-founder-banner` if folded into hero-callout primitive (currently kept separate per charter).
195 - - [ ] Orphan CSS cleanup — ~30 truly unused class names in `style.css` deferred (e.g. `.tier-grid`, `.search-box`, `.signup-container`, `.button-stack`). Per-class judgement; revisit when bandwidth allows.
192 + - [x] `style="display: none"` → `.hidden` audit pass — file-input sites upgraded to `.sr-only` (2026-05-20).
193 + - [x] `.landing-founder-banner` folded into `.alert.alert-important` on the landing hero (2026-05-20).
194 + - [x] Orphan CSS cleanup — 69 unused top-level rules removed; charter primitives and docengine/JS-constructed classes preserved (2026-05-20). See "UX audit remediations" cleanup section for the full kept/removed list.
196 195
197 196 - [x] **Phase 0 — Design-system conformance audit.** *(Complete 2026-05-19.)* Produced `docs/ux-audit/phase-0.md` (inventory + divergence map) and `docs/design-system.md` (charter).
198 197
@@ -207,7 +206,14 @@ Status: Phase 0 audit complete (2026-05-19). Findings at `docs/ux-audit/phase-0.
207 206
208 207 Out of scope for this sweep: per-tier capability decisions, brand/aesthetic direction (see `_meta/docs/brand.md`), full WCAG audit (run axe/Lighthouse separately).
209 208
210 - ### UX audit remediations (by site section)
209 + </details>
210 +
211 + ### UX audit remediations — complete
212 +
213 + All 18 remediations + 3 charter decisions + 3 cleanup tasks landed 2026-05-20. Full record in `todo_done.md`. Two findings retracted as incorrect audit data (`.coming-soon` rule actually exists; BEM `__` separator is an established convention with 112 usages — separate rename pass deferred).
214 +
215 + <details>
216 + <summary>Original detailed log (collapsed)</summary>
211 217
212 218 Findings from phases 1-8, grouped by the website area they affect. Six items landed in the audit session on 2026-05-20; seven more landed in a follow-up session the same day; two original findings were retracted (incorrect data). Remaining items are charter decisions or cleanup tasks.
213 219
@@ -241,8 +247,10 @@ Findings from phases 1-8, grouped by the website area they affect. Six items lan
241 247
242 248 **Cleanup tasks** (deferred from consolidation pass)
243 249 - [x] **`.sr-only` accessibility upgrade on file inputs** *(landed 2026-05-20)* — 13 `<input type="file">` sites swapped from `class="hidden"` / `class="wizard-file-input"` to `class="sr-only"`. Trigger buttons unchanged (they `.click()` the input programmatically); screen readers and keyboard now reach the input. `.wizard-file-input { display: none }` rule removed from `wizard.css`. One file input (`dashboard-import.html#import-file`) intentionally left visible — has a proper visible label.
244 - - [ ] **`.landing-founder-banner`** — delete if folded into hero-callout primitive (currently kept separate per charter).
245 - - [ ] **Orphan CSS cleanup** — ~30 truly unused class names in `style.css` deferred (e.g. `.tier-grid`, `.search-box`, `.signup-container`, `.button-stack`). Per-class judgement; revisit when bandwidth allows.
250 + - [x] **`.landing-founder-banner` folded into `.alert`** *(landed 2026-05-20)* — landing hero founder callout now uses `.alert.alert-important` with `.alert-title` for the eyebrow and `.text-sm.dimmed` for the sub line. Four bespoke `.landing-founder-*` rules deleted from `style.css`; `.banner` doc-comment updated.
251 + - [x] **Orphan CSS cleanup** *(landed 2026-05-20)* — 69 top-level orphan rules removed from `style.css`. See `todo_done.md` for kept/removed inventory.
252 +
253 + </details>
246 254
247 255 ---
248 256
@@ -26,10 +26,48 @@ Also removed 179 lines of identical duplicate section blocks left by parallel-ag
26 26
27 27 **Method:** mixed direct edits + parallel worktree-isolated agents. ~28 agents in 6 batches, each migrating 1-5 templates, committing to their worktree branch before being merged back. Worktree-isolated to avoid `style.css` write races.
28 28
29 - **Deferred:**
30 - - ~30 truly unused CSS class names (`.tier-grid`, `.search-box`, `.signup-container`, `.button-stack`, etc.) — judgement-call orphan cleanup, revisit when bandwidth allows.
31 - - `style="display: none"` → `.sr-only` accessibility upgrade pass on file inputs (separate from the `.hidden` sweep already done).
32 - - `.landing-founder-banner` consolidation — kept separate per charter.
29 + **Deferred items — all closed in v0.6.6 sweep (2026-05-20):** orphan CSS cleanup, `.sr-only` upgrade on file inputs, `.landing-founder-banner` consolidation. See next section.
30 +
31 + ---
32 +
33 + ## v0.6.6 UX audit phases 0-8 + remediations (2026-05-20)
34 +
35 + Full ux-audit skill sweep of every public-facing surface in MNW server. Phase 0 baseline (2026-05-19) produced `docs/design-system.md` charter; Phases 1-8 audit reports at `docs/ux-audit/phase-{1..8}.md`. All findings triaged same-day; 18 remediations landed across two sessions (audit session + follow-up) plus three charter decisions codified as charter rules 10-12.
36 +
37 + **Charter decisions (rules 10-12):**
38 + - Heading classes — no bare `<h1>`/`<h2>`. Added `.brand-h1` (wordmark), `.page-title` (page h1), `.subtitle-h2` (auth/wizard), `.subsection-title` (default h2). `.section-header` (h2 with border) kept for prose sub-sections. Migrated 93 templates.
39 + - Button class shorthand → `.btn-primary` / `.btn-secondary` / `.btn-danger`. Migrated 67 shorthand sites (`class="primary"` etc.). Dropped `button.primary` / `.secondary` / `.danger` CSS selectors; kept only `.btn-*` form, which works on both `<button>` and `<a>` (after the `<a><button>` antipattern fix).
40 + - BEM `__` separator retired. Renamed 76 distinct `block__elem` tokens (15 files) to single-dash kebab-case. Modifier `--` (`.card--bordered`) preserved. No collisions.
41 +
42 + **Remediations landed (audit session):**
43 + - `pricing.html` tier-picker keyboard-accessibility fix — radio visually-hidden but focusable; `:focus-within` outline on label; JS listens on `change` so keyboard nav updates styling.
44 + - `pricing.html` `.tier-option.selected` → `.is-selected` (last pre-charter `.selected` survivor).
45 + - `<a><button>` antipattern sweep — all 44 sites across 13 files converted to `<a class="btn-primary">`. Added `display: inline-block` and `text-decoration: none` to button base rules.
46 + - Four page-isolated `<style>` blocks migrated — `user.html`, `dashboard-user.html` (scoped under `.dashboard-user-page` to resolve collision with `user.html` and the user_projects tab partial), `library_feed.html` (scoped under `.library-page`), `user_settings.html`.
47 + - Follow-state synonyms → `.is-selected` — `.tag-follow-btn.following` and `.follow-btn.is-following` across discover.html, user.html, project.html, follow_button.html, tag_follow_toggle.html. Also fixed a latent bug in `follow_button.html` where two `class=` attributes meant `.is-following` never actually applied.
48 + - `.intro` lifted to `.page-intro` primitive — canonical rule added near `.section-lead`; four scoped copies dropped; four templates migrated.
49 +
50 + **Remediations landed (follow-up session):**
51 + - Heading convention for prose pages applied — `.section-header` over bare `<h2>` for prose-page sub-section headings. ~25 bare h2s converted across creators.html, policy.html, changelog.html, fan_plus.html, stripe_disclaimer.html, purchase.html, cart.html, library_downloads.html, doc_index.html, git/repo.html, git/settings.html. `library_locked.html:22` skipped (h2 inside `.purchase-box`). Auth flow + wizards keep bare `<h2>` as documented page-subtitle pattern.
52 + - `dashboard-user.html` — "Account Deactivated" and "Account Paused" rewrapped from `.card-muted`/`<h2>` to `.alert.alert-warning`/`<p class="alert-title">`. `.banner--warning` (the audit suggestion) doesn't fit multi-paragraph + action-button content.
53 + - `git/settings.html` delete-repo — `onsubmit="return confirm(...)"` replaced with htmx button (`hx-post` + `hx-confirm`); `repo_settings_delete` handler returns `HX-Redirect` instead of `Redirect::to()`.
54 + - `project.html:208` `.login-cta-btn` class removed; `width: 100%` folded into existing `.project-page .tier-card button` rule.
55 + - `dashboard-export.html` `.export-card-*` family documented as intentionally page-scoped with explanatory CSS comment.
56 + - `wizard.css` consolidation — `.monetization-card{,-cards,.info-only}` deleted as dead CSS (~25 lines). `.content-choice-card` anchor-link override + `.muted` modifier moved into the canonical `.card--selectable` recipe; `.muted` renamed to `.is-disabled` to align with `.is-selected` naming.
57 + - `discover_results.html` empty-state hint markup accepted as-is per the audit's own recommendation.
58 +
59 + **Cleanup tasks (closed):**
60 + - `.sr-only` accessibility upgrade on file inputs — 13 `<input type="file">` sites swapped from `class="hidden"` / `class="wizard-file-input"` to `class="sr-only"`. Trigger buttons unchanged (they `.click()` the input programmatically). `.wizard-file-input { display: none }` rule removed from `wizard.css`.
61 + - `.landing-founder-banner` folded into `.alert.alert-important` — landing hero founder callout uses `.alert-title` for eyebrow and `.text-sm.dimmed` for sub line. Four bespoke `.landing-founder-*` rules deleted; `.banner` doc-comment updated.
62 + - Orphan CSS cleanup — 69 top-level unused rules removed from `style.css` (~8 KB net). `style.css` 10,441 → 10,399 lines. Kept: charter primitives without current callers (`.card--*`, `.container--*`, `.btn--icon`, `.btn-link--sm`, `.stack-row--bordered`, `.loading-skeleton*`, `.form-group--error`, `.field-error`, `.input--mono`, `.skip-link`), docengine-generated classes (`.alert-note/-tip/-caution/-important`, `.doc-ui-frame`, `.doc-ui-missing`, `.keyword`), dynamically-constructed runtime classes (`.toast-*`, `.badge-*`), and documented intentional variants (`.big-button`, `.shortcuts-help-btn`). Removed (~45 classes): `.tier-grid`, `.search-box`, `.signup-container`, `.signup-step`, `.button-stack`, `.button-grid`, `.tier-crossover`, `.tier-planned-label`, `.landing-values`, `.splash-actions`, `.header-spacer`, `.footer-stats`, `.subtagline`, `.cover-*`, `.git-repos-empty`, `.collection-picker-empty`, `.discover-results`, `.results-empty`, `.analytics-card`, `.incident-line`, `.test-results`, `.test-skip`, `.thumbnail-preview`, `.success-icon`, `.specs-table`, `.item-overview-hint`, `.item-versions`, `.item-features`, `.item-specs`, `.filter-label`, `.account-status-card`, `.account-tip-card`, `.card-muted--status`, `.card-muted--tip`, `.feature-title`, `.feature-description`, `.version-*`, `.file-*`, `.api-hint`, `.foo-page`, `.feed-page-scoped`, `.library-container`, `.price-input-group`, `.radio-option*`, `.checkbox-content/-desc/-title`, `.list-row-meta/-title`, `.row-description`, `.content-choice-card-desc/-inner/-label`, `.summary-row`.
63 +
64 + **Retracted findings** (audit data was wrong):
65 + - `.coming-soon` modifier exists at `style.css:6489` (`border-style: dashed; opacity: 0.6`) — original Phase 1 grep was too narrow.
66 + - `cart-group__title` is not the only `__` separator in the codebase — 112 template usages across 20 block prefixes. Established convention; either document in charter or schedule a separate larger rename pass (deferred — not in this sweep's scope).
67 +
68 + **Method:** ux-audit skill per phase, scoped to phase template list. Phase reports at `docs/ux-audit/phase-{0..8}.md`; charter at `docs/design-system.md`.
69 +
70 + **Out of scope for this sweep:** per-tier capability decisions, brand/aesthetic direction (see `_meta/docs/brand.md`), full WCAG audit (run axe/Lighthouse separately).
33 71
34 72 ## Prelaunch Items from human_todo.md (moved 2026-05-17)
35 73
@@ -645,21 +645,6 @@ form button:hover {
645 645 margin-bottom: 0.25rem;
646 646 cursor: pointer;
647 647 }
648 -
649 - .checkbox-content {
650 - flex: 1;
651 - }
652 -
653 - .checkbox-title {
654 - font-weight: bold;
655 - margin-bottom: 0.25rem;
656 - }
657 -
658 - .checkbox-desc {
659 - font-size: 0.85rem;
660 - opacity: 0.7;
661 - }
662 -
663 648 /* Radio group */
664 649 .radio-group {
665 650 display: flex;
@@ -667,40 +652,6 @@ form button:hover {
667 652 gap: 0.75rem;
668 653 margin-top: 0.5rem;
669 654 }
670 -
671 - .radio-option {
672 - display: flex;
673 - align-items: start;
674 - gap: 0.75rem;
675 - padding: 1rem;
676 - background: var(--surface-muted);
677 - cursor: pointer;
678 - transition: background 0.2s ease;
679 - }
680 -
681 - .radio-option:hover {
682 - background: var(--border);
683 - }
684 -
685 - .radio-option input[type="radio"] {
686 - width: auto;
687 - margin-top: 0.25rem;
688 - }
689 -
690 - .radio-option-content {
691 - flex: 1;
692 - }
693 -
694 - .radio-option-title {
695 - font-weight: bold;
696 - margin-bottom: 0.25rem;
697 - }
698 -
699 - .radio-option-desc {
700 - font-size: 0.85rem;
701 - opacity: 0.7;
702 - }
703 -
704 655 /* ===========================================
705 656 TABS
706 657 =========================================== */
@@ -1057,15 +1008,11 @@ form button:hover {
1057 1008 background: var(--surface-muted);
1058 1009 }
1059 1010
1060 - /* Muted card (.card-muted alias for .stat-card, .analytics-card, .account-tip-card).
1061 - .account-status-card adds a border on top of the muted fill. */
1011 + /* Muted card primitive. */
1062 1012 .card-muted {
1063 1013 background: var(--surface-muted);
1064 1014 padding: 1.5rem;
1065 1015 }
1066 - .card-muted--tip { padding: 1rem 1.25rem; font-size: 0.9rem; }
1067 - .card-muted--status { border: 1px solid var(--border-color); margin-bottom: var(--space-5); }
1068 -
1069 1016 /* Bordered card (.card--bordered alias for .feature-card, .tier-card, .use-case-card, .fork-card). */
1070 1017 .card--bordered,
1071 1018 .feature-card,
@@ -1625,38 +1572,7 @@ form button:hover {
1625 1572 grid-template-columns: repeat(2, 1fr);
1626 1573 gap: var(--space-5);
1627 1574 }
1628 -
1629 - .item-page .feature-title {
1630 - font-size: 1.1rem;
1631 - margin-bottom: var(--space-2);
1632 - font-family: var(--font-heading);
1633 - font-weight: bold;
1634 - }
1635 -
1636 - .item-page .feature-description { font-size: 0.9rem; opacity: 0.8; }
1637 -
1638 - .item-page .specs-table { width: 100%; font-size: 0.9rem; }
1639 - .item-page .specs-table tr { border-bottom: 1px solid var(--border); }
1640 - .item-page .specs-table td { padding: var(--space-3) 0; }
1641 - .item-page .specs-table td:first-child { opacity: 0.7; width: 200px; }
1642 -
1643 - .item-page .version-item {
1644 - background: var(--surface-muted);
1645 - padding: var(--space-4);
1646 - margin-bottom: var(--space-2);
1647 - }
1648 -
1649 - .item-page .version-header {
1650 - display: flex;
1651 - justify-content: space-between;
1652 - align-items: center;
1653 - margin-bottom: var(--space-2);
1654 - }
1655 -
1656 1575 .item-page .version-number { font-size: 1.1rem; }
1657 - .item-page .version-date { font-size: 0.85rem; opacity: 0.7; }
1658 - .item-page .version-notes { font-size: 0.9rem; opacity: 0.8; }
1659 -
1660 1576 .item-page .item-footer {
1661 1577 margin-top: 3rem;
1662 1578 padding-top: var(--space-6);
@@ -1679,16 +1595,9 @@ form button:hover {
1679 1595 .item-page .item-meta { grid-template-columns: 1fr; gap: var(--space-2); }
1680 1596 .item-page .item-media,
1681 1597 .item-page .item-details { padding: var(--space-4); }
1682 - .item-page .item-description,
1683 - .item-page .item-features,
1684 - .item-page .item-specs,
1685 - .item-page .item-versions { padding: var(--space-4); }
1686 - .item-page .item-description h2,
1687 - .item-page .item-features h2,
1688 - .item-page .item-specs h2,
1689 - .item-page .item-versions h2 { font-size: 1.2rem; }
1598 + .item-page .item-description { padding: var(--space-4); }
1599 + .item-page .item-description h2 { font-size: 1.2rem; }
1690 1600 .item-page .purchase-box { padding: var(--space-4); }
1691 - .item-page .specs-table td:first-child { width: auto; }
1692 1601 }
1693 1602
1694 1603 /* Project store-front page (templates/pages/project.html). Scoped under
@@ -2310,13 +2219,6 @@ form button:hover {
2310 2219 padding-bottom: var(--space-2);
2311 2220 border-bottom: 1px solid var(--border);
2312 2221 }
2313 -
2314 - .health-page .test-results h3 {
2315 - font-family: var(--font-mono);
2316 - font-size: 0.9rem;
2317 - margin-bottom: var(--space-4);
2318 - }
2319 -
2320 2222 .health-page .test-list {
2321 2223 list-style: none;
2322 2224 padding: 0;
@@ -2337,8 +2239,6 @@ form button:hover {
2337 2239
2338 2240 .health-page .test-pass { color: var(--health-ok); }
2339 2241 .health-page .test-fail { color: var(--health-error); }
2340 - .health-page .test-skip { color: var(--health-unknown); }
2341 -
2342 2242 .health-page .summary-bar {
2343 2243 display: flex;
2344 2244 gap: var(--space-6);
@@ -2393,17 +2293,6 @@ form button:hover {
2393 2293 .health-page details.check-list .test-list {
2394 2294 margin-top: var(--space-4);
2395 2295 }
2396 -
2397 - .health-page .incident-line {
2398 - display: flex;
2399 - justify-content: space-between;
2400 - font-size: 0.85rem;
2401 - padding: 0.3rem 0;
2402 - border-bottom: 1px solid var(--border);
2403 - }
2404 -
2405 - .health-page .incident-line:last-child { border-bottom: none; }
2406 -
2407 2296 /* Import data wizard (templates/dashboards/dashboard-import.html).
2408 2297 Page-specific upload + column-mapping + progress flow. Migration also
2409 2298 fixed token bypasses: --border-color → --border, --accent → --highlight,
@@ -2779,7 +2668,6 @@ form button:hover {
2779 2668 .fan-plus-page h1 { font-size: 2.5rem; margin-bottom: var(--space-2); }
2780 2669 .fan-plus-page h2 { font-size: 1.5rem; margin-top: var(--space-6); margin-bottom: var(--space-4); }
2781 2670
2782 -
2783 2671 .fan-plus-page .fan-plus-section { margin-bottom: var(--space-6); line-height: 1.7; }
2784 2672 .fan-plus-page .fan-plus-section ul { padding-left: var(--space-5); margin: var(--space-3) 0; }
2785 2673 .fan-plus-page .fan-plus-section li { margin-bottom: var(--space-2); }
@@ -3033,31 +2921,6 @@ form button:hover {
3033 2921 related innerHTML in static/project-sections.js)
3034 2922 =========================================== */
3035 2923
3036 - /* Canonical 120×120 thumbnail/preview box. Used by project image picker,
3037 - item image picker, and anywhere a small square cover preview is needed.
3038 - Pair with .cover-empty for the "No image" placeholder text inside it. */
3039 - .cover-thumb {
3040 - width: 120px;
3041 - height: 120px;
3042 - background: var(--border);
3043 - display: flex;
3044 - align-items: center;
3045 - justify-content: center;
3046 - flex-shrink: 0;
3047 - }
3048 - .cover-thumb img {
3049 - width: 100%;
3050 - height: 100%;
3051 - object-fit: cover;
3052 - }
3053 - .cover-empty { opacity: 0.4; font-size: 0.8rem; }
3054 -
3055 - /* Companion flex row: thumbnail + form-control column. */
3056 - .cover-row {
3057 - display: flex;
3058 - align-items: flex-start;
3059 - gap: var(--space-5);
3060 - }
3061 2924 .proj-image-hint {
3062 2925 font-size: 0.85rem;
3063 2926 opacity: 0.7;
@@ -3797,13 +3660,7 @@ form button:hover {
3797 3660 .settings-layout { flex-direction: column; gap: var(--space-4); }
3798 3661 .settings-nav { display: flex; flex-wrap: wrap; gap: 0; min-width: 0; }
3799 3662 .settings-nav a { padding: 0.4rem 0.6rem; font-size: 0.85rem; }
3800 - }
3801 -
3802 - /* Library "Feed" tab (templates/partials/tabs/library_feed.html).
3803 - Scoped under .library-page so rules don't bleed onto the standalone
3804 - /feed page (which has its own .feed-page-scoped rules). */
3805 - .library-page .feed-meta { font-size: 0.8rem; opacity: 0.6; margin-bottom: var(--space-3); }
3806 - .library-page .feed-table-header {
3663 + }.library-page .feed-table-header {
3807 3664 display: grid;
3808 3665 grid-template-columns: 50px 1fr 100px 70px 70px;
3809 3666 gap: var(--space-2);
@@ -3919,14 +3776,6 @@ form button:hover {
3919 3776 padding: 0.4rem 0.8rem;
3920 3777 font-size: 0.85rem;
3921 3778 }
3922 -
3923 - .dashboard-user-page .summary-row {
3924 - background: var(--surface-muted);
3925 - padding: var(--space-4);
3926 - margin-top: var(--space-4);
3927 - font-size: 0.9rem;
3928 - }
3929 -
3930 3779 @media (max-width: 768px) {
3931 3780 .dashboard-user-page .project-card { flex-direction: column; }
3932 3781 .dashboard-user-page .project-actions { margin-top: var(--space-3); }
@@ -4175,10 +4024,10 @@ form button:hover {
4175 4024
4176 4025 .admin-page .lottery-form input[type="number"] { width: 80px; }
4177 4026
4178 - /* Page-top notice (charter primitive — replaces #restart-banner,
4179 - the inline sandbox banner in dashboard-project, and
4180 - .landing-founder-banner over time). Full-bleed across the viewport,
4181 - monospace, one short sentence + optional action. */
4027 + /* Page-top notice (charter primitive — replaces #restart-banner and
4028 + the inline sandbox banner in dashboard-project). Full-bleed across
4029 + the viewport, monospace, one short sentence + optional action.
4030 + Hero callouts on the landing page use `.alert` instead (multi-paragraph). */
4182 4031 .banner {
4183 4032 padding: var(--space-3) var(--space-5);
4184 4033 font-family: var(--font-mono);
@@ -4227,7 +4076,6 @@ form button:hover {
4227 4076 .library-page .downloads-hero,
4228 4077 .receipt-page .receipt-box,
4229 4078 .stripe-disclaimer-page .disclaimer-box,
4230 - .health-page .test-results,
4231 4079 .project-page .project-sections {
4232 4080 background: var(--light-background);
4233 4081 padding: var(--space-6);
@@ -4464,28 +4312,12 @@ footer {
4464 4312 gap: 1rem;
4465 4313 flex-wrap: wrap;
4466 4314 }
4467 -
4468 - .button-grid {
4469 - display: grid;
4470 - grid-template-columns: repeat(2, 1fr);
4471 - gap: 0.5rem;
4472 - justify-items: center;
4473 - max-width: 300px;
4474 - margin: 0 auto;
4475 - }
4476 -
4477 - .button-stack {
4478 - display: flex;
4479 - gap: 0.5em;
4480 - }
4481 -
4482 4315 /* ===========================================
4483 4316 SPECIFIC COMPONENTS
4484 4317 =========================================== */
4485 4318
4486 - /* Login/Signup containers */
4487 - .login-container,
4488 - .signup-container {
4319 + /* Login container */
4320 + .login-container {
4489 4321 display: flex;
4490 4322 flex-direction: column;
4491 4323 max-width: 400px;
@@ -4494,17 +4326,6 @@ footer {
4494 4326 background: var(--light-background);
4495 4327 padding: 2rem;
4496 4328 }
4497 -
4498 - /* Splash page actions */
4499 - .splash-actions {
4500 - display: flex;
4501 - flex-direction: row;
4502 - gap: 1.5rem;
4503 - align-items: center;
4504 - flex-wrap: wrap;
4505 - justify-content: center;
4506 - }
4507 -
4508 4329 /* Logo */
4509 4330 .logo {
4510 4331 font-family: var(--font-heading);
@@ -4521,28 +4342,6 @@ footer {
4521 4342 .centered-page .tagline {
4522 4343 margin-bottom: 0.25rem;
4523 4344 }
4524 -
4525 - .subtagline {
4526 - font-family: var(--font-mono);
4527 - color: var(--text-muted);
4528 - text-align: center;
4529 - font-size: 0.9rem;
4530 - margin-bottom: 1rem;
4531 - }
4532 -
4533 - .centered-page .splash-actions {
4534 - margin-bottom: 2rem;
4535 - }
4536 -
4537 - /* Signup steps */
4538 - .signup-step {
4539 - display: none;
4540 - }
4541 -
4542 - .signup-step.active {
4543 - display: block;
4544 - }
4545 -
4546 4345 /* Skip link */
4547 4346 .skip-link {
4548 4347 text-align: center;
@@ -4601,19 +4400,6 @@ footer {
4601 4400 .file-upload-area.dragover {
4602 4401 background: var(--border);
4603 4402 }
4604 -
4605 - /* Price input */
4606 - .price-input-group {
4607 - display: flex;
4608 - align-items: center;
4609 - gap: 0.5rem;
4610 - margin-top: 0.5rem;
4611 - }
4612 -
4613 - .price-input-group input {
4614 - width: 150px;
4615 - }
4616 -
4617 4403 /* Chart placeholder */
4618 4404 .chart-container {
4619 4405 background: var(--surface-muted);
@@ -4718,15 +4504,6 @@ footer {
4718 4504 gap: 1.5rem;
4719 4505 margin-bottom: 1.5rem;
4720 4506 }
4721 -
4722 - /* .analytics-card base recipe defined above with .card-muted */
4723 -
4724 - .analytics-card h3 {
4725 - font-size: 1rem;
4726 - font-weight: normal;
4727 - margin-bottom: 1rem;
4728 - }
4729 -
4730 4507 .analytics-list {
4731 4508 list-style: none;
4732 4509 }
@@ -4768,96 +4545,12 @@ footer {
4768 4545 gap: 0.5rem;
4769 4546 align-items: center;
4770 4547 }
4771 -
4772 - .filter-label {
4773 - font-size: 0.9rem;
4774 - opacity: 0.7;
4775 - }
4776 -
4777 - /* Search box */
4778 - .search-box {
4779 - background: var(--background);
4780 - border: none;
4781 - padding: 0.5rem 1rem;
4782 - font-family: inherit;
4783 - font-size: 0.9rem;
4784 - flex: 1;
4785 - min-width: 200px;
4786 - }
4787 -
4788 - .search-box::placeholder {
4789 - opacity: 0.5;
4790 - }
4791 -
4792 4548 /* UUID styling */
4793 4549 .uuid {
4794 4550 font-family: inherit;
4795 4551 opacity: 0.5;
4796 4552 font-size: 0.85rem;
4797 4553 }
4798 -
4799 - /* Thumbnail styles */
4800 - .thumbnail-preview {
4801 - width: 200px;
4802 - height: 200px;
4803 - background: var(--surface-muted);
4804 - margin-top: 0.5rem;
4805 - display: flex;
4806 - align-items: center;
4807 - justify-content: center;
4808 - opacity: 0.5;
4809 - }
4810 -
4811 - /* File list */
4812 - .file-list {
4813 - list-style: none;
4814 - margin-top: 1rem;
4815 - }
4816 -
4817 - .file-item {
4818 - background: var(--surface-muted);
4819 - padding: 1rem;
4820 - margin-bottom: 0.5rem;
4821 - display: flex;
4822 - justify-content: space-between;
4823 - align-items: center;
4824 - }
4825 -
4826 - .file-info {
4827 - flex: 1;
4828 - }
4829 -
4830 - .file-name {
4831 - font-weight: bold;
4832 - margin-bottom: 0.25rem;
4833 - }
4834 -
4835 - .file-details {
4836 - font-size: 0.85rem;
4837 - opacity: 0.7;
4838 - }
4839 -
4840 - /* Library container */
4841 - .library-container {
4842 - padding: 0;
4843 - }
4844 -
4845 - /* Footer stats */
4846 - .footer-stats {
4847 - margin-top: 1rem;
4848 - padding-top: 1rem;
4849 - border-top: 1px solid var(--border);
4850 - display: flex;
4851 - justify-content: space-between;
4852 - font-size: 0.85rem;
4853 - opacity: 0.6;
4854 - }
4855 -
4856 - /* API hint (hidden) */
4857 - .api-hint {
4858 - display: none;
4859 - }
4860 -
4861 4554 /* ===========================================
4862 4555 HTMX LOADING INDICATORS
4863 4556 =========================================== */
@@ -5506,13 +5199,6 @@ textarea:focus-visible {
5506 5199 background: var(--surface-muted);
5507 5200 text-align: center;
5508 5201 }
5509 -
5510 - .success-icon {
5511 - color: var(--success);
5512 - font-size: 1.5rem;
5513 - margin-right: 0.5rem;
5514 - }
5515 -
5516 5202 .upload-error {
5517 5203 padding: 1.5rem;
5518 5204 background: var(--surface-muted);
@@ -5553,15 +5239,6 @@ textarea:focus-visible {
5553 5239 background: var(--primary-dark);
5554 5240 color: var(--primary-light);
5555 5241 }
5556 -
5557 - /* (Empty results inside .discover-results — uses .empty-state primitive
5558 - plus .empty-state-hint child. Older `.results-empty` removed.) */
5559 -
5560 - /* Results container layout switching */
5561 - .results-container.results-list .results-grid {
5562 - display: none;
5563 - }
5564 -
5565 5242 .results-container.results-list .results-table {
5566 5243 display: block;
5567 5244 }
@@ -5751,41 +5428,6 @@ textarea:focus-visible {
5751 5428 text-align: left;
5752 5429 }
5753 5430
5754 - .landing-founder-banner {
5755 - margin-top: 2rem;
5756 - padding: 1.25rem 1.5rem;
5757 - background: var(--light-background);
5758 - border-left: 4px solid var(--detail);
5759 - text-align: left;
Lines truncated
@@ -22,12 +22,12 @@
22 22 <p class="landing-sub">Audio, video, software, writing, games, and more. 0% platform fee &mdash; just Stripe's ~3% processing.</p>
23 23
24 24 {% if founder_window_open %}
25 - <div class="landing-founder-banner">
26 - <p class="landing-founder-eyebrow">Founder pricing &mdash; open now</p>
27 - <p class="landing-founder-headline">
25 + <div class="alert alert-important">
26 + <p class="alert-title">Founder pricing &mdash; open now</p>
27 + <p>
28 28 Join while the founder window is open and lock in <strong>half-price creator memberships for the life of your account</strong>.
29 29 </p>
30 - <p class="landing-founder-sub">
30 + <p class="text-sm dimmed">
31 31 Window closes at 1,000 creators or when we exit beta, whichever first.
32 32 {% if let Some(remaining) = founder_slots_remaining %}
33 33 <strong>{{ remaining }} founder slot{% if *remaining != 1u32 %}s{% endif %} left.</strong>