@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.
- package/LICENSE +21 -0
- package/README.md +136 -0
- package/SKILL.md +149 -0
- package/bin/agents.js +63 -0
- package/dist/actions/Alert.svelte +202 -0
- package/dist/actions/Alert.svelte.d.ts +36 -0
- package/dist/actions/Alert.svelte.d.ts.map +1 -0
- package/dist/actions/Button.svelte +1450 -0
- package/dist/actions/Button.svelte.d.ts +56 -0
- package/dist/actions/Button.svelte.d.ts.map +1 -0
- package/dist/actions/ButtonGroup.svelte +111 -0
- package/dist/actions/ButtonGroup.svelte.d.ts +41 -0
- package/dist/actions/ButtonGroup.svelte.d.ts.map +1 -0
- package/dist/actions/CommandPalette.svelte +939 -0
- package/dist/actions/CommandPalette.svelte.d.ts +37 -0
- package/dist/actions/CommandPalette.svelte.d.ts.map +1 -0
- package/dist/actions/ContextMenu.svelte +138 -0
- package/dist/actions/ContextMenu.svelte.d.ts +54 -0
- package/dist/actions/ContextMenu.svelte.d.ts.map +1 -0
- package/dist/actions/Modal.svelte +474 -0
- package/dist/actions/Modal.svelte.d.ts +28 -0
- package/dist/actions/Modal.svelte.d.ts.map +1 -0
- package/dist/actions/Popover.svelte +1214 -0
- package/dist/actions/Popover.svelte.d.ts +31 -0
- package/dist/actions/Popover.svelte.d.ts.map +1 -0
- package/dist/actions/Portal.svelte +80 -0
- package/dist/actions/Portal.svelte.d.ts +17 -0
- package/dist/actions/Portal.svelte.d.ts.map +1 -0
- package/dist/actions/ThemeToggle.svelte +345 -0
- package/dist/actions/ThemeToggle.svelte.d.ts +15 -0
- package/dist/actions/ThemeToggle.svelte.d.ts.map +1 -0
- package/dist/actions/index.d.ts +13 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +10 -0
- package/dist/actions/scrollbar.d.ts +48 -0
- package/dist/actions/scrollbar.d.ts.map +1 -0
- package/dist/actions/scrollbar.js +404 -0
- package/dist/display/Accordion.svelte +586 -0
- package/dist/display/Accordion.svelte.d.ts +41 -0
- package/dist/display/Accordion.svelte.d.ts.map +1 -0
- package/dist/display/Avatar.svelte +527 -0
- package/dist/display/Avatar.svelte.d.ts +22 -0
- package/dist/display/Avatar.svelte.d.ts.map +1 -0
- package/dist/display/AvatarGroup.svelte +298 -0
- package/dist/display/AvatarGroup.svelte.d.ts +31 -0
- package/dist/display/AvatarGroup.svelte.d.ts.map +1 -0
- package/dist/display/Calendar.svelte +1366 -0
- package/dist/display/Calendar.svelte.d.ts +58 -0
- package/dist/display/Calendar.svelte.d.ts.map +1 -0
- package/dist/display/Chart.svelte +1426 -0
- package/dist/display/Chart.svelte.d.ts +35 -0
- package/dist/display/Chart.svelte.d.ts.map +1 -0
- package/dist/display/Code.svelte +780 -0
- package/dist/display/Code.svelte.d.ts +19 -0
- package/dist/display/Code.svelte.d.ts.map +1 -0
- package/dist/display/Comparison.svelte +686 -0
- package/dist/display/Comparison.svelte.d.ts +22 -0
- package/dist/display/Comparison.svelte.d.ts.map +1 -0
- package/dist/display/Counter.svelte +285 -0
- package/dist/display/Counter.svelte.d.ts +21 -0
- package/dist/display/Counter.svelte.d.ts.map +1 -0
- package/dist/display/Expand.svelte +48 -0
- package/dist/display/Expand.svelte.d.ts +9 -0
- package/dist/display/Expand.svelte.d.ts.map +1 -0
- package/dist/display/List.svelte +294 -0
- package/dist/display/List.svelte.d.ts +40 -0
- package/dist/display/List.svelte.d.ts.map +1 -0
- package/dist/display/ListContextReset.svelte +19 -0
- package/dist/display/ListContextReset.svelte.d.ts +7 -0
- package/dist/display/ListContextReset.svelte.d.ts.map +1 -0
- package/dist/display/ListItem.svelte +834 -0
- package/dist/display/ListItem.svelte.d.ts +22 -0
- package/dist/display/ListItem.svelte.d.ts.map +1 -0
- package/dist/display/QR.svelte +1193 -0
- package/dist/display/QR.svelte.d.ts +23 -0
- package/dist/display/QR.svelte.d.ts.map +1 -0
- package/dist/display/SplitPane.svelte +744 -0
- package/dist/display/SplitPane.svelte.d.ts +25 -0
- package/dist/display/SplitPane.svelte.d.ts.map +1 -0
- package/dist/display/Stat.svelte +439 -0
- package/dist/display/Stat.svelte.d.ts +24 -0
- package/dist/display/Stat.svelte.d.ts.map +1 -0
- package/dist/display/Table.svelte +4654 -0
- package/dist/display/Table.svelte.d.ts +249 -0
- package/dist/display/Table.svelte.d.ts.map +1 -0
- package/dist/display/TableCellEditor.svelte +935 -0
- package/dist/display/TableCellEditor.svelte.d.ts +58 -0
- package/dist/display/TableCellEditor.svelte.d.ts.map +1 -0
- package/dist/display/Timeline.svelte +1258 -0
- package/dist/display/Timeline.svelte.d.ts +43 -0
- package/dist/display/Timeline.svelte.d.ts.map +1 -0
- package/dist/display/Tree.svelte +1740 -0
- package/dist/display/Tree.svelte.d.ts +74 -0
- package/dist/display/Tree.svelte.d.ts.map +1 -0
- package/dist/display/Typewriter.svelte +338 -0
- package/dist/display/Typewriter.svelte.d.ts +22 -0
- package/dist/display/Typewriter.svelte.d.ts.map +1 -0
- package/dist/display/index.d.ts +24 -0
- package/dist/display/index.d.ts.map +1 -0
- package/dist/display/index.js +18 -0
- package/dist/feedback/Callout.svelte +529 -0
- package/dist/feedback/Callout.svelte.d.ts +24 -0
- package/dist/feedback/Callout.svelte.d.ts.map +1 -0
- package/dist/feedback/Confetti.svelte +631 -0
- package/dist/feedback/Confetti.svelte.d.ts +90 -0
- package/dist/feedback/Confetti.svelte.d.ts.map +1 -0
- package/dist/feedback/Progress.svelte +382 -0
- package/dist/feedback/Progress.svelte.d.ts +25 -0
- package/dist/feedback/Progress.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast.svelte +967 -0
- package/dist/feedback/Toast.svelte.d.ts +54 -0
- package/dist/feedback/Toast.svelte.d.ts.map +1 -0
- package/dist/feedback/index.d.ts +7 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +4 -0
- package/dist/form/Checkbox.svelte +449 -0
- package/dist/form/Checkbox.svelte.d.ts +27 -0
- package/dist/form/Checkbox.svelte.d.ts.map +1 -0
- package/dist/form/Fieldset.svelte +410 -0
- package/dist/form/Fieldset.svelte.d.ts +22 -0
- package/dist/form/Fieldset.svelte.d.ts.map +1 -0
- package/dist/form/FileUpload.svelte +934 -0
- package/dist/form/FileUpload.svelte.d.ts +41 -0
- package/dist/form/FileUpload.svelte.d.ts.map +1 -0
- package/dist/form/Form.svelte +530 -0
- package/dist/form/Form.svelte.d.ts +120 -0
- package/dist/form/Form.svelte.d.ts.map +1 -0
- package/dist/form/Input.svelte +2858 -0
- package/dist/form/Input.svelte.d.ts +66 -0
- package/dist/form/Input.svelte.d.ts.map +1 -0
- package/dist/form/Radio.svelte +507 -0
- package/dist/form/Radio.svelte.d.ts +39 -0
- package/dist/form/Radio.svelte.d.ts.map +1 -0
- package/dist/form/Range.svelte +912 -0
- package/dist/form/Range.svelte.d.ts +33 -0
- package/dist/form/Range.svelte.d.ts.map +1 -0
- package/dist/form/Rating.svelte +429 -0
- package/dist/form/Rating.svelte.d.ts +28 -0
- package/dist/form/Rating.svelte.d.ts.map +1 -0
- package/dist/form/Select.svelte +1933 -0
- package/dist/form/Select.svelte.d.ts +54 -0
- package/dist/form/Select.svelte.d.ts.map +1 -0
- package/dist/form/Toggle.svelte +645 -0
- package/dist/form/Toggle.svelte.d.ts +50 -0
- package/dist/form/Toggle.svelte.d.ts.map +1 -0
- package/dist/form/index.d.ts +15 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/form/index.js +10 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/layout/README.md +172 -0
- package/dist/media/Carousel.svelte +2424 -0
- package/dist/media/Carousel.svelte.d.ts +47 -0
- package/dist/media/Carousel.svelte.d.ts.map +1 -0
- package/dist/media/Gallery.svelte +2881 -0
- package/dist/media/Gallery.svelte.d.ts +82 -0
- package/dist/media/Gallery.svelte.d.ts.map +1 -0
- package/dist/media/Image.svelte +389 -0
- package/dist/media/Image.svelte.d.ts +33 -0
- package/dist/media/Image.svelte.d.ts.map +1 -0
- package/dist/media/PDF.svelte +1793 -0
- package/dist/media/PDF.svelte.d.ts +44 -0
- package/dist/media/PDF.svelte.d.ts.map +1 -0
- package/dist/media/Panorama.svelte +1391 -0
- package/dist/media/Panorama.svelte.d.ts +47 -0
- package/dist/media/Panorama.svelte.d.ts.map +1 -0
- package/dist/media/Video.svelte +2501 -0
- package/dist/media/Video.svelte.d.ts +58 -0
- package/dist/media/Video.svelte.d.ts.map +1 -0
- package/dist/media/carousel.d.ts +211 -0
- package/dist/media/carousel.d.ts.map +1 -0
- package/dist/media/carousel.js +408 -0
- package/dist/media/index.d.ts +11 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +5 -0
- package/dist/navigation/BottomSheet.svelte +636 -0
- package/dist/navigation/BottomSheet.svelte.d.ts +27 -0
- package/dist/navigation/BottomSheet.svelte.d.ts.map +1 -0
- package/dist/navigation/Breadcrumbs.svelte +611 -0
- package/dist/navigation/Breadcrumbs.svelte.d.ts +28 -0
- package/dist/navigation/Breadcrumbs.svelte.d.ts.map +1 -0
- package/dist/navigation/Pagination.svelte +641 -0
- package/dist/navigation/Pagination.svelte.d.ts +27 -0
- package/dist/navigation/Pagination.svelte.d.ts.map +1 -0
- package/dist/navigation/Steps.svelte +965 -0
- package/dist/navigation/Steps.svelte.d.ts +43 -0
- package/dist/navigation/Steps.svelte.d.ts.map +1 -0
- package/dist/navigation/Tabs.svelte +698 -0
- package/dist/navigation/Tabs.svelte.d.ts +41 -0
- package/dist/navigation/Tabs.svelte.d.ts.map +1 -0
- package/dist/navigation/index.d.ts +8 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +5 -0
- 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"}
|