@dryui/ui 1.1.4 → 1.2.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/dist/border-beam/border-beam.svelte +42 -0
- package/dist/border-beam/border-beam.svelte.d.ts +4 -0
- package/dist/border-beam/index.d.ts +3 -0
- package/dist/border-beam/index.js +1 -0
- package/dist/button/button.svelte +2 -1
- package/dist/dialog/dialog-content.svelte +4 -0
- package/dist/drawer/drawer-body.svelte +1 -0
- package/dist/drawer/drawer-dialog-content.svelte +13 -15
- package/dist/drawer/drawer-footer.svelte +1 -0
- package/dist/drawer/drawer-header.svelte +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/dist/slider/index.d.ts +7 -0
- package/dist/slider/slider-input.svelte +94 -2
- package/dist/slider/slider-input.svelte.d.ts +6 -0
- package/package.json +7 -2
- package/skills/dryui/SKILL.md +1 -1
- package/dist/internal/overlay-base.svelte +0 -25
- package/dist/internal/overlay-base.svelte.d.ts +0 -6
- package/dist/internal/section-body.svelte +0 -22
- package/dist/internal/section-body.svelte.d.ts +0 -8
- package/dist/internal/section-footer.svelte +0 -26
- package/dist/internal/section-footer.svelte.d.ts +0 -8
- package/dist/internal/section-header.svelte +0 -21
- package/dist/internal/section-header.svelte.d.ts +0 -8
- package/dist/themes/practical-ui-foundation-map.md +0 -46
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
BorderBeam as BorderBeamPrimitive,
|
|
4
|
+
type BorderBeamProps
|
|
5
|
+
} from '@dryui/primitives/border-beam';
|
|
6
|
+
|
|
7
|
+
let {
|
|
8
|
+
size,
|
|
9
|
+
colorVariant,
|
|
10
|
+
theme,
|
|
11
|
+
staticColors,
|
|
12
|
+
duration,
|
|
13
|
+
active,
|
|
14
|
+
borderRadius,
|
|
15
|
+
brightness,
|
|
16
|
+
saturation,
|
|
17
|
+
hueRange,
|
|
18
|
+
strength,
|
|
19
|
+
onActivate,
|
|
20
|
+
onDeactivate,
|
|
21
|
+
children,
|
|
22
|
+
...rest
|
|
23
|
+
}: BorderBeamProps = $props();
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<BorderBeamPrimitive
|
|
27
|
+
{size}
|
|
28
|
+
{colorVariant}
|
|
29
|
+
{theme}
|
|
30
|
+
{staticColors}
|
|
31
|
+
{duration}
|
|
32
|
+
{active}
|
|
33
|
+
{borderRadius}
|
|
34
|
+
{brightness}
|
|
35
|
+
{saturation}
|
|
36
|
+
{hueRange}
|
|
37
|
+
{strength}
|
|
38
|
+
{onActivate}
|
|
39
|
+
{onDeactivate}
|
|
40
|
+
{children}
|
|
41
|
+
{...rest}
|
|
42
|
+
/>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { BorderBeamProps, BorderBeamColorVariant, BorderBeamSize, BorderBeamTheme } from '@dryui/primitives/border-beam';
|
|
2
|
+
export type { BorderBeamProps, BorderBeamColorVariant, BorderBeamSize, BorderBeamTheme };
|
|
3
|
+
export { default as BorderBeam } from './border-beam.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as BorderBeam } from './border-beam.svelte';
|
|
@@ -410,7 +410,8 @@
|
|
|
410
410
|
--_dry-btn-color: var(--dry-btn-color, var(--dry-color-text-strong));
|
|
411
411
|
}
|
|
412
412
|
|
|
413
|
-
&[aria-pressed='true']
|
|
413
|
+
&[aria-pressed='true'],
|
|
414
|
+
&[aria-pressed='true']:hover:not([data-disabled]) {
|
|
414
415
|
--_dry-btn-bg: var(--dry-btn-bg, var(--dry-color-fill-brand));
|
|
415
416
|
--_dry-btn-color: var(--dry-btn-color, var(--dry-color-on-brand));
|
|
416
417
|
}
|
|
@@ -106,6 +106,8 @@
|
|
|
106
106
|
--dry-drawer-bg: var(--dry-color-bg-overlay);
|
|
107
107
|
--dry-drawer-border: var(--dry-color-stroke-weak);
|
|
108
108
|
--dry-drawer-size: 25rem;
|
|
109
|
+
--_drawer-rest-transform: translateX(0);
|
|
110
|
+
--_drawer-enter-transform: translateX(100%);
|
|
109
111
|
|
|
110
112
|
background: var(--dry-drawer-bg);
|
|
111
113
|
color: var(--dry-color-text-strong);
|
|
@@ -114,6 +116,9 @@
|
|
|
114
116
|
display: grid;
|
|
115
117
|
grid-template-rows: max-content minmax(0, 1fr) max-content;
|
|
116
118
|
overflow: hidden;
|
|
119
|
+
opacity: 1;
|
|
120
|
+
transform: var(--_drawer-rest-transform);
|
|
121
|
+
will-change: transform, opacity;
|
|
117
122
|
|
|
118
123
|
transition:
|
|
119
124
|
transform var(--dry-duration-slow) var(--dry-ease-spring-snappy),
|
|
@@ -127,44 +132,37 @@
|
|
|
127
132
|
}
|
|
128
133
|
|
|
129
134
|
[data-drawer-content][data-side='left'] [data-drawer-panel] {
|
|
135
|
+
--_drawer-enter-transform: translateX(-100%);
|
|
130
136
|
grid-column: 1;
|
|
131
137
|
height: 100%;
|
|
132
138
|
border-right: 1px solid var(--dry-drawer-border);
|
|
133
139
|
}
|
|
134
140
|
|
|
135
141
|
[data-drawer-content][data-side='top'] [data-drawer-panel] {
|
|
142
|
+
--_drawer-rest-transform: translateY(0);
|
|
143
|
+
--_drawer-enter-transform: translateY(-100%);
|
|
136
144
|
grid-row: 1;
|
|
137
145
|
height: var(--dry-drawer-size);
|
|
138
146
|
border-bottom: 1px solid var(--dry-drawer-border);
|
|
139
147
|
}
|
|
140
148
|
|
|
141
149
|
[data-drawer-content][data-side='bottom'] [data-drawer-panel] {
|
|
150
|
+
--_drawer-rest-transform: translateY(0);
|
|
151
|
+
--_drawer-enter-transform: translateY(100%);
|
|
142
152
|
grid-row: 2;
|
|
143
153
|
height: var(--dry-drawer-size);
|
|
144
154
|
border-top: 1px solid var(--dry-drawer-border);
|
|
145
155
|
}
|
|
146
156
|
|
|
147
157
|
@starting-style {
|
|
148
|
-
[data-drawer-content][
|
|
149
|
-
opacity: 0;
|
|
150
|
-
transform: translateX(100%);
|
|
151
|
-
}
|
|
152
|
-
[data-drawer-content][data-side='left'][open] [data-drawer-panel] {
|
|
153
|
-
opacity: 0;
|
|
154
|
-
transform: translateX(-100%);
|
|
155
|
-
}
|
|
156
|
-
[data-drawer-content][data-side='top'][open] [data-drawer-panel] {
|
|
157
|
-
opacity: 0;
|
|
158
|
-
transform: translateY(-100%);
|
|
159
|
-
}
|
|
160
|
-
[data-drawer-content][data-side='bottom'][open] [data-drawer-panel] {
|
|
158
|
+
[data-drawer-content][open] [data-drawer-panel] {
|
|
161
159
|
opacity: 0;
|
|
162
|
-
transform:
|
|
160
|
+
transform: var(--_drawer-enter-transform);
|
|
163
161
|
}
|
|
164
162
|
}
|
|
165
163
|
|
|
166
164
|
[data-drawer-content][data-state='open'] [data-drawer-panel] {
|
|
167
165
|
opacity: 1;
|
|
168
|
-
transform:
|
|
166
|
+
transform: var(--_drawer-rest-transform);
|
|
169
167
|
}
|
|
170
168
|
</style>
|
package/dist/index.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export type { MultiSelectComboboxRootProps, MultiSelectComboboxInputProps, Multi
|
|
|
47
47
|
export { SegmentedControl } from './segmented-control/index.js';
|
|
48
48
|
export type { SegmentedControlRootProps, SegmentedControlItemProps } from './segmented-control/index.js';
|
|
49
49
|
export { Slider } from './slider/index.js';
|
|
50
|
-
export type { SliderProps } from './slider/index.js';
|
|
50
|
+
export type { SliderProps, SliderVariant } from './slider/index.js';
|
|
51
51
|
export { Toggle } from './toggle/index.js';
|
|
52
52
|
export type { ToggleProps } from './toggle/index.js';
|
|
53
53
|
export { ToggleGroup } from './toggle-group/index.js';
|
|
@@ -270,6 +270,8 @@ export { AlphaSlider } from './alpha-slider/index.js';
|
|
|
270
270
|
export type { AlphaSliderProps } from './alpha-slider/index.js';
|
|
271
271
|
export { Beam } from './beam/index.js';
|
|
272
272
|
export type { BeamProps } from './beam/index.js';
|
|
273
|
+
export { BorderBeam } from './border-beam/index.js';
|
|
274
|
+
export type { BorderBeamProps } from './border-beam/index.js';
|
|
273
275
|
export { Shimmer } from './shimmer/index.js';
|
|
274
276
|
export type { ShimmerProps } from './shimmer/index.js';
|
|
275
277
|
export { Glass } from './glass/index.js';
|
package/dist/index.js
CHANGED
|
@@ -139,6 +139,7 @@ export { Glow } from './glow/index.js';
|
|
|
139
139
|
export { Adjust } from './adjust/index.js';
|
|
140
140
|
export { AlphaSlider } from './alpha-slider/index.js';
|
|
141
141
|
export { Beam } from './beam/index.js';
|
|
142
|
+
export { BorderBeam } from './border-beam/index.js';
|
|
142
143
|
export { Shimmer } from './shimmer/index.js';
|
|
143
144
|
export { Glass } from './glass/index.js';
|
|
144
145
|
export { GodRays } from './god-rays/index.js';
|
package/dist/slider/index.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
1
2
|
import type { SliderProps as PrimitiveSliderProps } from '@dryui/primitives';
|
|
3
|
+
export type SliderVariant = 'default' | 'pill';
|
|
2
4
|
export interface SliderProps extends Omit<PrimitiveSliderProps, 'size'> {
|
|
3
5
|
size?: 'sm' | 'md' | 'lg';
|
|
6
|
+
variant?: SliderVariant;
|
|
7
|
+
valueLabel?: Snippet<[{
|
|
8
|
+
value: number;
|
|
9
|
+
percentage: number;
|
|
10
|
+
}]>;
|
|
4
11
|
}
|
|
5
12
|
export { default as Slider } from './slider-input.svelte';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
2
3
|
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
3
4
|
import { getFormControlCtx } from '@dryui/primitives';
|
|
4
5
|
|
|
@@ -8,8 +9,10 @@
|
|
|
8
9
|
max?: number;
|
|
9
10
|
step?: number;
|
|
10
11
|
size?: 'sm' | 'md' | 'lg';
|
|
12
|
+
variant?: 'default' | 'pill';
|
|
11
13
|
disabled?: boolean;
|
|
12
14
|
orientation?: 'horizontal' | 'vertical';
|
|
15
|
+
valueLabel?: Snippet<[{ value: number; percentage: number }]>;
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
let {
|
|
@@ -18,8 +21,10 @@
|
|
|
18
21
|
max = 100,
|
|
19
22
|
step = 1,
|
|
20
23
|
size = 'md',
|
|
24
|
+
variant = 'default',
|
|
21
25
|
disabled = false,
|
|
22
26
|
orientation = 'horizontal',
|
|
27
|
+
valueLabel,
|
|
23
28
|
class: className,
|
|
24
29
|
...rest
|
|
25
30
|
}: Props = $props();
|
|
@@ -28,6 +33,7 @@
|
|
|
28
33
|
const isDisabled = $derived(disabled || ctx?.disabled || false);
|
|
29
34
|
|
|
30
35
|
let progress = $derived(((value - min) / (max - min)) * 100);
|
|
36
|
+
let isPill = $derived(variant === 'pill');
|
|
31
37
|
|
|
32
38
|
function applyStyles(node: HTMLElement) {
|
|
33
39
|
$effect(() => {
|
|
@@ -36,7 +42,7 @@
|
|
|
36
42
|
}
|
|
37
43
|
</script>
|
|
38
44
|
|
|
39
|
-
<span class="wrapper">
|
|
45
|
+
<span class="wrapper" data-variant={variant} data-size={size} use:applyStyles>
|
|
40
46
|
<input
|
|
41
47
|
type="range"
|
|
42
48
|
bind:value
|
|
@@ -51,11 +57,20 @@
|
|
|
51
57
|
aria-errormessage={ctx?.errorMessageId}
|
|
52
58
|
data-disabled={isDisabled || undefined}
|
|
53
59
|
data-orientation={orientation}
|
|
60
|
+
data-variant={variant}
|
|
54
61
|
data-size={size}
|
|
55
62
|
class={className}
|
|
56
|
-
use:applyStyles
|
|
57
63
|
{...rest}
|
|
58
64
|
/>
|
|
65
|
+
{#if isPill}
|
|
66
|
+
<span data-part="value-label" aria-hidden="true">
|
|
67
|
+
{#if valueLabel}
|
|
68
|
+
{@render valueLabel({ value, percentage: progress })}
|
|
69
|
+
{:else}
|
|
70
|
+
{Math.round(progress)}%
|
|
71
|
+
{/if}
|
|
72
|
+
</span>
|
|
73
|
+
{/if}
|
|
59
74
|
</span>
|
|
60
75
|
|
|
61
76
|
<style>
|
|
@@ -181,4 +196,81 @@
|
|
|
181
196
|
--dry-slider-track-height: 8px;
|
|
182
197
|
--dry-slider-thumb-size: 28px;
|
|
183
198
|
}
|
|
199
|
+
|
|
200
|
+
/* ── Pill variant ── */
|
|
201
|
+
|
|
202
|
+
.wrapper[data-variant='pill'] input,
|
|
203
|
+
.wrapper[data-variant='pill'] [data-part='value-label'] {
|
|
204
|
+
grid-area: 1 / 1;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
input[data-variant='pill'][data-size='sm'] {
|
|
208
|
+
--dry-slider-track-height: 32px;
|
|
209
|
+
--dry-slider-thumb-size: 32px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
input[data-variant='pill'][data-size='md'] {
|
|
213
|
+
--dry-slider-track-height: 40px;
|
|
214
|
+
--dry-slider-thumb-size: 40px;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
input[data-variant='pill'][data-size='lg'] {
|
|
218
|
+
--dry-slider-track-height: 48px;
|
|
219
|
+
--dry-slider-thumb-size: 48px;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
input[data-variant='pill']::-webkit-slider-thumb {
|
|
223
|
+
background: transparent;
|
|
224
|
+
border: none;
|
|
225
|
+
box-shadow: none;
|
|
226
|
+
margin-top: 0;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
input[data-variant='pill']::-moz-range-thumb {
|
|
230
|
+
background: transparent;
|
|
231
|
+
border: none;
|
|
232
|
+
box-shadow: none;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
input[data-variant='pill']:hover:not([data-disabled])::-webkit-slider-thumb,
|
|
236
|
+
input[data-variant='pill']:active:not([data-disabled])::-webkit-slider-thumb {
|
|
237
|
+
transform: none;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
input[data-variant='pill']:hover:not([data-disabled])::-moz-range-thumb,
|
|
241
|
+
input[data-variant='pill']:active:not([data-disabled])::-moz-range-thumb {
|
|
242
|
+
transform: none;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* Pill value label */
|
|
246
|
+
.wrapper[data-variant='pill'] [data-part='value-label'] {
|
|
247
|
+
pointer-events: none;
|
|
248
|
+
display: grid;
|
|
249
|
+
align-items: center;
|
|
250
|
+
padding-inline: var(--dry-space-4);
|
|
251
|
+
font-size: var(--dry-text-sm-size, 0.875rem);
|
|
252
|
+
font-weight: 600;
|
|
253
|
+
color: var(--dry-color-text);
|
|
254
|
+
clip-path: inset(
|
|
255
|
+
0 calc(100% - var(--dry-slider-progress, 50%)) 0 0 round var(--dry-radius-full)
|
|
256
|
+
);
|
|
257
|
+
transition: clip-path var(--dry-duration-fast) var(--dry-ease-default);
|
|
258
|
+
z-index: 1;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.wrapper[data-variant='pill'][data-size='sm'] [data-part='value-label'] {
|
|
262
|
+
font-size: var(--dry-text-xs-size, 0.75rem);
|
|
263
|
+
padding-inline: var(--dry-space-3);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.wrapper[data-variant='pill'][data-size='lg'] [data-part='value-label'] {
|
|
267
|
+
font-size: var(--dry-text-base-size, 1rem);
|
|
268
|
+
padding-inline: var(--dry-space-5);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
@media (prefers-reduced-motion: reduce) {
|
|
272
|
+
.wrapper[data-variant='pill'] [data-part='value-label'] {
|
|
273
|
+
transition: none;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
184
276
|
</style>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
1
2
|
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
2
3
|
interface Props extends Omit<HTMLInputAttributes, 'size'> {
|
|
3
4
|
value?: number;
|
|
@@ -5,8 +6,13 @@ interface Props extends Omit<HTMLInputAttributes, 'size'> {
|
|
|
5
6
|
max?: number;
|
|
6
7
|
step?: number;
|
|
7
8
|
size?: 'sm' | 'md' | 'lg';
|
|
9
|
+
variant?: 'default' | 'pill';
|
|
8
10
|
disabled?: boolean;
|
|
9
11
|
orientation?: 'horizontal' | 'vertical';
|
|
12
|
+
valueLabel?: Snippet<[{
|
|
13
|
+
value: number;
|
|
14
|
+
percentage: number;
|
|
15
|
+
}]>;
|
|
10
16
|
}
|
|
11
17
|
declare const SliderInput: import("svelte").Component<Props, {}, "value">;
|
|
12
18
|
type SliderInput = ReturnType<typeof SliderInput>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dryui/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"author": "Rob Balfre",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -76,6 +76,11 @@
|
|
|
76
76
|
"svelte": "./dist/beam/index.js",
|
|
77
77
|
"default": "./dist/beam/index.js"
|
|
78
78
|
},
|
|
79
|
+
"./border-beam": {
|
|
80
|
+
"types": "./dist/border-beam/index.d.ts",
|
|
81
|
+
"svelte": "./dist/border-beam/index.js",
|
|
82
|
+
"default": "./dist/border-beam/index.js"
|
|
83
|
+
},
|
|
79
84
|
"./breadcrumb": {
|
|
80
85
|
"types": "./dist/breadcrumb/index.d.ts",
|
|
81
86
|
"svelte": "./dist/breadcrumb/index.js",
|
|
@@ -770,7 +775,7 @@
|
|
|
770
775
|
"postpack": "bun ../../scripts/postpack-exports.ts"
|
|
771
776
|
},
|
|
772
777
|
"dependencies": {
|
|
773
|
-
"@dryui/primitives": "^1.
|
|
778
|
+
"@dryui/primitives": "^1.2.0"
|
|
774
779
|
},
|
|
775
780
|
"peerDependencies": {
|
|
776
781
|
"svelte": "^5.55.1"
|
package/skills/dryui/SKILL.md
CHANGED
|
@@ -145,7 +145,7 @@ This works for greenfield (empty directory), brownfield (existing non-SvelteKit
|
|
|
145
145
|
**4. Add the agent integration layer manually** if you do not want to use `dryui` / `dryui setup`:
|
|
146
146
|
|
|
147
147
|
- Claude Code: `claude plugin marketplace add rob-balfre/dryui && claude plugin install dryui@dryui` (installs skill + MCP in one step)
|
|
148
|
-
- Codex:
|
|
148
|
+
- Codex (0.121.0+): `codex marketplace add rob-balfre/dryui`, then start `codex`, run `/plugins`, and install `DryUI` (installs skill + MCP in one step). Manual fallback: `codex mcp add dryui -- npx -y @dryui/mcp` + copy the skill from `packages/ui/skills/dryui`.
|
|
149
149
|
- Copilot/Cursor/Windsurf: `npx degit rob-balfre/dryui/packages/ui/skills/dryui .agents/skills/dryui` + add MCP config (see https://dryui.dev/tools)
|
|
150
150
|
|
|
151
151
|
### Manual setup
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
|
|
4
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {}
|
|
5
|
-
|
|
6
|
-
let { class: className, ...rest }: Props = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<div class={className} {...rest}></div>
|
|
10
|
-
|
|
11
|
-
<style>
|
|
12
|
-
div {
|
|
13
|
-
position: fixed;
|
|
14
|
-
inset: 0;
|
|
15
|
-
background: var(--dry-overlay-bg, var(--dry-color-overlay-backdrop));
|
|
16
|
-
backdrop-filter: blur(var(--dry-overlay-blur, 12px));
|
|
17
|
-
-webkit-backdrop-filter: blur(var(--dry-overlay-blur, 12px));
|
|
18
|
-
z-index: var(--dry-layer-overlay);
|
|
19
|
-
will-change: opacity;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
div[data-state='closed'] {
|
|
23
|
-
display: none;
|
|
24
|
-
}
|
|
25
|
-
</style>
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
-
}
|
|
4
|
-
declare const OverlayBase: import("svelte").Component<Props, {}, "">;
|
|
5
|
-
type OverlayBase = ReturnType<typeof OverlayBase>;
|
|
6
|
-
export default OverlayBase;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
-
|
|
5
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
6
|
-
children: Snippet;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
let { children, class: className, ...rest }: Props = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<div class={className} {...rest}>
|
|
13
|
-
{@render children()}
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<style>
|
|
17
|
-
div {
|
|
18
|
-
padding: var(--dry-section-padding);
|
|
19
|
-
overflow-y: auto;
|
|
20
|
-
min-height: 0;
|
|
21
|
-
}
|
|
22
|
-
</style>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
-
children: Snippet;
|
|
5
|
-
}
|
|
6
|
-
declare const SectionBody: import("svelte").Component<Props, {}, "">;
|
|
7
|
-
type SectionBody = ReturnType<typeof SectionBody>;
|
|
8
|
-
export default SectionBody;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
-
|
|
5
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
6
|
-
children: Snippet;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
let { children, class: className, ...rest }: Props = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<div class={className} {...rest}>
|
|
13
|
-
{@render children()}
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<style>
|
|
17
|
-
div {
|
|
18
|
-
padding: var(--dry-section-padding);
|
|
19
|
-
border-top: 1px solid var(--dry-section-border);
|
|
20
|
-
display: grid;
|
|
21
|
-
grid-auto-flow: column;
|
|
22
|
-
grid-auto-columns: max-content;
|
|
23
|
-
justify-items: var(--dry-section-footer-justify, start);
|
|
24
|
-
gap: var(--dry-section-footer-gap, var(--dry-space-4));
|
|
25
|
-
}
|
|
26
|
-
</style>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
-
children: Snippet;
|
|
5
|
-
}
|
|
6
|
-
declare const SectionFooter: import("svelte").Component<Props, {}, "">;
|
|
7
|
-
type SectionFooter = ReturnType<typeof SectionFooter>;
|
|
8
|
-
export default SectionFooter;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
-
|
|
5
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
6
|
-
children: Snippet;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
let { children, class: className, ...rest }: Props = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<div class={className} {...rest}>
|
|
13
|
-
{@render children()}
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<style>
|
|
17
|
-
div {
|
|
18
|
-
padding: var(--dry-section-padding);
|
|
19
|
-
border-bottom: 1px solid var(--dry-section-border);
|
|
20
|
-
}
|
|
21
|
-
</style>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
-
children: Snippet;
|
|
5
|
-
}
|
|
6
|
-
declare const SectionHeader: import("svelte").Component<Props, {}, "">;
|
|
7
|
-
type SectionHeader = ReturnType<typeof SectionHeader>;
|
|
8
|
-
export default SectionHeader;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Practical UI Foundation Map
|
|
2
|
-
|
|
3
|
-
> Living note for [docs/research/practical-ui-figma-extraction.md](./docs/research/practical-ui-figma-extraction.md). Extracted from the Practical UI design system file on 2026-03-25.
|
|
4
|
-
|
|
5
|
-
## Foundation Rules
|
|
6
|
-
|
|
7
|
-
- Colour tokens are organized as semantic roles first, then tone, emphasis, and state.
|
|
8
|
-
- Background surfaces use `base`, `sunken`, `raised`, and `overlay`.
|
|
9
|
-
- Practical UI’s public neutral text and fill system is transparent, not solid.
|
|
10
|
-
- Elevation is expressed with both surface colour and shadow.
|
|
11
|
-
- Spacing is a fixed 4px-based ladder, not ad hoc values.
|
|
12
|
-
- Typography is centered on Inter with a small named scale.
|
|
13
|
-
|
|
14
|
-
## DryUI Mapping
|
|
15
|
-
|
|
16
|
-
| Figma | DryUI |
|
|
17
|
-
| -------------------- | --------------------------- |
|
|
18
|
-
| `Background/Base` | `--dry-color-bg-base` |
|
|
19
|
-
| `Background/Sunken` | `--dry-color-bg-sunken` |
|
|
20
|
-
| `Background/Raised` | `--dry-color-bg-raised` |
|
|
21
|
-
| `Background/Overlay` | `--dry-color-bg-overlay` |
|
|
22
|
-
| `Background/Inverse` | `--dry-color-bg-inverse` |
|
|
23
|
-
| `Text/Strong` | `--dry-color-text-strong` |
|
|
24
|
-
| `Text/Weak` | `--dry-color-text-weak` |
|
|
25
|
-
| `Text/Disabled` | `--dry-color-text-disabled` |
|
|
26
|
-
| `Stroke/Strong` | `--dry-color-stroke-strong` |
|
|
27
|
-
| `Stroke/Weak` | `--dry-color-stroke-weak` |
|
|
28
|
-
| `Stroke/Focus` | `--dry-color-stroke-focus` |
|
|
29
|
-
| `Fill/Strong` | `--dry-color-fill-strong` |
|
|
30
|
-
| `Fill/Weak` | `--dry-color-fill-weak` |
|
|
31
|
-
| `Fill/Hover` | `--dry-color-fill-hover` |
|
|
32
|
-
| `Fill/Press` | `--dry-color-fill-active` |
|
|
33
|
-
| `Fill/Selected` | `--dry-color-fill-selected` |
|
|
34
|
-
| `Fill/Inverse` | `--dry-color-fill-inverse` |
|
|
35
|
-
| `Information` | `info` |
|
|
36
|
-
|
|
37
|
-
## Published Scales
|
|
38
|
-
|
|
39
|
-
- Spacing: `0`, `4`, `8`, `12`, `16`, `20`, `24`, `32`, `40`, `48`, `56`, `64`, `80`, `96`, `128`, `192`, `256`
|
|
40
|
-
- Desktop typography: `Display 56/64`, `Heading 1 40/48`, `Heading 2 32/40`, `Heading 3 24/32`, `Heading 4 20/28`, `Small 16/24`, `Tiny 14/20`
|
|
41
|
-
- Mobile typography: `Display 40/48`, `Heading 1 36/44`, `Heading 2 28/36`, `Heading 3 24/32`, `Heading 4 20/28`, `Small 16/24`, `Tiny 14/20`
|
|
42
|
-
|
|
43
|
-
## Notes
|
|
44
|
-
|
|
45
|
-
- Keep [`default.css`](./packages/ui/src/themes/default.css) and [`dark.css`](./packages/ui/src/themes/dark.css) synchronized with the extracted foundation ladder.
|
|
46
|
-
- The inverse fill family in Dark mode follows the same transparent-neutral logic as the rest of the semantic layer.
|