forgedock 1.0.17 → 1.0.19

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.
Files changed (134) hide show
  1. package/README.md +34 -1
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +229 -17
  4. package/commands/autopilot.md +77 -0
  5. package/commands/design-bench.md +176 -0
  6. package/commands/design-render-critique-loop.md +103 -0
  7. package/commands/design.md +259 -0
  8. package/commands/issue.md +7 -3
  9. package/commands/orchestrate.md +121 -0
  10. package/commands/{resume.md → pipeline-resume.md} +4 -4
  11. package/commands/{status.md → pipeline-status.md} +1 -1
  12. package/commands/qa-sweep.md +37 -2
  13. package/commands/quality-gate.md +57 -0
  14. package/commands/review-pr-staging.md +158 -2
  15. package/commands/test-gate.md +929 -0
  16. package/commands/work-on/build/implement.md +5 -3
  17. package/commands/work-on.md +53 -3
  18. package/docs/CI.md +177 -0
  19. package/docs/FORGE-PROTOCOL.md +324 -0
  20. package/docs/articles/b-vs-c-baseline.md +210 -0
  21. package/docs/articles/full-abc-benchmark.md +205 -0
  22. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  23. package/docs/design/abc-benchmark.md +195 -0
  24. package/docs/design/design-architect-rationale.md +123 -0
  25. package/docs/design/design-memory.md +61 -0
  26. package/docs/design/design-spec-schema.md +248 -0
  27. package/docs/design/design-system-lint.md +150 -0
  28. package/docs/design/divergent-generation.md +106 -0
  29. package/docs/design/effects-appropriateness.md +133 -0
  30. package/docs/design/fixtures/briefs/README.md +47 -0
  31. package/docs/design/fixtures/briefs/cadence.md +39 -0
  32. package/docs/design/fixtures/briefs/plume.md +39 -0
  33. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  34. package/docs/design/fixtures/briefs/tender.md +39 -0
  35. package/docs/design/fixtures/briefs/voltage.md +39 -0
  36. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  37. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  38. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  39. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  40. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  41. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  42. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  43. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  44. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  45. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  46. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  47. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  48. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  49. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  50. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  51. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  52. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  53. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  54. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  55. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  56. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  57. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  58. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  59. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  60. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  61. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  62. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  63. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  64. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  65. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  66. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  67. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  68. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  69. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  70. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  71. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  72. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  73. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  74. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  75. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  76. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  77. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  78. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  79. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  80. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  81. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  82. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  83. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  84. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  85. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  86. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  87. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  88. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  89. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  90. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  91. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  92. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  93. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  94. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  95. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  96. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  97. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  98. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  99. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  100. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  101. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  102. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  103. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  104. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  105. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  106. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  107. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  108. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  109. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  110. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  111. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  112. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  113. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  114. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  115. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  116. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  117. package/docs/design/foundations/brutalist.css +294 -0
  118. package/docs/design/foundations/editorial.css +300 -0
  119. package/docs/design/foundations/minimal-luxury.css +295 -0
  120. package/docs/design/foundations/technical.css +293 -0
  121. package/docs/design/foundations/warm-photo.css +299 -0
  122. package/docs/design/reference-corpus.md +1726 -0
  123. package/docs/design/render-critique-loop.md +57 -0
  124. package/docs/spec-graph-schema.md +397 -0
  125. package/package.json +1 -1
  126. package/scripts/bench-scorecard.mjs +239 -0
  127. package/scripts/build-spec-graph.mjs +509 -0
  128. package/scripts/check-native-conflicts.sh +200 -0
  129. package/scripts/classify-lane.sh +0 -7
  130. package/scripts/design-system-lint.mjs +993 -0
  131. package/scripts/graph-query.sh +486 -0
  132. package/scripts/transition-label.sh +10 -2
  133. package/scripts/validate-spec-graph.sh +423 -0
  134. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,294 @@
1
+ /*
2
+ * brutalist.css — Foundation for the bold-brutalist archetype
3
+ *
4
+ * Archetype ID: bold-brutalist
5
+ * Craft profile (reference-corpus.md):
6
+ * radius system: zero or max (0px or 9999px — never in between)
7
+ * button style: high-contrast; heavy border (2px+); flat fill; no shadow
8
+ * divider style: bold solid line (2–3px) or full color-block section break
9
+ * icon treatment: bold, oversized (32px+); high contrast; no tinted backgrounds
10
+ *
11
+ * Override --color-accent (and related tokens) via a :root block in the
12
+ * generated page to brand this foundation without touching the file.
13
+ *
14
+ * Issue: #1048 — custom CSS component library per archetype
15
+ */
16
+
17
+ /* --- 1. Design Tokens --- */
18
+
19
+ :root {
20
+ /* Accent — override per brand */
21
+ --color-accent: #ff2d00; /* bold red-orange default */
22
+ --color-accent-subtle: rgba(255, 45, 0, 0.08);
23
+ --color-accent-hover: rgba(255, 45, 0, 0.14);
24
+
25
+ /* Surface palette — stark, high contrast */
26
+ --color-bg: #ffffff;
27
+ --color-bg-raised: #f5f5f5;
28
+ --color-bg-sunken: #ebebeb;
29
+ --color-fg: #000000;
30
+ --color-fg-muted: #333333;
31
+ --color-fg-faint: #777777;
32
+ --color-border: #000000; /* full-black border — brutalist */
33
+ --color-border-strong: #000000;
34
+
35
+ /* Code surface */
36
+ --code-bg: #000000;
37
+
38
+ /* Radius system — zero OR pill, nothing in between (N13 compliance by contrast) */
39
+ --radius-sm: 0px; /* all boxes: hard edge */
40
+ --radius-btn: 0px; /* button — hard edge */
41
+ --radius-input: 0px; /* input — hard edge */
42
+ --radius-card: 0px; /* card — hard edge */
43
+ --radius-pill: 9999px; /* pill badge only — maximum curve */
44
+
45
+ /* Shadow tokens — no shadow (craft profile: flat fill, no shadow) */
46
+ --shadow-card: none;
47
+ --shadow-card-hover: 4px 4px 0 var(--color-fg);
48
+ --shadow-btn: none;
49
+ --shadow-elevated: 8px 8px 0 var(--color-fg);
50
+
51
+ /* Transition — snap, immediate */
52
+ --transition-fast: 80ms step-end;
53
+ --transition-base: 100ms cubic-bezier(0.4, 0, 0.2, 1);
54
+ --transition-slow: 200ms cubic-bezier(0.4, 0, 0.2, 1);
55
+
56
+ /* Spacing scale */
57
+ --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px;
58
+ --space-6:24px; --space-8:32px; --space-12:48px; --space-16:64px; --space-24:96px;
59
+
60
+ /* Icon sizing — oversized (32px+), no containers (craft profile) */
61
+ --icon-feature: 36px;
62
+ --icon-nav: 24px;
63
+ --icon-inline: 20px;
64
+ }
65
+
66
+ /* --- 2. Element Overrides (N18 compliance) --- */
67
+
68
+ /* Custom selection — bold accent fill */
69
+ ::selection {
70
+ background: var(--color-accent);
71
+ color: #ffffff;
72
+ }
73
+
74
+ /* Custom focus ring — heavy black border (N18, N15 compliance) */
75
+ :focus-visible {
76
+ outline: 3px solid var(--color-fg);
77
+ outline-offset: 2px;
78
+ }
79
+
80
+ /* Custom scrollbar — thick, stark */
81
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
82
+ ::-webkit-scrollbar-track { background: var(--color-bg-raised); }
83
+ ::-webkit-scrollbar-thumb {
84
+ background: var(--color-fg);
85
+ border-radius: 0;
86
+ }
87
+ ::-webkit-scrollbar-thumb:hover { background: var(--color-accent); }
88
+
89
+ /* Code blocks — inverse, high-contrast */
90
+ code, kbd {
91
+ background: var(--code-bg);
92
+ border-radius: 0;
93
+ padding: 3px 8px;
94
+ font-size: 0.875em;
95
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
96
+ color: #ffffff;
97
+ border: 2px solid var(--color-fg);
98
+ }
99
+
100
+ /* Links — bold underline (N17 compliance) */
101
+ a:not([class]) {
102
+ color: var(--color-fg);
103
+ text-decoration: underline;
104
+ text-decoration-color: var(--color-fg);
105
+ text-underline-offset: 4px;
106
+ text-decoration-thickness: 2px; /* heavy underline — brutalist */
107
+ transition: color var(--transition-fast),
108
+ text-decoration-color var(--transition-fast);
109
+ }
110
+ a:not([class]):hover {
111
+ color: var(--color-accent);
112
+ text-decoration-color: var(--color-accent);
113
+ }
114
+
115
+ /* --- 3. Component Classes --- */
116
+
117
+ /* --- Button --- */
118
+
119
+ .btn {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ gap: var(--space-2);
123
+ padding: 12px 24px;
124
+ border-radius: var(--radius-btn); /* 0px — hard edge */
125
+ font-size: 0.9375rem;
126
+ font-weight: 700;
127
+ line-height: 1;
128
+ letter-spacing: 0.05em;
129
+ text-transform: uppercase;
130
+ cursor: pointer;
131
+ white-space: nowrap;
132
+ transition: background-color var(--transition-fast),
133
+ box-shadow var(--transition-fast),
134
+ transform var(--transition-fast);
135
+ /* High-contrast flat fill with heavy border — craft profile */
136
+ background-color: var(--color-fg);
137
+ color: var(--color-bg);
138
+ border: 2px solid var(--color-fg);
139
+ box-shadow: none;
140
+ }
141
+
142
+ .btn:hover {
143
+ background-color: var(--color-accent);
144
+ border-color: var(--color-accent);
145
+ box-shadow: 4px 4px 0 var(--color-fg);
146
+ transform: translate(-2px, -2px);
147
+ }
148
+
149
+ .btn:active {
150
+ transform: translate(0px, 0px);
151
+ box-shadow: none;
152
+ }
153
+
154
+ .btn:focus-visible {
155
+ outline: 3px solid var(--color-fg);
156
+ outline-offset: 3px; /* heavy focus ring — N18 compliance */
157
+ }
158
+
159
+ /* Ghost — high-contrast outline (craft profile) */
160
+ .btn-ghost {
161
+ background-color: transparent;
162
+ color: var(--color-fg);
163
+ border: 2px solid var(--color-fg);
164
+ box-shadow: none;
165
+ }
166
+
167
+ .btn-ghost:hover {
168
+ background-color: var(--color-fg);
169
+ color: var(--color-bg);
170
+ box-shadow: 4px 4px 0 var(--color-accent);
171
+ transform: translate(-2px, -2px);
172
+ }
173
+
174
+ .btn-ghost:active {
175
+ transform: translate(0px, 0px);
176
+ box-shadow: none;
177
+ }
178
+
179
+ /* --- Card --- */
180
+
181
+ .card {
182
+ background: var(--color-bg-raised);
183
+ border-radius: var(--radius-card); /* 0px — hard edge */
184
+ border: 2px solid var(--color-fg);
185
+ box-shadow: var(--shadow-card);
186
+ padding: var(--space-6);
187
+ transition: box-shadow var(--transition-base),
188
+ transform var(--transition-base);
189
+ }
190
+
191
+ .card:hover {
192
+ box-shadow: var(--shadow-card-hover);
193
+ transform: translate(-2px, -2px);
194
+ }
195
+
196
+ /* --- Badge --- */
197
+
198
+ .badge {
199
+ display: inline-flex;
200
+ align-items: center;
201
+ gap: var(--space-1);
202
+ padding: 3px 10px;
203
+ border-radius: var(--radius-pill); /* pill — only rounded element */
204
+ font-size: 0.6875rem;
205
+ font-weight: 700;
206
+ letter-spacing: 0.08em;
207
+ text-transform: uppercase;
208
+ background-color: var(--color-fg);
209
+ color: var(--color-bg);
210
+ border: none;
211
+ }
212
+
213
+ /* --- Input --- */
214
+
215
+ .input {
216
+ display: block;
217
+ width: 100%;
218
+ padding: 10px 14px;
219
+ border-radius: var(--radius-input); /* 0px — hard edge */
220
+ font-size: 0.9375rem;
221
+ font-weight: 500;
222
+ background-color: var(--color-bg);
223
+ color: var(--color-fg);
224
+ border: 2px solid var(--color-fg);
225
+ transition: border-color var(--transition-fast),
226
+ box-shadow var(--transition-fast);
227
+ -webkit-appearance: none;
228
+ appearance: none;
229
+ }
230
+
231
+ .input::placeholder { color: var(--color-fg-faint); }
232
+
233
+ .input:focus {
234
+ outline: none;
235
+ border-color: var(--color-accent);
236
+ box-shadow: 4px 4px 0 var(--color-fg);
237
+ }
238
+
239
+ /* --- 4. Utility Classes --- */
240
+
241
+ /* Scroll-triggered reveal (honors prefers-reduced-motion) */
242
+ .reveal {
243
+ opacity: 0;
244
+ transform: translateY(12px);
245
+ transition: opacity var(--transition-slow), transform var(--transition-slow);
246
+ }
247
+
248
+ .reveal.visible {
249
+ opacity: 1;
250
+ transform: translateY(0);
251
+ }
252
+
253
+ @media (prefers-reduced-motion: reduce) {
254
+ .reveal,
255
+ .reveal.visible {
256
+ opacity: 1;
257
+ transform: none;
258
+ transition: none;
259
+ }
260
+ }
261
+
262
+ /* Gradient text — stark, high-contrast */
263
+ .gradient-text {
264
+ background-image: linear-gradient(90deg, var(--color-fg) 0%, var(--color-accent) 100%);
265
+ -webkit-background-clip: text;
266
+ background-clip: text;
267
+ -webkit-text-fill-color: transparent;
268
+ color: transparent;
269
+ }
270
+
271
+ /* Glass — not used in brutalist; falls back to solid with border */
272
+ .glass {
273
+ background: var(--color-bg-raised);
274
+ border: 2px solid var(--color-fg);
275
+ }
276
+
277
+ /* Divider — bold solid 2px (craft profile) */
278
+ .divider {
279
+ height: 0;
280
+ border: none;
281
+ border-top: 2px solid var(--color-fg);
282
+ margin: var(--space-8) 0;
283
+ }
284
+
285
+ /* Icon container — no background, high contrast (craft profile) */
286
+ .icon-container {
287
+ display: inline-flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ width: var(--icon-feature); /* oversized: 36px */
291
+ height: var(--icon-feature);
292
+ color: var(--color-fg); /* high contrast — no tinted background */
293
+ flex-shrink: 0;
294
+ }
@@ -0,0 +1,300 @@
1
+ /*
2
+ * editorial.css — Foundation for the editorial-typographic archetype
3
+ *
4
+ * Archetype ID: editorial-typographic
5
+ * Craft profile (reference-corpus.md):
6
+ * radius system: generous — 16px card / 12px input / 8px button
7
+ * button style: serif-label text button or outlined; subtle warm shadow
8
+ * divider style: gradient fade to transparent at edges
9
+ * icon treatment: tinted squares or rectangles at low opacity
10
+ *
11
+ * Override --color-accent (and related tokens) via a :root block in the
12
+ * generated page to brand this foundation without touching the file.
13
+ *
14
+ * Issue: #1048 — custom CSS component library per archetype
15
+ */
16
+
17
+ /* --- 1. Design Tokens --- */
18
+ :root {
19
+ /* Accent — override per brand */
20
+ --color-accent: #b5651d; /* warm amber/sienna default */
21
+ --color-accent-subtle: rgba(181, 101, 29, 0.10);
22
+ --color-accent-hover: rgba(181, 101, 29, 0.18);
23
+
24
+ /* Surface palette */
25
+ --color-bg: #faf8f5; /* warm off-white — cream base */
26
+ --color-bg-raised: #f5f0e8;
27
+ --color-bg-sunken: #f0e8dc;
28
+ --color-fg: #1a1410;
29
+ --color-fg-muted: #6b5e52;
30
+ --color-fg-faint: #a0907e;
31
+ --color-border: rgba(90, 70, 50, 0.14);
32
+ --color-border-strong: rgba(90, 70, 50, 0.28);
33
+
34
+ /* Code surface */
35
+ --code-bg: rgba(90, 70, 50, 0.07);
36
+
37
+ /* Radius system — at least 3 distinct values (N13 compliance) */
38
+ --radius-sm: 4px; /* inline / badge-tight */
39
+ --radius-btn: 8px; /* button — smaller than card */
40
+ --radius-input: 12px; /* input — between btn and card */
41
+ --radius-card: 16px; /* card — most generous */
42
+ --radius-pill: 9999px; /* pill badge */
43
+
44
+ /* Shadow tokens — warm, soft, low-spread */
45
+ --shadow-card: 0 1px 3px rgba(90, 60, 30, 0.06),
46
+ 0 0 0 1px rgba(90, 60, 30, 0.08);
47
+ --shadow-card-hover: 0 6px 20px rgba(90, 60, 30, 0.10),
48
+ 0 0 0 1px rgba(90, 60, 30, 0.10);
49
+ --shadow-btn: 0 1px 4px rgba(90, 60, 30, 0.18),
50
+ 0 0 0 1px rgba(90, 60, 30, 0.12);
51
+ --shadow-btn-hover: 0 4px 12px rgba(90, 60, 30, 0.22),
52
+ 0 0 0 1px rgba(90, 60, 30, 0.16);
53
+ --shadow-elevated: 0 8px 32px rgba(90, 60, 30, 0.12);
54
+
55
+ /* Transition — deliberate, not hurried */
56
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
57
+ --transition-base: 240ms cubic-bezier(0.4, 0, 0.2, 1);
58
+ --transition-slow: 380ms cubic-bezier(0.4, 0, 0.2, 1);
59
+
60
+ /* Spacing scale */
61
+ --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px;
62
+ --space-6:24px; --space-8:32px; --space-12:48px; --space-16:64px; --space-24:96px;
63
+
64
+ /* Icon sizing — contextual, not uniform (N16 compliance) */
65
+ --icon-feature: 24px;
66
+ --icon-nav: 18px;
67
+ --icon-inline: 16px;
68
+ }
69
+
70
+ /* --- 2. Element Overrides (N18 compliance) --- */
71
+
72
+ /* Custom selection — branded warm tint */
73
+ ::selection {
74
+ background: var(--color-accent-subtle);
75
+ color: var(--color-fg);
76
+ }
77
+
78
+ /* Custom focus ring — warm accent, not browser default (N18, N15 compliance) */
79
+ :focus-visible {
80
+ outline: 2px solid var(--color-accent);
81
+ outline-offset: 3px;
82
+ }
83
+
84
+ /* Custom scrollbar — thin, theme-matched */
85
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
86
+ ::-webkit-scrollbar-track { background: var(--color-bg-raised); }
87
+ ::-webkit-scrollbar-thumb {
88
+ background: var(--color-border-strong);
89
+ border-radius: var(--radius-pill);
90
+ }
91
+ ::-webkit-scrollbar-thumb:hover { background: var(--color-accent); }
92
+
93
+ /* Code blocks — warm, inline-friendly */
94
+ code, kbd {
95
+ background: var(--code-bg);
96
+ border-radius: var(--radius-sm);
97
+ padding: 2px 6px;
98
+ font-size: 0.875em;
99
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
100
+ }
101
+
102
+ /* Links — animated underline, not browser default (N17 compliance) */
103
+ a:not([class]) {
104
+ color: var(--color-accent);
105
+ text-decoration: underline;
106
+ text-decoration-color: transparent;
107
+ text-underline-offset: 3px;
108
+ text-decoration-thickness: 1px;
109
+ transition: text-decoration-color var(--transition-fast);
110
+ }
111
+ a:not([class]):hover {
112
+ text-decoration-color: var(--color-accent);
113
+ }
114
+
115
+ /* --- 3. Component Classes --- */
116
+
117
+ /* --- Button --- */
118
+
119
+ .btn {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ gap: var(--space-2);
123
+ padding: 10px 20px;
124
+ border-radius: var(--radius-btn);
125
+ font-size: 0.9375rem;
126
+ font-weight: 500;
127
+ line-height: 1;
128
+ letter-spacing: 0.01em;
129
+ cursor: pointer;
130
+ white-space: nowrap;
131
+ transition: box-shadow var(--transition-fast),
132
+ transform var(--transition-fast),
133
+ background-color var(--transition-fast);
134
+ /* Depth signal: shadow lift — satisfies N14 */
135
+ background-color: var(--color-accent);
136
+ color: #fff;
137
+ box-shadow: var(--shadow-btn);
138
+ border: none;
139
+ }
140
+
141
+ .btn:hover {
142
+ box-shadow: var(--shadow-btn-hover);
143
+ transform: translateY(-1px);
144
+ background-color: color-mix(in srgb, var(--color-accent) 90%, #000);
145
+ }
146
+
147
+ .btn:active {
148
+ transform: translateY(0px);
149
+ box-shadow: 0 1px 2px rgba(90, 60, 30, 0.14);
150
+ }
151
+
152
+ .btn:focus-visible {
153
+ outline: 2px solid var(--color-accent);
154
+ outline-offset: 3px; /* custom focus ring — N18 compliance */
155
+ }
156
+
157
+ /* Ghost / outlined variant */
158
+ .btn-ghost {
159
+ background-color: transparent;
160
+ color: var(--color-accent);
161
+ box-shadow: none;
162
+ border: 1px solid var(--color-border-strong);
163
+ }
164
+
165
+ .btn-ghost:hover {
166
+ background-color: var(--color-accent-hover);
167
+ box-shadow: none;
168
+ transform: translateY(-1px);
169
+ }
170
+
171
+ .btn-ghost:active {
172
+ transform: translateY(0px);
173
+ background-color: var(--color-accent-subtle);
174
+ }
175
+
176
+ /* --- Card --- */
177
+
178
+ .card {
179
+ background: var(--color-bg-raised);
180
+ border-radius: var(--radius-card); /* 16px — generous, editorial */
181
+ box-shadow: var(--shadow-card);
182
+ padding: var(--space-6);
183
+ transition: box-shadow var(--transition-base),
184
+ transform var(--transition-base);
185
+ }
186
+
187
+ .card:hover {
188
+ box-shadow: var(--shadow-card-hover);
189
+ transform: translateY(-2px);
190
+ }
191
+
192
+ /* --- Badge --- */
193
+
194
+ .badge {
195
+ display: inline-flex;
196
+ align-items: center;
197
+ gap: var(--space-1);
198
+ padding: 3px 10px;
199
+ border-radius: var(--radius-pill); /* pill — categorically different */
200
+ font-size: 0.75rem;
201
+ font-weight: 500;
202
+ letter-spacing: 0.03em;
203
+ text-transform: uppercase;
204
+ background-color: var(--color-accent-subtle);
205
+ color: var(--color-accent);
206
+ border: 1px solid rgba(181, 101, 29, 0.20);
207
+ }
208
+
209
+ /* --- Input --- */
210
+
211
+ .input {
212
+ display: block;
213
+ width: 100%;
214
+ padding: 10px 14px;
215
+ border-radius: var(--radius-input); /* 12px — distinct from card and btn */
216
+ font-size: 0.9375rem;
217
+ background-color: var(--color-bg);
218
+ color: var(--color-fg);
219
+ border: 1px solid var(--color-border-strong);
220
+ transition: border-color var(--transition-fast),
221
+ box-shadow var(--transition-fast);
222
+ /* Removes browser default appearance */
223
+ -webkit-appearance: none;
224
+ appearance: none;
225
+ }
226
+
227
+ .input::placeholder { color: var(--color-fg-faint); }
228
+
229
+ .input:focus {
230
+ outline: none;
231
+ border-color: var(--color-accent);
232
+ box-shadow: 0 0 0 3px var(--color-accent-subtle); /* custom focus ring — N18 */
233
+ }
234
+
235
+ /* --- 4. Utility Classes --- */
236
+
237
+ /* Scroll-triggered reveal (honors prefers-reduced-motion) */
238
+ .reveal {
239
+ opacity: 0;
240
+ transform: translateY(20px);
241
+ transition: opacity var(--transition-slow), transform var(--transition-slow);
242
+ }
243
+
244
+ .reveal.visible {
245
+ opacity: 1;
246
+ transform: translateY(0);
247
+ }
248
+
249
+ @media (prefers-reduced-motion: reduce) {
250
+ .reveal,
251
+ .reveal.visible {
252
+ opacity: 1;
253
+ transform: none;
254
+ transition: none;
255
+ }
256
+ }
257
+
258
+ /* Gradient text */
259
+ .gradient-text {
260
+ background-image: linear-gradient(135deg, var(--color-accent) 0%, var(--color-fg-muted) 100%);
261
+ -webkit-background-clip: text;
262
+ background-clip: text;
263
+ -webkit-text-fill-color: transparent;
264
+ color: transparent;
265
+ }
266
+
267
+ /* Glass — warm-tinted */
268
+ .glass {
269
+ background: rgba(250, 248, 245, 0.75);
270
+ backdrop-filter: blur(12px);
271
+ -webkit-backdrop-filter: blur(12px);
272
+ border: 1px solid var(--color-border);
273
+ }
274
+
275
+ /* Divider — gradient fade to transparent at edges (craft profile) */
276
+ .divider {
277
+ height: 1px;
278
+ border: none;
279
+ background: linear-gradient(
280
+ to right,
281
+ transparent,
282
+ var(--color-border-strong) 20%,
283
+ var(--color-border-strong) 80%,
284
+ transparent
285
+ );
286
+ margin: var(--space-12) 0;
287
+ }
288
+
289
+ /* Icon container — tinted square */
290
+ .icon-container {
291
+ display: inline-flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ width: var(--icon-feature);
295
+ height: var(--icon-feature);
296
+ border-radius: var(--radius-sm);
297
+ background-color: var(--color-accent-subtle);
298
+ color: var(--color-accent);
299
+ flex-shrink: 0;
300
+ }