Skip to main content

max / makenotwork

Delete the dead classes, including a skeleton primitive that was documented but never built
Author: Max Johnson <me@maxj.phd> · 2026-08-02 21:43 UTC
Signed with PGP, not checked
Commit: a5c24ff88475818bc518ea87dc1337e2f1b45f1c
Parent: 69ff54f
2 files changed, +6 insertions, -40 deletions
@@ -71,7 +71,7 @@
71 71
72 72 | Primitive | Canonical class | Variants | Notes |
73 73 |---|---|---|---|
74 - | Container | `.container` | `--narrow` (600px), `--medium` (800px), `--wide` (900px) | Default `max-width: 1200px` |
74 + | Container | `.container` | width set by the page's body class, one rule per tier in `style.css` | Default `max-width: 1200px` |
75 75 | Toolbar / header bar | `.stack-row` | `--bordered`, `--tight`, `--top` | Title-left + actions-right |
76 76 | Inline form row | `.field-row` | child `.form-group.is-grow` / `.is-grow-2` | Input(s) + button bottom-aligned |
77 77 | Vertical list row | `.list-row` | parts: `-title`, `-meta` | Flex with bottom border |
@@ -91,7 +91,7 @@
91 91 | Section lead | `.section-lead` | with `.mb-section` / `.text-sm` / `.dimmed` utilities | — |
92 92 | Section divider | `.section-divider` | — | — |
93 93 | Section grouping label | `.section-group-label` | — | — |
94 - | Badge | `.badge` | `.badge-success`, `.badge-warning`, `.badge-danger`, `.free` | `.is-selected`, `.is-faded`, `.active` (= completion, not selection) |
94 + | Badge | `.badge` | `.badge-success`, `.free`, plus state classes `.pending` / `.draft` / `.failed` | `.is-selected`, `.is-faded`, `.active` (= completion, not selection) |
95 95 | Tag | `.tag` (inside `.tag-input` for editing) | — | — |
96 96 | Callout (solid-tint inline) | `.callout` | `--danger`, `--warning`, `--solid-warning` | — |
97 97 | Alert (left-border inline) | `.alert` | `-note`, `-tip`, `-important`, `-warning`, `-caution` | — |
@@ -100,7 +100,6 @@
100 100 | Confirm dialog | `_ui.html` macro `confirm_dialog` | — | — |
101 101 | Toast | `partials/toast.html` → `.toast` | `--success`, `--error`, `--warning` | — |
102 102 | Empty state | `.empty-state` (or `_ui.html` macro) | `--compact`, `--chart`, `--lg` | — |
103 - | Loading skeleton | `partials/loading_skeleton.html` | row, card, list | — |
104 103 | Progress bar | `.progress-bar-container` + `.progress-bar` | `--slim` (6px), `--rounded`, `.progress-bar--highlight` (purple, default green) | — |
105 104 | Upload status block | `.upload-status` + `-row` | `-msg.is-success`, `-msg.is-error` | — |
106 105 | Status pill | `.field-status` / `.save-status` | `.success`, `.error`, `.saving` | — |
@@ -109,7 +108,7 @@
109 108 | Breadcrumb | `.breadcrumb` | — | — |
110 109 | Pagination | `_ui.html` macro `pagination` → `.pagination` | — | `.active` |
111 110
112 - Tokens, the four parameterized macros (`empty_state`, `loading_skeleton`, `form_field`, `confirm_dialog`, `pagination`), and the consolidation pass have all shipped. Tokens live in `static/style.css` `:root`. Macros are in `templates/partials/_ui.html`.
111 + Tokens, the four parameterized macros (`empty_state`, `form_field`, `confirm_dialog`, `pagination`), and the consolidation pass have all shipped. Tokens live in `static/style.css` `:root`. Macros are in `templates/partials/_ui.html`.
113 112
114 113 ### Composition guide for new features
115 114
@@ -154,13 +153,13 @@
154 153 - **Focus**: `:focus-visible` shows the `--focus-ring` violet outline. Custom interactive containers (`.type-card`, `.pricing-card`, sort headers) must opt in by adding `:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }`.
155 154 - **Selected / active**: `.is-selected` modifier applies `background: var(--highlight-faint)` plus the focus-ring border. Migrate `.tab.active`, `.filter-item.active`, `.view-btn.active`, `.badge.active`, and the `:checked + .type-card-inner` recipe onto this single class.
156 155 - **Disabled**: `:disabled` and `[aria-disabled="true"]` show `opacity: 0.5` and `cursor: not-allowed`.
157 - - **Busy / loading**: HTMX-driven via `.htmx-request` on the trigger, plus a `partials/loading_skeleton.html` for content placeholders.
156 + - **Busy / loading**: HTMX-driven via `.htmx-request` on the trigger. There is no skeleton primitive: one was documented here for months and never built, so it was removed rather than left as a promise.
158 157
159 158 ## Page-level layouts
160 159
161 160 - `.padded-page`: standard content padding (`1.5rem`).
162 161 - `.centered-page`: landing / login / signup vertical-center layout.
163 - - `.container` + `--narrow` / `--medium` / `--wide` modifiers.
162 + - `.container`, whose width comes from the page's body class. One rule per width tier in `style.css`; a new page adds its body class there rather than a new modifier.
164 163 - Wizard layout in `static/wizard.css` (`.wizard-layout` + `.wizard-sidebar` + `.wizard-content`).
165 164 - Media layout in `static/media-player.css` (`.media-container`).
166 165
@@ -32,7 +32,7 @@
32 32 Shapes (.square-cover, .scroll-x)
33 33
34 34 LAYOUT PRIMITIVES (page-scaffolding shapes)
35 - .container + .container--narrow / --medium / --wide
35 + .container width set by body class
36 36 .stack-row + --bordered / --tight / --top toolbar / header bar
37 37 .field-row + .form-group.is-grow inline form row
38 38 .list-row + .list-row-title vertical item list
@@ -352,9 +352,6 @@
352 352 margin: 0 auto;
353 353 padding: var(--gap-page);
354 354 }
355 - .container--narrow { max-width: 600px; }
356 - .container--medium { max-width: 800px; }
357 - .container--wide { max-width: 900px; }
358 355
359 356 /* Per-page container width overrides (selected via body class). One rule
360 357 per width tier; new pages should add their body class here rather than
@@ -695,33 +692,6 @@
695 692 margin-top: var(--gap-peer);
696 693 }
697 694
698 - /* Loading skeleton placeholder.
699 - Canonical: `partials/_ui.html` ui::loading_skeleton macro. */
700 - .loading-skeleton {
701 - background: var(--surface-sunken);
702 - border-radius: var(--radius-md);
703 - animation: skeleton-pulse 1.2s ease-in-out infinite;
704 - }
705 -
706 - .loading-skeleton--row {
707 - height: 1.25rem;
708 - margin: var(--gap-peer) 0;
709 - }
710 -
711 - .loading-skeleton--card {
712 - height: 8rem;
713 - margin: var(--gap-section) 0;
714 - }
715 -
716 - .loading-skeleton--list .loading-skeleton--row + .loading-skeleton--row {
717 - margin-top: var(--gap-peer);
718 - }
719 -
720 - @keyframes skeleton-pulse {
721 - 0%, 100% { opacity: 0.5; }
722 - 50% { opacity: 0.9; }
723 - }
724 -
725 695 /* Checkbox group */
726 696 .checkbox-group {
727 697 display: flex;
@@ -944,7 +914,6 @@
944 914 .mb-peer { margin-bottom: var(--gap-peer); }
945 915 .mb-section { margin-bottom: var(--gap-section); }
946 916 .mb-pane { margin-bottom: var(--gap-pane); }
947 - .mb-page { margin-bottom: var(--gap-page); }
948 917 .my-peer { margin-block: var(--gap-peer); }
949 918 .my-section { margin-block: var(--gap-section); }
950 919 .py-section { padding-block: var(--gap-section); }
@@ -1006,13 +975,11 @@
1006 975 background: var(--success);
1007 976 }
1008 977
1009 - .badge-warning,
1010 978 .badge.pending,
1011 979 .badge.draft {
1012 980 background: var(--warning);
1013 981 }
1014 982
1015 - .badge-danger,
1016 983 .badge.failed {
1017 984 background: var(--danger);
1018 985 }