@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.
- package/dist/accordion/accordion-trigger.svelte +9 -1
- package/dist/accordion/index.d.ts +24 -10
- package/dist/adjust/index.d.ts +10 -10
- package/dist/alert/index.d.ts +7 -13
- package/dist/alert-dialog/index.d.ts +10 -20
- package/dist/alpha-slider/index.d.ts +6 -6
- package/dist/aspect-ratio/index.d.ts +2 -2
- package/dist/aurora/index.d.ts +8 -8
- package/dist/avatar/index.d.ts +11 -4
- package/dist/badge/index.d.ts +3 -3
- package/dist/beam/index.d.ts +7 -7
- package/dist/breadcrumb/index.d.ts +24 -12
- package/dist/button/button.svelte +5 -1
- package/dist/button/index.d.ts +3 -3
- package/dist/button-group/index.d.ts +1 -1
- package/dist/calendar/index.d.ts +7 -14
- package/dist/card/index.d.ts +15 -15
- package/dist/carousel/index.d.ts +8 -16
- package/dist/chart/index.d.ts +49 -44
- package/dist/chat-thread/index.d.ts +9 -11
- package/dist/checkbox/checkbox.svelte +1 -5
- package/dist/checkbox/index.d.ts +1 -1
- package/dist/chip/index.d.ts +13 -18
- package/dist/chip-group/index.d.ts +3 -3
- package/dist/chromatic-aberration/index.d.ts +3 -3
- package/dist/chromatic-shift/index.d.ts +2 -1
- package/dist/code-block/highlighter/types.d.ts +3 -3
- package/dist/code-block/index.d.ts +3 -3
- package/dist/collapsible/collapsible-trigger.svelte +9 -1
- package/dist/collapsible/index.d.ts +16 -8
- package/dist/color-picker/color-picker-eyedropper.svelte +13 -1
- package/dist/color-picker/index.d.ts +11 -19
- package/dist/combobox/index.d.ts +10 -15
- package/dist/command-palette/index.d.ts +8 -16
- package/dist/container/index.d.ts +3 -3
- package/dist/context-menu/index.d.ts +8 -16
- package/dist/data-grid/index.d.ts +22 -29
- package/dist/date-field/date-field-separator.svelte +1 -7
- package/dist/date-field/index.d.ts +4 -4
- package/dist/date-picker/datepicker-trigger.svelte +15 -1
- package/dist/date-picker/index.d.ts +6 -10
- package/dist/date-range-picker/date-range-picker-trigger.svelte +12 -1
- package/dist/date-range-picker/index.d.ts +6 -12
- package/dist/date-time-input/index.d.ts +1 -1
- package/dist/description-list/index.d.ts +8 -8
- package/dist/dialog/index.d.ts +9 -18
- package/dist/displacement/index.d.ts +2 -1
- package/dist/drag-and-drop/index.d.ts +4 -8
- package/dist/drawer/index.d.ts +10 -18
- package/dist/drop-zone/index.d.ts +2 -2
- package/dist/dropdown-menu/index.d.ts +8 -16
- package/dist/field/index.d.ts +3 -3
- package/dist/fieldset/index.d.ts +8 -8
- package/dist/file-select/file-select-clear.svelte +8 -1
- package/dist/file-select/index.d.ts +8 -10
- package/dist/file-upload/file-upload-item-delete.svelte +8 -1
- package/dist/file-upload/file-upload-root.svelte +0 -1
- package/dist/file-upload/index.d.ts +14 -19
- package/dist/flip-card/index.d.ts +3 -3
- package/dist/float-button/float-button-root.svelte +7 -1
- package/dist/float-button/index.d.ts +6 -10
- package/dist/glass/index.d.ts +4 -4
- package/dist/glow/index.d.ts +5 -5
- package/dist/god-rays/index.d.ts +10 -10
- package/dist/gradient-mesh/index.d.ts +2 -1
- package/dist/halftone/index.d.ts +5 -5
- package/dist/heading/index.d.ts +3 -3
- package/dist/hover-card/index.d.ts +4 -8
- package/dist/icon/index.d.ts +5 -5
- package/dist/index.d.ts +65 -587
- package/dist/input/index.d.ts +2 -2
- package/dist/input-group/index.d.ts +11 -17
- package/dist/input-group/input-group-root.svelte +0 -1
- package/dist/internal/color-aliases.d.ts +5 -8
- package/dist/kbd/index.d.ts +6 -1
- package/dist/label/index.d.ts +1 -1
- package/dist/link/index.d.ts +1 -1
- package/dist/link-preview/index.d.ts +4 -8
- package/dist/list/index.d.ts +6 -12
- package/dist/list/list-root.svelte +0 -1
- package/dist/listbox/index.d.ts +2 -2
- package/dist/logo-mark/logo-mark.svelte.d.ts +7 -7
- package/dist/map/index.d.ts +31 -43
- package/dist/mask-reveal/index.d.ts +2 -1
- package/dist/mega-menu/index.d.ts +7 -14
- package/dist/menubar/index.d.ts +8 -16
- package/dist/multi-select-combobox/index.d.ts +10 -20
- package/dist/multi-select-combobox/multi-select-combobox-input.svelte +0 -1
- package/dist/navigation-menu/index.d.ts +27 -14
- package/dist/navigation-menu/navigation-menu-list.svelte +0 -1
- package/dist/noise/index.d.ts +5 -5
- package/dist/notification-center/index.d.ts +6 -13
- package/dist/notification-center/notification-center-panel.svelte +4 -1
- package/dist/notification-center/notification-center-trigger.svelte +0 -1
- package/dist/number-input/index.d.ts +1 -1
- package/dist/number-input/number-input.svelte +3 -1
- package/dist/option-swatch-group/index.d.ts +8 -8
- package/dist/pagination/index.d.ts +8 -16
- package/dist/phone-input/index.d.ts +1 -1
- package/dist/pin-input/index.d.ts +7 -13
- package/dist/popover/index.d.ts +3 -3
- package/dist/progress/index.d.ts +3 -7
- package/dist/progress-ring/index.d.ts +2 -2
- package/dist/radio-group/index.d.ts +2 -2
- package/dist/radio-group/radio-group.svelte +0 -1
- package/dist/range-calendar/index.d.ts +2 -2
- package/dist/range-calendar/range-calendar-grid.svelte +10 -4
- package/dist/range-calendar/range-calendar-root.svelte +1 -5
- package/dist/rating/index.d.ts +1 -1
- package/dist/reveal/index.d.ts +3 -1
- package/dist/rich-text-editor/index.d.ts +5 -4
- package/dist/rich-text-editor/rich-text-editor-content.svelte +9 -1
- package/dist/rich-text-editor/rich-text-editor-toolbar.svelte +1 -2
- package/dist/scroll-to-top/index.d.ts +2 -2
- package/dist/segmented-control/index.d.ts +2 -2
- package/dist/select/index.d.ts +6 -12
- package/dist/select/select-trigger.svelte +9 -1
- package/dist/separator/index.d.ts +3 -3
- package/dist/shader-canvas/index.d.ts +13 -18
- package/dist/shader-canvas/presets.d.ts +5 -10
- package/dist/shader-canvas/shader-canvas.svelte +0 -1
- package/dist/sidebar/index.d.ts +37 -18
- package/dist/sidebar/sidebar-header.svelte +4 -1
- package/dist/sidebar/sidebar-root.svelte +1 -1
- package/dist/skeleton/index.d.ts +5 -5
- package/dist/slider/index.d.ts +1 -1
- package/dist/spacer/index.d.ts +2 -2
- package/dist/spinner/index.d.ts +5 -4
- package/dist/splitter/index.d.ts +3 -3
- package/dist/spotlight/index.d.ts +2 -1
- package/dist/star-rating/index.d.ts +5 -5
- package/dist/stepper/index.d.ts +5 -10
- package/dist/svg/index.d.ts +2 -1
- package/dist/system-map/index.d.ts +13 -41
- package/dist/system-map/types.d.ts +75 -92
- package/dist/table/index.d.ts +9 -18
- package/dist/table-of-contents/index.d.ts +4 -9
- package/dist/tabs/index.d.ts +25 -8
- package/dist/tabs/tabs-trigger.svelte +4 -2
- package/dist/tag/index.d.ts +3 -3
- package/dist/tags-input/index.d.ts +7 -12
- package/dist/text/index.d.ts +7 -7
- package/dist/textarea/index.d.ts +1 -1
- package/dist/themes/default.css +4 -1
- package/dist/themes/use-theme-override.svelte.d.ts +1 -17
- package/dist/thumbnail/index.d.ts +5 -5
- package/dist/time-input/index.d.ts +6 -6
- package/dist/time-input/time-input.svelte +1 -3
- package/dist/timeline/index.d.ts +9 -16
- package/dist/timeline/timeline-item.svelte +2 -1
- package/dist/toast/index.d.ts +7 -15
- package/dist/toggle/index.d.ts +2 -2
- package/dist/toggle-group/index.d.ts +3 -3
- package/dist/toolbar/index.d.ts +5 -10
- package/dist/tooltip/index.d.ts +3 -3
- package/dist/tour/index.d.ts +2 -2
- package/dist/tour/tour-root.svelte +4 -1
- package/dist/transfer/index.d.ts +9 -16
- package/dist/tree/index.d.ts +5 -10
- package/dist/typing-indicator/index.d.ts +2 -1
- package/dist/typography/index.d.ts +9 -12
- package/dist/visually-hidden/index.d.ts +5 -1
- package/package.json +1 -1
- package/skills/dryui/SKILL.md +28 -16
- 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
|
-
|
|
12
|
-
|
|
11
|
+
<p>First</p>
|
|
12
|
+
<p>Second</p>
|
|
13
13
|
</div>
|
|
14
14
|
|
|
15
15
|
<style>
|
|
16
|
-
|
|
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
|
-
|
|
25
|
-
|
|
27
|
+
<span>Label</span>
|
|
28
|
+
<Button>Action</Button>
|
|
26
29
|
</div>
|
|
27
30
|
|
|
28
31
|
<style>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
81
|
-
|
|
87
|
+
import '@dryui/ui/themes/default.css';
|
|
88
|
+
import { Card, Field, Label, Input, Button } from '@dryui/ui';
|
|
82
89
|
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
let name = $state('');
|
|
91
|
+
let email = $state('');
|
|
85
92
|
</script>
|
|
86
93
|
|
|
87
94
|
<Card.Root>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
248
|
-
|
|
272
|
+
let activeTab = $state('general');
|
|
273
|
+
let displayName = $state('');
|
|
249
274
|
</script>
|
|
250
275
|
|
|
251
276
|
<Container>
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
-
|
|
282
|
-
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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
|
-
|
|
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
|
-
|
|
390
|
+
<Card.Content>...</Card.Content>
|
|
354
391
|
</Card>
|
|
355
392
|
|
|
356
393
|
<!-- Right: Card.Root -->
|
|
357
394
|
<Card.Root>
|
|
358
|
-
|
|
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
|
|