@delightstack/components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/SKILL.md +149 -0
  4. package/bin/agents.js +63 -0
  5. package/dist/actions/Alert.svelte +202 -0
  6. package/dist/actions/Alert.svelte.d.ts +36 -0
  7. package/dist/actions/Alert.svelte.d.ts.map +1 -0
  8. package/dist/actions/Button.svelte +1450 -0
  9. package/dist/actions/Button.svelte.d.ts +56 -0
  10. package/dist/actions/Button.svelte.d.ts.map +1 -0
  11. package/dist/actions/ButtonGroup.svelte +111 -0
  12. package/dist/actions/ButtonGroup.svelte.d.ts +41 -0
  13. package/dist/actions/ButtonGroup.svelte.d.ts.map +1 -0
  14. package/dist/actions/CommandPalette.svelte +939 -0
  15. package/dist/actions/CommandPalette.svelte.d.ts +37 -0
  16. package/dist/actions/CommandPalette.svelte.d.ts.map +1 -0
  17. package/dist/actions/ContextMenu.svelte +138 -0
  18. package/dist/actions/ContextMenu.svelte.d.ts +54 -0
  19. package/dist/actions/ContextMenu.svelte.d.ts.map +1 -0
  20. package/dist/actions/Modal.svelte +474 -0
  21. package/dist/actions/Modal.svelte.d.ts +28 -0
  22. package/dist/actions/Modal.svelte.d.ts.map +1 -0
  23. package/dist/actions/Popover.svelte +1214 -0
  24. package/dist/actions/Popover.svelte.d.ts +31 -0
  25. package/dist/actions/Popover.svelte.d.ts.map +1 -0
  26. package/dist/actions/Portal.svelte +80 -0
  27. package/dist/actions/Portal.svelte.d.ts +17 -0
  28. package/dist/actions/Portal.svelte.d.ts.map +1 -0
  29. package/dist/actions/ThemeToggle.svelte +345 -0
  30. package/dist/actions/ThemeToggle.svelte.d.ts +15 -0
  31. package/dist/actions/ThemeToggle.svelte.d.ts.map +1 -0
  32. package/dist/actions/index.d.ts +13 -0
  33. package/dist/actions/index.d.ts.map +1 -0
  34. package/dist/actions/index.js +10 -0
  35. package/dist/actions/scrollbar.d.ts +48 -0
  36. package/dist/actions/scrollbar.d.ts.map +1 -0
  37. package/dist/actions/scrollbar.js +404 -0
  38. package/dist/display/Accordion.svelte +586 -0
  39. package/dist/display/Accordion.svelte.d.ts +41 -0
  40. package/dist/display/Accordion.svelte.d.ts.map +1 -0
  41. package/dist/display/Avatar.svelte +527 -0
  42. package/dist/display/Avatar.svelte.d.ts +22 -0
  43. package/dist/display/Avatar.svelte.d.ts.map +1 -0
  44. package/dist/display/AvatarGroup.svelte +298 -0
  45. package/dist/display/AvatarGroup.svelte.d.ts +31 -0
  46. package/dist/display/AvatarGroup.svelte.d.ts.map +1 -0
  47. package/dist/display/Calendar.svelte +1366 -0
  48. package/dist/display/Calendar.svelte.d.ts +58 -0
  49. package/dist/display/Calendar.svelte.d.ts.map +1 -0
  50. package/dist/display/Chart.svelte +1426 -0
  51. package/dist/display/Chart.svelte.d.ts +35 -0
  52. package/dist/display/Chart.svelte.d.ts.map +1 -0
  53. package/dist/display/Code.svelte +780 -0
  54. package/dist/display/Code.svelte.d.ts +19 -0
  55. package/dist/display/Code.svelte.d.ts.map +1 -0
  56. package/dist/display/Comparison.svelte +686 -0
  57. package/dist/display/Comparison.svelte.d.ts +22 -0
  58. package/dist/display/Comparison.svelte.d.ts.map +1 -0
  59. package/dist/display/Counter.svelte +285 -0
  60. package/dist/display/Counter.svelte.d.ts +21 -0
  61. package/dist/display/Counter.svelte.d.ts.map +1 -0
  62. package/dist/display/Expand.svelte +48 -0
  63. package/dist/display/Expand.svelte.d.ts +9 -0
  64. package/dist/display/Expand.svelte.d.ts.map +1 -0
  65. package/dist/display/List.svelte +294 -0
  66. package/dist/display/List.svelte.d.ts +40 -0
  67. package/dist/display/List.svelte.d.ts.map +1 -0
  68. package/dist/display/ListContextReset.svelte +19 -0
  69. package/dist/display/ListContextReset.svelte.d.ts +7 -0
  70. package/dist/display/ListContextReset.svelte.d.ts.map +1 -0
  71. package/dist/display/ListItem.svelte +834 -0
  72. package/dist/display/ListItem.svelte.d.ts +22 -0
  73. package/dist/display/ListItem.svelte.d.ts.map +1 -0
  74. package/dist/display/QR.svelte +1193 -0
  75. package/dist/display/QR.svelte.d.ts +23 -0
  76. package/dist/display/QR.svelte.d.ts.map +1 -0
  77. package/dist/display/SplitPane.svelte +744 -0
  78. package/dist/display/SplitPane.svelte.d.ts +25 -0
  79. package/dist/display/SplitPane.svelte.d.ts.map +1 -0
  80. package/dist/display/Stat.svelte +439 -0
  81. package/dist/display/Stat.svelte.d.ts +24 -0
  82. package/dist/display/Stat.svelte.d.ts.map +1 -0
  83. package/dist/display/Table.svelte +4654 -0
  84. package/dist/display/Table.svelte.d.ts +249 -0
  85. package/dist/display/Table.svelte.d.ts.map +1 -0
  86. package/dist/display/TableCellEditor.svelte +935 -0
  87. package/dist/display/TableCellEditor.svelte.d.ts +58 -0
  88. package/dist/display/TableCellEditor.svelte.d.ts.map +1 -0
  89. package/dist/display/Timeline.svelte +1258 -0
  90. package/dist/display/Timeline.svelte.d.ts +43 -0
  91. package/dist/display/Timeline.svelte.d.ts.map +1 -0
  92. package/dist/display/Tree.svelte +1740 -0
  93. package/dist/display/Tree.svelte.d.ts +74 -0
  94. package/dist/display/Tree.svelte.d.ts.map +1 -0
  95. package/dist/display/Typewriter.svelte +338 -0
  96. package/dist/display/Typewriter.svelte.d.ts +22 -0
  97. package/dist/display/Typewriter.svelte.d.ts.map +1 -0
  98. package/dist/display/index.d.ts +24 -0
  99. package/dist/display/index.d.ts.map +1 -0
  100. package/dist/display/index.js +18 -0
  101. package/dist/feedback/Callout.svelte +529 -0
  102. package/dist/feedback/Callout.svelte.d.ts +24 -0
  103. package/dist/feedback/Callout.svelte.d.ts.map +1 -0
  104. package/dist/feedback/Confetti.svelte +631 -0
  105. package/dist/feedback/Confetti.svelte.d.ts +90 -0
  106. package/dist/feedback/Confetti.svelte.d.ts.map +1 -0
  107. package/dist/feedback/Progress.svelte +382 -0
  108. package/dist/feedback/Progress.svelte.d.ts +25 -0
  109. package/dist/feedback/Progress.svelte.d.ts.map +1 -0
  110. package/dist/feedback/Toast.svelte +967 -0
  111. package/dist/feedback/Toast.svelte.d.ts +54 -0
  112. package/dist/feedback/Toast.svelte.d.ts.map +1 -0
  113. package/dist/feedback/index.d.ts +7 -0
  114. package/dist/feedback/index.d.ts.map +1 -0
  115. package/dist/feedback/index.js +4 -0
  116. package/dist/form/Checkbox.svelte +449 -0
  117. package/dist/form/Checkbox.svelte.d.ts +27 -0
  118. package/dist/form/Checkbox.svelte.d.ts.map +1 -0
  119. package/dist/form/Fieldset.svelte +410 -0
  120. package/dist/form/Fieldset.svelte.d.ts +22 -0
  121. package/dist/form/Fieldset.svelte.d.ts.map +1 -0
  122. package/dist/form/FileUpload.svelte +934 -0
  123. package/dist/form/FileUpload.svelte.d.ts +41 -0
  124. package/dist/form/FileUpload.svelte.d.ts.map +1 -0
  125. package/dist/form/Form.svelte +530 -0
  126. package/dist/form/Form.svelte.d.ts +120 -0
  127. package/dist/form/Form.svelte.d.ts.map +1 -0
  128. package/dist/form/Input.svelte +2858 -0
  129. package/dist/form/Input.svelte.d.ts +66 -0
  130. package/dist/form/Input.svelte.d.ts.map +1 -0
  131. package/dist/form/Radio.svelte +507 -0
  132. package/dist/form/Radio.svelte.d.ts +39 -0
  133. package/dist/form/Radio.svelte.d.ts.map +1 -0
  134. package/dist/form/Range.svelte +912 -0
  135. package/dist/form/Range.svelte.d.ts +33 -0
  136. package/dist/form/Range.svelte.d.ts.map +1 -0
  137. package/dist/form/Rating.svelte +429 -0
  138. package/dist/form/Rating.svelte.d.ts +28 -0
  139. package/dist/form/Rating.svelte.d.ts.map +1 -0
  140. package/dist/form/Select.svelte +1933 -0
  141. package/dist/form/Select.svelte.d.ts +54 -0
  142. package/dist/form/Select.svelte.d.ts.map +1 -0
  143. package/dist/form/Toggle.svelte +645 -0
  144. package/dist/form/Toggle.svelte.d.ts +50 -0
  145. package/dist/form/Toggle.svelte.d.ts.map +1 -0
  146. package/dist/form/index.d.ts +15 -0
  147. package/dist/form/index.d.ts.map +1 -0
  148. package/dist/form/index.js +10 -0
  149. package/dist/index.d.ts +7 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +6 -0
  152. package/dist/layout/README.md +172 -0
  153. package/dist/media/Carousel.svelte +2424 -0
  154. package/dist/media/Carousel.svelte.d.ts +47 -0
  155. package/dist/media/Carousel.svelte.d.ts.map +1 -0
  156. package/dist/media/Gallery.svelte +2881 -0
  157. package/dist/media/Gallery.svelte.d.ts +82 -0
  158. package/dist/media/Gallery.svelte.d.ts.map +1 -0
  159. package/dist/media/Image.svelte +389 -0
  160. package/dist/media/Image.svelte.d.ts +33 -0
  161. package/dist/media/Image.svelte.d.ts.map +1 -0
  162. package/dist/media/PDF.svelte +1793 -0
  163. package/dist/media/PDF.svelte.d.ts +44 -0
  164. package/dist/media/PDF.svelte.d.ts.map +1 -0
  165. package/dist/media/Panorama.svelte +1391 -0
  166. package/dist/media/Panorama.svelte.d.ts +47 -0
  167. package/dist/media/Panorama.svelte.d.ts.map +1 -0
  168. package/dist/media/Video.svelte +2501 -0
  169. package/dist/media/Video.svelte.d.ts +58 -0
  170. package/dist/media/Video.svelte.d.ts.map +1 -0
  171. package/dist/media/carousel.d.ts +211 -0
  172. package/dist/media/carousel.d.ts.map +1 -0
  173. package/dist/media/carousel.js +408 -0
  174. package/dist/media/index.d.ts +11 -0
  175. package/dist/media/index.d.ts.map +1 -0
  176. package/dist/media/index.js +5 -0
  177. package/dist/navigation/BottomSheet.svelte +636 -0
  178. package/dist/navigation/BottomSheet.svelte.d.ts +27 -0
  179. package/dist/navigation/BottomSheet.svelte.d.ts.map +1 -0
  180. package/dist/navigation/Breadcrumbs.svelte +611 -0
  181. package/dist/navigation/Breadcrumbs.svelte.d.ts +28 -0
  182. package/dist/navigation/Breadcrumbs.svelte.d.ts.map +1 -0
  183. package/dist/navigation/Pagination.svelte +641 -0
  184. package/dist/navigation/Pagination.svelte.d.ts +27 -0
  185. package/dist/navigation/Pagination.svelte.d.ts.map +1 -0
  186. package/dist/navigation/Steps.svelte +965 -0
  187. package/dist/navigation/Steps.svelte.d.ts +43 -0
  188. package/dist/navigation/Steps.svelte.d.ts.map +1 -0
  189. package/dist/navigation/Tabs.svelte +698 -0
  190. package/dist/navigation/Tabs.svelte.d.ts +41 -0
  191. package/dist/navigation/Tabs.svelte.d.ts.map +1 -0
  192. package/dist/navigation/index.d.ts +8 -0
  193. package/dist/navigation/index.d.ts.map +1 -0
  194. package/dist/navigation/index.js +5 -0
  195. package/package.json +139 -0
@@ -0,0 +1,410 @@
1
+ <script lang="ts">
2
+ import { type Snippet } from 'svelte';
3
+ import Expand from '../display/Expand.svelte';
4
+ import Button from '../actions/Button.svelte';
5
+
6
+ const propId = $props.id();
7
+ let {
8
+ /** Label text for the fieldset (rendered in the legend slot) */
9
+ label = undefined as string | undefined,
10
+
11
+ /** Description text shown below the label */
12
+ description = undefined as string | undefined,
13
+
14
+ /** Show a subtle border around the fieldset */
15
+ bordered = false,
16
+
17
+ /** Whether the fieldset and all child inputs are disabled */
18
+ disabled = false,
19
+
20
+ /** Error message displayed below the fieldset */
21
+ error = undefined as string | undefined,
22
+
23
+ /** Whether the fieldset is required (shows asterisk after label) */
24
+ required = false,
25
+
26
+ /** Whether the fieldset can be collapsed */
27
+ collapsible = false,
28
+
29
+ /** Whether the fieldset is currently collapsed (only when collapsible) */
30
+ collapsed = $bindable(false),
31
+
32
+ /** Lay out children in a CSS grid */
33
+ grid = false,
34
+
35
+ /** Number of grid columns when grid is true */
36
+ columns = 2,
37
+
38
+ /** Whether to show a skeleton loading state */
39
+ skeleton = false,
40
+
41
+ /** Whether the fieldset uses dense spacing */
42
+ dense = false,
43
+
44
+ /** Whether the fieldset uses comfortable spacing */
45
+ comfortable = false,
46
+
47
+ /** The id of the fieldset element */
48
+ id = propId,
49
+
50
+ /** Custom class name */
51
+ class: class_name = '',
52
+
53
+ /** Child elements rendered inside the fieldset */
54
+ children = undefined as Snippet | undefined,
55
+ } = $props();
56
+
57
+ const description_id = `${id}-desc`;
58
+ const error_id = `${id}-error`;
59
+
60
+ function toggleCollapsed() {
61
+ if (!collapsible) return;
62
+ collapsed = !collapsed;
63
+ }
64
+
65
+ function onKeyDown(e: KeyboardEvent) {
66
+ if (!collapsible) return;
67
+ if (e.key === ' ' || e.key === 'Enter') {
68
+ e.preventDefault();
69
+ toggleCollapsed();
70
+ }
71
+ }
72
+
73
+ function expandIfCollapsed() {
74
+ if (collapsible && collapsed) collapsed = false;
75
+ }
76
+ </script>
77
+
78
+ <fieldset
79
+ {id}
80
+ {disabled}
81
+ class={['fieldset', class_name].filter(Boolean).join(' ')}
82
+ class:bordered
83
+ class:dense
84
+ class:comfortable
85
+ class:has-error={!!error}
86
+ class:skeleton
87
+ class:disabled
88
+ class:collapsed={collapsible && collapsed}
89
+ aria-describedby={description ? description_id : error ? error_id : undefined}>
90
+ {#if label}
91
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
92
+ <legend
93
+ class:collapsible
94
+ role={collapsible ? 'button' : undefined}
95
+ tabindex={collapsible ? 0 : undefined}
96
+ aria-expanded={collapsible ? !collapsed : undefined}
97
+ onclick={collapsible ? toggleCollapsed : undefined}
98
+ onkeydown={collapsible ? onKeyDown : undefined}>
99
+ <span class="legend-text">
100
+ {label}
101
+ {#if required}
102
+ <span class="required-mark" aria-hidden="true">*</span>
103
+ {/if}
104
+ </span>
105
+ {#if collapsible}
106
+ <svg
107
+ class="collapse-icon"
108
+ class:rotated={!collapsed}
109
+ width="18"
110
+ height="18"
111
+ viewBox="0 0 24 24"
112
+ fill="none"
113
+ stroke="currentColor"
114
+ stroke-width="2"
115
+ stroke-linecap="round"
116
+ stroke-linejoin="round"
117
+ aria-hidden="true">
118
+ <polyline points="6 9 12 15 18 9"></polyline>
119
+ </svg>
120
+ {/if}
121
+ </legend>
122
+ {/if}
123
+
124
+ {#if description}
125
+ <p class="description" id={description_id}>{description}</p>
126
+ {/if}
127
+
128
+ {#if collapsible}
129
+ <div class="expand-container">
130
+ {#if collapsed}
131
+ <!-- The collapsed body is a single full-width transparent Button, so a
132
+ click anywhere in the fieldset body expands it. -->
133
+ <Button
134
+ transparent
135
+ full_width
136
+ class="expand-button"
137
+ onclick={expandIfCollapsed}
138
+ aria-label="Expand">
139
+ <span class="expand-label">Show more</span>
140
+ <svg
141
+ class="expand-chevron"
142
+ width="20"
143
+ height="20"
144
+ viewBox="0 0 24 24"
145
+ fill="none"
146
+ stroke="currentColor"
147
+ stroke-width="2"
148
+ stroke-linecap="round"
149
+ stroke-linejoin="round"
150
+ aria-hidden="true">
151
+ <polyline points="6 9 12 15 18 9"></polyline>
152
+ </svg>
153
+ </Button>
154
+ {/if}
155
+ <Expand show={!collapsed}>
156
+ <div class="content" class:grid style:--columns={grid ? columns : undefined}>
157
+ {#if children}
158
+ {@render children()}
159
+ {/if}
160
+ </div>
161
+ </Expand>
162
+ </div>
163
+ {:else}
164
+ <div class="content" class:grid style:--columns={grid ? columns : undefined}>
165
+ {#if children}
166
+ {@render children()}
167
+ {/if}
168
+ </div>
169
+ {/if}
170
+
171
+ {#if error}
172
+ <p class="error-message" id={error_id} role="alert">{error}</p>
173
+ {/if}
174
+ </fieldset>
175
+
176
+ <style>
177
+ .fieldset {
178
+ border: none;
179
+ margin: 0;
180
+ padding: 0.5em 1em 1em 1em;
181
+ min-inline-size: 0;
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: 0.75em;
185
+ border-radius: var(--radius-lg, 8px);
186
+ @supports (corner-shape: squircle) {
187
+ corner-shape: squircle;
188
+ border-radius: calc(var(--radius-lg, 8px) * var(--squircle-ratio, 2));
189
+ }
190
+ position: relative;
191
+
192
+ &.dense {
193
+ padding: 0.25em 0.5em 0.5em 0.5em;
194
+ gap: 0.5em;
195
+ }
196
+ &.comfortable {
197
+ padding: 1em 1.5em 1.5em 1.5em;
198
+ gap: 1em;
199
+ }
200
+
201
+ /* Bordered style */
202
+ &.bordered {
203
+ border: 1px solid var(--color-border, hsl(0 0% 80%));
204
+ }
205
+
206
+ /* Error state */
207
+ &.has-error {
208
+ border-color: var(--color-error, hsl(0 70% 55%));
209
+
210
+ .legend-text {
211
+ color: var(--color-error, hsl(0 70% 55%));
212
+ }
213
+ }
214
+
215
+ /* Disabled */
216
+ &.disabled {
217
+ opacity: 0.6;
218
+ }
219
+
220
+ /* Skeleton — the legend keeps its real layout but its text turns
221
+ transparent, and a text-height pill is painted over the label's own box.
222
+ Anchoring to the real legend text means the bar is always exactly where
223
+ (and as wide as) the label, at every density — no offset guesswork. The
224
+ child fields render their own skeleton states, so the real form shape
225
+ shows through with no layout shift when it resolves. */
226
+ &.skeleton {
227
+ pointer-events: none;
228
+
229
+ legend {
230
+ color: transparent;
231
+ }
232
+ .description {
233
+ visibility: hidden;
234
+ }
235
+ /* The pill is a pseudo-element (it can't host its own ::after), so the
236
+ sweep is emulated with background-position using the same geometry and
237
+ timing as the global delight-skeleton-shimmer. */
238
+ .legend-text {
239
+ position: relative;
240
+
241
+ &::before {
242
+ content: '';
243
+ position: absolute;
244
+ top: 50%;
245
+ left: 0;
246
+ right: 0;
247
+ height: 0.7em;
248
+ transform: translateY(-50%);
249
+ border-radius: var(--radius-full, 1e5px);
250
+ background-color: var(
251
+ --skeleton-bg,
252
+ rgb(from var(--color-text, #888) r g b / 0.1)
253
+ );
254
+ background-image: linear-gradient(
255
+ 105deg,
256
+ transparent 37.5%,
257
+ var(--skeleton-sheen, rgb(from var(--color-text, #888) r g b / 0.12)) 50%,
258
+ transparent 62.5%
259
+ );
260
+ background-size: 200% 100%;
261
+ background-repeat: no-repeat;
262
+ background-position: 150% 0;
263
+ animation: fieldset-skeleton-sweep var(--skeleton-duration, 2.4s) ease-in-out
264
+ infinite;
265
+ }
266
+ }
267
+ }
268
+ }
269
+ /* background-position twin of delight-skeleton-shimmer: a 200%-wide image
270
+ whose centered band spans half the box, travelling the same
271
+ -100% → +100% distance with the same rest beat. */
272
+ @keyframes fieldset-skeleton-sweep {
273
+ 0% {
274
+ background-position: 150% 0;
275
+ }
276
+ 55%,
277
+ 100% {
278
+ background-position: -50% 0;
279
+ }
280
+ }
281
+
282
+ @media (prefers-reduced-motion: reduce) {
283
+ .fieldset.skeleton .legend-text::before {
284
+ animation: none;
285
+ }
286
+ }
287
+
288
+ /* Legend — native <legend> breaks the bordered outline at its position,
289
+ * so a few extra pixels of horizontal padding gives the border breathing
290
+ * room around the text. */
291
+ legend {
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 0.5em;
295
+ font-weight: 600;
296
+ font-size: 1em;
297
+ color: var(--color-text, inherit);
298
+ padding: 0 0.4em;
299
+ line-height: 1.4;
300
+ /* A flex fieldset drops the legend below the top border (it no longer
301
+ notches the outline), so it sits entirely inside the content box. The
302
+ first row's child inputs float their own labels up above their top
303
+ edge — without this gap a floated child label collides with the
304
+ legend's descenders. Reserve room for that rise. */
305
+ margin-bottom: 0.45em;
306
+ border: none;
307
+ background: none;
308
+ transition: color 200ms ease;
309
+
310
+ &.collapsible {
311
+ cursor: pointer;
312
+ user-select: none;
313
+ -webkit-tap-highlight-color: transparent;
314
+ border-radius: var(--radius-md, 4px);
315
+ @supports (corner-shape: squircle) {
316
+ corner-shape: squircle;
317
+ border-radius: calc(var(--radius-md, 4px) * var(--squircle-ratio, 2));
318
+ }
319
+
320
+ &:hover {
321
+ color: var(--color-action, hsl(220 70% 55%));
322
+ /* Snap the color in on hover; the base rule eases it back out on leave. */
323
+ transition: none;
324
+ }
325
+ &:focus-visible {
326
+ outline: 2px solid var(--color-border-active, currentColor);
327
+ outline-offset: 2px;
328
+ }
329
+ }
330
+ }
331
+
332
+ .legend-text {
333
+ display: inline;
334
+ transition: color 200ms ease;
335
+ }
336
+
337
+ .required-mark {
338
+ color: var(--color-error, hsl(0 70% 55%));
339
+ margin-left: 0.125em;
340
+ font-weight: 700;
341
+ }
342
+
343
+ .collapse-icon {
344
+ flex-shrink: 0;
345
+ transition: transform 250ms ease;
346
+ transform: rotate(-90deg);
347
+ }
348
+ .collapse-icon.rotated {
349
+ transform: rotate(0deg);
350
+ }
351
+
352
+ /* Description */
353
+ .description {
354
+ margin: 0;
355
+ font-size: 0.875em;
356
+ color: var(--color-text-muted, hsl(0 0% 45%));
357
+ line-height: 1.5;
358
+ }
359
+
360
+ /* Content */
361
+ .content {
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 0.75em;
365
+ }
366
+ .dense .content {
367
+ gap: 0.5em;
368
+ }
369
+ .comfortable .content {
370
+ gap: 1em;
371
+ }
372
+
373
+ .content.grid {
374
+ display: grid;
375
+ grid-template-columns: repeat(var(--columns, 2), 1fr);
376
+ }
377
+
378
+ /* Expand button — fills the collapsed body so a click anywhere on it (the
379
+ whole fieldset body) expands the section. */
380
+ .fieldset :global(.button.expand-button) {
381
+ width: 100%;
382
+ --color-text: var(--color-text-muted, hsl(0 0% 45%));
383
+ }
384
+ .fieldset :global(.button.expand-button button) {
385
+ justify-content: space-between;
386
+ min-height: 3em;
387
+ gap: 0.4em;
388
+ font-size: 0.9em;
389
+ }
390
+ .fieldset.dense :global(.button.expand-button button) {
391
+ min-height: 2.25em;
392
+ }
393
+ .fieldset.comfortable :global(.button.expand-button button) {
394
+ min-height: 3.5em;
395
+ }
396
+ .fieldset :global(.button.expand-button:hover) {
397
+ --color-text: var(--color-action, hsl(220 70% 55%));
398
+ }
399
+ .expand-chevron {
400
+ flex-shrink: 0;
401
+ }
402
+
403
+ /* Error message */
404
+ .error-message {
405
+ margin: 0;
406
+ font-size: 0.8em;
407
+ color: var(--color-error, hsl(0 70% 55%));
408
+ line-height: 1.4;
409
+ }
410
+ </style>
@@ -0,0 +1,22 @@
1
+ import { type Snippet } from 'svelte';
2
+ declare const Fieldset: import("svelte").Component<{
3
+ label?: string | undefined;
4
+ description?: string | undefined;
5
+ bordered?: boolean;
6
+ disabled?: boolean;
7
+ error?: string | undefined;
8
+ required?: boolean;
9
+ collapsible?: boolean;
10
+ collapsed?: boolean;
11
+ grid?: boolean;
12
+ columns?: number;
13
+ skeleton?: boolean;
14
+ dense?: boolean;
15
+ comfortable?: boolean;
16
+ id?: string;
17
+ class?: string;
18
+ children?: Snippet | undefined;
19
+ }, {}, "collapsed">;
20
+ type Fieldset = ReturnType<typeof Fieldset>;
21
+ export default Fieldset;
22
+ //# sourceMappingURL=Fieldset.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fieldset.svelte.d.ts","sourceRoot":"","sources":["../../src/form/Fieldset.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AA2ItC,QAAA,MAAM,QAAQ;YAlImE,MAAM,GAAG,SAAS;kBAAgB,MAAM,GAAG,SAAS;eAAa,OAAO;eAAa,OAAO;YAAU,MAAM,GAAG,SAAS;eAAa,OAAO;kBAAgB,OAAO;gBAAc,OAAO;WAAS,OAAO;cAAY,MAAM;eAAa,OAAO;YAAU,OAAO;kBAAgB,OAAO;;YAA8B,MAAM;eAAa,OAAO,GAAG,SAAS;mBAkIrX,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}