kmcom-nuxt-layers 6.3.0 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/MIGRATION-v6.4.0.md +215 -0
- package/docs/MIGRATION-v6.5.0.md +87 -0
- package/docs/MIGRATION.md +3 -1
- package/docs/USAGE.md +35 -10
- package/docs/adr/0003-modular-step-system-replaces-fluid-clamps.md +16 -0
- package/docs/component-levels.md +1 -0
- package/docs/layout-shift-causes.md +18 -0
- package/layers/content/app/components/content/Figure.vue +1 -1
- package/layers/content/app/composables/useContentSection.ts +1 -1
- package/layers/core/app/app.config.ts +9 -5
- package/layers/core/app/app.vue +2 -1
- package/layers/core/app/components/LoadingScreen.vue +35 -21
- package/layers/core/app/composables/useCache.ts +2 -2
- package/layers/core/app/composables/useErrorLog.ts +5 -5
- package/layers/core/app/composables/useLoading.ts +19 -10
- package/layers/core/app/plugins/loading.client.ts +11 -3
- package/layers/core/app/types/loading.ts +10 -3
- package/layers/core/app/utils/loading.ts +7 -16
- package/layers/core/nuxt.config.ts +14 -14
- package/layers/core/server/utils/app-config.ts +17 -0
- package/layers/data/auth/app/middleware/auth.ts +1 -1
- package/layers/data/forms/app/components/Form/Contact.vue +1 -1
- package/layers/data/forms/server/api/contact.post.ts +16 -8
- package/layers/data/forms/server/api/forms/status.get.ts +3 -0
- package/layers/data/forms/{app → shared}/utils/contact-schema.ts +2 -1
- package/layers/data/metadata/server/api/metadata/search.get.ts +27 -7
- package/layers/data/metadata/server/api/metadata/status.get.ts +4 -1
- package/layers/data/metadata/server/api/metadata/sync.post.ts +13 -3
- package/layers/data/metadata/server/utils/metadata/resolve-record.ts +3 -3
- package/layers/delivery/feeds/nuxt.config.ts +6 -1
- package/layers/delivery/feeds/package.json +2 -2
- package/layers/delivery/feeds/server/routes/feed/demo.get.ts +2 -2
- package/layers/delivery/feeds/server/utils/content-adapter.ts +1 -1
- package/layers/delivery/feeds/server/utils/feed-service.ts +2 -2
- package/layers/design-system/theming/app/plugins/theme.client.ts +7 -0
- package/layers/design-system/theming/nuxt.config.ts +0 -2
- package/layers/design-system/typography/app/assets/css/typography.css +41 -5
- package/layers/design-system/visual/app/components/HoverDimGroup.vue +11 -3
- package/layers/motion/scroll/app/plugins/locomotive-scroll.client.ts +3 -2
- package/layers/render/canvas/nuxt.config.ts +0 -4
- package/layers/render/shader/nuxt.config.ts +0 -4
- package/layers/structure/navigation/app/app.config.ts +37 -14
- package/layers/structure/navigation/app/components/Mast/Nav.vue +14 -13
- package/layers/structure/navigation/app/components/Mast/NavModal.vue +83 -28
- package/layers/structure/navigation/app/components/Site/Logo.vue +35 -0
- package/layers/structure/navigation/app/components/Site/Title.vue +3 -3
- package/layers/structure/navigation/app/composables/mastNav.ts +38 -13
- package/layers/structure/navigation/app/types/nav.ts +34 -0
- package/layers/structure/routing/app/middleware/01.maintenance.global.ts +4 -1
- package/layers/structure/routing/app/middleware/02.governance.global.ts +1 -1
- package/layers/structure/routing/nuxt.config.ts +19 -12
- package/layers/structure/routing/server/api/feature-flags.get.ts +4 -2
- package/package.json +35 -5
- package/docs/FALLOW-COMPLEXITY-DUPLICATION-AUDIT.md +0 -64
- package/docs/IMPROVE-AUDIT-README.md +0 -29
- package/docs/IMPROVE-AUDIT-RESULTS.md +0 -51
- package/docs/IMPROVE-DEEP-AUDIT-RESULTS.md +0 -81
- package/docs/fallow-refactor/apps-debug.md +0 -27
- package/docs/fallow-refactor/apps-playground.md +0 -46
- package/docs/fallow-refactor/apps-visual-identity.md +0 -41
- package/docs/fallow-refactor/layers-animations.md +0 -34
- package/docs/fallow-refactor/layers-canvas.md +0 -32
- package/docs/fallow-refactor/layers-content.md +0 -33
- package/docs/fallow-refactor/layers-core.md +0 -39
- package/docs/fallow-refactor/layers-feeds.md +0 -39
- package/docs/fallow-refactor/layers-forms.md +0 -30
- package/docs/fallow-refactor/layers-layout.md +0 -42
- package/docs/fallow-refactor/layers-mailer.md +0 -32
- package/docs/fallow-refactor/layers-motion.md +0 -27
- package/docs/fallow-refactor/layers-navigation.md +0 -31
- package/docs/fallow-refactor/layers-page-transitions.md +0 -30
- package/docs/fallow-refactor/layers-routing.md +0 -33
- package/docs/fallow-refactor/layers-scripts.md +0 -35
- package/docs/fallow-refactor/layers-scroll.md +0 -38
- package/docs/fallow-refactor/layers-seo.md +0 -32
- package/docs/fallow-refactor/layers-shader.md +0 -53
- package/docs/fallow-refactor/layers-theme.md +0 -33
- package/docs/fallow-refactor/layers-transitions.md +0 -27
- package/docs/fallow-refactor/layers-typography.md +0 -29
- package/docs/fallow-refactor/layers-visual.md +0 -34
- package/docs/superpowers/plans/2026-09-03-layout-layer-fluid-rebuild.md +0 -1850
- package/docs/superpowers/plans/2026-09-03-vue-element-system.md +0 -1019
- package/docs/superpowers/plans/2026-09-04-grid-layer.md +0 -977
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-0-1-design.md +0 -533
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-2-design.md +0 -154
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-3-design.md +0 -109
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-4-design.md +0 -124
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-5-design.md +0 -121
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-6-design.md +0 -77
- package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-7-design.md +0 -73
- package/docs/superpowers/specs/2026-08-31-swiss-grid-layer-design.md +0 -190
- package/docs/superpowers/specs/2026-09-03-layout-layer-fluid-rebuild-design.md +0 -312
- package/docs/superpowers/specs/2026-09-03-vue-element-system-design.md +0 -342
- package/docs/superpowers/specs/2026-09-04-grid-layer-design.md +0 -236
- package/layers/content/app/utils/galleryImageMeta.test.ts +0 -30
- package/layers/core/app/components/Element.test.ts +0 -90
- package/layers/core/app/components/ElementTw.test.ts +0 -64
- package/layers/core/app/composables/useLayoutAttrs.test.ts +0 -77
- package/layers/core/app/utils/browserInfo.test.ts +0 -81
- package/layers/core/app/utils/featureClasses.test.ts +0 -101
- package/layers/core/app/utils/loading.test.ts +0 -48
- package/layers/core/app/utils/resolveElementStyle.test.ts +0 -99
- package/layers/core/app/utils/scrollGuardClamp.test.ts +0 -36
- package/layers/core/app/utils/styleToTailwindClasses.test.ts +0 -31
- package/layers/data/forms/app/utils/contact-schema.test.ts +0 -75
- package/layers/data/forms/app/utils/fieldProps.test.ts +0 -141
- package/layers/data/metadata/providers/comicvine/server/utils/metadata-comicvine/normalise.test.ts +0 -201
- package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/client.test.ts +0 -76
- package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/normalise.test.ts +0 -144
- package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/client.test.ts +0 -25
- package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/normalise.test.ts +0 -144
- package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/client.test.ts +0 -29
- package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/normalise.test.ts +0 -162
- package/layers/data/metadata/server/utils/metadata/cache.test.ts +0 -39
- package/layers/data/metadata/server/utils/metadata/provider-fetch.test.ts +0 -27
- package/layers/data/metadata/server/utils/metadata/provider-registry.test.ts +0 -54
- package/layers/data/metadata/server/utils/metadata/resolve-record.test.ts +0 -87
- package/layers/data/metadata/server/utils/metadata/search.test.ts +0 -204
- package/layers/delivery/feeds/server/utils/content-adapter.test.ts +0 -67
- package/layers/delivery/feeds/server/utils/feed-author.test.ts +0 -71
- package/layers/delivery/feeds/server/utils/feed-config.test.ts +0 -184
- package/layers/delivery/feeds/server/utils/formats.test.ts +0 -71
- package/layers/delivery/seo/app/utils/seoConfig.test.ts +0 -58
- package/layers/design-system/theming/server/utils/accent-css.test.ts +0 -71
- package/layers/design-system/theming/server/utils/fouc-config.test.ts +0 -78
- package/layers/design-system/typography/app/components/Typography/Headline.test.ts +0 -36
- package/layers/design-system/typography/app/components/Typography/index.test.ts +0 -31
- package/layers/design-system/typography/app/composables/color.test.ts +0 -30
- package/layers/design-system/typography/app/composables/typography.test.ts +0 -53
- package/layers/design-system/visual/app/composables/tint.test.ts +0 -22
- package/layers/design-system/visual/app/utils/colorTokens.test.ts +0 -51
- package/layers/design-system/visual/app/utils/gradientStyle.test.ts +0 -75
- package/layers/design-system/visual/app/utils/responsiveSizes.test.ts +0 -71
- package/layers/motion/animations/app/components/Motion/Staggered.test.ts +0 -40
- package/layers/motion/scroll/app/composables/useReducedMotion.test.ts +0 -23
- package/layers/motion/scroll/app/utils/parallax.test.ts +0 -24
- package/layers/structure/grid/app/composables/useGridTracks.test.ts +0 -94
- package/layers/structure/grid/app/types/tracks.test.ts +0 -32
- package/layers/structure/grid/app/utils/placement.test.ts +0 -19
- package/layers/structure/layout/app/utils/gridPlacementStyle.test.ts +0 -269
- package/layers/structure/navigation/app/utils/site.test.ts +0 -39
- package/layers/structure/routing/app/utils/resolveRoute.test.ts +0 -47
|
@@ -1,533 +0,0 @@
|
|
|
1
|
-
# Layer Taxonomy Redesign — Part 1: Tier 0 (Foundation) & Tier 1 (Design System)
|
|
2
|
-
|
|
3
|
-
## Scope
|
|
4
|
-
|
|
5
|
-
This document covers the first two tiers of a full monorepo layer-taxonomy redesign that
|
|
6
|
-
reorganizes ~26 layers into 8 tiers ordered by build-workflow sequence (design system → structure
|
|
7
|
-
→ content → data → motion → render → delivery) instead of flat domain buckets. Tiers 2–7
|
|
8
|
-
(Structure, Content, Data, Motion, Render, Delivery) are audited in follow-on documents. This
|
|
9
|
-
document is complete and actionable for Tier 0 and Tier 1 on their own — it does not depend on
|
|
10
|
-
later tiers being finished, except where explicitly noted.
|
|
11
|
-
|
|
12
|
-
Full 8-tier map, for reference:
|
|
13
|
-
|
|
14
|
-
| Tier | Name | Layers |
|
|
15
|
-
| ---- | ------------- | ---------------------------------------------------------------------------- |
|
|
16
|
-
| 0 | Foundation | `core` |
|
|
17
|
-
| 1 | Design System | `theming`, `typography`, `visual` (`ui` dissolved, see below) |
|
|
18
|
-
| 2 | Structure | `layout`, `navigation`, `routing` |
|
|
19
|
-
| 3 | Content | `content` |
|
|
20
|
-
| 4 | Data | `database`, `auth`, `metadata` (+ 4 provider sub-folders), `forms`, `mailer` |
|
|
21
|
-
| 5 | Motion | `scroll`, `animations`, `transitions` (absorbs `page-transitions`), `motion` |
|
|
22
|
-
| 6 | Render | `canvas`, `shader` |
|
|
23
|
-
| 7 | Delivery | `seo`, `scripts`, `feeds` |
|
|
24
|
-
|
|
25
|
-
`baseline` merges into `scripts` (Tier 7, Delivery) rather than `core` — corrected after full
|
|
26
|
-
audit: it's not just compiler config, it wraps a real third-party widget (`baseline-status` npm
|
|
27
|
-
package, web.dev's Baseline browser-support badge web component) via a `BaselineStatus.vue`
|
|
28
|
-
wrapper, a client plugin, and the `isCustomElement` allowlist. That's a third-party embed
|
|
29
|
-
integration, the same shape as `scripts`' existing analytics/GTM/embed facades — not a `core`
|
|
30
|
-
concern. `starter` relocates out of `layers/` into `apps/` (it's a demo app). Neither is a
|
|
31
|
-
standalone tier member. The per-tier sub-layer/toggle mechanism (extending the
|
|
32
|
-
`PLAYGROUND_LAYERS` pattern) referenced below is a separate, not-yet-designed piece of work —
|
|
33
|
-
tiers 0–1 do not depend on it existing yet.
|
|
34
|
-
|
|
35
|
-
## Nuxt 5 readiness (cross-cutting, applies to every tier)
|
|
36
|
-
|
|
37
|
-
Verified against the official upgrade guide (nuxt.com/docs/5.x/getting-started/upgrade):
|
|
38
|
-
|
|
39
|
-
- `app.config.ts` is **unaffected** in Nuxt 5 — confirmed, not carried forward as a risk.
|
|
40
|
-
(Two blog posts disagreed on this; the official guide settles it. `app.config.ts` migration
|
|
41
|
-
to `runtimeConfig` is explicitly **out of scope** for this redesign.)
|
|
42
|
-
- `future.compatibilityVersion: 5` — flip in `core`'s `nuxt.config.ts` now. Available since
|
|
43
|
-
Nuxt 4.2, individually revertable, cheapest way to surface real breakage early.
|
|
44
|
-
- TypeScript `baseUrl` is removed in v5 — audit every layer's `tsconfig.json` for `baseUrl`
|
|
45
|
-
reliance (not yet done).
|
|
46
|
-
- Vue Options API disabled by default in v5 — repo convention is already `<script setup>`
|
|
47
|
-
everywhere (per root CLAUDE.md), expect zero findings, worth a confirming grep.
|
|
48
|
-
- Case-sensitive routing / normalized page names — relevant once the Content/Structure tiers
|
|
49
|
-
are audited (page file naming), not Tier 0/1.
|
|
50
|
-
- `giget` becomes an optional peer dep for remote layers — not applicable, this repo has no
|
|
51
|
-
remote `extends:`, all layers are local.
|
|
52
|
-
|
|
53
|
-
## Tier 0 — Foundation (`core`)
|
|
54
|
-
|
|
55
|
-
**Charter:** the safe, minimal way to load a site. Zero layer dependencies — every other layer
|
|
56
|
-
extends `core`, `core` extends nothing.
|
|
57
|
-
|
|
58
|
-
**Current real contents** (junk paths `.playground/.output`, `.fallow`, `.turbo` excluded):
|
|
59
|
-
|
|
60
|
-
- Device/capability detection: `useDevice`, `useBrowser`, `useNetworkInfo`, `useScreen`,
|
|
61
|
-
`useRendering`, `useFeatures`, `usePWAInfo`, `useScrollGuard`, `feature-detection.client.ts`,
|
|
62
|
-
`scroll-guard.client.ts`, `browserInfo.ts`, `featureClasses.ts`
|
|
63
|
-
- Error/404: `ErrorBoundary.vue`, `error.vue`, `error-handler.ts` plugin, `useErrorLog`,
|
|
64
|
-
`[...slug].vue` catch-all
|
|
65
|
-
- Loading: `LoadingScreen.vue`, `useLoading`, `loading.client.ts`
|
|
66
|
-
- Design tokens (Phase 1–4 declarative layout work): `types/tokens.ts`, `types/responsive.ts`,
|
|
67
|
-
`useLayoutAttrs.ts`, `assets/css/tokens/{breakpoints,container,spacing-fluid}.css` — correctly
|
|
68
|
-
homed here per the earlier locked decision that shared tokens live in `core`
|
|
69
|
-
- Misc utils: `useCache`, `useEnv`, `helpers.ts`, `regex.ts`
|
|
70
|
-
|
|
71
|
-
Re-audited the device/capability-detection cluster individually — traced real consumers, not just
|
|
72
|
-
presence. Result: `useDevice`, `useBrowser`, `useNetworkInfo`, `useScreen` fit cleanly.
|
|
73
|
-
`useRendering`, `useFeatures`, `usePWAInfo`, `useScrollGuard` did not hold up — see decisions 5-8
|
|
74
|
-
below.
|
|
75
|
-
|
|
76
|
-
### Decisions
|
|
77
|
-
|
|
78
|
-
1. **`Container.vue` → `AppContainer.vue`.** Not a duplicate of `layout`'s containers (see Tier 2
|
|
79
|
-
note below) — it's the shared width-constraint primitive both `layout` and `ui`/`layout`
|
|
80
|
-
consumers build on. Renamed for clarity per direct request. `layout/Layout/Container.vue`
|
|
81
|
-
(`LayoutContainer`, a documented back-compat shim that just re-renders `<Container>`) needs its
|
|
82
|
-
internal reference updated to `<AppContainer>` alongside this rename.
|
|
83
|
-
|
|
84
|
-
2. **`core.css`'s hard import of `typography.css` stays — do not remove.** This looked like a
|
|
85
|
-
layer-independence violation (`core` reaching into `typography`) but is the deliberate,
|
|
86
|
-
documented fix for a real production bug (see
|
|
87
|
-
`kmcom-nuxt-layers-typography-css-bug.md` at repo root): Tailwind v4 is CSS-first and only
|
|
88
|
-
tolerates **one** `@import 'tailwindcss/...'` build root per app. `typography.css` used to open
|
|
89
|
-
its own build root and silently broke `@nuxt/ui`'s `UNavigationMenu` padding in production
|
|
90
|
-
(nav stuck at 36px instead of 64px, no error, confirmed via isolation A/B test). The current
|
|
91
|
-
fix — `typography.css` has no Tailwind import of its own, `core.css` pulls its contents in via
|
|
92
|
-
relative path so everything rides `core`'s single build root — is correct and must be
|
|
93
|
-
preserved.
|
|
94
|
-
|
|
95
|
-
**New rule to codify** (candidate location: `.claude/rules/nuxt-layers.md`): any layer adding
|
|
96
|
-
Tailwind-consuming CSS (custom properties, `@utility` blocks) must fold into `core.css`'s
|
|
97
|
-
import chain via relative path and must never open its own `@import 'tailwindcss/...'` root.
|
|
98
|
-
This is a permanent, documented exception to "core has zero layer deps" — true for JS/TS,
|
|
99
|
-
not true for CSS build-root ownership.
|
|
100
|
-
|
|
101
|
-
3. **Delete `assets/css-backup.zip`.** 3.9KB, zero references anywhere in the codebase, dead
|
|
102
|
-
leftover.
|
|
103
|
-
|
|
104
|
-
4. **`assets/css/base.css` and `assets/css/layout.css` contents not yet audited.** Both are
|
|
105
|
-
loaded unconditionally by `core.css`. `core`'s `layout.css` shares a filename with
|
|
106
|
-
`layers/layout/app/assets/css/layout.css` (a different file, both real) — confusing at minimum.
|
|
107
|
-
Open item: read both files' actual contents and decide keep-in-core / move-to-`layout`-tier /
|
|
108
|
-
delete per content, before this tier is considered fully closed.
|
|
109
|
-
|
|
110
|
-
5. **Types — mostly fine, one still-open.**
|
|
111
|
-
- `types/tokens.ts` (`Spacing`, `ContainerSize`, `BREAKPOINT_PX`, `Breakpoint`) — correctly
|
|
112
|
-
homed, deliberately cross-consumed by `layout`/`visual` via the `#layers/core/types` alias.
|
|
113
|
-
No action.
|
|
114
|
-
- `types/responsive.ts` (canonical `ResponsiveValue<T>`) — deliberately kept separate from
|
|
115
|
-
`layout`'s own `ResponsiveValue` per an explicit code comment. Same item as the "3 duplicate
|
|
116
|
-
`ResponsiveValue` types" flagged in the original pre-redesign audit — still open: permanent
|
|
117
|
-
split or future merge target, not decided.
|
|
118
|
-
|
|
119
|
-
6. **`init.ts` — delete entirely.** 190 lines that call nearly every composable in `core`
|
|
120
|
-
(`useDevice`, `useBrowser`, `useScreen`, `useNetworkInfo`, `useFeatures`, `useCache`,
|
|
121
|
-
`useRendering`, `useEnv`) purely to `console.log` their output in dev mode. Zero production
|
|
122
|
-
behavior. Its one artifact — `provide: { $coreLayer: {...} } ` — is never read anywhere in the
|
|
123
|
-
repo. Duplicates `DiagnosticsPage.vue`. Confirmed leftover scaffolding from when the layer was
|
|
124
|
-
being built, not load-bearing.
|
|
125
|
-
|
|
126
|
-
7. **Misc utils — three of four dead or near-dead, one folded into the PWA decision.**
|
|
127
|
-
- `useCache` — PWA-only (hardcoded `'workbox-precache-v2'`), only caller was `init.ts`. Folds
|
|
128
|
-
into decision 8 (PWA disabled, not deleted) rather than standing alone.
|
|
129
|
-
- `useEnv` — delete. 4-line pass-through of `useRuntimeConfig()`, adds nothing despite its doc
|
|
130
|
-
comment's claims. Only caller was `init.ts`. Consumers use `useRuntimeConfig()` directly.
|
|
131
|
-
- `helpers.ts` — delete. ~20-function grab-bag (`debounce`, `throttle`, `sleep`, `retry`,
|
|
132
|
-
`clamp`, `deepClone`, `pick`, `omit`, `groupBy`, etc). Confirmed zero real usage anywhere in
|
|
133
|
-
the repo outside its own test file and `useScrollGuard`'s `debounce` import (already being
|
|
134
|
-
deleted per decision 7) — checked specifically against the loading cluster too, no imports
|
|
135
|
-
there. Recoverable from git history if a real need appears later.
|
|
136
|
-
- `regex.ts` — delete. Dead duplicate: `navigation` has its own separate `regex.ts` with the
|
|
137
|
-
same `splitSpaces` job, actually consumed by `navigation/app/utils/site.ts`. `core`'s copy
|
|
138
|
-
has zero consumers.
|
|
139
|
-
|
|
140
|
-
8. **Loading cluster — mostly fine, one real gap, minor cruft.**
|
|
141
|
-
- `LoadingScreen`/`useLoading`/`loading.client.ts` = app-level, one-time boot splash (runs
|
|
142
|
-
once via `app:mounted`). Confirmed intentional design, kept as-is. Progress is simulated
|
|
143
|
-
(random 3-8% increments every 150ms to 90%, not tied to real asset/network state) — expected
|
|
144
|
-
behavior for this kind of splash, not a bug, just worth knowing it's cosmetic.
|
|
145
|
-
- Remove dead commented-out `console.log` debug lines (3 spots across `LoadingScreen.vue` and
|
|
146
|
-
`loading.client.ts`).
|
|
147
|
-
- **Gap**: Nuxt's native `<NuxtLoadingIndicator>`/`useLoadingIndicator()` (page-level,
|
|
148
|
-
per-navigation progress bar, real state, zero config, ships free) is not used anywhere in the
|
|
149
|
-
repo — `core/app.vue` doesn't include it. Confirmed split: `LoadingScreen` = app-level boot
|
|
150
|
-
splash, `NuxtLoadingIndicator` = page-level per-navigation bar. Add
|
|
151
|
-
`<NuxtLoadingIndicator />` to `core/app.vue` alongside `<NuxtLayout>`/`<NuxtPage>`.
|
|
152
|
-
|
|
153
|
-
9. **Error/404 cluster — one real production bug.**
|
|
154
|
-
- `[...slug].vue` (catch-all 404 route) is solid: config-driven, `setResponseStatus(404)`,
|
|
155
|
-
matches unmatched routes correctly.
|
|
156
|
-
- `error-handler.ts` (global Vue/Nuxt error hooks → `useErrorLog`) and `useErrorLog` itself
|
|
157
|
-
(console + optional external-service logging, app.config-driven) are both correctly wired
|
|
158
|
-
and fine.
|
|
159
|
-
- **`error.vue` — Nuxt's actual global error page, shown for any _thrown_ error (500s,
|
|
160
|
-
`createError()`, unhandled exceptions) — is a bare stub in production**: `<div><p>error</p>
|
|
161
|
-
</div>`, no message, no status code, no way back. Its full real implementation (same
|
|
162
|
-
UEmpty/actions/stack-trace pattern as the working 404 page) exists but is entirely commented
|
|
163
|
-
out. Confirmed: this was always meant as a fallback and the real version was never finished
|
|
164
|
-
— not a regression, an unfinished build. Ships broken today regardless. Open item: finish
|
|
165
|
-
it (the commented code is already written, needs uncommenting + wiring against the same
|
|
166
|
-
pattern `[...slug].vue` already proves out) — not yet scheduled, logged here so it isn't
|
|
167
|
-
lost.
|
|
168
|
-
|
|
169
|
-
10. **`useRendering` — keep as-is.** Zero current consumers, but cheap: computed refs only, no
|
|
170
|
-
side effects, no auto-run plugin. Real use case documented (gate interactivity until
|
|
171
|
-
`isHydrated`, e.g. `:disabled="!isHydrated"`) even though nothing uses it yet. Not worth
|
|
172
|
-
cutting something inert on the chance it's needed.
|
|
173
|
-
|
|
174
|
-
11. **`useFeatures` — keep the composable, delete the auto-run plugin.** Traced actual consumers:
|
|
175
|
-
zero outside the diagnostics demo page, despite the plugin (`feature-detection.client.ts`)
|
|
176
|
-
running CSS/JS-API/image-format detection, `sessionStorage` writes, and `<html>` classList
|
|
177
|
-
mutation on every single page load for every `core` consumer. Delete
|
|
178
|
-
`plugins/feature-detection.client.ts`. Composable itself stays, callable on-demand by whichever
|
|
179
|
-
future consumer actually needs it (candidate: `layout`'s subgrid fallback).
|
|
180
|
-
|
|
181
|
-
12. **`useScrollGuard` — delete entirely** (composable, `plugins/scroll-guard.client.ts`,
|
|
182
|
-
`types/scroll-guard.ts`). Traced: auto-enabled on every page load, zero code anywhere calls its
|
|
183
|
-
exposed runtime controls (`enable`/`disable`/`toggle`), yet it walks the full DOM on load and
|
|
184
|
-
runs a `MutationObserver` on the entire `<body>` subtree indefinitely — real always-on perf
|
|
185
|
-
cost for a problem never confirmed to exist in practice. The clamping behavior it implements is
|
|
186
|
-
preserved as a vitest characterization test instead of shipped runtime code, so the logic isn't
|
|
187
|
-
lost, just no longer running live.
|
|
188
|
-
|
|
189
|
-
13. **PWA — disabled, not deleted**, pending a separate decision on Nuxt's PWA direction. Comment
|
|
190
|
-
out (don't remove) `@vite-pwa/nuxt` from `core`'s conditional prod `modules` array and the
|
|
191
|
-
`pwa: { workbox: {...} }` config block in `core/nuxt.config.ts`. `usePWAInfo` composable stays
|
|
192
|
-
in place, dormant, same status as `useRendering` — unused but harmless.
|
|
193
|
-
|
|
194
|
-
## Tier 1 — Design System (`theming`, `typography`, `visual`)
|
|
195
|
-
|
|
196
|
-
**Charter:** typed design primitives — typography, color, gradients/tints/accents, theming —
|
|
197
|
-
consumed by everything above it in the tier order.
|
|
198
|
-
|
|
199
|
-
### `ui` is dissolved as a physical layer
|
|
200
|
-
|
|
201
|
-
Audited full contents of `ui`: `HStack.vue`, `VStack.vue`, `ZStack.vue`, `Spacer.vue`, one CSS
|
|
202
|
-
file, and `app/layouts/default.vue`. Everything `ui/CLAUDE.md` documents (Typography/, Links/,
|
|
203
|
-
Media/, Mast/, Site/, `breakpoints.ts`) has already migrated to `typography`, `navigation`, and
|
|
204
|
-
`visual` — confirmed those files live there now, `ui/CLAUDE.md` is stale and describes a
|
|
205
|
-
structure that no longer exists in this layer.
|
|
206
|
-
|
|
207
|
-
`ui`'s only two remaining jobs: (1) `extends: ['typography', 'navigation', 'visual']` as a
|
|
208
|
-
convenience bundle, and (2) own 4 unrelated stack/spacing primitives. Job 1 duplicates what the
|
|
209
|
-
Tier 1 sub-layer/toggle manifest (separate future work) will do natively. Job 2 doesn't belong in
|
|
210
|
-
a design-system layer — `HStack`/`VStack`/`ZStack`/`Spacer` are flexbox/positioning layout
|
|
211
|
-
primitives.
|
|
212
|
-
|
|
213
|
-
**Decision:** delete `ui` as a layer. Move `HStack.vue`, `VStack.vue`, `ZStack.vue`, `Spacer.vue`
|
|
214
|
-
into `layout` (Tier 2), next to `Container.vue`. Consumers that previously did
|
|
215
|
-
`extends: ['ui']` now either extend `['typography', 'navigation', 'visual']` directly, or use the
|
|
216
|
-
Tier 1 manifest once it exists.
|
|
217
|
-
|
|
218
|
-
### `MastMain` / grid-root duplication (found while tracing `ui`'s dissolved `default.vue`)
|
|
219
|
-
|
|
220
|
-
Two competing implementations of the same grid-root DOM contract existed:
|
|
221
|
-
|
|
222
|
-
- `navigation/Mast/Main.vue` (`MastMain`) — naive stub: `<div class="mastmain"><slot/></div>`,
|
|
223
|
-
dead `<!-- <UMain> -->` comments, wrong element (`<div>` not `<main>`, loses the page's `<main>`
|
|
224
|
-
landmark — an accessibility regression), no grid-mode awareness, no disabled-mode fallback.
|
|
225
|
-
- `layout/Layout/Main.vue` (`LayoutMain`) — the real one: semantic `<main>` (configurable tag),
|
|
226
|
-
reads `useGridConfig()`, applies grid padding, has a `disabled`-mode escape hatch. This is what
|
|
227
|
-
`layout`'s own CLAUDE.md documents as canonical.
|
|
228
|
-
|
|
229
|
-
`ui`'s (now-dissolved) `default.vue` used the weak `navigation` stub, not the real `layout`
|
|
230
|
-
component. Not currently biting anyone — every current playground page sets `layout: false` or
|
|
231
|
-
points at its own `layouts/grid.vue` — but a silent trap for any future consumer using an
|
|
232
|
-
unmodified default layout.
|
|
233
|
-
|
|
234
|
-
**Decisions:**
|
|
235
|
-
|
|
236
|
-
- Delete `navigation/Mast/Main.vue` outright — not salvageable, the real implementation already
|
|
237
|
-
exists in `layout`.
|
|
238
|
-
- Grid-root ownership moves fully to `layout` (Tier 2, Structure) — it was never a Design System
|
|
239
|
-
concern. `layout` gets its own real default layout using `LayoutMain`; no design-system-tier
|
|
240
|
-
layer should ship a page-shell default layout again.
|
|
241
|
-
- Rename the `.mastmain` CSS class itself (not just the component) — the class string is threaded
|
|
242
|
-
through `grids.css`, `useGridConfig`, and `layout`'s CLAUDE.md, and a component-only rename
|
|
243
|
-
would leave the exact naming confusion that caused this bug. Component name `LayoutMain` stays
|
|
244
|
-
as-is (already consistent with `LayoutContainer`, `LayoutSection`, `LayoutGridItem` — not the
|
|
245
|
-
outdated part). Target CSS class name not yet chosen (candidate: `.grid-root`).
|
|
246
|
-
|
|
247
|
-
### `theme` → `theming`
|
|
248
|
-
|
|
249
|
-
Confirmed rename. Functional scope (static tokens only vs. real multi-theme runtime switching) is
|
|
250
|
-
**not yet re-confirmed** — flagged early in the discussion, implicitly superseded by the rename
|
|
251
|
-
decision but never explicitly re-settled. Open item.
|
|
252
|
-
|
|
253
|
-
### Other Tier 1 content, audited, no action needed yet
|
|
254
|
-
|
|
255
|
-
- `typography`: `Typography/*` components (`CodeBlock`, `Headline`, `HeadlineScreen`,
|
|
256
|
-
`QuoteBlock`, `RepeatText`, `TextStroke`, base `index.vue`), `useTypography`, `useColor`,
|
|
257
|
-
`repeatFill` composable, `colors.ts`/`typography.ts` types. Fits charter.
|
|
258
|
-
- `visual`: `Accent/{Blob,Scene}`, `Base/Modal`, `Gradient/{Background,Text}`, `Media/Picture`,
|
|
259
|
-
`Progress/{Bar,Circular}`, `Tint/Overlay`, matching composables, `colorTokens`/`gradientStyle`/
|
|
260
|
-
`responsiveSizes` utils (all with tests). Fits charter.
|
|
261
|
-
|
|
262
|
-
### `typography` component audit + prop standardization
|
|
263
|
-
|
|
264
|
-
Traced real consumers per component (playground's `typography.vue`/`ui.vue` demo pages +
|
|
265
|
-
`starter`'s design-system showcase count as legitimate usage for a component-library monorepo,
|
|
266
|
-
unlike `core`'s debug-only diagnostics page).
|
|
267
|
-
|
|
268
|
-
- **`HeadlineScreen.vue` — delete.** Zero usages anywhere, including demos. Strictly a worse
|
|
269
|
-
subset of `Headline.vue`: `Headline` already supports everything `HeadlineScreen` does
|
|
270
|
-
(`fluidSize`) plus a fixed `size` option, with fluid defaults that scale per heading level
|
|
271
|
-
(`h1`→`6xl` … `h6`→`lg`) where `HeadlineScreen` flat-defaults every level to `2xl`. `Headline`
|
|
272
|
-
also renders through the shared `<Typography>` base; `HeadlineScreen` bypasses it, breaking
|
|
273
|
-
the delegation pattern every sibling follows.
|
|
274
|
-
- **`RepeatText`** — still in active development per direct confirmation, not audited this pass.
|
|
275
|
-
|
|
276
|
-
**Prop inconsistency found across the remaining semantic text components** (`TextStroke`
|
|
277
|
-
excluded — different domain, an SVG stroke-effect component with no typography props, not an
|
|
278
|
-
inconsistency to fix):
|
|
279
|
-
|
|
280
|
-
| Component | Props declared |
|
|
281
|
-
| ------------------- | ---------------------------------------------------------------------------------------- |
|
|
282
|
-
| `Typography` (base) | `tag, weight, width, slant, leading, tracking, align, transform, color, size, fluidSize` |
|
|
283
|
-
| `Headline` | same 11, via `level` instead of `tag`, + `class` |
|
|
284
|
-
| `CodeBlock` | only `language, color, size, class` |
|
|
285
|
-
| `QuoteBlock` | only `color, size` |
|
|
286
|
-
|
|
287
|
-
`CodeBlock`/`QuoteBlock` already render through `<Typography>` under the hood and forward
|
|
288
|
-
`$attrs` to it — so the other 9 axes technically work if passed, they're just untyped and
|
|
289
|
-
invisible to autocomplete on those two components. Confirmed: the delegation architecture the
|
|
290
|
-
user asked for already exists (`Typography/index.vue` is the one generic base component every
|
|
291
|
-
wrapper renders through); the actual fix is closing the gap between what already delegates at
|
|
292
|
-
runtime and what's typed, not building new architecture.
|
|
293
|
-
|
|
294
|
-
**Decisions:**
|
|
295
|
-
|
|
296
|
-
1. Every wrapper component (`Headline`, `CodeBlock`, `QuoteBlock`) explicitly declares the full
|
|
297
|
-
canonical prop set in its own `defineProps` and calls `useTypography()`/`useColor()` directly
|
|
298
|
-
— see decision 4 (architecture refactor) below for why this is composable calls, not
|
|
299
|
-
`<Typography>` component wrapping.
|
|
300
|
-
2. Drop the manual `class: classProp` destructure-and-remerge pattern (present in `Headline` and
|
|
301
|
-
`CodeBlock`, absent from `Typography` and `QuoteBlock`) — Vue's automatic `$attrs` class
|
|
302
|
-
merging already does this without the extra code. Standardize on the implicit pattern
|
|
303
|
-
everywhere.
|
|
304
|
-
3. **New `font` prop**, replacing hardcoded utility classes like `CodeBlock`'s current
|
|
305
|
-
`class="font-mono"`. Requires new token infrastructure — none exists yet (confirmed: no
|
|
306
|
-
`@theme { --font-* }` block anywhere in `core`/`typography`/`visual`; `--font-mono` is
|
|
307
|
-
referenced defensively in `feeds`/`shader` CSS but the variable itself is never defined,
|
|
308
|
-
silently falling through to its fallback value).
|
|
309
|
-
- Define `--font-sans`, `--font-mono`, `--font-display` (or whatever set is chosen) in a
|
|
310
|
-
`@theme` block in `typography.css` — matches the existing pattern where every other
|
|
311
|
-
typography-axis type (`FontWeight`, `FontLeading`, `FontTracking`) already lives in the
|
|
312
|
-
`typography` layer, not `core`. Tailwind v4 auto-generates the `font-sans`/`font-mono`/
|
|
313
|
-
`font-display` utility classes from these.
|
|
314
|
-
- Add a `FontFamily` type to `typography/app/types/typography.ts`, typed directly off the
|
|
315
|
-
chosen token names so the prop and the CSS can't drift apart.
|
|
316
|
-
- Add `font` to the canonical prop set on `Typography/index.vue`, wired through
|
|
317
|
-
`useTypography` to emit `font-${font}`.
|
|
318
|
-
- Sensible per-component defaults: `Typography`/`Headline`/`QuoteBlock` default `font: 'sans'`;
|
|
319
|
-
`CodeBlock` defaults `font: 'mono'` (directly replacing its current hardcoded class).
|
|
320
|
-
- **Open item, not yet decided**: actual font families to use. No real webfont loading exists
|
|
321
|
-
in this design-system layer today (confirmed: no `@nuxt/fonts`/Google Fonts module in
|
|
322
|
-
`core`/`typography`; only the unrelated `visual-identity` app has one). Options: system-font
|
|
323
|
-
stacks for `sans`/`mono`/`display` now with real webfont loading as separate later work, or
|
|
324
|
-
specific fonts chosen now. Not resolved this pass.
|
|
325
|
-
4. **Architecture refactor: stop wrapping the `<Typography>` component, call the composables
|
|
326
|
-
directly.** `useTypography()`/`useColor()` (`layers/typography/app/composables/typography.ts`,
|
|
327
|
-
`color.ts`) are already pure, headless, no-DOM functions — props in, class string out. That's
|
|
328
|
-
already the abstraction layer being asked for; it's just not used as the primary interface.
|
|
329
|
-
Right now `Headline`/`CodeBlock`/`QuoteBlock` reach it indirectly by wrapping the
|
|
330
|
-
`<Typography>` _component_, adding an extra nested-component hop in the render tree
|
|
331
|
-
(`<Headline>` → `<Typography>` → actual DOM tag) to reach logic that already sits one level
|
|
332
|
-
lower as a plain function.
|
|
333
|
-
|
|
334
|
-
Refactor: `Headline`/`CodeBlock`/`QuoteBlock` call `useTypography()`/`useColor()` directly and
|
|
335
|
-
render their own root element with the computed classes — the same pattern
|
|
336
|
-
`Typography/index.vue` itself already uses internally. `Typography/index.vue` becomes just one
|
|
337
|
-
more consumer of the composables (the generic "any tag, any axis" primitive for ad-hoc use),
|
|
338
|
-
not a mandatory pass-through for every other typography component. Side benefit: unlocks
|
|
339
|
-
components outside the typical semantic set — e.g. `TextStroke`, which currently has no
|
|
340
|
-
typography classes at all — to opt into consistent typography styling later without needing to
|
|
341
|
-
nest inside `<Typography>`.
|
|
342
|
-
|
|
343
|
-
### `visual/app/types/breakpoints.ts` — resolved
|
|
344
|
-
|
|
345
|
-
Traced real consumers per vocabulary: every export except `ResponsiveBreakpoint`/
|
|
346
|
-
`BREAKPOINT_VALUES` (the Tailwind-matching one) has **zero** external references anywhere in the
|
|
347
|
-
repo — `DeviceBreakpoint`, `PhoneBreakpoint`, `TabletBreakpoint`, `DeviceOrientation`,
|
|
348
|
-
`ORIENTATION_BREAKPOINTS`, `AllBreakpoints` are only referenced inside their own file. Confirms
|
|
349
|
-
the original audit's ~15%-used figure precisely.
|
|
350
|
-
|
|
351
|
-
Also found: this design system currently runs **two half-overlapping breakpoint scales**.
|
|
352
|
-
`BREAKPOINT_VALUES` mirrors Tailwind's generic defaults (640/768/1024/1280/1536px), while
|
|
353
|
-
`layout`'s own Swiss Grid density breakpoints are `48rem`/`80rem` (per its CLAUDE.md) — those
|
|
354
|
-
only coincidentally match 2 of Tailwind's 4 values (`48rem`=768px=`md`, `80rem`=1280px=`xl`;
|
|
355
|
-
`sm`/`lg`/`2xl` correspond to nothing grid-related).
|
|
356
|
-
|
|
357
|
-
Separately, "container breakpoints" turned out to name two different things: `core`'s
|
|
358
|
-
`container.css` is max-width sizing classes (`.container-content/wide/fluid/full`), unrelated to
|
|
359
|
-
breakpoints. The actual container-_query_ breakpoints (`@container (width >= 30rem/44rem/52rem)`)
|
|
360
|
-
live hardcoded, ad-hoc, directly in `layout/fluid.css` — no shared token/type backs them.
|
|
361
|
-
|
|
362
|
-
**Decisions:**
|
|
363
|
-
|
|
364
|
-
1. Delete `DeviceBreakpoint`, `PhoneBreakpoint`, `TabletBreakpoint`, `DeviceOrientation`,
|
|
365
|
-
`ORIENTATION_BREAKPOINTS`, `AllBreakpoints`, and their value objects — zero consumers, cut
|
|
366
|
-
outright, not rebuilt.
|
|
367
|
-
2. Replace `BREAKPOINT_VALUES`'s Tailwind-derived sm/md/lg/xl/2xl with breakpoints derived from
|
|
368
|
-
`layout`'s actual grid thresholds (`48rem`/`80rem` plus whatever else the grid needs) — one
|
|
369
|
-
real scale instead of two overlapping ones.
|
|
370
|
-
3. Formalize the 3 ad-hoc `layout/fluid.css` container-query values (`30rem`/`44rem`/`52rem`)
|
|
371
|
-
into named tokens.
|
|
372
|
-
|
|
373
|
-
### Container responsiveness strategy — breakpoints + container queries combined
|
|
374
|
-
|
|
375
|
-
`AppContainer`'s CSS already sets `container-type: inline-size` on all four size variants
|
|
376
|
-
(`container.css`) — meaning every descendant already has a live container-query context, the same
|
|
377
|
-
mechanism `layout/fluid.css`'s `@container` breakpoints and `typography.css`'s `-cq` fluid text
|
|
378
|
-
variants already use. That half already ships, just not used as a deliberate strategy.
|
|
379
|
-
`AppContainer`'s own sizing (`content`=65ch, `wide`=90rem, `fluid`=100%, `full`=100vw), by
|
|
380
|
-
contrast, is one static value per variant — it doesn't itself respond to viewport width.
|
|
381
|
-
|
|
382
|
-
**Decision:** combine both deliberately, split by scope —
|
|
383
|
-
|
|
384
|
-
- **Viewport breakpoints** (the new custom scale from decision 2 above) decide macro/page-level
|
|
385
|
-
layout: which container size variant is active, grid-mode switches, nav collapse points,
|
|
386
|
-
structural decisions that need to know about the whole page/device.
|
|
387
|
-
- **Container queries** decide everything rendered inside `AppContainer` — since
|
|
388
|
-
`container-type: inline-size` is already there, any nested component responds to the
|
|
389
|
-
container's real width rather than the viewport's, which matters once a component can render
|
|
390
|
-
inside a sidebar, a modal, or a narrower section.
|
|
391
|
-
- `AppContainer`'s own max-width values become responsive across the new breakpoint tokens
|
|
392
|
-
(rather than one fixed value per size), while everything nested inside it uses `@container`
|
|
393
|
-
against `AppContainer`'s own box. Standard "outer responds to viewport, inner responds to its
|
|
394
|
-
own box" pattern, made deliberate instead of accidental.
|
|
395
|
-
|
|
396
|
-
**Third technique, combined with the two above**: fluid (`clamp()`) sizing for the size variants
|
|
397
|
-
themselves, extending the same pattern `typography.css`'s fluid type scale already proves out
|
|
398
|
-
(clamp scale + `-cq` container-relative variant + breakpoint-derived endpoints). Each technique
|
|
399
|
-
answers a different question:
|
|
400
|
-
|
|
401
|
-
- **Breakpoints** decide _which mode_ — which named size variant is active, when macro/structural
|
|
402
|
-
switches happen — and set the `clamp()` bounds themselves (the min/max endpoints).
|
|
403
|
-
- **`clamp()`** decides _how it moves within that mode_ — continuous scaling instead of an abrupt
|
|
404
|
-
jump at a hard breakpoint. E.g. `wide` becomes `clamp(65rem, 85vw, 90rem)` instead of a flat
|
|
405
|
-
`90rem`.
|
|
406
|
-
- **Container queries** decide how _descendants_ respond to `AppContainer`'s real rendered width,
|
|
407
|
-
independent of both of the above.
|
|
408
|
-
|
|
409
|
-
`AppContainer`'s size variants (`content`/`wide`/`fluid`/`full`) move from single fixed values to
|
|
410
|
-
`clamp()` expressions bounded by the new breakpoint tokens.
|
|
411
|
-
|
|
412
|
-
### `theme`/`visual` app.config + theming scope — resolved
|
|
413
|
-
|
|
414
|
-
No actual conflict between the two config surfaces — each has its own separate, real defect
|
|
415
|
-
instead.
|
|
416
|
-
|
|
417
|
-
- **`visual`'s `app.config.ts` uses the `uiLayer` namespace** — leftover from before this
|
|
418
|
-
gradient/accent-scene config was split out of the (now-dissolved) `ui` layer. Now orphaned:
|
|
419
|
-
config that lives in `visual` is namespaced under a layer name that no longer exists.
|
|
420
|
-
- **`theme`'s `app.config.ts` is a broken stub**: `{ themeLayer: {} }`, not even using
|
|
421
|
-
`defineAppConfig()`. Real consumers exist and expect it populated —
|
|
422
|
-
`useAccentColor.ts` reads `themeLayer.defaultAccent` (falls back to a hardcoded `'blue'` since
|
|
423
|
-
config provides nothing), `ThemePicker/Colors.vue` reads `themeLayer.accents` (falls back to
|
|
424
|
-
`[]`, picker renders empty by default). The type augmentation also lives in a separate file
|
|
425
|
-
(`types/app-config.d.ts`) instead of inside `app.config.ts` itself, violating the repo's own
|
|
426
|
-
documented rule that both must live together.
|
|
427
|
-
- This also resolves **`theming`'s functional scope**, decisively: `useTheme()` composes
|
|
428
|
-
`useAccentColor` + `useThemeContrast` + `useThemeMotion` + `useThemeTransparency`, backed by a
|
|
429
|
-
`theme-fouc.ts` server plugin for flash-prevention and a real `ThemePicker` UI. Already a
|
|
430
|
-
genuine runtime accessibility-preference system (accent color, contrast, motion, transparency —
|
|
431
|
-
each with `system`/`on`/`off` override), confirmed via code — not tokens-only, no scope
|
|
432
|
-
decision needed, just the rename.
|
|
433
|
-
|
|
434
|
-
**Decisions:**
|
|
435
|
-
|
|
436
|
-
1. Rename `visual`'s `uiLayer` config namespace → `visualLayer`.
|
|
437
|
-
2. Fix `theme`'s `app.config.ts`: real defaults for `accents`/`defaultAccent`, use
|
|
438
|
-
`defineAppConfig()`, move the type augmentation into the same file per the repo's own rule.
|
|
439
|
-
3. `theming` rename proceeds as previously confirmed — functional scope already correct as-is.
|
|
440
|
-
|
|
441
|
-
### `LayoutContainer` shim — delete
|
|
442
|
-
|
|
443
|
-
This redesign is already a breaking pass everywhere else (renaming `Container`→`AppContainer`,
|
|
444
|
-
deleting `ui` as a layer, deleting `HeadlineScreen`) — keeping one back-compat shim is
|
|
445
|
-
inconsistent. Delete `layout/Layout/Container.vue`; migrate its one real usage (playground demo)
|
|
446
|
-
directly to `<AppContainer>`.
|
|
447
|
-
|
|
448
|
-
### Font families for the `font` prop — resolved
|
|
449
|
-
|
|
450
|
-
No real webfont loading exists anywhere in the design system today. Default to system-font
|
|
451
|
-
stacks for `sans`/`mono`/`display` now — matches what `core/base.css` already does
|
|
452
|
-
(`font-family: system-ui, sans-serif`) — and defer real custom webfont choice to later,
|
|
453
|
-
non-blocking.
|
|
454
|
-
|
|
455
|
-
**Tier 0 and Tier 1 are both fully closed** — every open item above is resolved.
|
|
456
|
-
|
|
457
|
-
## Consolidated action list (Tier 0 + Tier 1)
|
|
458
|
-
|
|
459
|
-
- [x] `core`: flip `future.compatibilityVersion: 5`
|
|
460
|
-
- [x] `core`: audit `tsconfig.json` files repo-wide for `baseUrl` reliance
|
|
461
|
-
- [x] `core`: grep repo-wide for Options API stragglers (expect zero)
|
|
462
|
-
- [x] `core`: rename `Container.vue` → `AppContainer.vue` (all consumers migrated, shims deleted)
|
|
463
|
-
- [x] `core`: delete `assets/css-backup.zip`
|
|
464
|
-
- [x] `core`: read `base.css` + `layout.css` contents — both clean resets, correctly homed, no
|
|
465
|
-
action needed (see Tier 2 doc)
|
|
466
|
-
- [x] `core`: keep `useRendering` as-is (no action, decision recorded for traceability)
|
|
467
|
-
- [x] `core`: delete `plugins/feature-detection.client.ts`; `useFeatures` composable kept on-demand
|
|
468
|
-
- [x] `core`: delete `useScrollGuard` composable, `plugins/scroll-guard.client.ts`,
|
|
469
|
-
`types/scroll-guard.ts`; clamping decision logic ported to
|
|
470
|
-
`utils/scrollGuardClamp.ts` + `.test.ts`
|
|
471
|
-
- [x] `core`: `@vite-pwa/nuxt` module entry + `pwa: { workbox: {...} }` config block commented out;
|
|
472
|
-
`usePWAInfo`/`useCache` left in place, dormant
|
|
473
|
-
- [x] `baseline`: merge into `scripts` (not `core`) — see scope note at top of document
|
|
474
|
-
- [x] `core`: delete `plugins/init.ts` (dev-only console-log scaffolding, zero production value)
|
|
475
|
-
- [x] `core`: delete `composables/useEnv.ts` (no-op pass-through, consumers use
|
|
476
|
-
`useRuntimeConfig()` directly)
|
|
477
|
-
- [x] `core`: delete `utils/helpers.ts` (zero real usage repo-wide once `useScrollGuard` is gone)
|
|
478
|
-
- [x] `core`: delete `utils/regex.ts` (dead duplicate of `navigation/app/utils/regex.ts`)
|
|
479
|
-
- [x] `core`: remove dead commented-out `console.log` debug lines from `LoadingScreen.vue` and
|
|
480
|
-
`plugins/loading.client.ts`
|
|
481
|
-
- [x] `core`: add `<NuxtLoadingIndicator />` to `app.vue` (page-level nav progress; `LoadingScreen`
|
|
482
|
-
stays as the separate app-level boot splash)
|
|
483
|
-
- [x] `core`: finish `error.vue`'s real implementation (currently commented out, bare stub ships
|
|
484
|
-
in production) — uncomment and wire against the same UEmpty/actions pattern `[...slug].vue`
|
|
485
|
-
already proves out
|
|
486
|
-
- [x] `.claude/rules/nuxt-layers.md`: add the CSS single-build-root rule
|
|
487
|
-
- [x] Delete `ui` as a layer
|
|
488
|
-
- [x] Move `HStack.vue`, `VStack.vue`, `ZStack.vue`, `Spacer.vue` from `ui` → `layout`
|
|
489
|
-
- [x] Update `LayoutContainer` shim's internal `<Container>` reference → `<AppContainer>`
|
|
490
|
-
- [x] Delete `navigation/Mast/Main.vue`
|
|
491
|
-
- [x] Give `layout` its own real default layout using `LayoutMain`
|
|
492
|
-
- [x] Rename `.mastmain` CSS class repo-wide (candidate: `.grid-root`)
|
|
493
|
-
- [x] Rename `theme` layer → `theming`
|
|
494
|
-
- [x] Delete `layout/Layout/Page/Container.vue` — playground demo card for it removed (nothing
|
|
495
|
-
migrated onto `LayoutPage`; the card was pure documentation text, not a live usage)
|
|
496
|
-
- [x] `typography`: delete `HeadlineScreen.vue`
|
|
497
|
-
- [x] `typography`: add `font` prop infrastructure — `@theme` font tokens in `typography.css`,
|
|
498
|
-
`FontFamily` type, wire into `Typography/index.vue` + `useTypography`
|
|
499
|
-
- [x] `typography`: refactor `Headline`/`CodeBlock`/`QuoteBlock` to call `useTypography()`/
|
|
500
|
-
`useColor()` directly (own root element) instead of wrapping the `<Typography>` component;
|
|
501
|
-
give each the full canonical prop set in the process
|
|
502
|
-
- [x] `typography`: drop the manual `class: classProp` destructure pattern from `Headline` and
|
|
503
|
-
`CodeBlock`; rely on implicit `$attrs` class merging everywhere
|
|
504
|
-
- [x] `CodeBlock`: replace hardcoded `class="font-mono"` with `font="mono"` prop
|
|
505
|
-
- [x] `visual`: **finding corrected, not blindly executed** — `DeviceBreakpoint`/`PhoneBreakpoint`/
|
|
506
|
-
`TabletBreakpoint`/`DeviceOrientation` and their `*_VALUES` consts are NOT dead: real
|
|
507
|
-
consumers exist (`responsiveSizes.ts`'s `buildResponsiveSizesQueries()`, tested, wired into
|
|
508
|
-
`usePicture`/`Picture.vue`). Kept those. Deleted only the genuinely zero-consumer parts:
|
|
509
|
-
`BreakpointValues`/`BreakpointKey`/`BreakpointValue`, `DeviceBreakpointValues`/`Key`/`Value`,
|
|
510
|
-
`PhoneBreakpointValues`/`Key`/`Value`, `TabletBreakpointValues`/`Key`/`Value`,
|
|
511
|
-
`ORIENTATION_BREAKPOINTS`, `OrientationBreakpoints`, `AllBreakpoints` — derived helper
|
|
512
|
-
types/consts nobody imported.
|
|
513
|
-
- [x] `visual`/`core`: `BREAKPOINT_VALUES` already resolved — `sm`/`md`/`lg`/`xl` repoint at core's
|
|
514
|
-
`BREAKPOINT_PX` (768/1280 = 48rem/80rem, exactly `layout`'s grid thresholds) from the earlier
|
|
515
|
-
Phase 3 breakpoint migration. Only `2xl` (1536, no grid equivalent) stays hand-written. No
|
|
516
|
-
further change needed.
|
|
517
|
-
- [x] `layout`: formalize the 3 ad-hoc `fluid.css` container-query values (`30rem`/`44rem`/`52rem`)
|
|
518
|
-
into named tokens
|
|
519
|
-
- [x] `core`: convert `AppContainer`'s size variants (`content`/`wide`/`fluid`/`full`) from fixed
|
|
520
|
-
max-width values to `clamp()` expressions bounded by the new breakpoint tokens
|
|
521
|
-
- [x] `visual`: rename `app.config.ts`'s `uiLayer` namespace → `visualLayer`
|
|
522
|
-
- [x] `theme`/`theming`: fix `app.config.ts` — real `accents`/`defaultAccent` defaults, use
|
|
523
|
-
`defineAppConfig()`, move the `types/app-config.d.ts` augmentation into the same file
|
|
524
|
-
- [x] Delete `layout/Layout/Container.vue` (`LayoutContainer` back-compat shim); playground's
|
|
525
|
-
back-compat comparison card removed, live `<Container>` usage migrated to `<AppContainer>`
|
|
526
|
-
- [x] `typography`: default `font` prop's `sans`/`mono`/`display` tokens to system-font stacks
|
|
527
|
-
(real webfont choice deferred, non-blocking)
|
|
528
|
-
|
|
529
|
-
## Not yet covered
|
|
530
|
-
|
|
531
|
-
Tiers 2 (Structure), 3 (Content), 4 (Data), 5 (Motion), 6 (Render), 7 (Delivery), and the Tier
|
|
532
|
-
sub-layer/toggle mechanism design are separate passes, to be written up as follow-on sections or
|
|
533
|
-
documents.
|