@dryui/ui 0.2.1 → 0.2.2

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 (165) hide show
  1. package/dist/accordion/accordion-trigger.svelte +9 -1
  2. package/dist/accordion/index.d.ts +24 -10
  3. package/dist/adjust/index.d.ts +10 -10
  4. package/dist/alert/index.d.ts +7 -13
  5. package/dist/alert-dialog/index.d.ts +10 -20
  6. package/dist/alpha-slider/index.d.ts +6 -6
  7. package/dist/aspect-ratio/index.d.ts +2 -2
  8. package/dist/aurora/index.d.ts +8 -8
  9. package/dist/avatar/index.d.ts +11 -4
  10. package/dist/badge/index.d.ts +3 -3
  11. package/dist/beam/index.d.ts +7 -7
  12. package/dist/breadcrumb/index.d.ts +24 -12
  13. package/dist/button/button.svelte +5 -1
  14. package/dist/button/index.d.ts +3 -3
  15. package/dist/button-group/index.d.ts +1 -1
  16. package/dist/calendar/index.d.ts +7 -14
  17. package/dist/card/index.d.ts +15 -15
  18. package/dist/carousel/index.d.ts +8 -16
  19. package/dist/chart/index.d.ts +49 -44
  20. package/dist/chat-thread/index.d.ts +9 -11
  21. package/dist/checkbox/checkbox.svelte +1 -5
  22. package/dist/checkbox/index.d.ts +1 -1
  23. package/dist/chip/index.d.ts +13 -18
  24. package/dist/chip-group/index.d.ts +3 -3
  25. package/dist/chromatic-aberration/index.d.ts +3 -3
  26. package/dist/chromatic-shift/index.d.ts +2 -1
  27. package/dist/code-block/highlighter/types.d.ts +3 -3
  28. package/dist/code-block/index.d.ts +3 -3
  29. package/dist/collapsible/collapsible-trigger.svelte +9 -1
  30. package/dist/collapsible/index.d.ts +16 -8
  31. package/dist/color-picker/color-picker-eyedropper.svelte +13 -1
  32. package/dist/color-picker/index.d.ts +11 -19
  33. package/dist/combobox/index.d.ts +10 -15
  34. package/dist/command-palette/index.d.ts +8 -16
  35. package/dist/container/index.d.ts +3 -3
  36. package/dist/context-menu/index.d.ts +8 -16
  37. package/dist/data-grid/index.d.ts +22 -29
  38. package/dist/date-field/date-field-separator.svelte +1 -7
  39. package/dist/date-field/index.d.ts +4 -4
  40. package/dist/date-picker/datepicker-trigger.svelte +15 -1
  41. package/dist/date-picker/index.d.ts +6 -10
  42. package/dist/date-range-picker/date-range-picker-trigger.svelte +12 -1
  43. package/dist/date-range-picker/index.d.ts +6 -12
  44. package/dist/date-time-input/index.d.ts +1 -1
  45. package/dist/description-list/index.d.ts +8 -8
  46. package/dist/dialog/index.d.ts +9 -18
  47. package/dist/displacement/index.d.ts +2 -1
  48. package/dist/drag-and-drop/index.d.ts +4 -8
  49. package/dist/drawer/index.d.ts +10 -18
  50. package/dist/drop-zone/index.d.ts +2 -2
  51. package/dist/dropdown-menu/index.d.ts +8 -16
  52. package/dist/field/index.d.ts +3 -3
  53. package/dist/fieldset/index.d.ts +8 -8
  54. package/dist/file-select/file-select-clear.svelte +8 -1
  55. package/dist/file-select/index.d.ts +8 -10
  56. package/dist/file-upload/file-upload-item-delete.svelte +8 -1
  57. package/dist/file-upload/file-upload-root.svelte +0 -1
  58. package/dist/file-upload/index.d.ts +14 -19
  59. package/dist/flip-card/index.d.ts +3 -3
  60. package/dist/float-button/float-button-root.svelte +7 -1
  61. package/dist/float-button/index.d.ts +6 -10
  62. package/dist/glass/index.d.ts +4 -4
  63. package/dist/glow/index.d.ts +5 -5
  64. package/dist/god-rays/index.d.ts +10 -10
  65. package/dist/gradient-mesh/index.d.ts +2 -1
  66. package/dist/halftone/index.d.ts +5 -5
  67. package/dist/heading/index.d.ts +3 -3
  68. package/dist/hover-card/index.d.ts +4 -8
  69. package/dist/icon/index.d.ts +5 -5
  70. package/dist/index.d.ts +65 -587
  71. package/dist/input/index.d.ts +2 -2
  72. package/dist/input-group/index.d.ts +11 -17
  73. package/dist/input-group/input-group-root.svelte +0 -1
  74. package/dist/internal/color-aliases.d.ts +5 -8
  75. package/dist/kbd/index.d.ts +6 -1
  76. package/dist/label/index.d.ts +1 -1
  77. package/dist/link/index.d.ts +1 -1
  78. package/dist/link-preview/index.d.ts +4 -8
  79. package/dist/list/index.d.ts +6 -12
  80. package/dist/list/list-root.svelte +0 -1
  81. package/dist/listbox/index.d.ts +2 -2
  82. package/dist/logo-mark/logo-mark.svelte.d.ts +7 -7
  83. package/dist/map/index.d.ts +31 -43
  84. package/dist/mask-reveal/index.d.ts +2 -1
  85. package/dist/mega-menu/index.d.ts +7 -14
  86. package/dist/menubar/index.d.ts +8 -16
  87. package/dist/multi-select-combobox/index.d.ts +10 -20
  88. package/dist/multi-select-combobox/multi-select-combobox-input.svelte +0 -1
  89. package/dist/navigation-menu/index.d.ts +27 -14
  90. package/dist/navigation-menu/navigation-menu-list.svelte +0 -1
  91. package/dist/noise/index.d.ts +5 -5
  92. package/dist/notification-center/index.d.ts +6 -13
  93. package/dist/notification-center/notification-center-panel.svelte +4 -1
  94. package/dist/notification-center/notification-center-trigger.svelte +0 -1
  95. package/dist/number-input/index.d.ts +1 -1
  96. package/dist/number-input/number-input.svelte +3 -1
  97. package/dist/option-swatch-group/index.d.ts +8 -8
  98. package/dist/pagination/index.d.ts +8 -16
  99. package/dist/phone-input/index.d.ts +1 -1
  100. package/dist/pin-input/index.d.ts +7 -13
  101. package/dist/popover/index.d.ts +3 -3
  102. package/dist/progress/index.d.ts +3 -7
  103. package/dist/progress-ring/index.d.ts +2 -2
  104. package/dist/radio-group/index.d.ts +2 -2
  105. package/dist/radio-group/radio-group.svelte +0 -1
  106. package/dist/range-calendar/index.d.ts +2 -2
  107. package/dist/range-calendar/range-calendar-grid.svelte +10 -4
  108. package/dist/range-calendar/range-calendar-root.svelte +1 -5
  109. package/dist/rating/index.d.ts +1 -1
  110. package/dist/reveal/index.d.ts +3 -1
  111. package/dist/rich-text-editor/index.d.ts +5 -4
  112. package/dist/rich-text-editor/rich-text-editor-content.svelte +9 -1
  113. package/dist/rich-text-editor/rich-text-editor-toolbar.svelte +1 -2
  114. package/dist/scroll-to-top/index.d.ts +2 -2
  115. package/dist/segmented-control/index.d.ts +2 -2
  116. package/dist/select/index.d.ts +6 -12
  117. package/dist/select/select-trigger.svelte +9 -1
  118. package/dist/separator/index.d.ts +3 -3
  119. package/dist/shader-canvas/index.d.ts +13 -18
  120. package/dist/shader-canvas/presets.d.ts +5 -10
  121. package/dist/shader-canvas/shader-canvas.svelte +0 -1
  122. package/dist/sidebar/index.d.ts +37 -18
  123. package/dist/sidebar/sidebar-header.svelte +4 -1
  124. package/dist/sidebar/sidebar-root.svelte +1 -1
  125. package/dist/skeleton/index.d.ts +5 -5
  126. package/dist/slider/index.d.ts +1 -1
  127. package/dist/spacer/index.d.ts +2 -2
  128. package/dist/spinner/index.d.ts +5 -4
  129. package/dist/splitter/index.d.ts +3 -3
  130. package/dist/spotlight/index.d.ts +2 -1
  131. package/dist/star-rating/index.d.ts +5 -5
  132. package/dist/stepper/index.d.ts +5 -10
  133. package/dist/svg/index.d.ts +2 -1
  134. package/dist/system-map/index.d.ts +13 -41
  135. package/dist/system-map/types.d.ts +75 -92
  136. package/dist/table/index.d.ts +9 -18
  137. package/dist/table-of-contents/index.d.ts +4 -9
  138. package/dist/tabs/index.d.ts +25 -8
  139. package/dist/tabs/tabs-trigger.svelte +4 -2
  140. package/dist/tag/index.d.ts +3 -3
  141. package/dist/tags-input/index.d.ts +7 -12
  142. package/dist/text/index.d.ts +7 -7
  143. package/dist/textarea/index.d.ts +1 -1
  144. package/dist/themes/default.css +4 -1
  145. package/dist/themes/use-theme-override.svelte.d.ts +1 -17
  146. package/dist/thumbnail/index.d.ts +5 -5
  147. package/dist/time-input/index.d.ts +6 -6
  148. package/dist/time-input/time-input.svelte +1 -3
  149. package/dist/timeline/index.d.ts +9 -16
  150. package/dist/timeline/timeline-item.svelte +2 -1
  151. package/dist/toast/index.d.ts +7 -15
  152. package/dist/toggle/index.d.ts +2 -2
  153. package/dist/toggle-group/index.d.ts +3 -3
  154. package/dist/toolbar/index.d.ts +5 -10
  155. package/dist/tooltip/index.d.ts +3 -3
  156. package/dist/tour/index.d.ts +2 -2
  157. package/dist/tour/tour-root.svelte +4 -1
  158. package/dist/transfer/index.d.ts +9 -16
  159. package/dist/tree/index.d.ts +5 -10
  160. package/dist/typing-indicator/index.d.ts +2 -1
  161. package/dist/typography/index.d.ts +9 -12
  162. package/dist/visually-hidden/index.d.ts +5 -1
  163. package/package.json +1 -1
  164. package/skills/dryui/SKILL.md +28 -16
  165. package/skills/dryui/rules/composition.md +262 -225
@@ -8,12 +8,15 @@ All layout uses raw `display: grid` in scoped `<style>` blocks with `--dry-space
8
8
 
9
9
  ```svelte
10
10
  <div class="stack">
11
- <p>First</p>
12
- <p>Second</p>
11
+ <p>First</p>
12
+ <p>Second</p>
13
13
  </div>
14
14
 
15
15
  <style>
16
- .stack { display: grid; gap: var(--dry-space-4); }
16
+ .stack {
17
+ display: grid;
18
+ gap: var(--dry-space-4);
19
+ }
17
20
  </style>
18
21
  ```
19
22
 
@@ -21,17 +24,17 @@ All layout uses raw `display: grid` in scoped `<style>` blocks with `--dry-space
21
24
 
22
25
  ```svelte
23
26
  <div class="row">
24
- <span>Label</span>
25
- <Button>Action</Button>
27
+ <span>Label</span>
28
+ <Button>Action</Button>
26
29
  </div>
27
30
 
28
31
  <style>
29
- .row {
30
- display: grid;
31
- grid-template-columns: 1fr auto;
32
- align-items: center;
33
- gap: var(--dry-space-4);
34
- }
32
+ .row {
33
+ display: grid;
34
+ grid-template-columns: 1fr auto;
35
+ align-items: center;
36
+ gap: var(--dry-space-4);
37
+ }
35
38
  </style>
36
39
  ```
37
40
 
@@ -39,23 +42,27 @@ All layout uses raw `display: grid` in scoped `<style>` blocks with `--dry-space
39
42
 
40
43
  ```svelte
41
44
  <div class="grid-container">
42
- <div class="grid">
43
- <div>A</div>
44
- <div>B</div>
45
- <div>C</div>
46
- </div>
45
+ <div class="grid">
46
+ <div>A</div>
47
+ <div>B</div>
48
+ <div>C</div>
49
+ </div>
47
50
  </div>
48
51
 
49
52
  <style>
50
- .grid-container { container-type: inline-size; }
51
- .grid {
52
- display: grid;
53
- grid-template-columns: 1fr;
54
- gap: var(--dry-space-6);
55
- }
56
- @container (min-width: 40rem) {
57
- .grid { grid-template-columns: repeat(3, 1fr); }
58
- }
53
+ .grid-container {
54
+ container-type: inline-size;
55
+ }
56
+ .grid {
57
+ display: grid;
58
+ grid-template-columns: 1fr;
59
+ gap: var(--dry-space-6);
60
+ }
61
+ @container (min-width: 40rem) {
62
+ .grid {
63
+ grid-template-columns: repeat(3, 1fr);
64
+ }
65
+ }
59
66
  </style>
60
67
  ```
61
68
 
@@ -65,7 +72,7 @@ Use `Container` (simple component, no `.Root`) for constrained content width:
65
72
 
66
73
  ```svelte
67
74
  <Container>
68
- <h1>Page Title</h1>
75
+ <h1>Page Title</h1>
69
76
  </Container>
70
77
  ```
71
78
 
@@ -77,32 +84,35 @@ Wrap each input in Field.Root, stack them with grid, put everything in a Card.
77
84
 
78
85
  ```svelte
79
86
  <script>
80
- import '@dryui/ui/themes/default.css';
81
- import { Card, Field, Label, Input, Button } from '@dryui/ui';
87
+ import '@dryui/ui/themes/default.css';
88
+ import { Card, Field, Label, Input, Button } from '@dryui/ui';
82
89
 
83
- let name = $state('');
84
- let email = $state('');
90
+ let name = $state('');
91
+ let email = $state('');
85
92
  </script>
86
93
 
87
94
  <Card.Root>
88
- <Card.Header>Contact Info</Card.Header>
89
- <Card.Content>
90
- <form class="form-stack">
91
- <Field.Root>
92
- <Label>Name</Label>
93
- <Input bind:value={name} />
94
- </Field.Root>
95
- <Field.Root>
96
- <Label>Email</Label>
97
- <Input type="email" bind:value={email} />
98
- </Field.Root>
99
- <Button type="submit" variant="solid">Save contact</Button>
100
- </form>
101
- </Card.Content>
95
+ <Card.Header>Contact Info</Card.Header>
96
+ <Card.Content>
97
+ <form class="form-stack">
98
+ <Field.Root>
99
+ <Label>Name</Label>
100
+ <Input bind:value={name} />
101
+ </Field.Root>
102
+ <Field.Root>
103
+ <Label>Email</Label>
104
+ <Input type="email" bind:value={email} />
105
+ </Field.Root>
106
+ <Button type="submit" variant="solid">Save contact</Button>
107
+ </form>
108
+ </Card.Content>
102
109
  </Card.Root>
103
110
 
104
111
  <style>
105
- .form-stack { display: grid; gap: var(--dry-space-4); }
112
+ .form-stack {
113
+ display: grid;
114
+ gap: var(--dry-space-4);
115
+ }
106
116
  </style>
107
117
  ```
108
118
 
@@ -112,16 +122,16 @@ Use Field.Error to show validation messages.
112
122
 
113
123
  ```svelte
114
124
  <script>
115
- let email = $state('');
116
- let error = $derived(email && !email.includes('@') ? 'Please enter a valid email' : '');
125
+ let email = $state('');
126
+ let error = $derived(email && !email.includes('@') ? 'Please enter a valid email' : '');
117
127
  </script>
118
128
 
119
129
  <Field.Root>
120
- <Label>Email</Label>
121
- <Input type="email" bind:value={email} />
122
- {#if error}
123
- <Field.Error>{error}</Field.Error>
124
- {/if}
130
+ <Label>Email</Label>
131
+ <Input type="email" bind:value={email} />
132
+ {#if error}
133
+ <Field.Error>{error}</Field.Error>
134
+ {/if}
125
135
  </Field.Root>
126
136
  ```
127
137
 
@@ -129,54 +139,57 @@ Use Field.Error to show validation messages.
129
139
 
130
140
  ```svelte
131
141
  <script>
132
- let name = $state('');
133
- let bio = $state('');
134
- let country = $state('');
135
- let agreed = $state(false);
142
+ let name = $state('');
143
+ let bio = $state('');
144
+ let country = $state('');
145
+ let agreed = $state(false);
136
146
  </script>
137
147
 
138
148
  <form class="form-stack">
139
- <Field.Root>
140
- <Label>Name</Label>
141
- <Input bind:value={name} />
142
- </Field.Root>
143
-
144
- <Field.Root>
145
- <Label>Bio</Label>
146
- <Textarea bind:value={bio} />
147
- </Field.Root>
148
-
149
- <Field.Root>
150
- <Label>Country</Label>
151
- <Select.Root bind:value={country}>
152
- <Select.Trigger>
153
- <Select.Value placeholder="Select country..." />
154
- </Select.Trigger>
155
- <Select.Content>
156
- <Select.Item value="us">United States</Select.Item>
157
- <Select.Item value="uk">United Kingdom</Select.Item>
158
- </Select.Content>
159
- </Select.Root>
160
- </Field.Root>
161
-
162
- <Field.Root>
163
- <div class="checkbox-row">
164
- <Checkbox bind:checked={agreed} />
165
- <Label>I agree to the terms</Label>
166
- </div>
167
- </Field.Root>
168
-
169
- <Button type="submit" variant="solid">Submit form</Button>
149
+ <Field.Root>
150
+ <Label>Name</Label>
151
+ <Input bind:value={name} />
152
+ </Field.Root>
153
+
154
+ <Field.Root>
155
+ <Label>Bio</Label>
156
+ <Textarea bind:value={bio} />
157
+ </Field.Root>
158
+
159
+ <Field.Root>
160
+ <Label>Country</Label>
161
+ <Select.Root bind:value={country}>
162
+ <Select.Trigger>
163
+ <Select.Value placeholder="Select country..." />
164
+ </Select.Trigger>
165
+ <Select.Content>
166
+ <Select.Item value="us">United States</Select.Item>
167
+ <Select.Item value="uk">United Kingdom</Select.Item>
168
+ </Select.Content>
169
+ </Select.Root>
170
+ </Field.Root>
171
+
172
+ <Field.Root>
173
+ <div class="checkbox-row">
174
+ <Checkbox bind:checked={agreed} />
175
+ <Label>I agree to the terms</Label>
176
+ </div>
177
+ </Field.Root>
178
+
179
+ <Button type="submit" variant="solid">Submit form</Button>
170
180
  </form>
171
181
 
172
182
  <style>
173
- .form-stack { display: grid; gap: var(--dry-space-4); }
174
- .checkbox-row {
175
- display: grid;
176
- grid-template-columns: auto 1fr;
177
- align-items: center;
178
- gap: var(--dry-space-2);
179
- }
183
+ .form-stack {
184
+ display: grid;
185
+ gap: var(--dry-space-4);
186
+ }
187
+ .checkbox-row {
188
+ display: grid;
189
+ grid-template-columns: auto 1fr;
190
+ align-items: center;
191
+ gap: var(--dry-space-2);
192
+ }
180
193
  </style>
181
194
  ```
182
195
 
@@ -186,25 +199,33 @@ Use Field.Error to show validation messages.
186
199
 
187
200
  ```svelte
188
201
  <div class="page-with-sidebar">
189
- <nav class="sidebar">
190
- <Button variant="ghost">Dashboard</Button>
191
- <Button variant="ghost">Settings</Button>
192
- <Button variant="ghost">Profile</Button>
193
- </nav>
194
- <main class="content">
195
- <h1>Dashboard</h1>
196
- <p>Main content here.</p>
197
- </main>
202
+ <nav class="sidebar">
203
+ <Button variant="ghost">Dashboard</Button>
204
+ <Button variant="ghost">Settings</Button>
205
+ <Button variant="ghost">Profile</Button>
206
+ </nav>
207
+ <main class="content">
208
+ <h1>Dashboard</h1>
209
+ <p>Main content here.</p>
210
+ </main>
198
211
  </div>
199
212
 
200
213
  <style>
201
- .page-with-sidebar {
202
- display: grid;
203
- grid-template-columns: 15rem 1fr;
204
- gap: var(--dry-space-6);
205
- }
206
- .sidebar { display: grid; gap: var(--dry-space-2); align-content: start; }
207
- .content { display: grid; gap: var(--dry-space-6); align-content: start; }
214
+ .page-with-sidebar {
215
+ display: grid;
216
+ grid-template-columns: 15rem 1fr;
217
+ gap: var(--dry-space-6);
218
+ }
219
+ .sidebar {
220
+ display: grid;
221
+ gap: var(--dry-space-2);
222
+ align-content: start;
223
+ }
224
+ .content {
225
+ display: grid;
226
+ gap: var(--dry-space-6);
227
+ align-content: start;
228
+ }
208
229
  </style>
209
230
  ```
210
231
 
@@ -212,31 +233,35 @@ Use Field.Error to show validation messages.
212
233
 
213
234
  ```svelte
214
235
  <div class="card-grid-container">
215
- <div class="card-grid">
216
- {#each items as item (item.id)}
217
- <Card.Root>
218
- <Card.Header>{item.title}</Card.Header>
219
- <Card.Content>
220
- <p>{item.description}</p>
221
- </Card.Content>
222
- <Card.Footer>
223
- <Button variant="outline">View details</Button>
224
- </Card.Footer>
225
- </Card.Root>
226
- {/each}
227
- </div>
236
+ <div class="card-grid">
237
+ {#each items as item (item.id)}
238
+ <Card.Root>
239
+ <Card.Header>{item.title}</Card.Header>
240
+ <Card.Content>
241
+ <p>{item.description}</p>
242
+ </Card.Content>
243
+ <Card.Footer>
244
+ <Button variant="outline">View details</Button>
245
+ </Card.Footer>
246
+ </Card.Root>
247
+ {/each}
248
+ </div>
228
249
  </div>
229
250
 
230
251
  <style>
231
- .card-grid-container { container-type: inline-size; }
232
- .card-grid {
233
- display: grid;
234
- grid-template-columns: 1fr;
235
- gap: var(--dry-space-6);
236
- }
237
- @container (min-width: 40rem) {
238
- .card-grid { grid-template-columns: repeat(3, 1fr); }
239
- }
252
+ .card-grid-container {
253
+ container-type: inline-size;
254
+ }
255
+ .card-grid {
256
+ display: grid;
257
+ grid-template-columns: 1fr;
258
+ gap: var(--dry-space-6);
259
+ }
260
+ @container (min-width: 40rem) {
261
+ .card-grid {
262
+ grid-template-columns: repeat(3, 1fr);
263
+ }
264
+ }
240
265
  </style>
241
266
  ```
242
267
 
@@ -244,42 +269,48 @@ Use Field.Error to show validation messages.
244
269
 
245
270
  ```svelte
246
271
  <script>
247
- let activeTab = $state('general');
248
- let displayName = $state('');
272
+ let activeTab = $state('general');
273
+ let displayName = $state('');
249
274
  </script>
250
275
 
251
276
  <Container>
252
- <div class="settings-stack">
253
- <h1>Settings</h1>
254
- <Tabs.Root bind:value={activeTab}>
255
- <Tabs.List>
256
- <Tabs.Trigger value="general">General</Tabs.Trigger>
257
- <Tabs.Trigger value="security">Security</Tabs.Trigger>
258
- <Tabs.Trigger value="notifications">Notifications</Tabs.Trigger>
259
- </Tabs.List>
260
- <Tabs.Content value="general">
261
- <Card.Root>
262
- <Card.Content>
263
- <form class="form-stack">
264
- <Field.Root>
265
- <Label>Display Name</Label>
266
- <Input bind:value={displayName} />
267
- </Field.Root>
268
- <Button type="submit" variant="solid">Save settings</Button>
269
- </form>
270
- </Card.Content>
271
- </Card.Root>
272
- </Tabs.Content>
273
- <Tabs.Content value="security">
274
- <!-- Security settings -->
275
- </Tabs.Content>
276
- </Tabs.Root>
277
- </div>
277
+ <div class="settings-stack">
278
+ <h1>Settings</h1>
279
+ <Tabs.Root bind:value={activeTab}>
280
+ <Tabs.List>
281
+ <Tabs.Trigger value="general">General</Tabs.Trigger>
282
+ <Tabs.Trigger value="security">Security</Tabs.Trigger>
283
+ <Tabs.Trigger value="notifications">Notifications</Tabs.Trigger>
284
+ </Tabs.List>
285
+ <Tabs.Content value="general">
286
+ <Card.Root>
287
+ <Card.Content>
288
+ <form class="form-stack">
289
+ <Field.Root>
290
+ <Label>Display Name</Label>
291
+ <Input bind:value={displayName} />
292
+ </Field.Root>
293
+ <Button type="submit" variant="solid">Save settings</Button>
294
+ </form>
295
+ </Card.Content>
296
+ </Card.Root>
297
+ </Tabs.Content>
298
+ <Tabs.Content value="security">
299
+ <!-- Security settings -->
300
+ </Tabs.Content>
301
+ </Tabs.Root>
302
+ </div>
278
303
  </Container>
279
304
 
280
305
  <style>
281
- .settings-stack { display: grid; gap: var(--dry-space-8); }
282
- .form-stack { display: grid; gap: var(--dry-space-4); }
306
+ .settings-stack {
307
+ display: grid;
308
+ gap: var(--dry-space-8);
309
+ }
310
+ .form-stack {
311
+ display: grid;
312
+ gap: var(--dry-space-4);
313
+ }
283
314
  </style>
284
315
  ```
285
316
 
@@ -287,41 +318,44 @@ Use Field.Error to show validation messages.
287
318
 
288
319
  ```svelte
289
320
  <Container>
290
- <div class="page-stack">
291
- <div class="page-header">
292
- <h1>Users</h1>
293
- <Button variant="solid">Add user</Button>
294
- </div>
295
- <Table.Root>
296
- <Table.Header>
297
- <Table.Row>
298
- <Table.Head>Name</Table.Head>
299
- <Table.Head>Email</Table.Head>
300
- <Table.Head>Role</Table.Head>
301
- </Table.Row>
302
- </Table.Header>
303
- <Table.Body>
304
- {#each users as user (user.id)}
305
- <Table.Row>
306
- <Table.Cell>{user.name}</Table.Cell>
307
- <Table.Cell>{user.email}</Table.Cell>
308
- <Table.Cell>
309
- <Badge variant="soft">{user.role}</Badge>
310
- </Table.Cell>
311
- </Table.Row>
312
- {/each}
313
- </Table.Body>
314
- </Table.Root>
315
- </div>
321
+ <div class="page-stack">
322
+ <div class="page-header">
323
+ <h1>Users</h1>
324
+ <Button variant="solid">Add user</Button>
325
+ </div>
326
+ <Table.Root>
327
+ <Table.Header>
328
+ <Table.Row>
329
+ <Table.Head>Name</Table.Head>
330
+ <Table.Head>Email</Table.Head>
331
+ <Table.Head>Role</Table.Head>
332
+ </Table.Row>
333
+ </Table.Header>
334
+ <Table.Body>
335
+ {#each users as user (user.id)}
336
+ <Table.Row>
337
+ <Table.Cell>{user.name}</Table.Cell>
338
+ <Table.Cell>{user.email}</Table.Cell>
339
+ <Table.Cell>
340
+ <Badge variant="soft">{user.role}</Badge>
341
+ </Table.Cell>
342
+ </Table.Row>
343
+ {/each}
344
+ </Table.Body>
345
+ </Table.Root>
346
+ </div>
316
347
  </Container>
317
348
 
318
349
  <style>
319
- .page-stack { display: grid; gap: var(--dry-space-6); }
320
- .page-header {
321
- display: grid;
322
- grid-template-columns: 1fr auto;
323
- align-items: center;
324
- }
350
+ .page-stack {
351
+ display: grid;
352
+ gap: var(--dry-space-6);
353
+ }
354
+ .page-header {
355
+ display: grid;
356
+ grid-template-columns: 1fr auto;
357
+ align-items: center;
358
+ }
325
359
  </style>
326
360
  ```
327
361
 
@@ -341,7 +375,10 @@ Use Field.Error to show validation messages.
341
375
  <Container>...</Container>
342
376
 
343
377
  <style>
344
- .layout { display: grid; gap: var(--dry-space-4); }
378
+ .layout {
379
+ display: grid;
380
+ gap: var(--dry-space-4);
381
+ }
345
382
  </style>
346
383
  ```
347
384
 
@@ -350,12 +387,12 @@ Use Field.Error to show validation messages.
350
387
  ```svelte
351
388
  <!-- Wrong: bare Card -->
352
389
  <Card>
353
- <Card.Content>...</Card.Content>
390
+ <Card.Content>...</Card.Content>
354
391
  </Card>
355
392
 
356
393
  <!-- Right: Card.Root -->
357
394
  <Card.Root>
358
- <Card.Content>...</Card.Content>
395
+ <Card.Content>...</Card.Content>
359
396
  </Card.Root>
360
397
  ```
361
398
 
@@ -363,34 +400,34 @@ Use Field.Error to show validation messages.
363
400
 
364
401
  Before using any component, call `compose` to get the correct component and usage snippet. This table is a quick reference — `compose` has full snippets and anti-patterns.
365
402
 
366
- | UI Need | Use This | NOT This |
367
- | ----------------- | -------------------------------------- | --------------------------- |
368
- | Date picker | `DatePicker.Root` | `<input type="date">` |
369
- | Date range | `DateRangePicker.Root` | Two `<input type="date">` |
370
- | Time input | `TimeInput` | `<input type="time">` |
371
- | Dropdown select | `Select.Root` | `<select>` |
372
- | Searchable select | `Combobox.Root` | `<input>` + custom dropdown |
373
- | Modal dialog | `Dialog.Root` | `<dialog>` or manual overlay|
374
- | Confirmation | `AlertDialog.Root` | `window.confirm()` |
375
- | Side panel | `Drawer.Root` | Fixed-position div |
376
- | Data table | `Table.Root` | `<table>` |
377
- | Person image | `Avatar` | Emoji or bare `<img>` |
378
- | Content image | `Image` | Bare `<img>` |
379
- | Multi-step flow | `Stepper.Root` | Manual step divs |
380
- | Progress bar | `Progress` | CSS-only bar |
381
- | Inline chart | `Sparkline` | Manual SVG |
382
- | Full chart | `Chart.Root` | External chart library |
383
- | Max-width wrapper | `Container` | `max-width` + `margin: auto`|
384
- | Form field | `Field.Root` + `Label` + Input | `<label>` + `<input>` |
385
- | Status indicator | `Badge` | Colored `<span>` |
386
- | Loading state | `Skeleton` or `Spinner` | Text "Loading..." |
387
- | Empty state | `EmptyState.Root` | Custom empty div |
388
- | Notifications | `Toast` | Alert div |
389
- | Keyboard shortcut | `Kbd` | `<code>` |
390
- | Code display | `CodeBlock` | `<pre><code>` |
391
- | File upload | `FileUpload.Root` | `<input type="file">` |
392
- | Color picker | `ColorPicker.Root` | `<input type="color">` |
393
- | Collapsible | `Accordion.Root` or `Collapsible.Root` | Manual toggle with if/else |
403
+ | UI Need | Use This | NOT This |
404
+ | ----------------- | -------------------------------------- | ---------------------------- |
405
+ | Date picker | `DatePicker.Root` | `<input type="date">` |
406
+ | Date range | `DateRangePicker.Root` | Two `<input type="date">` |
407
+ | Time input | `TimeInput` | `<input type="time">` |
408
+ | Dropdown select | `Select.Root` | `<select>` |
409
+ | Searchable select | `Combobox.Root` | `<input>` + custom dropdown |
410
+ | Modal dialog | `Dialog.Root` | `<dialog>` or manual overlay |
411
+ | Confirmation | `AlertDialog.Root` | `window.confirm()` |
412
+ | Side panel | `Drawer.Root` | Fixed-position div |
413
+ | Data table | `Table.Root` | `<table>` |
414
+ | Person image | `Avatar` | Emoji or bare `<img>` |
415
+ | Content image | `Image` | Bare `<img>` |
416
+ | Multi-step flow | `Stepper.Root` | Manual step divs |
417
+ | Progress bar | `Progress` | CSS-only bar |
418
+ | Inline chart | `Sparkline` | Manual SVG |
419
+ | Full chart | `Chart.Root` | External chart library |
420
+ | Max-width wrapper | `Container` | `max-width` + `margin: auto` |
421
+ | Form field | `Field.Root` + `Label` + Input | `<label>` + `<input>` |
422
+ | Status indicator | `Badge` | Colored `<span>` |
423
+ | Loading state | `Skeleton` or `Spinner` | Text "Loading..." |
424
+ | Empty state | `EmptyState.Root` | Custom empty div |
425
+ | Notifications | `Toast` | Alert div |
426
+ | Keyboard shortcut | `Kbd` | `<code>` |
427
+ | Code display | `CodeBlock` | `<pre><code>` |
428
+ | File upload | `FileUpload.Root` | `<input type="file">` |
429
+ | Color picker | `ColorPicker.Root` | `<input type="color">` |
430
+ | Collapsible | `Accordion.Root` or `Collapsible.Root` | Manual toggle with if/else |
394
431
 
395
432
  ## Composition Recipes
396
433