hd-garden 0.3.8 → 0.3.10

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 (95) hide show
  1. package/.agents/skills/garden-post-review/SKILL.md +2 -0
  2. package/.agents/skills/garden-ui/SKILL.md +111 -0
  3. package/.env.example +8 -0
  4. package/app/admin/page.tsx +14 -3
  5. package/app/admin/preview/[...path]/page.tsx +88 -0
  6. package/app/admin/ui/blocks/page.tsx +16 -0
  7. package/app/admin/ui/catalog/page.tsx +16 -0
  8. package/app/admin/ui/evals/page.tsx +19 -0
  9. package/app/admin/ui/page.tsx +22 -0
  10. package/app/admin-ui.css +227 -0
  11. package/app/api/admin/distribution/route.ts +4 -2
  12. package/app/api/admin/posts/source/route.ts +21 -0
  13. package/app/api/admin/preview/asset/route.ts +32 -0
  14. package/app/api/admin/thoughts/route.ts +1 -1
  15. package/app/api/admin/ui/blocks/route.ts +19 -0
  16. package/app/api/admin/ui/draft/route.ts +30 -0
  17. package/app/api/auth/github/route.ts +40 -1
  18. package/app/blog/page.tsx +6 -5
  19. package/app/columns/page.tsx +1 -1
  20. package/app/components/AdminDashboard.tsx +53 -1
  21. package/app/components/AdminUiPanels.tsx +258 -0
  22. package/app/components/AdminUiShell.tsx +56 -0
  23. package/app/components/ContentEmptyState.tsx +6 -6
  24. package/app/components/MarkdownArticle.tsx +15 -5
  25. package/app/components/UiBlock.tsx +22 -0
  26. package/app/components/UiStudio.tsx +422 -0
  27. package/app/components/ui-studio-keys.ts +3 -0
  28. package/app/globals.css +2 -0
  29. package/app/lib/admin-auth.ts +13 -1
  30. package/app/lib/content.ts +2 -1
  31. package/app/lib/fallback-site-config.ts +18 -18
  32. package/app/lib/github-content.ts +47 -4
  33. package/app/lib/repository-path.mjs +55 -0
  34. package/app/lib/ui-content.ts +79 -0
  35. package/app/lib/ui-model.ts +145 -0
  36. package/app/raw.d.ts +4 -0
  37. package/app/rss.xml/route.ts +2 -1
  38. package/app/ui-parity/page.tsx +120 -0
  39. package/bin/garden.mjs +71 -0
  40. package/eslint.config.mjs +3 -0
  41. package/package.json +15 -1
  42. package/scripts/build-content.mjs +35 -4
  43. package/scripts/build-ui-preview.mjs +29 -0
  44. package/scripts/check-post.mjs +26 -4
  45. package/scripts/ui-cli.mjs +303 -0
  46. package/site.config.yaml +19 -19
  47. package/templates/site/site.config.yaml +19 -19
  48. package/tsconfig.json +1 -1
  49. package/ui/core/apply.mjs +81 -0
  50. package/ui/core/catalog.mjs +536 -0
  51. package/ui/core/compile.mjs +63 -0
  52. package/ui/core/demos.mjs +223 -0
  53. package/ui/core/expr.mjs +310 -0
  54. package/ui/core/fence.mjs +201 -0
  55. package/ui/core/fix-prompt.mjs +35 -0
  56. package/ui/core/format.mjs +96 -0
  57. package/ui/core/index.mjs +37 -0
  58. package/ui/core/parse.mjs +229 -0
  59. package/ui/core/scan.mjs +53 -0
  60. package/ui/core/sha256.mjs +66 -0
  61. package/ui/core/starters.mjs +18 -0
  62. package/ui/core/state.mjs +259 -0
  63. package/ui/core/static.mjs +524 -0
  64. package/ui/core/transform.mjs +146 -0
  65. package/ui/core/validate.mjs +665 -0
  66. package/ui/evals/cases.yaml +155 -0
  67. package/ui/preview/dist/garden-ui.css +1182 -0
  68. package/ui/preview/dist/garden-ui.esm.js +367 -0
  69. package/ui/preview/dist/garden-ui.iife.js +367 -0
  70. package/ui/preview/index.tsx +191 -0
  71. package/ui/preview/mermaid-shim.ts +19 -0
  72. package/ui/prompt/build.mjs +24 -0
  73. package/ui/prompt/recipes/code-walkthrough.md +68 -0
  74. package/ui/prompt/recipes/compare.md +48 -0
  75. package/ui/prompt/recipes/converter.md +55 -0
  76. package/ui/prompt/recipes/data-chart.md +57 -0
  77. package/ui/prompt/recipes/inspect-grid.md +45 -0
  78. package/ui/prompt/recipes/param-bench.md +55 -0
  79. package/ui/prompt/recipes/plan.md +45 -0
  80. package/ui/prompt/recipes/stepper.md +52 -0
  81. package/ui/prompt/recipes/trace.md +62 -0
  82. package/ui/prompt/rules.md +104 -0
  83. package/ui/prompt/studio.md +20 -0
  84. package/ui/react/CatalogPage.tsx +166 -0
  85. package/ui/react/components/chart.tsx +470 -0
  86. package/ui/react/components/display.tsx +296 -0
  87. package/ui/react/components/inputs.tsx +268 -0
  88. package/ui/react/components/layout.tsx +236 -0
  89. package/ui/react/components/media.tsx +184 -0
  90. package/ui/react/index.tsx +59 -0
  91. package/ui/react/recipes.ts +25 -0
  92. package/ui/react/runtime.tsx +239 -0
  93. package/ui/react/types.ts +29 -0
  94. package/ui/react/ui.css +1182 -0
  95. package/vite.config.ts +4 -3
@@ -0,0 +1,1182 @@
1
+ /*
2
+ * Garden Intelligent UI, drawn in ChatGPT's Intelligent UI style.
3
+ * Token values come from OpenAI's Intelligent UI showcase (--iui-*) and
4
+ * ChatGPT's component tokens (--d-*, --color-*), light and dark.
5
+ */
6
+ .garden-ui,
7
+ .garden-catalog,
8
+ .garden-ui-preview {
9
+ --gui-bg: #fff;
10
+ --gui-chart: transparent;
11
+ --gui-track: #e4e4e4;
12
+ --gui-thumb: #fff;
13
+ --gui-text: #0d0d0d;
14
+ --gui-muted: #5d5d5d;
15
+ --gui-subtle: #8f8f8f;
16
+ --gui-completed: #777;
17
+ --gui-border: #0000001a;
18
+ --gui-border-soft: #00000014;
19
+ --gui-border-strong: #0000001f;
20
+ --gui-control-border: #ccc;
21
+ --gui-check-border: #d2d2d2;
22
+ --gui-control-bg: #fff;
23
+ --gui-surface: #f5f5f5;
24
+ --gui-chip: #f3f3f3;
25
+ --gui-hover: #f5f5f5;
26
+ --gui-solid: #171717;
27
+ --gui-solid-hover: #303030;
28
+ --gui-on-solid: #fff;
29
+ --gui-segment: #ededed;
30
+ --gui-segment-selected: #fff;
31
+ --gui-segment-shadow: 0 1px 4px -1px #0003;
32
+ --gui-progress: #0d0d0d;
33
+ --gui-progress-track: #f3f3f3;
34
+ --gui-focus: #0285ff;
35
+ --gui-bubble: #eaf2ff;
36
+ --gui-popover-border: #0000000d;
37
+ --gui-shadow: 0 2px 6px #00000014;
38
+ --gui-code-bg: #f9f9f9;
39
+ --gui-info: #539af8;
40
+ --gui-info-text: #0169cc;
41
+ --gui-info-soft: #0285ff1a;
42
+ --gui-success: #6bc67f;
43
+ --gui-success-text: #008635;
44
+ --gui-success-soft: #04b84c1f;
45
+ --gui-danger: #e02e2a;
46
+ --gui-danger-text: #ba2623;
47
+ --gui-danger-soft: #fa423e1a;
48
+ --gui-discovery: #924ff7;
49
+ --gui-discovery-text: #8046d9;
50
+ --gui-discovery-soft: #924ff71a;
51
+ --gui-font: -apple-system-body, ui-sans-serif, -apple-system, system-ui, "Segoe UI", Helvetica, "Apple Color Emoji", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
52
+ --gui-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
53
+ }
54
+
55
+ :root[data-theme="dark"] .garden-ui,
56
+ :root[data-theme="dark"] .garden-catalog,
57
+ [data-theme="dark"] .garden-ui,
58
+ [data-theme="dark"] .garden-catalog,
59
+ .garden-ui[data-theme="dark"],
60
+ .garden-catalog[data-theme="dark"],
61
+ .garden-ui-preview[data-theme="dark"] {
62
+ --gui-bg: #0e0e0e;
63
+ --gui-chart: #212121;
64
+ --gui-text: #ededed;
65
+ --gui-muted: #cdcdcd;
66
+ --gui-subtle: #afafaf;
67
+ --gui-completed: #afafaf;
68
+ --gui-border: #ffffff1a;
69
+ --gui-border-soft: #ffffff0d;
70
+ --gui-border-strong: #fff3;
71
+ --gui-control-border: #fff3;
72
+ --gui-check-border: #fff3;
73
+ --gui-control-bg: #303030;
74
+ --gui-surface: #2a2a2a;
75
+ --gui-chip: #303030;
76
+ --gui-hover: #ffffff1a;
77
+ --gui-solid: #ededed;
78
+ --gui-solid-hover: #dcdcdc;
79
+ --gui-on-solid: #0d0d0d;
80
+ --gui-segment: #303030;
81
+ --gui-segment-selected: #303030;
82
+ --gui-segment-shadow: none;
83
+ --gui-track: #3a3a3a;
84
+ --gui-thumb: #fff;
85
+ --gui-progress: #0285ff;
86
+ --gui-progress-track: #303030;
87
+ --gui-focus: #3a83f7;
88
+ --gui-bubble: #133463;
89
+ --gui-popover-border: #ffffff26;
90
+ --gui-shadow: 0 2px 8px #00000066;
91
+ --gui-code-bg: #171717;
92
+ --gui-info: #0285ff;
93
+ --gui-info-text: #66b5ff;
94
+ --gui-info-soft: #0285ff26;
95
+ --gui-success: #04b84c;
96
+ --gui-success-text: #40c977;
97
+ --gui-success-soft: #04b84c26;
98
+ --gui-danger: #fa423e;
99
+ --gui-danger-text: #fa423e;
100
+ --gui-danger-soft: #fa423e29;
101
+ --gui-discovery: #924ff7;
102
+ --gui-discovery-text: #be95fa;
103
+ --gui-discovery-soft: #924ff726;
104
+ }
105
+
106
+ /* frame: each block is one outlined widget, with the same curved corner as a ChatGPT card */
107
+ .garden-ui {
108
+ margin: 28px 0;
109
+ border: 1px solid var(--gui-border);
110
+ border-radius: 8px;
111
+ background: transparent;
112
+ color: var(--gui-text);
113
+ font-family: var(--gui-font);
114
+ font-size: 16px;
115
+ line-height: 26px;
116
+ letter-spacing: normal;
117
+ -webkit-font-smoothing: antialiased;
118
+ }
119
+
120
+ .garden-ui-body {
121
+ display: flex;
122
+ flex-direction: column;
123
+ align-items: stretch;
124
+ gap: 12px;
125
+ padding: 12px 16px 4px;
126
+ }
127
+
128
+ .garden-ui-body > *,
129
+ .garden-ui-stack > *,
130
+ .garden-ui-card > *,
131
+ .garden-ui-step > *,
132
+ .garden-ui-tabpanel > *,
133
+ .garden-ui-column > * {
134
+ margin: 0;
135
+ }
136
+
137
+ .garden-ui > figcaption {
138
+ padding: 4px 16px 12px;
139
+ color: var(--gui-muted);
140
+ font-size: 14px;
141
+ line-height: 20px;
142
+ text-align: start;
143
+ }
144
+
145
+ .garden-ui :focus-visible {
146
+ outline: 2px solid var(--gui-focus);
147
+ outline-offset: 2px;
148
+ }
149
+
150
+ :where(.garden-ui) p,
151
+ :where(.garden-ui) li {
152
+ font-size: 16px;
153
+ line-height: 26px;
154
+ }
155
+
156
+ :where(.garden-ui) strong { font-weight: 600; }
157
+
158
+ :where(.garden-ui) code {
159
+ padding: 2px 5px;
160
+ border-radius: 6px;
161
+ background: var(--gui-chip);
162
+ color: var(--gui-text);
163
+ font-family: var(--gui-mono);
164
+ font-size: 0.86em;
165
+ }
166
+
167
+ :where(.garden-ui) a { color: var(--gui-info-text); text-decoration: underline; text-underline-offset: 2px; }
168
+
169
+ .garden-ui-value { font-variant-numeric: tabular-nums; }
170
+
171
+ .garden-ui button {
172
+ font: inherit;
173
+ color: inherit;
174
+ cursor: pointer;
175
+ }
176
+
177
+ .garden-ui-sr-only {
178
+ position: absolute;
179
+ width: 1px;
180
+ height: 1px;
181
+ margin: -1px;
182
+ padding: 0;
183
+ border: 0;
184
+ overflow: hidden;
185
+ clip: rect(0 0 0 0);
186
+ clip-path: inset(50%);
187
+ white-space: nowrap;
188
+ }
189
+
190
+ /* tones map onto ChatGPT's semantic colors */
191
+ .garden-ui-tone-plain { --gui-tone: var(--gui-text); --gui-tone-text: var(--gui-text); --gui-tone-soft: transparent; }
192
+ .garden-ui-tone-accent { --gui-tone: var(--gui-info); --gui-tone-text: var(--gui-info-text); --gui-tone-soft: var(--gui-info-soft); }
193
+ .garden-ui-tone-new { --gui-tone: var(--gui-success); --gui-tone-text: var(--gui-success-text); --gui-tone-soft: var(--gui-success-soft); }
194
+ .garden-ui-tone-waste { --gui-tone: var(--gui-danger); --gui-tone-text: var(--gui-danger-text); --gui-tone-soft: var(--gui-danger-soft); }
195
+ .garden-ui-tone-same { --gui-tone: var(--gui-discovery); --gui-tone-text: var(--gui-discovery-text); --gui-tone-soft: var(--gui-discovery-soft); }
196
+ .garden-ui-tone-muted,
197
+ .garden-ui-tone-cached { --gui-tone: var(--gui-subtle); --gui-tone-text: var(--gui-muted); --gui-tone-soft: var(--gui-surface); }
198
+
199
+ /* layout */
200
+ .garden-ui-stack { display: flex; flex-direction: column; }
201
+ .garden-ui-stack[data-direction="row"] { flex-direction: row; flex-wrap: wrap; align-items: center; }
202
+
203
+ .garden-ui-columns {
204
+ display: grid;
205
+ grid-template-columns: repeat(auto-fit, minmax(min(var(--garden-ui-col-min, 220px), 100%), 1fr));
206
+ }
207
+
208
+ .garden-ui-column { min-width: 0; }
209
+
210
+ .garden-ui-card {
211
+ display: flex;
212
+ flex-direction: column;
213
+ align-items: stretch;
214
+ gap: 4px;
215
+ padding: 12px;
216
+ border: 1px solid var(--gui-border);
217
+ border-radius: 8px;
218
+ background: transparent;
219
+ box-shadow: none;
220
+ text-align: start;
221
+ }
222
+
223
+ .garden-ui-card.garden-ui-tone-plain,
224
+ .garden-ui-card:not(.garden-ui-tone-plain) { background: transparent; }
225
+
226
+ .garden-ui-card-title {
227
+ margin: 0;
228
+ color: var(--gui-text);
229
+ font-size: 16px;
230
+ font-weight: 600;
231
+ line-height: 26px;
232
+ text-align: start;
233
+ }
234
+
235
+ /* tabs: pill chips, selected one solid */
236
+ .garden-ui-tablist {
237
+ display: flex;
238
+ flex-wrap: wrap;
239
+ justify-content: center;
240
+ gap: 7px;
241
+ }
242
+
243
+ .garden-ui-tablist button {
244
+ position: relative;
245
+ min-height: 28px;
246
+ padding: 4px 12px;
247
+ border: 0;
248
+ border-radius: 999px;
249
+ background: var(--gui-chip);
250
+ color: var(--gui-text);
251
+ font-size: 13px;
252
+ line-height: 20px;
253
+ transition: background-color 150ms ease, color 150ms ease;
254
+ }
255
+
256
+ .garden-ui-tablist button:hover { background: var(--gui-hover); }
257
+
258
+ .garden-ui-tablist button[aria-selected="true"] {
259
+ background: var(--gui-solid);
260
+ color: var(--gui-on-solid);
261
+ }
262
+
263
+ .garden-ui-tabpanel { display: flex; flex-direction: column; gap: 14px; padding-top: 14px; }
264
+ .garden-ui-tabpanel[hidden] { display: none; }
265
+
266
+ /* steps */
267
+ .garden-ui-steps { display: flex; flex-direction: column; gap: 12px; outline: none; }
268
+
269
+ .garden-ui-steps-head {
270
+ display: flex;
271
+ justify-content: space-between;
272
+ align-items: baseline;
273
+ gap: 12px;
274
+ }
275
+
276
+ .garden-ui-steps-head strong { color: var(--gui-text); font-size: 16px; font-weight: 600; line-height: 1.4; }
277
+ .garden-ui-steps-head span { flex-shrink: 0; color: var(--gui-muted); font-size: 12px; font-variant-numeric: tabular-nums; }
278
+
279
+ .garden-ui-steps .garden-ui-progress { height: 2px; margin: 2px 0 0; }
280
+
281
+ .garden-ui-steps-stage { display: grid; }
282
+
283
+ .garden-ui-step {
284
+ grid-area: 1 / 1;
285
+ display: flex;
286
+ flex-direction: column;
287
+ gap: 14px;
288
+ visibility: hidden;
289
+ }
290
+
291
+ .garden-ui-step[data-active="true"] { visibility: visible; }
292
+
293
+ .garden-ui-steps[data-animate="true"] .garden-ui-step[data-active="true"] { animation: garden-ui-fade 420ms ease-out; }
294
+
295
+ @keyframes garden-ui-fade {
296
+ from { opacity: 0; transform: translateY(4px); }
297
+ to { opacity: 1; transform: none; }
298
+ }
299
+
300
+ .garden-ui-steps-controls {
301
+ display: flex;
302
+ flex-wrap: wrap;
303
+ align-items: center;
304
+ justify-content: flex-start;
305
+ gap: 10px;
306
+ }
307
+
308
+ .garden-ui-round {
309
+ display: grid;
310
+ place-items: center;
311
+ width: 36px;
312
+ height: 36px;
313
+ padding: 0;
314
+ border: 1px solid var(--gui-border-strong);
315
+ border-radius: 50%;
316
+ background: transparent;
317
+ color: var(--gui-text);
318
+ transition: background-color 150ms ease, transform 100ms ease;
319
+ }
320
+
321
+ .garden-ui-round svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
322
+ .garden-ui-round:hover:not(:disabled) { background: var(--gui-hover); }
323
+ .garden-ui-round:active:not(:disabled) { transform: scale(0.96); }
324
+ .garden-ui-round:disabled { color: var(--gui-subtle); opacity: 0.45; cursor: default; }
325
+
326
+ .garden-ui-steps-dots { display: inline-flex; flex-wrap: wrap; gap: 6px; }
327
+
328
+ .garden-ui-steps-dots button {
329
+ width: 8px;
330
+ height: 8px;
331
+ padding: 0;
332
+ border: 0;
333
+ border-radius: 50%;
334
+ background: var(--gui-border-strong);
335
+ transition: background-color 150ms ease, transform 150ms ease;
336
+ }
337
+
338
+ .garden-ui-steps-dots button[aria-current="step"] { background: var(--gui-solid); transform: scale(1.15); }
339
+
340
+ /* progress bar shared by Steps and Checklist */
341
+ .garden-ui-progress {
342
+ height: 3px;
343
+ overflow: hidden;
344
+ border-radius: 999px;
345
+ background: var(--gui-progress-track);
346
+ }
347
+
348
+ .garden-ui-progress > span {
349
+ display: block;
350
+ height: 100%;
351
+ border-radius: inherit;
352
+ background: var(--gui-progress);
353
+ transition: width 300ms ease;
354
+ }
355
+
356
+ /* buttons: outline pill by default, solid pill for the accent tone */
357
+ .garden-ui-button {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ justify-content: center;
361
+ gap: 6px;
362
+ width: fit-content;
363
+ min-height: 36px;
364
+ padding: 0 14px;
365
+ border: 1px solid var(--gui-border-strong);
366
+ border-radius: 999px;
367
+ background: transparent;
368
+ color: var(--gui-text);
369
+ font-size: 13px;
370
+ font-weight: 600;
371
+ line-height: 1;
372
+ transition: background-color 150ms ease, transform 100ms ease;
373
+ }
374
+
375
+ .garden-ui-button:hover { background: var(--gui-hover); }
376
+ .garden-ui-button:active { transform: scale(0.98); }
377
+
378
+ .garden-ui-button.garden-ui-tone-accent {
379
+ padding: 0 16px;
380
+ border-color: var(--gui-solid);
381
+ background: var(--gui-solid);
382
+ color: var(--gui-on-solid);
383
+ font-size: 15px;
384
+ font-weight: 500;
385
+ }
386
+
387
+ .garden-ui-button.garden-ui-tone-accent:hover { border-color: var(--gui-solid-hover); background: var(--gui-solid-hover); }
388
+
389
+ /* slider: thin track, a round thumb sitting on it, as in ChatGPT's scenario slider */
390
+ .garden-ui-slider { display: flex; flex-direction: column; gap: 8px; }
391
+
392
+ .garden-ui-slider label {
393
+ display: flex;
394
+ justify-content: space-between;
395
+ align-items: baseline;
396
+ gap: 12px;
397
+ color: var(--gui-muted);
398
+ font-size: 14px;
399
+ line-height: 20px;
400
+ }
401
+
402
+ .garden-ui-slider output { color: var(--gui-text); font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums; }
403
+
404
+ .garden-ui-slider-track { padding: 8px 0; }
405
+
406
+ .garden-ui-slider-track:has(input:focus-visible) { outline: 2px solid var(--gui-focus); outline-offset: 4px; border-radius: 999px; }
407
+
408
+ .garden-ui-slider input[type="range"] {
409
+ display: block;
410
+ width: 100%;
411
+ height: 22px;
412
+ margin: 0;
413
+ background: transparent;
414
+ cursor: ew-resize;
415
+ -webkit-appearance: none;
416
+ appearance: none;
417
+ }
418
+
419
+ .garden-ui-slider input[type="range"]:focus-visible { outline: none; }
420
+
421
+ .garden-ui-slider input[type="range"]::-webkit-slider-runnable-track {
422
+ height: 8px;
423
+ border: 0;
424
+ border-radius: 999px;
425
+ background: var(--gui-track);
426
+ }
427
+
428
+ .garden-ui-slider input[type="range"]::-moz-range-track {
429
+ height: 8px;
430
+ border: 0;
431
+ border-radius: 999px;
432
+ background: var(--gui-track);
433
+ }
434
+
435
+ .garden-ui-slider input[type="range"]::-webkit-slider-thumb {
436
+ width: 22px;
437
+ height: 22px;
438
+ margin-top: -7px;
439
+ border: 1px solid #0000001a;
440
+ border-radius: 50%;
441
+ background: var(--gui-thumb);
442
+ box-shadow: 0 1px 4px #00000040;
443
+ -webkit-appearance: none;
444
+ appearance: none;
445
+ transition: transform 120ms ease;
446
+ }
447
+
448
+ .garden-ui-slider input[type="range"]::-moz-range-thumb {
449
+ width: 22px;
450
+ height: 22px;
451
+ border: 1px solid #0000001a;
452
+ border-radius: 50%;
453
+ background: var(--gui-thumb);
454
+ box-shadow: 0 1px 4px #00000040;
455
+ }
456
+
457
+ .garden-ui-slider input[type="range"]:active::-webkit-slider-thumb { transform: scale(1.08); }
458
+
459
+ /* choice: ChatGPT segmented control, or a select for many options */
460
+ .garden-ui-choice {
461
+ display: flex;
462
+ flex-direction: column;
463
+ align-items: flex-start;
464
+ gap: 8px;
465
+ width: fit-content;
466
+ max-width: 100%;
467
+ color: var(--gui-muted);
468
+ font-size: 14px;
469
+ line-height: 20px;
470
+ }
471
+
472
+ .garden-ui-segmented {
473
+ display: inline-flex;
474
+ flex-wrap: wrap;
475
+ gap: 4px;
476
+ width: fit-content;
477
+ max-width: 100%;
478
+ }
479
+
480
+ .garden-ui-segmented button {
481
+ min-height: 28px;
482
+ padding: 0 12px;
483
+ border: 0;
484
+ border-radius: 999px;
485
+ background: transparent;
486
+ color: var(--gui-muted);
487
+ font-size: 13px;
488
+ transition: background-color 150ms ease, color 150ms ease;
489
+ }
490
+
491
+ .garden-ui-segmented button:hover:not([aria-pressed="true"]) { color: var(--gui-text); }
492
+
493
+ .garden-ui-segmented button[aria-pressed="true"] {
494
+ background: var(--gui-segment);
495
+ color: var(--gui-text);
496
+ font-weight: 500;
497
+ }
498
+
499
+ .garden-ui-choice select {
500
+ width: fit-content;
501
+ min-height: 36px;
502
+ padding: 0 34px 0 12px;
503
+ border: 1px solid var(--gui-border-strong);
504
+ border-radius: 10px;
505
+ background: var(--gui-control-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5 6 7.5 9 4.5' fill='none' stroke='%23888' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 12px center;
506
+ color: var(--gui-text);
507
+ font: inherit;
508
+ font-size: 14px;
509
+ -webkit-appearance: none;
510
+ appearance: none;
511
+ }
512
+
513
+ /* toggle: switch */
514
+ .garden-ui-toggle {
515
+ display: inline-flex;
516
+ align-items: center;
517
+ gap: 10px;
518
+ width: fit-content;
519
+ padding: 0;
520
+ border: 0;
521
+ background: none;
522
+ color: var(--gui-text);
523
+ font-size: 15px;
524
+ }
525
+
526
+ .garden-ui-switch {
527
+ position: relative;
528
+ flex-shrink: 0;
529
+ width: 36px;
530
+ height: 20px;
531
+ border-radius: 999px;
532
+ background: var(--gui-control-border);
533
+ transition: background-color 150ms ease;
534
+ }
535
+
536
+ .garden-ui-switch::after {
537
+ position: absolute;
538
+ top: 2px;
539
+ left: 2px;
540
+ width: 16px;
541
+ height: 16px;
542
+ border-radius: 50%;
543
+ background: #fff;
544
+ box-shadow: 0 1px 2px #00000033;
545
+ content: "";
546
+ transition: transform 150ms ease;
547
+ }
548
+
549
+ .garden-ui-toggle[aria-checked="true"] .garden-ui-switch { background: var(--gui-solid); }
550
+ .garden-ui-toggle[aria-checked="true"] .garden-ui-switch::after { background: var(--gui-on-solid); transform: translateX(16px); }
551
+
552
+ /* checklist: round checks, title and counter, a thin progress bar */
553
+ .garden-ui-checklist { display: flex; flex-direction: column; }
554
+
555
+ .garden-ui-checklist-head {
556
+ display: flex;
557
+ justify-content: space-between;
558
+ align-items: center;
559
+ gap: 8px;
560
+ }
561
+
562
+ .garden-ui-checklist-head strong { color: var(--gui-text); font-size: 16px; font-weight: 600; line-height: 1.4; }
563
+ .garden-ui-checklist-head > span { color: var(--gui-muted); font-size: 12px; font-variant-numeric: tabular-nums; }
564
+
565
+ .garden-ui-checklist .garden-ui-progress { margin: 8px 0 4px; }
566
+
567
+ .garden-ui-checklist ul { margin: 0; padding: 0; list-style: none; }
568
+
569
+ .garden-ui-checklist li { padding: 5px 0; }
570
+
571
+ .garden-ui-checklist label { display: flex; align-items: flex-start; gap: 10px; min-height: 26px; cursor: pointer; }
572
+
573
+ .garden-ui-checklist input[type="checkbox"] {
574
+ flex: 0 0 20px;
575
+ width: 20px;
576
+ height: 20px;
577
+ margin: 2px 0 0;
578
+ border: 1px solid var(--gui-check-border);
579
+ border-radius: 50%;
580
+ background: var(--gui-control-bg);
581
+ cursor: pointer;
582
+ -webkit-appearance: none;
583
+ appearance: none;
584
+ transition: background-color 150ms ease, border-color 150ms ease;
585
+ }
586
+
587
+ .garden-ui-checklist input[type="checkbox"]:checked { border-color: var(--gui-solid); background: var(--gui-solid); }
588
+
589
+ .garden-ui-checklist input[type="checkbox"]:checked::after {
590
+ display: block;
591
+ width: 9px;
592
+ height: 5px;
593
+ margin: 5px 0 0 5px;
594
+ border-bottom: 2px solid var(--gui-on-solid);
595
+ border-left: 2px solid var(--gui-on-solid);
596
+ content: "";
597
+ transform: rotate(-45deg);
598
+ }
599
+
600
+ .garden-ui-checklist-text { display: flex; flex-direction: column; min-width: 0; }
601
+ .garden-ui-checklist-time { color: var(--gui-muted); font-size: 12px; line-height: 1.65; font-variant-numeric: tabular-nums; }
602
+ .garden-ui-checklist-title { color: var(--gui-text); font-size: 16px; line-height: 26px; }
603
+ .garden-ui-checklist-note { margin-top: 2px; color: var(--gui-muted); font-size: 13px; line-height: 1.65; }
604
+
605
+ .garden-ui-checklist-detailed li { padding: 12px 0; border-top: 1px solid var(--gui-border); }
606
+ .garden-ui-checklist-detailed li:first-child { border-top: 0; }
607
+ .garden-ui-checklist-detailed .garden-ui-checklist-title { font-weight: 600; }
608
+
609
+ .garden-ui-checklist li[data-done="true"] .garden-ui-checklist-title,
610
+ .garden-ui-checklist li[data-done="true"] .garden-ui-checklist-note,
611
+ .garden-ui-checklist li[data-done="true"] .garden-ui-checklist-time { color: var(--gui-completed); text-decoration: line-through; }
612
+
613
+ @media (forced-colors: active) {
614
+ .garden-ui-checklist input[type="checkbox"] { -webkit-appearance: auto; appearance: auto; }
615
+ .garden-ui-checklist input[type="checkbox"]:checked::after { display: none; }
616
+ }
617
+
618
+ /* display */
619
+ .garden-ui-stat { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; text-align: start; }
620
+
621
+ .garden-ui-stat-label {
622
+ color: var(--gui-muted);
623
+ font-size: 12px;
624
+ font-weight: 400;
625
+ line-height: 16px;
626
+ }
627
+
628
+ .garden-ui-stat-hint { color: var(--gui-muted); font-size: 14px; line-height: 20px; }
629
+
630
+ .garden-ui-stat-value {
631
+ color: var(--gui-tone-text, var(--gui-text));
632
+ font-size: 20px;
633
+ font-weight: 600;
634
+ line-height: 28px;
635
+ font-variant-numeric: tabular-nums;
636
+ }
637
+
638
+ .garden-ui-stat-sm .garden-ui-stat-value { font-size: 16px; line-height: 26px; }
639
+ .garden-ui-stat-lg .garden-ui-stat-value { font-size: 24px; line-height: 32px; }
640
+ .garden-ui-stat-value small { color: var(--gui-muted); font-size: 14px; font-weight: 400; }
641
+
642
+ .garden-ui-meter { display: flex; flex-direction: column; gap: 8px; }
643
+
644
+ .garden-ui-meter-head {
645
+ display: flex;
646
+ justify-content: space-between;
647
+ align-items: baseline;
648
+ gap: 12px;
649
+ color: var(--gui-muted);
650
+ font-size: 14px;
651
+ line-height: 20px;
652
+ }
653
+
654
+ .garden-ui-meter-head > span:last-child { color: var(--gui-text); font-weight: 600; font-variant-numeric: tabular-nums; }
655
+ .garden-ui-meter-head strong { color: var(--gui-danger-text); font-weight: 600; }
656
+
657
+ .garden-ui-meter-track {
658
+ display: flex;
659
+ gap: 2px;
660
+ height: 8px;
661
+ overflow: hidden;
662
+ border-radius: 999px;
663
+ background: var(--gui-progress-track);
664
+ }
665
+
666
+ .garden-ui-meter-fill { height: 100%; border-radius: 999px; background: var(--gui-tone, var(--gui-info)); transition: width 300ms ease; }
667
+ .garden-ui-meter-fill.garden-ui-tone-plain { background: var(--gui-solid); }
668
+ .garden-ui-meter[data-over="true"] .garden-ui-meter-fill { background: var(--gui-danger); }
669
+
670
+ .garden-ui-legend {
671
+ display: flex;
672
+ flex-wrap: wrap;
673
+ justify-content: flex-start;
674
+ gap: 4px 14px;
675
+ max-width: 100%;
676
+ margin: 0;
677
+ padding: 0;
678
+ color: var(--gui-muted);
679
+ font-size: 14px;
680
+ line-height: 20px;
681
+ list-style: none;
682
+ }
683
+
684
+ .garden-ui-legend li { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; }
685
+
686
+ .garden-ui-swatch {
687
+ width: 8px;
688
+ height: 8px;
689
+ border-radius: 50%;
690
+ background: var(--gui-series, var(--gui-tone, var(--gui-text)));
691
+ }
692
+
693
+ .garden-ui-badge {
694
+ display: inline-block;
695
+ padding: 2px 8px;
696
+ border-radius: 999px;
697
+ background: var(--gui-tone-soft, var(--gui-chip));
698
+ color: var(--gui-tone-text, var(--gui-text));
699
+ font-size: 12px;
700
+ font-weight: 500;
701
+ line-height: 16px;
702
+ vertical-align: 1px;
703
+ white-space: nowrap;
704
+ }
705
+
706
+ .garden-ui-badge.garden-ui-tone-plain,
707
+ .garden-ui-badge.garden-ui-tone-muted { background: var(--gui-chip); }
708
+
709
+ /* table: hairline rows, no vertical rules */
710
+ .garden-ui-table-wrap,
711
+ .garden-ui-grid-wrap { overflow-x: auto; }
712
+
713
+ .garden-ui-grid-wrap {
714
+ display: flex;
715
+ flex-direction: column;
716
+ align-items: flex-start;
717
+ width: fit-content;
718
+ max-width: 100%;
719
+ }
720
+
721
+ .garden-ui-table { width: 100%; border-collapse: collapse; font-size: 14px; font-weight: 400; line-height: 20px; color: #0d0d0d; }
722
+ .garden-ui-flow { align-items: center; text-align: center; gap: 8px; }
723
+ .garden-ui-card.garden-ui-flow { gap: 8px; }
724
+ .garden-ui-flow p { margin: 0; color: #0d0d0d; font-size: 16px; font-weight: 400; line-height: 26px; text-align: center; }
725
+ .garden-ui-flow svg { display: block; width: 16px; height: 16px; flex: none; }
726
+ .garden-ui-flow-arrow { color: #8f8f8f; }
727
+ .garden-ui-flow-loop { color: #5d5d5d; }
728
+
729
+ .garden-ui-table th,
730
+ .garden-ui-table td {
731
+ padding: 8px 8px 8px 0;
732
+ border: 0;
733
+ color: #0d0d0d;
734
+ font-size: 14px;
735
+ font-weight: 400;
736
+ line-height: 20px;
737
+ text-align: left;
738
+ }
739
+
740
+ .garden-ui-table thead th { font-weight: 600; }
741
+
742
+ .garden-ui-table tr { border-bottom: 1px solid rgba(0, 0, 0, 0.05); }
743
+ .garden-ui-table tr:last-child { border-bottom: 0; }
744
+
745
+ .garden-ui-table tbody th { font-size: 14px; font-weight: 400; }
746
+ .garden-ui-table [data-align="right"] { text-align: right; }
747
+ .garden-ui-table tr:last-child > * { border-bottom: 0; }
748
+ .garden-ui-table td:not(.garden-ui-tone-plain) { color: var(--gui-tone-text); }
749
+ .garden-ui-table tr[data-tone="row"] > th,
750
+ .garden-ui-table tr[data-tone="row"] > td { background: var(--gui-tone-soft); color: var(--gui-text); }
751
+ .garden-ui-table tr[data-tone="row"] > :first-child { border-radius: 10px 0 0 10px; }
752
+ .garden-ui-table tr[data-tone="row"] > :last-child { border-radius: 0 10px 10px 0; }
753
+
754
+ .garden-ui-table-kv thead { display: none; }
755
+ .garden-ui-table-kv tbody th,
756
+ .garden-ui-table-kv td { padding-top: 14px; padding-bottom: 14px; border-bottom: 1px solid var(--gui-border-soft); }
757
+ .garden-ui-table-kv td { font-weight: 600; text-align: right; }
758
+
759
+ .garden-ui-note-trigger {
760
+ padding: 0;
761
+ border: 0;
762
+ border-bottom: 1px dashed currentColor;
763
+ background: none;
764
+ }
765
+
766
+ .garden-ui-note { min-height: 1.65em; margin: 0; color: var(--gui-muted); font-size: 14px; line-height: 20px; text-align: start; }
767
+
768
+ /* grid: rounded tiles tinted by tone */
769
+ .garden-ui-grid { border-collapse: separate; border-spacing: 4px; }
770
+
771
+ .garden-ui-grid th { padding: 0 6px; color: var(--gui-muted); font-size: 12px; font-weight: 400; text-align: center; }
772
+ .garden-ui-grid tbody th { text-align: right; }
773
+
774
+ .garden-ui-cell {
775
+ min-width: 40px;
776
+ height: 36px;
777
+ padding: 0 8px;
778
+ border: 1px solid transparent;
779
+ border-radius: 8px;
780
+ background: var(--gui-tone-soft, var(--gui-surface));
781
+ color: var(--gui-tone-text, var(--gui-text));
782
+ font-family: var(--gui-mono);
783
+ font-size: 12px;
784
+ font-variant-numeric: tabular-nums;
785
+ transition: transform 100ms ease, box-shadow 150ms ease;
786
+ }
787
+
788
+ .garden-ui-cell.garden-ui-tone-plain { background: var(--gui-surface); color: var(--gui-text); }
789
+ .garden-ui-cell.garden-ui-tone-cached { border: 1px dashed var(--gui-border-strong); background: transparent; }
790
+ .garden-ui-cell:hover { box-shadow: inset 0 0 0 1px var(--gui-border-strong); }
791
+ .garden-ui-cell[aria-pressed="true"] { box-shadow: 0 0 0 2px var(--gui-solid); }
792
+
793
+ /* chart */
794
+ .garden-ui-chart { display: flex; flex-direction: column; gap: 8px; }
795
+
796
+ .garden-ui-chart-canvas {
797
+ position: relative;
798
+ padding: 8px 4px 0;
799
+ border-radius: 12px;
800
+ outline: none;
801
+ background: var(--gui-chart);
802
+ }
803
+ .garden-ui-chart-canvas:focus-visible { outline: 2px solid var(--gui-focus); outline-offset: 2px; }
804
+
805
+ .garden-ui-series-plain { --gui-series: #539af8; }
806
+ .garden-ui-series-accent { --gui-series: #539af8; }
807
+ .garden-ui-series-new { --gui-series: #6bc67f; }
808
+ .garden-ui-series-waste { --gui-series: #ef8b57; }
809
+ .garden-ui-series-same { --gui-series: #ef8b57; }
810
+ .garden-ui-series-muted,
811
+ .garden-ui-series-cached { --gui-series: var(--gui-subtle); }
812
+
813
+ .garden-ui-chart-grid { stroke: var(--gui-border); stroke-width: 1; stroke-dasharray: 2 4; }
814
+ .garden-ui-chart-axis { stroke: transparent; stroke-width: 1; }
815
+ .garden-ui-chart .garden-ui-legend { justify-content: center; }
816
+ .garden-ui-chart-tick,
817
+ .garden-ui-chart-label { fill: var(--gui-subtle); font-family: var(--gui-font); font-size: 12px; }
818
+ .garden-ui-chart-value { fill: var(--gui-text); font-family: var(--gui-font); font-size: 12px; font-weight: 600; }
819
+ .garden-ui-chart-line { fill: none; stroke: var(--gui-series); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
820
+ .garden-ui-chart-area { fill: var(--gui-series); fill-opacity: 0.1; stroke: none; }
821
+ .garden-ui-chart-bar { fill: var(--gui-series); }
822
+ .garden-ui-chart-point { fill: var(--gui-series); }
823
+ .garden-ui-chart-dot { fill: var(--gui-bg); stroke: var(--gui-series); stroke-width: 2; }
824
+ .garden-ui-chart-marker { stroke: var(--gui-border-strong); stroke-dasharray: 3 3; }
825
+ .garden-ui-chart-cross { stroke: var(--gui-border-strong); stroke-width: 1; }
826
+
827
+ .garden-ui-chart-drawn .garden-ui-chart-line { stroke-dasharray: 1; animation: garden-ui-draw 1.8s cubic-bezier(0.22, 1, 0.36, 1) both; }
828
+ .garden-ui-chart-drawn .garden-ui-chart-area,
829
+ .garden-ui-chart-drawn .garden-ui-chart-point { animation: garden-ui-appear 0.7s ease-out both; }
830
+ .garden-ui-chart-drawn .garden-ui-chart-bar { transform-box: fill-box; transform-origin: bottom; animation: garden-ui-grow 0.6s cubic-bezier(0.22, 1, 0.36, 1) both; }
831
+
832
+ @keyframes garden-ui-draw { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }
833
+ @keyframes garden-ui-appear { from { opacity: 0; } to { opacity: 1; } }
834
+ @keyframes garden-ui-grow { from { transform: scaleY(0); } to { transform: none; } }
835
+
836
+ .garden-ui-chart-tooltip {
837
+ position: absolute;
838
+ top: 8px;
839
+ display: flex;
840
+ flex-direction: column;
841
+ gap: 2px;
842
+ padding: 6px 10px;
843
+ border: 1px solid var(--gui-popover-border);
844
+ border-radius: 10px;
845
+ background: var(--gui-bg);
846
+ box-shadow: var(--gui-shadow);
847
+ color: var(--gui-text);
848
+ font-size: 12px;
849
+ line-height: 1.5;
850
+ pointer-events: none;
851
+ white-space: nowrap;
852
+ transform: translateX(8px);
853
+ }
854
+
855
+ .garden-ui-chart-tooltip[data-side="left"] { transform: translateX(calc(-100% - 8px)); }
856
+
857
+ /* media */
858
+ .garden-ui-image-stage { position: relative; overflow: hidden; border-radius: 12px; }
859
+ .garden-ui-image-stage img { display: block; width: 100%; height: 100%; object-fit: contain; }
860
+
861
+ .garden-ui-hotspot {
862
+ position: absolute;
863
+ min-width: 24px;
864
+ height: 24px;
865
+ padding: 0 6px;
866
+ border: 1px solid var(--gui-border-strong);
867
+ border-radius: 999px;
868
+ background: #fff;
869
+ box-shadow: 0 2px 6px #00000014;
870
+ color: #333;
871
+ font-size: 12px;
872
+ font-weight: 600;
873
+ line-height: 22px;
874
+ transform: translate(-50%, -50%);
875
+ transition: background-color 150ms ease, color 150ms ease;
876
+ }
877
+
878
+ .garden-ui-hotspot[aria-pressed="true"] { border-color: #111; background: #111; color: #fff; }
879
+
880
+ .garden-ui-code {
881
+ margin: 0;
882
+ padding: 12px 0;
883
+ overflow-x: auto;
884
+ border-radius: 12px;
885
+ background: var(--gui-code-bg);
886
+ font-family: var(--gui-mono);
887
+ font-size: 13px;
888
+ line-height: 1.6;
889
+ }
890
+
891
+ .garden-ui-code code { padding: 0; border-radius: 0; background: none; color: var(--gui-text); font-size: 13px; }
892
+ .garden-ui-code-line { display: block; padding: 0 14px 0 0; border-left: 2px solid transparent; }
893
+ .garden-ui-code-line[data-highlight="true"] { border-left-color: var(--gui-info); background: var(--gui-info-soft); }
894
+ .garden-ui-code-number { display: inline-block; width: 3em; padding-right: 1em; color: var(--gui-subtle); text-align: right; user-select: none; }
895
+
896
+ .garden-ui-diagram-canvas { overflow-x: auto; padding: 12px; border-radius: 12px; background: var(--gui-code-bg); }
897
+ .garden-ui-diagram-canvas svg { max-width: 100%; height: auto; }
898
+ .garden-ui .garden-ui-diagram-canvas foreignObject,
899
+ .garden-ui .garden-ui-diagram-canvas foreignObject div,
900
+ .garden-ui .garden-ui-diagram-canvas .nodeLabel,
901
+ .garden-ui .garden-ui-diagram-canvas p {
902
+ font-family: ui-sans-serif, -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif !important;
903
+ font-size: 14px !important;
904
+ font-weight: 400 !important;
905
+ line-height: 1.3 !important;
906
+ letter-spacing: normal !important;
907
+ }
908
+ .garden-ui-diagram-canvas .garden-ui-diagram-on rect,
909
+ .garden-ui-diagram-canvas .garden-ui-diagram-on polygon,
910
+ .garden-ui-diagram-canvas .garden-ui-diagram-on circle,
911
+ .garden-ui-diagram-canvas rect.garden-ui-diagram-on { fill: var(--gui-info-soft) !important; stroke: var(--gui-info) !important; }
912
+ .garden-ui-diagram-canvas .garden-ui-diagram-on .nodeLabel,
913
+ .garden-ui-diagram-canvas .garden-ui-diagram-on text { color: var(--gui-info-text) !important; fill: var(--gui-info-text) !important; }
914
+ .garden-ui-diagram-canvas path.garden-ui-diagram-on { stroke: var(--gui-info) !important; stroke-width: 2px !important; }
915
+
916
+ /* intent: the author's words, shown like a message bubble */
917
+ .garden-ui-intent { border: 0; background: transparent; }
918
+ .garden-ui-intent .garden-ui-body { gap: 10px; padding: 14px 16px; border-radius: 18px; background: var(--gui-bubble); }
919
+ .garden-ui-intent-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; color: var(--gui-text); font-size: 13px; }
920
+ .garden-ui-intent-head strong { font-weight: 600; }
921
+ .garden-ui-intent-text { white-space: pre-wrap; }
922
+ .garden-ui-intent > figcaption { padding: 8px 16px 0; }
923
+
924
+ /* errors */
925
+ .garden-ui-error { border-color: var(--gui-danger-soft); }
926
+ .garden-ui-error .garden-ui-body { background: var(--gui-danger-soft); }
927
+ .garden-ui-error-title { color: var(--gui-danger-text); font-size: 15px; font-weight: 600; }
928
+ .garden-ui-diagnostics { margin: 0; padding: 0; list-style: none; font-size: 13px; }
929
+ .garden-ui-diagnostics li { display: flex; flex-wrap: wrap; gap: 8px; padding: 6px 0; border-top: 1px solid var(--gui-border); font-size: 13px; }
930
+ .garden-ui-error > figcaption { padding-top: 12px; }
931
+ .garden-ui-error-inline,
932
+ .garden-ui-unknown { color: var(--gui-danger-text); font-size: 13px; }
933
+
934
+ /* editor previews */
935
+ .garden-ui-preview { font-family: var(--gui-font); }
936
+ .garden-ui-preview-note { margin: 0 0 6px; color: var(--gui-danger-text); font-size: 13px; }
937
+
938
+ /* Category rail + a grid of name/preview cards. */
939
+ .garden-catalog {
940
+ display: grid;
941
+ grid-template-columns: 200px minmax(0, 1fr);
942
+ gap: 20px;
943
+ align-items: start;
944
+ color: var(--ink, var(--gui-text));
945
+ font-family: var(--font-mono), ui-monospace, monospace;
946
+ }
947
+
948
+ .garden-catalog-nav {
949
+ display: flex;
950
+ flex-direction: column;
951
+ gap: 4px;
952
+ min-height: calc(100vh - 150px);
953
+ padding: 16px 12px;
954
+ border: 1px solid var(--line, var(--gui-border));
955
+ border-radius: 16px;
956
+ background: var(--card, #fff);
957
+ }
958
+
959
+ .garden-catalog-nav input {
960
+ width: 100%;
961
+ height: 34px;
962
+ margin: 0 0 12px;
963
+ padding: 0 10px;
964
+ border: 1px solid var(--line, var(--gui-border));
965
+ border-radius: 8px;
966
+ background: transparent;
967
+ color: inherit;
968
+ font: inherit;
969
+ font-size: 13px;
970
+ }
971
+
972
+ .garden-catalog-nav input:focus-visible { border-color: var(--ink, var(--gui-text)); outline: none; }
973
+
974
+ .garden-catalog-nav button {
975
+ display: block;
976
+ width: 100%;
977
+ margin: 0;
978
+ padding: 10px 12px;
979
+ border: 0;
980
+ border-radius: 10px;
981
+ background: none;
982
+ color: var(--ink, var(--gui-text));
983
+ font: inherit;
984
+ font-size: 14px;
985
+ line-height: 20px;
986
+ text-align: left;
987
+ cursor: pointer;
988
+ }
989
+
990
+ .garden-catalog-nav button:hover { background: var(--paper-deep, #eeeeeb); }
991
+ .garden-catalog-nav button[aria-current="page"] { background: var(--paper-deep, #eeeeeb); font-weight: 600; }
992
+
993
+ .garden-catalog-grid {
994
+ display: grid;
995
+ grid-template-columns: repeat(3, minmax(0, 1fr));
996
+ gap: 16px;
997
+ align-items: start;
998
+ }
999
+
1000
+ .garden-catalog-card {
1001
+ display: flex;
1002
+ flex-direction: column;
1003
+ gap: 12px;
1004
+ min-width: 0;
1005
+ padding: 16px 16px 18px;
1006
+ border: 1px solid var(--line, var(--gui-border));
1007
+ border-radius: 14px;
1008
+ background: var(--card, #fff);
1009
+ }
1010
+
1011
+ .garden-catalog-card-name {
1012
+ margin: 0;
1013
+ padding: 0;
1014
+ border: 0;
1015
+ background: none;
1016
+ color: var(--ink, var(--gui-text));
1017
+ font: inherit;
1018
+ font-size: 14px;
1019
+ font-weight: 600;
1020
+ line-height: 20px;
1021
+ text-align: left;
1022
+ cursor: pointer;
1023
+ }
1024
+
1025
+ .garden-catalog-well {
1026
+ min-width: 0;
1027
+ padding: 4px 2px 0;
1028
+ }
1029
+
1030
+ .garden-catalog-well > .garden-ui { width: 100%; margin: 0; border: 0; background: transparent; }
1031
+ .garden-catalog-empty { margin: 0; color: var(--muted, var(--gui-muted)); font-size: 13px; }
1032
+ .garden-catalog-more { display: flex; flex-direction: column; gap: 8px; font-family: var(--gui-font); font-size: 13px; line-height: 20px; }
1033
+ .garden-catalog-more p { margin: 0; }
1034
+ .garden-catalog-phrases { color: var(--muted, var(--gui-muted)); }
1035
+ .garden-catalog-props { width: 100%; border-collapse: collapse; font-size: 12px; line-height: 18px; }
1036
+ .garden-catalog-props th,
1037
+ .garden-catalog-props td { padding: 8px 8px 8px 0; border: 0; border-bottom: 1px solid var(--line, var(--gui-border)); text-align: left; vertical-align: top; }
1038
+ .garden-catalog-props th { color: var(--muted, var(--gui-muted)); font-weight: 600; }
1039
+ .garden-catalog-props code { font-family: var(--gui-mono); font-size: 12px; }
1040
+ .garden-catalog-intro { font-size: 13px; line-height: 20px; }
1041
+ .garden-catalog-intro p { margin: 0 0 6px; }
1042
+ .garden-catalog-more pre { max-height: 180px; overflow: auto; margin: 0; padding: 10px; border-radius: 8px; background: var(--paper-deep, #eeeeeb); font-size: 11px; line-height: 1.45; }
1043
+
1044
+ @media (max-width: 1100px) {
1045
+ .garden-catalog-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1046
+ }
1047
+
1048
+ @media (max-width: 800px) {
1049
+ .garden-catalog { grid-template-columns: 1fr; }
1050
+ .garden-catalog-nav { min-height: 0; }
1051
+ .garden-catalog-grid { grid-template-columns: 1fr; }
1052
+ }
1053
+
1054
+ @media (max-width: 480px) {
1055
+ .garden-ui > figcaption { padding-top: 4px; }
1056
+ }
1057
+
1058
+ @media (prefers-reduced-motion: reduce) {
1059
+ .garden-ui *,
1060
+ .garden-ui *::after { transition: none !important; }
1061
+ .garden-ui-steps[data-animate="true"] .garden-ui-step[data-active="true"],
1062
+ .garden-ui-chart-drawn .garden-ui-chart-line,
1063
+ .garden-ui-chart-drawn .garden-ui-chart-area,
1064
+ .garden-ui-chart-drawn .garden-ui-chart-point,
1065
+ .garden-ui-chart-drawn .garden-ui-chart-bar { animation: none; }
1066
+ }
1067
+
1068
+ /* Article styles (.markdown-body) are declared later with equal specificity; keep them out of blocks. */
1069
+ .garden-ui .garden-ui-body p,
1070
+ .garden-ui .garden-ui-body li { margin: 0; font-family: inherit; }
1071
+ .garden-ui .garden-ui-body p:not([class]),
1072
+ .garden-ui .garden-ui-body ul:not([class]) > li,
1073
+ .garden-ui .garden-ui-body ol:not([class]) > li { color: inherit; font-size: 16px; line-height: 26px; }
1074
+ .garden-ui .garden-ui-body p,
1075
+ .garden-ui .garden-ui-card-title,
1076
+ .garden-ui > figcaption { text-align: start; }
1077
+ .garden-ui-stepper { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
1078
+ .garden-ui-stepper-label { color: var(--gui-muted); font-size: 12px; line-height: 16px; letter-spacing: 0.04em; }
1079
+ .garden-ui-stepper-row { display: flex; align-items: center; gap: 12px; }
1080
+ .garden-ui-stepper-value { color: var(--gui-text); font-size: 24px; font-weight: 600; line-height: 32px; font-variant-numeric: tabular-nums; }
1081
+ .garden-ui-stepper-unit { color: var(--gui-muted); font-size: 14px; line-height: 20px; }
1082
+
1083
+ .garden-ui-kicker { margin: 0; color: #5d5d5d; font-size: 12px; font-weight: 500; line-height: 16px; }
1084
+ .garden-ui-text-xs { margin: 0; color: #5d5d5d; font-size: 12px; font-weight: 400; line-height: 16px; }
1085
+ .garden-ui-title-2xl { margin: 0; color: #0d0d0d; font-size: 24px; font-weight: 600; line-height: 32px; }
1086
+ .garden-ui-subtitle { margin: 0; color: #0d0d0d; font-size: 16px; font-weight: 600; line-height: 26px; }
1087
+ .garden-ui-text-sm { margin: 0; color: #5d5d5d; font-size: 14px; font-weight: 400; line-height: 20px; }
1088
+ .garden-ui-caption { margin: 0; color: #5d5d5d; font-size: 14px; font-weight: 400; line-height: 18.2px; text-align: start; }
1089
+ .garden-ui-divider { height: 0; margin: 4px 0; border: 0; border-top: 1px solid var(--gui-border); }
1090
+
1091
+ .garden-ui-cite {
1092
+ display: inline-flex;
1093
+ align-items: center;
1094
+ gap: 4px;
1095
+ box-sizing: border-box;
1096
+ height: 20px;
1097
+ margin: -3px 0;
1098
+ padding: 4px 6px 4px 4px;
1099
+ border-radius: 999px;
1100
+ background: #f3f3f3;
1101
+ color: #5d5d5d;
1102
+ font-size: 9px;
1103
+ font-weight: 400;
1104
+ line-height: 9px;
1105
+ letter-spacing: normal;
1106
+ text-decoration: none;
1107
+ vertical-align: middle;
1108
+ position: relative;
1109
+ top: -2px;
1110
+ }
1111
+ .garden-ui-cite img { width: 12px; height: 12px; border-radius: 2px; }
1112
+
1113
+ .garden-ui-pie { display: flex; flex-direction: column; align-items: stretch; gap: 0; margin: 0; }
1114
+ .garden-ui-pie-title { align-self: stretch; margin: 0 0 8px; color: var(--gui-text); font-size: 16px; font-weight: 600; line-height: 26px; text-align: start; }
1115
+ .garden-ui-pie-chart { position: relative; width: 100%; aspect-ratio: 742 / 400; }
1116
+ .garden-ui-pie-chart svg { display: block; width: 100%; height: 100%; }
1117
+ .garden-ui-pie-chart .garden-ui-legend {
1118
+ position: absolute;
1119
+ top: 89.25%;
1120
+ right: 0;
1121
+ left: 0;
1122
+ display: flex;
1123
+ flex-wrap: wrap;
1124
+ justify-content: center;
1125
+ gap: 6px 16px;
1126
+ margin: 0;
1127
+ padding: 12px 0 0;
1128
+ color: #0d0d0d;
1129
+ font-size: 14px;
1130
+ font-weight: 400;
1131
+ line-height: 18px;
1132
+ }
1133
+ .garden-ui-pie-chart .garden-ui-legend li { padding: 4px 8px; border-radius: 6px; gap: 6px; font-size: 14px; line-height: 18px; }
1134
+ .garden-ui-pie-chart .garden-ui-swatch { width: 10px; height: 10px; }
1135
+ .garden-ui-pie-note { margin: 16px 0 0; color: #8f8f8f; font-size: 12px; font-weight: 400; line-height: 16px; }
1136
+ .garden-ui .garden-ui-body ul:not([class]),
1137
+ .garden-ui .garden-ui-body ol:not([class]) { margin: 0; padding-left: 22px; }
1138
+ .garden-ui .garden-ui-body ul[class],
1139
+ .garden-ui .garden-ui-body ol[class] { margin: 0; padding-left: 0; list-style: none; }
1140
+ .garden-ui .garden-ui-body li::marker { color: var(--gui-subtle); }
1141
+ .garden-ui .garden-ui-body strong { color: inherit; }
1142
+ .garden-ui .garden-ui-body a { color: var(--gui-info-text); text-decoration-color: currentColor; text-underline-offset: 2px; }
1143
+ .garden-ui a.garden-ui-cite { color: #5d5d5d; font-size: 9px; line-height: 9px; letter-spacing: normal; text-decoration: none; }
1144
+ .garden-ui .garden-ui-legend,
1145
+ .garden-ui .garden-ui-checklist ul,
1146
+ .garden-ui .garden-ui-diagnostics { padding-left: 0; list-style: none; }
1147
+ .garden-ui .garden-ui-chart .garden-ui-legend,
1148
+ .garden-ui .garden-ui-pie .garden-ui-legend { justify-content: center; }
1149
+ .garden-ui .garden-ui-checklist li { margin: 0; padding: 5px 0; }
1150
+ .garden-ui .garden-ui-checklist-detailed li { padding: 12px 0; }
1151
+ .garden-ui table.garden-ui-table { display: table; width: 100%; margin: 0; border: 0; font-size: 14px; }
1152
+ .garden-ui table.garden-ui-grid { display: table; width: auto; margin: 0; border: 0; border-collapse: separate; border-spacing: 4px; font-size: 12px; }
1153
+ .garden-ui .garden-ui-grid tr { border: 0; background: none; }
1154
+ .garden-ui .garden-ui-table tr { border: 0; border-bottom: 1px solid rgba(0, 0, 0, 0.05); background: none; }
1155
+ .garden-ui .garden-ui-table tr:last-child { border-bottom: 0; }
1156
+ .garden-ui .garden-ui-table th,
1157
+ .garden-ui .garden-ui-table td { padding: 8px 8px 8px 0; border: 0; background: none; color: #0d0d0d; font-size: 14px; font-weight: 400; line-height: 20px; }
1158
+ .garden-ui .garden-ui-table thead th { color: #0d0d0d; font-size: 14px; font-weight: 600; }
1159
+ .garden-ui .garden-ui-table tbody th { color: #0d0d0d; font-size: 14px; font-weight: 400; }
1160
+ .garden-ui .garden-ui-table td:not(.garden-ui-tone-plain) { background: none; color: var(--gui-tone-text); }
1161
+ .garden-ui .garden-ui-table:has(tr[data-tone="row"]) th:first-child,
1162
+ .garden-ui .garden-ui-table:has(tr[data-tone="row"]) td:first-child { padding-left: 14px; }
1163
+ .garden-ui .garden-ui-table:has(tr[data-tone="row"]) th:last-child,
1164
+ .garden-ui .garden-ui-table:has(tr[data-tone="row"]) td:last-child { padding-right: 14px; }
1165
+ .garden-ui .garden-ui-table tr[data-tone="row"] > th,
1166
+ .garden-ui .garden-ui-table tr[data-tone="row"] > td { background: var(--gui-tone-soft); color: var(--gui-text); }
1167
+ .garden-ui .garden-ui-table tr[data-tone="row"] > :first-child { border-radius: 8px 0 0 8px; }
1168
+ .garden-ui .garden-ui-table tr[data-tone="row"] > :last-child { border-radius: 0 8px 8px 0; }
1169
+ .garden-ui .garden-ui-table-kv tbody th,
1170
+ .garden-ui .garden-ui-table-kv td { padding-top: 14px; padding-bottom: 14px; border-bottom: 1px solid var(--gui-border-soft); }
1171
+ .garden-ui .garden-ui-table-kv td { font-weight: 600; text-align: right; }
1172
+ .garden-ui .garden-ui-table [data-align="right"] { text-align: right; }
1173
+ .garden-ui .garden-ui-grid th,
1174
+ .garden-ui .garden-ui-grid td { padding: 0; border: 0; background: none; }
1175
+ .garden-ui .garden-ui-grid th { padding: 0 6px; color: var(--gui-muted); font-size: 12px; font-weight: 400; }
1176
+ .garden-ui .garden-ui-grid thead th { text-align: center; }
1177
+ .garden-ui .garden-ui-grid tbody th { text-align: right; }
1178
+ .garden-ui .garden-ui-code { margin: 0; padding: 12px 0; border: 0; border-radius: 12px; background: var(--gui-code-bg); color: var(--gui-text); font-size: 13px; }
1179
+ .garden-ui .garden-ui-code::before { content: none; }
1180
+ .garden-ui .garden-ui-body input[type="checkbox"] { width: 20px; height: 20px; margin: 2px 0 0; }
1181
+ .garden-ui figcaption,
1182
+ .garden-ui > figcaption { margin: 0; border: 0; text-align: start; }