@hegemonart/get-design-done 1.44.0 → 1.46.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.
@@ -0,0 +1,74 @@
1
+ # Responsive Design - Domain Index
2
+
3
+ This is the domain entry-point for responsive design. Load this file when the
4
+ interface will render in more than one locale, platform, or viewport condition.
5
+ It covers i18n engineering primitives, RTL and CJK cultural adaptation,
6
+ platform-specific conventions, native token bridging, and performance budgets.
7
+ It does not cover the CSS Grid implementation of responsive layouts (see
8
+ `reference/spatial.md` for container queries and `clamp()`); it does not cover
9
+ copy tone for localized content (see `reference/ux-writing.md`).
10
+
11
+ ---
12
+
13
+ ## Fragment Index
14
+
15
+ → **`reference/i18n.md`** (Phase 28) - use when localizing text: expansion
16
+ budgets (+30-40%), CSS logical props, `Intl.*` APIs, ICU MessageFormat,
17
+ bidi isolation, Unicode normalization, multi-script font stacks
18
+
19
+ → **`reference/rtl-cjk-cultural.md`** (Phase 28) - use when targeting RTL
20
+ locales or CJK audiences: layout mirroring rules, bidirectional text isolation,
21
+ Arabic/Hebrew/Devanagari rendering, cultural color meanings and imagery norms
22
+
23
+ → **`reference/platforms.md`** (Phase 19) - use when targeting multiple
24
+ platforms: iOS/Android/web/visionOS/watchOS nav patterns, safe area insets,
25
+ gesture vocabularies, haptics, native typography conventions
26
+
27
+ → **`reference/native-platforms.md`** (Phase 34.1) - use when bridging design
28
+ tokens to native code: canonical CSS token to SwiftUI Color / Compose Color /
29
+ Flutter ThemeData mapping, precision contract for the round-trip
30
+
31
+ → **`reference/performance.md`** (Phase 19) - use for any production
32
+ responsive build: Core Web Vitals budgets by project type, JS/font/image
33
+ budgets, React runtime perf rules
34
+
35
+ → **`reference/css-grid-layout.md`** (Phase 18) - load the container-queries
36
+ and `clamp()` sections only: fluid responsive components, safe-area insets,
37
+ logical CSS props in Grid context
38
+
39
+ ---
40
+
41
+ ## Rules of Thumb
42
+
43
+ **1. Size containers for the worst-case expansion locale.**
44
+ Russian and Finnish strings expand +40% from an English baseline. Any text
45
+ container designed at English width will overflow in those locales. Build for
46
+ `EN base x 1.4` as the standard layout-budget rule; top-aligned labels absorb
47
+ expansion without horizontal breakage.
48
+
49
+ **2. CSS logical properties are the implementation primitive for RTL.**
50
+ Never use `left`/`right` in a layout that will need to mirror. Replace
51
+ `margin-left` with `margin-inline-start`, `padding-right` with
52
+ `padding-inline-end`, and positioned `left` with `inset-inline-start`. The full
53
+ mapping is in `reference/rtl-cjk-cultural.md`.
54
+
55
+ **3. `prefers-reduced-motion` is a responsive property, not optional.**
56
+ Any animation behind a media query must resolve to `transition: none` or
57
+ `animation-duration: 0.01ms` when the user has set OS-level reduced-motion.
58
+ The CSS reset pattern is in `reference/motion.md`.
59
+
60
+ **4. Native token precision contract: no re-derivation in component code.**
61
+ Color hex values bridge to native at 8-bit channel precision (no rounding).
62
+ Dimension px values bridge as integer dp/pt. The token-bridge round-trip in
63
+ `reference/native-platforms.md` is the source of truth - any re-derivation
64
+ in component code will drift from the canonical value.
65
+
66
+ ---
67
+
68
+ ## Cross-Domain See Also
69
+
70
+ - i18n text expansion affects type container sizing: `reference/typography.md`
71
+ - Touch targets differ from pointer targets: `reference/interaction.md`
72
+ - Layout shifts at breakpoints: `reference/spatial.md`
73
+ - OS-level reduced-motion links to animation rules: `reference/motion.md`
74
+ - Civic multi-language government forms: `reference/domains/civic-patterns.md`
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: skill-metadata
3
+ type: meta-rules
4
+ version: 1.0.0
5
+ phase: 46
6
+ tags: [skill, metadata, frontmatter, single-source-of-truth, generator, description-budget]
7
+ last_updated: 2026-06-02
8
+ ---
9
+
10
+ # Skill Metadata Single Source of Truth
11
+
12
+ `scripts/lib/manifest/skills.json` is the one place skill frontmatter is authored. A
13
+ generator projects it onto every `source/skills/<id>/SKILL.md`, the build step compiles
14
+ those into the shipped trees, and CI gates keep the three copies identical. This doc
15
+ explains the file, the generator, and the description budget. For the structural rules a
16
+ SKILL.md body must follow (line cap, progressive disclosure, frontmatter required fields),
17
+ see `./skill-authoring-contract.md`.
18
+
19
+ ## What skills.json is
20
+
21
+ The file is a JSON object: a `schema_version` integer and a `skills` array. Each array
22
+ element is one skill record. Only `name` is required (it must equal the
23
+ `source/skills/<id>/` directory name); every other field is optional and omitted when it
24
+ has no value.
25
+
26
+ ```json
27
+ {
28
+ "schema_version": 1,
29
+ "skills": [
30
+ {
31
+ "name": "health",
32
+ "description": "Reports .design/ artifact health - staleness, missing files, token drift, broken state transitions.",
33
+ "tools": "Read, Bash, Glob, Grep, mcp__gdd_state__get",
34
+ "disable_model_invocation": true
35
+ }
36
+ ]
37
+ }
38
+ ```
39
+
40
+ Recognized record fields: `name`, `description`, `argument_hint`, `tools`,
41
+ `user_invocable`, `disable_model_invocation`, `frontmatter_name` (the `name:` value when it
42
+ is not the default `gdd-<id>`), `extra_frontmatter` (see below), plus `registered_in_phase`
43
+ and `aliases`, which live only in the manifest and never round-trip to frontmatter. The
44
+ schema at `scripts/lib/manifest/schemas/skills.schema.json` validates the shape.
45
+
46
+ ## The build chain
47
+
48
+ Metadata flows in one direction, and a `*:check` gate guards each hop:
49
+
50
+ ```text
51
+ skills.json
52
+ -> generate-skill-frontmatter (npm run generate:skill-frontmatter)
53
+ -> source/skills/<id>/SKILL.md
54
+ -> build:skills (npm run build:skills)
55
+ -> skills/ + dist/claude-code/
56
+ ```
57
+
58
+ `scripts/generate-skill-frontmatter.cjs` rewrites only the frontmatter block of each
59
+ `SKILL.md`, never the markdown body. It has three modes:
60
+
61
+ - forward (no flag): manifest to frontmatter. The default.
62
+ - `--extract`: the reverse direction, reading current frontmatter back into `skills.json`
63
+ to seed or refresh the source of truth. Idempotent with forward.
64
+ - `--check`: the CI drift gate. It writes nothing and exits non-zero when any committed
65
+ frontmatter differs from what the manifest would generate.
66
+
67
+ `scripts/build-skills.cjs` then propagates `source/skills/` into the committed `skills/`
68
+ tree and `dist/claude-code/`; its own check mode asserts that the built output equals the
69
+ committed output. So the contract is: edit `skills.json`, regenerate, build. Never
70
+ hand-edit a managed frontmatter line in `SKILL.md`, because the drift gate will fail.
71
+
72
+ ## Managed vs preserved fields
73
+
74
+ The generator owns six frontmatter keys and emits them in this canonical order whenever the
75
+ record carries a value:
76
+
77
+ 1. `name`
78
+ 2. `description`
79
+ 3. `argument-hint`
80
+ 4. `tools`
81
+ 5. `user-invocable`
82
+ 6. `disable-model-invocation`
83
+
84
+ String values for `description` and `argument-hint` are always double-quoted on emit, so
85
+ quoting stays uniform across every skill. Anything outside these six keys is not managed.
86
+ The generator carries it verbatim in the record's `extra_frontmatter` array and re-emits it
87
+ after the managed block. The `quality-gate` skill is the working example: its `color`,
88
+ `model`, `default-tier`, `size_budget`, `parallel-safe`, `typical-duration-seconds`,
89
+ `reads-only`, and multi-line `writes:` block all live in `extra_frontmatter` and survive
90
+ every regeneration untouched.
91
+
92
+ ## Description budget
93
+
94
+ Every `description` must be at least 20 and at most 1024 characters. Two validators enforce
95
+ the ceiling in CI:
96
+
97
+ - `scripts/validate-skill-length.cjs` treats `DESC_MAX = 1024` as a blocker (it also blocks
98
+ under 20 characters as under-specification) and is the Phase 28.5 authoring-contract gate.
99
+ - `scripts/lint-agentskills-spec.cjs` rule R4 applies the same 1024-character hard cap from
100
+ the agentskills.io spec angle, and warns past 200 characters.
101
+
102
+ Phase 46 keeps that contract intact and wires `npm run lint:agentskills` in as its own
103
+ explicit CI gate, so the spec lint runs on every change rather than only in-process via the
104
+ doctor aggregator.
105
+
106
+ ## How pin consumes it
107
+
108
+ The `pin`, `unpin`, and `list-pins` skills shipping in this phase read `description`,
109
+ `argument_hint`, and `tools` straight from `skills.json`. That manifest is the pin metadata
110
+ catalogue: the pin surface never live-scrapes a `SKILL.md` or re-derives a description at
111
+ runtime. Reading one structured file keeps pin output consistent with what the generator
112
+ emits, and the `aliases` array is reserved for the pin shortcuts those skills honor.
113
+
114
+ ## See also
115
+
116
+ - `./skill-authoring-contract.md` for the SKILL.md line cap, description-format guidance,
117
+ required frontmatter fields, and progressive-disclosure rule.
@@ -0,0 +1,38 @@
1
+ # Spatial - Composition, Grid, and Perceptual Organization
2
+
3
+ Spatial design governs how elements are placed, sized, and related in two-dimensional
4
+ space: composition principles (rule of thirds, focal point, eye-flow), proportion
5
+ derivation (baseline grid, spacing ladder), CSS implementation (Grid, container queries,
6
+ clamp), visual hierarchy, Gestalt grouping, and data presentation. Read this file first,
7
+ then load the specific fragment for the task at hand. Does not cover 3D depth signaling
8
+ via color/shadow as a color decision (see `color.md`) or responsive layout shifts driven
9
+ by locale/platform (see `responsive.md`).
10
+
11
+ ## Fragment Index
12
+
13
+ | Fragment | When to load |
14
+ |---|---|
15
+ | [`./composition.md`](./composition.md) | choosing a compositional grid (rule of thirds, root rectangles, Fibonacci), placing a focal point, deciding eye-flow archetype (Z / F / Gutenberg) |
16
+ | [`./proportion-systems.md`](./proportion-systems.md) | deriving the baseline grid unit, spacing ladder, icon sizing, corner radius from a single multiplier (4pt / 8pt / sqrt(2)) |
17
+ | [`./css-grid-layout.md`](./css-grid-layout.md) | implementing CSS Grid templates, subgrid, container queries, `clamp()` fluid type, logical props, anchor positioning |
18
+ | [`./visual-hierarchy-layout.md`](./visual-hierarchy-layout.md) | ordering elements by importance: Z-order, whitespace rules, shadow depth, 24 landing archetypes |
19
+ | [`./gestalt.md`](./gestalt.md) | auditing perceptual grouping: proximity, similarity, continuity, closure, figure/ground - 8 principles with scoring rubrics |
20
+ | [`./image-optimization.md`](./image-optimization.md) | images in layout: format matrix, srcset/sizes math, LQIP/BlurHash, CDN transforms, image budget |
21
+ | [`./data-visualization.md`](./data-visualization.md) | charts/dashboards: 25-type chart-choice matrix, color-blind palettes, axis conventions, UUPM dashboard patterns |
22
+ | [`./surfaces.md`](./surfaces.md) | surface treatments: concentric radius formula, optical alignment, 3-layer shadow system, hit area sizing |
23
+
24
+ ## Rules of Thumb
25
+
26
+ 1. Place primary CTAs on the rule-of-thirds power points (the 33%/67% intersections), not dead-center. Centered heroes are the intentional exception, not the default.
27
+ 2. Choose one baseline unit for the whole product (4pt, 8pt, or sqrt(2)) and author every spacing, sizing, and radius token as a multiple of it. No one-off values.
28
+ 3. CSS Grid container queries (`@container`) should replace media queries for component-level layout. Reserve media queries for page-level breakpoints only.
29
+ 4. Gestalt proximity rule: related controls 8px apart or less; unrelated groups 32px apart or more. The layout should communicate relationships before the user reads labels.
30
+ 5. Choose the chart type before the color palette. The wrong chart type cannot be rescued by a better palette. Use `data-visualization.md` chart-choice matrix first.
31
+
32
+ ## See Also
33
+
34
+ - Shadow and elevation as color/depth signal: [`./color.md`](./color.md)
35
+ - Type scale ties into spatial proportion grid: [`./typography.md`](./typography.md)
36
+ - Responsive layout shifts at breakpoints: [`./responsive.md`](./responsive.md)
37
+ - Gestalt grouping informs information architecture: [`./interaction.md`](./interaction.md)
38
+ - Gaming: TV-safe area constraints: [`./domains/gaming-patterns.md`](./domains/gaming-patterns.md)
@@ -1,5 +1,34 @@
1
1
  # Typography - Scale, Pairing, and Hierarchy
2
2
 
3
+ This file is the domain index for typography. It covers type-scale construction,
4
+ weight hierarchy, font pairing, and micro-typography. Read `variable-fonts-loading.md`
5
+ when web fonts are in scope. Read `proportion-systems.md` when the full UI grid is
6
+ in scope. Does not cover text-contrast (see `color.md`) or locale text expansion
7
+ (see `responsive.md`, which indexes [`./i18n.md`](./i18n.md) for the per-locale expansion budgets).
8
+
9
+ ## Fragment Index
10
+
11
+ | Fragment | When to load |
12
+ |---|---|
13
+ | This file (below) | type scale ratios, sizing tokens, weight hierarchy, font pairings, micro-typography |
14
+ | [`./variable-fonts-loading.md`](./variable-fonts-loading.md) | web fonts, `@font-face`, `font-display`, FOIT/FOUT, variable font axes, subsetting, fallback metrics |
15
+ | [`./proportion-systems.md`](./proportion-systems.md) | 4pt/8pt/sqrt(2) baseline grid, spacing ladder, icon sizing, corner radius derivation |
16
+
17
+ ## Rules of Thumb
18
+
19
+ 1. A 1.25 (Major Third) or 1.333 (Perfect Fourth) ratio fits 95% of SaaS products; only reach for 1.618 when visual drama is the explicit brief.
20
+ 2. Never author `line-height` as a pixel value - always use a unitless multiplier (1.4-1.6 for body, 1.1-1.2 for headings); unitless values scale with user font-size overrides.
21
+ 3. Font weight on the web has only 7 meaningful stops (100-700 in 100-steps); any weight not in the font file rounds to the nearest available - check the variable font `wght` range before specifying 450 or 600.
22
+ 4. Baseline-grid lock: every spacing and sizing token should be a multiple of the chosen baseline unit; `padding: 12px` next to body at `16/24` on an 8pt grid is a silent proportion break.
23
+ 5. For localized UIs, size type containers for +40% expansion (Russian/Finnish worst-case); top-aligned labels are the only label position that absorbs expansion without layout breakage.
24
+
25
+ ## See Also
26
+
27
+ - Text contrast and color-blindness checks: [`./color.md`](./color.md)
28
+ - Text expansion in localized UIs: [`./responsive.md`](./responsive.md)
29
+ - Proportion systems tie type to spatial grid: [`./spatial.md`](./spatial.md)
30
+ - Finance number formatting (tabular-nums): [`./domains/finance-patterns.md`](./domains/finance-patterns.md)
31
+
3
32
  ---
4
33
 
5
34
  ## Type Scale Systems
@@ -35,7 +64,7 @@ Choose a ratio and base size. Common ratios:
35
64
 
36
65
  Never create a scale ad-hoc. Pick one ratio, generate the scale, use only values in the scale.
37
66
 
38
- **See:** [`./proportion-systems.md`](./proportion-systems.md) §Modular Relationships for how the type scale ties to spacing / sizing / radius scales - when one ratio drives all four scales the whole UI gains a single rhythm rather than four independently-tuned progressions.
67
+ **See:** [`./proportion-systems.md`](./proportion-systems.md) for how the type scale ties to spacing / sizing / radius scales.
39
68
 
40
69
  ---
41
70
 
@@ -43,11 +72,11 @@ Never create a scale ad-hoc. Pick one ratio, generate the scale, use only values
43
72
 
44
73
  | Context | Line height | Notes |
45
74
  |---|---|---|
46
- | Body text | **1.5 1.75** | More generous = more readable |
47
- | Headings | **1.1 1.3** | Tight heading stacks look intentional |
75
+ | Body text | **1.5 - 1.75** | More generous = more readable |
76
+ | Headings | **1.1 - 1.3** | Tight heading stacks look intentional |
48
77
  | Captions / small text | **1.4** | Smaller text needs more breathing room |
49
- | Code blocks | **1.6 1.8** | Line scanning for code |
50
- | Display / hero | **0.9 1.1** | Can go very tight for dramatic effect |
78
+ | Code blocks | **1.6 - 1.8** | Line scanning for code |
79
+ | Display / hero | **0.9 - 1.1** | Can go very tight for dramatic effect |
51
80
 
52
81
  ---
53
82
 
@@ -55,9 +84,9 @@ Never create a scale ad-hoc. Pick one ratio, generate the scale, use only values
55
84
 
56
85
  | Context | Characters per line | Notes |
57
86
  |---|---|---|
58
- | Desktop body | **65 75 chars** | Optimal reading comfort |
59
- | Mobile body | **35 55 chars** | Narrower viewport forces shorter |
60
- | Hero/display | **35 55 chars** | Headings should never wrap awkwardly |
87
+ | Desktop body | **65 - 75 chars** | Optimal reading comfort |
88
+ | Mobile body | **35 - 55 chars** | Narrower viewport forces shorter |
89
+ | Hero/display | **35 - 55 chars** | Headings should never wrap awkwardly |
61
90
  | Data/tables | No limit | Tables have own structure |
62
91
 
63
92
  Enforce with `max-width`: `65ch` for body containers works with any font size.
@@ -68,13 +97,13 @@ Enforce with `max-width`: `65ch` for body containers works with any font size.
68
97
 
69
98
  | Role | Weight | Notes |
70
99
  |---|---|---|
71
- | Display headings | **700 900** | Bold commands attention |
72
- | Page headings | **600 700** | Strong but not display-level |
73
- | Section headings | **500 600** | Distinguish from body |
100
+ | Display headings | **700 - 900** | Bold commands attention |
101
+ | Page headings | **600 - 700** | Strong but not display-level |
102
+ | Section headings | **500 - 600** | Distinguish from body |
74
103
  | Body text | **400** | Regular - no emphasis weight |
75
104
  | UI labels | **500** | Slightly heavier than body |
76
105
  | Captions | **400** | Regular - size reduces emphasis |
77
- | Monospace code | **400 500** | |
106
+ | Monospace code | **400 - 500** | |
78
107
 
79
108
  **Rule**: Never use `font-weight: 300` (light) on small text. It becomes illegible below 16px.
80
109
 
@@ -127,7 +156,7 @@ Enforce with `max-width`: `65ch` for body containers works with any font size.
127
156
 
128
157
  **All caps body text** - reserved for: labels, badges, category markers, short UI labels only. Never for sentences or paragraphs.
129
158
 
130
- **Inconsistent tracking** - only use `letter-spacing` intentionally. Positive tracking on uppercase labels is fine. Negative tracking on small body text reduces readability. Random tracking changes across components signal lack of system.
159
+ **Inconsistent tracking** - only use `letter-spacing` intentionally. Positive tracking on uppercase labels is fine. Negative tracking on small body text reduces readability.
131
160
 
132
161
  ---
133
162
 
@@ -136,8 +165,8 @@ Enforce with `max-width`: `65ch` for body containers works with any font size.
136
165
  | Use case | letter-spacing |
137
166
  |---|---|
138
167
  | Body text | `0` (default) |
139
- | Uppercase labels / badges | `0.05em 0.1em` |
140
- | Display headings | `−0.02em 0.01em` |
168
+ | Uppercase labels / badges | `0.05em - 0.1em` |
169
+ | Display headings | `-0.02em - 0.01em` |
141
170
  | Monospace code | `0` or slight positive |
142
171
 
143
172
  ---
@@ -174,68 +203,19 @@ Test: Can you tell which element is a heading just from the weight/family, witho
174
203
 
175
204
  ## Brand Archetype Quick Guide
176
205
 
177
- Pick the archetype closest to the project brief; use the recommended pairing
178
- as a starting point (adjust for specific constraints).
179
-
180
206
  | Archetype | Character | Recommended Pairing |
181
207
  |-----------|-----------|---------------------|
182
208
  | SaaS / productivity | clear, neutral, utilitarian | Inter (UI) + Inter (body) - single family |
183
209
  | Consumer / editorial | warm, opinionated, expressive | Fraunces or GT Sectra (display) + Inter (body) |
184
210
  | Enterprise / finance | authoritative, conservative | IBM Plex Sans (UI) + IBM Plex Serif (body) |
185
211
  | Developer tools | technical, efficient | Geist (UI) + Geist Mono (code) |
186
- | Bold / expressive | high-energy, distinctive | Söhne or Mona Sans (display) + Inter (body) |
187
-
188
- **Selection heuristic:** If the brief uses words like "professional", "trustworthy", "clean" → SaaS or Enterprise. If "warm", "editorial", "narrative" → Consumer. If "bold", "energetic", "distinctive" → Bold. If "technical", "efficient", "fast" → Dev tools.
189
-
190
- ---
191
-
192
- ## Variable Fonts
193
-
194
- Variable fonts expose typographic axes that can be animated or set per-context
195
- via `font-variation-settings`. Prefer variable fonts over static family fallbacks
196
- when available - one file covers all weights and widths.
197
-
198
- ### Common axes
199
-
200
- | Axis | Range | Purpose |
201
- |------|-------|---------|
202
- | wght | 100–900 | Weight (Thin → Black) |
203
- | wdth | 50%–150% | Width (Condensed → Extended) |
204
- | ital | 0 / 1 | Italic toggle (discrete in most) |
205
- | opsz | font-size value | Optical size (auto-applies when `font-optical-sizing: auto`) |
206
-
207
- ### @font-face format
208
-
209
- ```css
210
- @font-face {
211
- font-family: 'InterVariable';
212
- src: url('/fonts/InterVariable.woff2') format('woff2-variations');
213
- font-weight: 100 900;
214
- font-style: normal;
215
- }
216
- ```
217
-
218
- ### Usage via font-variation-settings
219
-
220
- ```css
221
- .heading { font-variation-settings: "wght" 700, "opsz" 32; }
222
- .body { font-variation-settings: "wght" 400; }
223
- ```
224
-
225
- ### Fallback strategy
226
-
227
- Always include a non-variable fallback of the same family in the font stack:
228
-
229
- ```css
230
- font-family: 'InterVariable', 'Inter', -apple-system, system-ui, sans-serif;
231
- ```
212
+ | Bold / expressive | high-energy, distinctive | Sohne or Mona Sans (display) + Inter (body) |
232
213
 
233
- **See:** [`./i18n.md`](./i18n.md) §Multi-Script Font Stacks for when a multi-script project should ship weighted-static fonts rather than a single variable font (some scripts ship as static-only families; mixing scripts in a single variable file is rarely viable).
214
+ **Selection heuristic:** If the brief uses words like "professional", "trustworthy", "clean" use SaaS or Enterprise. If "warm", "editorial", "narrative" use Consumer. If "bold", "energetic", "distinctive" use Bold. If "technical", "efficient", "fast" use Dev tools.
234
215
 
235
216
  ---
236
217
 
237
218
  ## Micro-Typography
238
- Source: jakubkrehel/make-interfaces-feel-better (MIT) - typography.md
239
219
 
240
220
  ### text-wrap
241
221
 
@@ -254,7 +234,7 @@ Apply antialiasing at root level only:
254
234
  -moz-osx-font-smoothing: grayscale;
255
235
  }
256
236
  ```
257
- Never apply per-element - this creates inconsistency within a single text block and is one of the most common micro-typography mistakes. The antialiased value makes text appear slightly thinner/lighter, which is generally preferred for UI type at modern screen densities.
237
+ Never apply per-element - this creates inconsistency within a single text block.
258
238
 
259
239
  ### Tabular numerals
260
240
 
@@ -262,52 +242,4 @@ Use tabular-nums on any surface where numbers change dynamically or need to alig
262
242
  ```css
263
243
  .counter, .price, .timer, .table-cell { font-variant-numeric: tabular-nums; }
264
244
  ```
265
- Proportional numerals (the default) cause text to shift width when numbers change, creating a distracting jitter in timers and prices. Exception: Inter's `1` character widens slightly with tabular-nums - test at your numeric composition before committing.
266
-
267
- ## Font Pairings Catalog
268
- Source: nextlevelbuilder/ui-ux-pro-max-skill (MIT) - data/typography.csv
269
-
270
- 57 professionally curated pairings grouped by use-case vertical. For font loading, see `reference/data/google-fonts.csv` for the full 1923-font reference.
271
-
272
- ### SaaS / Productivity
273
- - **Inter + Inter** (mono weight hierarchy) - The "safe default" for app UIs. Use regular (400) for body, medium (500) for labels, semibold (600) for headings. Consistent x-height, excellent at small sizes.
274
- - **Inter + JetBrains Mono** - For dev tools and dashboards with code display. JetBrains Mono has excellent legibility at 12-14px.
275
- - **Geist Sans + Geist Mono** - Vercel's pair; clean, modern, designed together.
276
- - **Outfit + DM Mono** - Friendly SaaS feel with clear code fallback.
277
-
278
- ### Consumer / Marketing
279
- - **Satoshi + Cabinet Grotesk** - High-energy, modern consumer feel.
280
- - **Plus Jakarta Sans + Syne** - Playful but legible; works for creative consumer apps.
281
- - **DM Sans + DM Serif Display** - Classic pairing; editorial headers, clean body.
282
- - **Nunito + Source Code Pro** - Approachable and friendly.
283
-
284
- ### Finance / Enterprise
285
- - **IBM Plex Sans + IBM Plex Mono** - Authoritative, systematic, designed for data-heavy interfaces.
286
- - **Source Sans 3 + Source Code Pro** - Adobe's workhorse pair; widely trusted.
287
- - **Lato + Roboto Mono** - Clean, neutral enterprise pair.
288
-
289
- ### Editorial / Publishing
290
- - **Playfair Display + Source Serif 4** - High contrast serif headers with readable body serif.
291
- - **Cormorant Garamond + Proza Libre** - Elegant luxury/editorial tone.
292
- - **Libre Baskerville + Libre Franklin** - Free-license editorial pair.
293
- - **EB Garamond + Lato** - Classic print feel with modern body.
294
-
295
- ### Wellness / Health
296
- - **Nunito + Nunito Sans** - Soft, approachable, consistent x-height.
297
- - **Quicksand + Work Sans** - Rounded, friendly, healthcare-appropriate.
298
- - **Raleway + Open Sans** - Clean and welcoming.
299
-
300
- ### Dev Tools
301
- - **JetBrains Mono + Inter** - Code-first, UI-second; natural for developer tools.
302
- - **Fira Code + Fira Sans** - Cohesive family; ligatures available.
303
- - **Cascadia Code + Segoe UI** - Microsoft's modern dev pair.
304
-
305
- ### Luxury / Fashion
306
- - **Cormorant + Montserrat** - High contrast serif + geometric sans; classic luxury.
307
- - **Bodoni Moda + Jost** - Fashion editorial feel.
308
- - **Playfair Display + Raleway** - Elegant header + clean body.
309
-
310
- ### Gaming / Entertainment
311
- - **Syne + DM Sans** - Bold, energetic headers; clean readable body.
312
- - **Bebas Neue + Open Sans** - Impact headlines; neutral body.
313
- - **Exo 2 + Roboto** - Futuristic but readable.
245
+ Proportional numerals (the default) cause text to shift width when numbers change, creating jitter in timers and prices. Exception: Inter's `1` character widens slightly with tabular-nums - test at your numeric composition before committing.
@@ -0,0 +1,60 @@
1
+ # UX Writing - Domain Index
2
+
3
+ This is the domain entry-point for UX writing. Load this file when the task
4
+ involves voice, tone, or the copy standards that govern text a user reads in
5
+ the product: button labels, error messages, empty states, onboarding copy, and
6
+ microcopy. It does not cover the engineering side of localization (see
7
+ `reference/responsive.md` for string expansion budgets and `Intl.*` APIs); it
8
+ does not cover label position in forms or information architecture (see
9
+ `reference/interaction.md`).
10
+
11
+ ---
12
+
13
+ ## Fragment Index
14
+
15
+ → **`reference/brand-voice.md`** (Phase 24) - use when establishing or
16
+ auditing tone: 6 voice axes (Formal-Casual, Serious-Playful, etc.), 12
17
+ archetypes, tone-by-context matrix, industry-context palettes
18
+
19
+ → **`reference/style-vocabulary.md`** (Phase 24) - use when confirming an
20
+ aesthetic direction has a compatible voice register: the `Avoid For` column
21
+ cross-checks brand fit; `Best For` confirms product-type alignment
22
+
23
+ → **`reference/anti-patterns.md`** - use when auditing existing copy: the
24
+ BAN/SLOP grep patterns surface copy violations (AI-tells, filler phrases)
25
+ alongside visual ones
26
+
27
+ ---
28
+
29
+ ## Rules of Thumb
30
+
31
+ **1. Voice axes are independent from archetypes.**
32
+ Pick a position on each of the 6 axes first (Formal-Casual, Serious-Playful,
33
+ Authoritative-Supportive, and so on), then layer an archetype on top. The
34
+ archetype does not determine the axis position - they are orthogonal dimensions
35
+ in `reference/brand-voice.md`.
36
+
37
+ **2. Never use placeholder text as the sole label for a form field.**
38
+ It disappears on focus, fails WCAG 1.3.5, and collapses under translation.
39
+ Top-aligned labels are the only position that absorbs localization expansion
40
+ without breaking layout.
41
+
42
+ **3. Error messages follow a three-clause structure: what happened, why, what
43
+ to do.**
44
+ State the event in past tense, explain the cause in one clause, give a present
45
+ tense imperative for recovery. No tech jargon. Never blame the user.
46
+
47
+ **4. Shift toward supportive tone during error, empty-state, and onboarding
48
+ moments.**
49
+ Even a formally-voiced product should move on the axis toward supportive when
50
+ the user is at risk of abandonment. The per-context tone matrix in
51
+ `reference/brand-voice.md` provides the exact adjustment.
52
+
53
+ ---
54
+
55
+ ## Cross-Domain See Also
56
+
57
+ - String expansion budgets constrain copy length: `reference/responsive.md`
58
+ - Error copy paired with form patterns: `reference/interaction.md`
59
+ - Empty-state copy pairs with onboarding pattern: `reference/interaction.md`
60
+ - Style direction voice register cross-check: `reference/style-vocabulary.md`
@@ -24,7 +24,48 @@
24
24
  "properties": {
25
25
  "name": {
26
26
  "type": "string",
27
- "minLength": 1
27
+ "minLength": 1,
28
+ "description": "Skill id = source/skills/<name>/ directory name."
29
+ },
30
+ "frontmatter_name": {
31
+ "type": "string",
32
+ "description": "Frontmatter name: value when it is not the default gdd-<name>."
33
+ },
34
+ "description": {
35
+ "type": "string",
36
+ "minLength": 20,
37
+ "maxLength": 1024,
38
+ "description": "Skill description (Phase 28.5 budget: 20..1024 chars)."
39
+ },
40
+ "argument_hint": {
41
+ "type": "string"
42
+ },
43
+ "tools": {
44
+ "type": "string",
45
+ "description": "Comma-separated allow-list emitted as the frontmatter tools: line."
46
+ },
47
+ "user_invocable": {
48
+ "type": "boolean"
49
+ },
50
+ "disable_model_invocation": {
51
+ "type": "boolean"
52
+ },
53
+ "registered_in_phase": {
54
+ "type": "string"
55
+ },
56
+ "aliases": {
57
+ "type": "array",
58
+ "items": {
59
+ "type": "string"
60
+ },
61
+ "description": "Reserved for pin shortcuts; honored by the pin metadata catalogue."
62
+ },
63
+ "extra_frontmatter": {
64
+ "type": "array",
65
+ "items": {
66
+ "type": "string"
67
+ },
68
+ "description": "Non-managed frontmatter lines preserved verbatim (color, model, writes:, ...)."
28
69
  }
29
70
  }
30
71
  }