max / makenotwork
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 — 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 — open now</p> | |
| 27 | - | <p class="landing-founder-headline"> | |
| 25 | + | <div class="alert alert-important"> | |
| 26 | + | <p class="alert-title">Founder pricing — 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> |