@dryui/ui 1.5.1 → 1.7.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/accordion/accordion-item.svelte +9 -0
- package/dist/accordion/accordion-root.svelte +1 -1
- package/dist/alert/alert.svelte +1 -0
- package/dist/avatar/avatar.svelte +1 -1
- package/dist/button/button.svelte +3 -2
- package/dist/button-group/context.svelte.js +4 -7
- package/dist/calendar/calendar-root.svelte +15 -32
- package/dist/card/card-root.svelte +1 -0
- package/dist/chart/chart-y-axis.svelte +5 -0
- package/dist/checkbox/checkbox-input.svelte +30 -31
- package/dist/chip-group/context.svelte.d.ts +2 -4
- package/dist/chip-group/context.svelte.js +2 -9
- package/dist/combobox/combobox-content.svelte +1 -0
- package/dist/combobox/combobox-item.svelte +9 -0
- package/dist/command-palette/command-palette-item.svelte +9 -0
- package/dist/command-palette/command-palette-list.svelte +1 -0
- package/dist/context-menu/context-menu-content.svelte +25 -12
- package/dist/context-menu/context-menu-group.svelte +3 -2
- package/dist/context-menu/context-menu-item.svelte +8 -61
- package/dist/context-menu/context-menu-label.svelte +3 -11
- package/dist/context-menu/context-menu-root.svelte +10 -29
- package/dist/context-menu/context-menu-separator.svelte +2 -9
- package/dist/context-menu/context.svelte.d.ts +2 -12
- package/dist/data-grid/data-grid-cell.svelte +5 -0
- package/dist/date-picker/datepicker-content.svelte +11 -81
- package/dist/date-picker/datepicker-content.svelte.d.ts +1 -1
- package/dist/date-picker/datepicker-input-root.svelte +39 -47
- package/dist/date-range-picker/date-range-picker-content.svelte +11 -75
- package/dist/date-range-picker/date-range-picker-content.svelte.d.ts +1 -1
- package/dist/date-range-picker/date-range-picker-root.svelte +44 -49
- package/dist/drag-and-drop/group-context.svelte.d.ts +1 -1
- package/dist/drag-and-drop/group-context.svelte.js +4 -4
- package/dist/dropdown-menu/context.svelte.d.ts +2 -8
- package/dist/dropdown-menu/dropdown-menu-content.svelte +22 -3
- package/dist/dropdown-menu/dropdown-menu-group.svelte +3 -2
- package/dist/dropdown-menu/dropdown-menu-item.svelte +8 -61
- package/dist/dropdown-menu/dropdown-menu-label.svelte +3 -11
- package/dist/dropdown-menu/dropdown-menu-root.svelte +10 -21
- package/dist/dropdown-menu/dropdown-menu-separator.svelte +2 -9
- package/dist/flip-card/context.svelte.d.ts +5 -0
- package/dist/flip-card/context.svelte.js +2 -0
- package/dist/flip-card/flip-card-back.svelte +2 -2
- package/dist/flip-card/flip-card-root.svelte +42 -15
- package/dist/heading/heading.svelte +10 -1
- package/dist/heading/heading.svelte.d.ts +1 -0
- package/dist/heading/index.d.ts +1 -0
- package/dist/hover-card/hover-card-content.svelte +9 -21
- package/dist/hover-card/hover-card-root.svelte +2 -2
- package/dist/hover-card/hover-card-root.svelte.d.ts +4 -0
- package/dist/image/image.svelte +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/internal/anchored-overlay-content.svelte.d.ts +20 -0
- package/dist/internal/anchored-overlay-content.svelte.js +28 -0
- package/dist/internal/date-family-controller.svelte.d.ts +45 -0
- package/dist/internal/date-family-controller.svelte.js +99 -0
- package/dist/internal/menu-group.svelte +15 -0
- package/dist/internal/menu-group.svelte.d.ts +9 -0
- package/dist/internal/menu-item.svelte +91 -0
- package/dist/internal/menu-item.svelte.d.ts +11 -0
- package/dist/internal/menu-label.svelte +24 -0
- package/dist/internal/menu-label.svelte.d.ts +9 -0
- package/dist/internal/menu-root-state.svelte.d.ts +24 -0
- package/dist/internal/menu-root-state.svelte.js +42 -0
- package/dist/internal/menu-separator.svelte +19 -0
- package/dist/internal/menu-separator.svelte.d.ts +7 -0
- package/dist/internal/modal-content.svelte +18 -0
- package/dist/internal/motion.js +12 -1
- package/dist/internal/nav-arrow-button.svelte +21 -5
- package/dist/internal/picker-popover-content.svelte +112 -0
- package/dist/internal/picker-popover-content.svelte.d.ts +16 -0
- package/dist/link-preview/link-preview-content.svelte +7 -10
- package/dist/list/list-item-icon.svelte +3 -3
- package/dist/list/list-item-icon.svelte.d.ts +1 -1
- package/dist/list/list-item-text.svelte +3 -3
- package/dist/list/list-item-text.svelte.d.ts +1 -1
- package/dist/list/list-item.svelte +58 -35
- package/dist/list/list-item.svelte.d.ts +8 -2
- package/dist/menubar/menubar-content.svelte +1 -0
- package/dist/menubar/menubar-item.svelte +10 -1
- package/dist/number-input/number-input-button.svelte +1 -0
- package/dist/pin-input/pin-input-cell.svelte +1 -0
- package/dist/popover/popover-content.svelte +15 -11
- package/dist/progress/progress.svelte +1 -0
- package/dist/radio-group/radio-group-item-input.svelte +17 -2
- package/dist/range-calendar/range-calendar-root.svelte +13 -19
- package/dist/reveal/reveal.svelte +1 -1
- package/dist/select/select-content.svelte +1 -0
- package/dist/select/select-item.svelte +9 -0
- package/dist/select/select-trigger-button.svelte +18 -1
- package/dist/skeleton/skeleton.svelte +2 -0
- package/dist/slider/slider-input.svelte +1 -0
- package/dist/text/index.d.ts +1 -0
- package/dist/text/text.svelte +4 -1
- package/dist/text/text.svelte.d.ts +1 -0
- package/dist/theme-toggle/index.d.ts +18 -0
- package/dist/theme-toggle/index.js +3 -0
- package/dist/theme-toggle/theme-controller.svelte.d.ts +54 -0
- package/dist/theme-toggle/theme-controller.svelte.js +121 -0
- package/dist/theme-toggle/theme-flash.d.ts +16 -0
- package/dist/theme-toggle/theme-flash.js +38 -0
- package/dist/theme-toggle/theme-toggle.svelte +199 -0
- package/dist/theme-toggle/theme-toggle.svelte.d.ts +40 -0
- package/dist/themes/dark.css +6 -0
- package/dist/themes/default.css +92 -0
- package/dist/toast/toast-provider.svelte +1 -0
- package/dist/toast/toast-root.svelte +1 -0
- package/dist/tooltip/tooltip-content.svelte +13 -10
- package/dist/typography/heading.svelte +13 -89
- package/dist/typography/heading.svelte.d.ts +3 -8
- package/dist/typography/index.d.ts +8 -7
- package/dist/typography/text.svelte +12 -84
- package/dist/typography/text.svelte.d.ts +3 -10
- package/dist/video-embed/video-embed-button.svelte +2 -1
- package/package.json +7 -2
- package/skills/dryui/SKILL.md +18 -5
- package/skills/dryui/rules/composition.md +1 -1
- package/skills/dryui/rules/theming.md +1 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
5
|
+
children: Snippet;
|
|
6
|
+
}
|
|
7
|
+
declare const MenuGroup: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type MenuGroup = ReturnType<typeof MenuGroup>;
|
|
9
|
+
export default MenuGroup;
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
7
|
+
close: () => void;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
children: Snippet;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let { className, close, disabled, children, onclick, onkeydown, ...rest }: Props = $props();
|
|
13
|
+
|
|
14
|
+
function handleClick(e: MouseEvent & { currentTarget: HTMLDivElement }) {
|
|
15
|
+
if (disabled) return;
|
|
16
|
+
if (onclick) {
|
|
17
|
+
(onclick as (event: MouseEvent & { currentTarget: HTMLDivElement }) => void)(e);
|
|
18
|
+
}
|
|
19
|
+
close();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function handleKeydown(e: KeyboardEvent & { currentTarget: HTMLDivElement }) {
|
|
23
|
+
if (disabled) return;
|
|
24
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
e.currentTarget.click();
|
|
27
|
+
}
|
|
28
|
+
if (onkeydown) {
|
|
29
|
+
(onkeydown as (event: KeyboardEvent & { currentTarget: HTMLDivElement }) => void)(e);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<div
|
|
35
|
+
role="menuitem"
|
|
36
|
+
tabindex={disabled ? undefined : -1}
|
|
37
|
+
aria-disabled={disabled || undefined}
|
|
38
|
+
data-disabled={disabled || undefined}
|
|
39
|
+
class={className}
|
|
40
|
+
onclick={handleClick}
|
|
41
|
+
onkeydown={handleKeydown}
|
|
42
|
+
{...rest}
|
|
43
|
+
>
|
|
44
|
+
{@render children()}
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
div {
|
|
49
|
+
display: grid;
|
|
50
|
+
grid-auto-flow: column;
|
|
51
|
+
grid-auto-columns: max-content;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: var(--dry-space-2);
|
|
54
|
+
padding: var(--dry-menu-item-padding, var(--dry-space-2_5) var(--dry-space-2));
|
|
55
|
+
border-radius: var(
|
|
56
|
+
--dry-menu-item-radius,
|
|
57
|
+
min(var(--dry-control-radius, var(--dry-radius-sm)), var(--dry-space-4))
|
|
58
|
+
);
|
|
59
|
+
font-size: var(--dry-type-small-size, var(--dry-text-sm-size));
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
user-select: none;
|
|
62
|
+
outline: none;
|
|
63
|
+
color: var(--dry-color-text-strong);
|
|
64
|
+
min-height: var(--dry-space-11);
|
|
65
|
+
|
|
66
|
+
transition:
|
|
67
|
+
background var(--dry-duration-fast) var(--dry-ease-default),
|
|
68
|
+
opacity var(--dry-duration-fast) var(--dry-ease-out),
|
|
69
|
+
transform var(--dry-duration-fast) var(--dry-ease-out);
|
|
70
|
+
|
|
71
|
+
@starting-style {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
transform: translateY(4px);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
div:hover:not([data-disabled]),
|
|
78
|
+
div:focus-visible {
|
|
79
|
+
background: var(--dry-color-fill);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
div:active:not([data-disabled]) {
|
|
83
|
+
background: var(--dry-color-fill-hover);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
div[data-disabled] {
|
|
87
|
+
color: var(--dry-color-text-disabled);
|
|
88
|
+
cursor: not-allowed;
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
5
|
+
close: () => void;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
children: Snippet;
|
|
8
|
+
}
|
|
9
|
+
declare const MenuItem: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type MenuItem = ReturnType<typeof MenuItem>;
|
|
11
|
+
export default MenuItem;
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
7
|
+
children: Snippet;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let { className, children, ...rest }: Props = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<div role="presentation" class={className} {...rest}>
|
|
14
|
+
{@render children()}
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<style>
|
|
18
|
+
div {
|
|
19
|
+
padding: var(--dry-space-1_5) var(--dry-space-2);
|
|
20
|
+
font-size: var(--dry-type-tiny-size, var(--dry-text-xs-size));
|
|
21
|
+
color: var(--dry-color-text-weak);
|
|
22
|
+
font-weight: 500;
|
|
23
|
+
}
|
|
24
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
5
|
+
children: Snippet;
|
|
6
|
+
}
|
|
7
|
+
declare const MenuLabel: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type MenuLabel = ReturnType<typeof MenuLabel>;
|
|
9
|
+
export default MenuLabel;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MenuRootState {
|
|
2
|
+
readonly open: boolean;
|
|
3
|
+
readonly triggerId: string;
|
|
4
|
+
readonly contentId: string;
|
|
5
|
+
triggerEl: HTMLElement | null;
|
|
6
|
+
show: () => void;
|
|
7
|
+
close: () => void;
|
|
8
|
+
toggle: () => void;
|
|
9
|
+
}
|
|
10
|
+
export interface MenuPosition {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
}
|
|
14
|
+
export interface PositionedMenuRootState extends MenuRootState {
|
|
15
|
+
position: MenuPosition;
|
|
16
|
+
}
|
|
17
|
+
interface CreateMenuRootStateOptions {
|
|
18
|
+
idBase: string;
|
|
19
|
+
getOpen: () => boolean;
|
|
20
|
+
setOpen: (value: boolean) => void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createMenuRootState(options: CreateMenuRootStateOptions): MenuRootState;
|
|
23
|
+
export declare function createPositionedMenuRootState(options: CreateMenuRootStateOptions): PositionedMenuRootState;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { generateFormId } from '@dryui/primitives';
|
|
2
|
+
function createBaseMenuRootState(options) {
|
|
3
|
+
const triggerId = generateFormId(`${options.idBase}-trigger`);
|
|
4
|
+
const contentId = generateFormId(`${options.idBase}-content`);
|
|
5
|
+
return {
|
|
6
|
+
triggerId,
|
|
7
|
+
contentId,
|
|
8
|
+
triggerEl: null,
|
|
9
|
+
show() {
|
|
10
|
+
options.setOpen(true);
|
|
11
|
+
},
|
|
12
|
+
close() {
|
|
13
|
+
options.setOpen(false);
|
|
14
|
+
},
|
|
15
|
+
toggle() {
|
|
16
|
+
options.setOpen(!options.getOpen());
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function createMenuRootState(options) {
|
|
21
|
+
return {
|
|
22
|
+
get open() {
|
|
23
|
+
return options.getOpen();
|
|
24
|
+
},
|
|
25
|
+
...createBaseMenuRootState(options)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function createPositionedMenuRootState(options) {
|
|
29
|
+
let position = $state({ x: 0, y: 0 });
|
|
30
|
+
return {
|
|
31
|
+
get open() {
|
|
32
|
+
return options.getOpen();
|
|
33
|
+
},
|
|
34
|
+
...createBaseMenuRootState(options),
|
|
35
|
+
get position() {
|
|
36
|
+
return position;
|
|
37
|
+
},
|
|
38
|
+
set position(value) {
|
|
39
|
+
position = value;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
|
|
4
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
5
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let { className, ...rest }: Props = $props();
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<div role="separator" class={className} {...rest}></div>
|
|
12
|
+
|
|
13
|
+
<style>
|
|
14
|
+
div {
|
|
15
|
+
height: 1px;
|
|
16
|
+
background: var(--dry-color-stroke-weak);
|
|
17
|
+
margin: var(--dry-space-1) 0;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
className?: HTMLAttributes<HTMLDivElement>['class'];
|
|
4
|
+
}
|
|
5
|
+
declare const MenuSeparator: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type MenuSeparator = ReturnType<typeof MenuSeparator>;
|
|
7
|
+
export default MenuSeparator;
|
|
@@ -132,6 +132,7 @@
|
|
|
132
132
|
var(--dry-dialog-padding)
|
|
133
133
|
)
|
|
134
134
|
);
|
|
135
|
+
--dry-btn-radius: var(--dry-radius-nested);
|
|
135
136
|
|
|
136
137
|
container-type: inline-size;
|
|
137
138
|
justify-self: stretch;
|
|
@@ -150,6 +151,11 @@
|
|
|
150
151
|
transform var(--dry-duration-normal) var(--dry-ease-spring-snappy);
|
|
151
152
|
}
|
|
152
153
|
|
|
154
|
+
[data-modal-content][data-variant='dialog'][data-state='closed'] [data-modal-panel] {
|
|
155
|
+
transition-duration: var(--dry-duration-fast);
|
|
156
|
+
transition-timing-function: var(--dry-ease-out);
|
|
157
|
+
}
|
|
158
|
+
|
|
153
159
|
[data-modal-content][data-variant='dialog'][data-state='open'] [data-modal-panel] {
|
|
154
160
|
opacity: 1;
|
|
155
161
|
transform: scale(1) translateY(0);
|
|
@@ -189,6 +195,8 @@
|
|
|
189
195
|
--dry-dialog-shadow: var(--dry-shadow-overlay);
|
|
190
196
|
--dry-dialog-padding: var(--dry-space-6);
|
|
191
197
|
--dry-dialog-max-width: 32rem;
|
|
198
|
+
--dry-radius-nested: max(0px, calc(var(--dry-dialog-radius) - var(--dry-dialog-padding)));
|
|
199
|
+
--dry-btn-radius: var(--dry-radius-nested);
|
|
192
200
|
|
|
193
201
|
container-type: inline-size;
|
|
194
202
|
justify-self: stretch;
|
|
@@ -208,6 +216,11 @@
|
|
|
208
216
|
transform var(--dry-duration-normal) var(--dry-ease-spring-snappy);
|
|
209
217
|
}
|
|
210
218
|
|
|
219
|
+
[data-modal-content][data-variant='alert-dialog'][data-state='closed'] [data-modal-panel] {
|
|
220
|
+
transition-duration: var(--dry-duration-fast);
|
|
221
|
+
transition-timing-function: var(--dry-ease-out);
|
|
222
|
+
}
|
|
223
|
+
|
|
211
224
|
[data-modal-content][data-variant='alert-dialog'][data-state='open'] [data-modal-panel] {
|
|
212
225
|
opacity: 1;
|
|
213
226
|
transform: scale(1) translateY(0);
|
|
@@ -282,6 +295,11 @@
|
|
|
282
295
|
opacity var(--dry-duration-normal) var(--dry-ease-out);
|
|
283
296
|
}
|
|
284
297
|
|
|
298
|
+
[data-modal-content][data-variant='drawer'][data-state='closed'] [data-modal-panel] {
|
|
299
|
+
transition-duration: var(--dry-duration-fast);
|
|
300
|
+
transition-timing-function: var(--dry-ease-out);
|
|
301
|
+
}
|
|
302
|
+
|
|
285
303
|
[data-modal-content][data-variant='drawer'][data-side='right'] [data-modal-panel] {
|
|
286
304
|
grid-column: 2;
|
|
287
305
|
height: 100%;
|
package/dist/internal/motion.js
CHANGED
|
@@ -11,8 +11,19 @@ export function supportsScrollTimelines() {
|
|
|
11
11
|
return (CSS.supports('animation-timeline: view()') || CSS.supports('scroll-timeline-name: --dry-scroll'));
|
|
12
12
|
}
|
|
13
13
|
export function extractThemeColor(property, element) {
|
|
14
|
+
if (typeof document === 'undefined') {
|
|
15
|
+
return [0, 0, 0];
|
|
16
|
+
}
|
|
17
|
+
const readComputedStyle = typeof getComputedStyle === 'function'
|
|
18
|
+
? getComputedStyle
|
|
19
|
+
: typeof window !== 'undefined' && typeof window.getComputedStyle === 'function'
|
|
20
|
+
? window.getComputedStyle.bind(window)
|
|
21
|
+
: null;
|
|
22
|
+
if (!readComputedStyle) {
|
|
23
|
+
return [0, 0, 0];
|
|
24
|
+
}
|
|
14
25
|
const el = element ?? document.documentElement;
|
|
15
|
-
const value =
|
|
26
|
+
const value = readComputedStyle(el).getPropertyValue(property).trim();
|
|
16
27
|
// Parse hex (#rgb, #rrggbb)
|
|
17
28
|
const hexMatch = value.match(/^#([0-9a-f]{3,8})$/i);
|
|
18
29
|
if (hexMatch) {
|
|
@@ -18,9 +18,25 @@
|
|
|
18
18
|
</script>
|
|
19
19
|
|
|
20
20
|
<Button {variant} {size} type="button" aria-label={label} {...rest}>
|
|
21
|
-
{
|
|
22
|
-
{
|
|
23
|
-
|
|
24
|
-
{
|
|
25
|
-
|
|
21
|
+
<span data-part="nav-arrow-icon" data-direction={direction}>
|
|
22
|
+
{#if children}
|
|
23
|
+
{@render children()}
|
|
24
|
+
{:else}
|
|
25
|
+
{glyph}
|
|
26
|
+
{/if}
|
|
27
|
+
</span>
|
|
26
28
|
</Button>
|
|
29
|
+
|
|
30
|
+
<style>
|
|
31
|
+
[data-part='nav-arrow-icon'] {
|
|
32
|
+
display: inline-flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
}
|
|
36
|
+
[data-part='nav-arrow-icon'][data-direction='prev'] {
|
|
37
|
+
transform: translateX(-0.5px);
|
|
38
|
+
}
|
|
39
|
+
[data-part='nav-arrow-icon'][data-direction='next'] {
|
|
40
|
+
transform: translateX(0.5px);
|
|
41
|
+
}
|
|
42
|
+
</style>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { fromAction } from 'svelte/attachments';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
5
|
+
import { createAnchoredPopover, type Placement } from '@dryui/primitives';
|
|
6
|
+
import type { PickerPopoverController } from './date-family-controller.svelte.js';
|
|
7
|
+
|
|
8
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
9
|
+
controller: PickerPopoverController;
|
|
10
|
+
dataAttribute: 'data-dp-content' | 'data-drp-content';
|
|
11
|
+
placement?: Placement;
|
|
12
|
+
offset?: number;
|
|
13
|
+
contentClass?: HTMLAttributes<HTMLDivElement>['class'];
|
|
14
|
+
contentStyle?: HTMLAttributes<HTMLDivElement>['style'];
|
|
15
|
+
children: Snippet;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
controller,
|
|
20
|
+
dataAttribute,
|
|
21
|
+
placement = 'bottom-start',
|
|
22
|
+
offset = 8,
|
|
23
|
+
contentClass,
|
|
24
|
+
contentStyle,
|
|
25
|
+
children,
|
|
26
|
+
...rest
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
let el = $state<HTMLDivElement | null>(null);
|
|
30
|
+
|
|
31
|
+
const markerAttrs = $derived.by<Record<string, string>>(() => ({
|
|
32
|
+
'data-picker-popover-content': '',
|
|
33
|
+
[dataAttribute]: ''
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
function attachContent(node: HTMLDivElement) {
|
|
37
|
+
el = node;
|
|
38
|
+
|
|
39
|
+
return () => {
|
|
40
|
+
if (el === node) {
|
|
41
|
+
el = null;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const popover = createAnchoredPopover({
|
|
47
|
+
triggerEl: () => controller.triggerEl,
|
|
48
|
+
contentEl: () => el ?? null,
|
|
49
|
+
open: () => controller.open,
|
|
50
|
+
placement: () => placement,
|
|
51
|
+
offset: () => offset
|
|
52
|
+
});
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<div
|
|
56
|
+
{@attach attachContent}
|
|
57
|
+
{@attach fromAction(popover.applyPosition, () => contentStyle)}
|
|
58
|
+
popover="auto"
|
|
59
|
+
role="dialog"
|
|
60
|
+
id={controller.contentId}
|
|
61
|
+
aria-labelledby={controller.triggerId}
|
|
62
|
+
data-state={controller.open ? 'open' : 'closed'}
|
|
63
|
+
class={contentClass}
|
|
64
|
+
{...markerAttrs}
|
|
65
|
+
ontoggle={(e) => {
|
|
66
|
+
const newState = (e as ToggleEvent).newState === 'open';
|
|
67
|
+
|
|
68
|
+
if (newState && !controller.open) {
|
|
69
|
+
controller.show();
|
|
70
|
+
} else if (!newState && controller.open) {
|
|
71
|
+
controller.close();
|
|
72
|
+
}
|
|
73
|
+
}}
|
|
74
|
+
{...rest}
|
|
75
|
+
>
|
|
76
|
+
{@render children()}
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<style>
|
|
80
|
+
[data-picker-popover-content] {
|
|
81
|
+
inset: unset;
|
|
82
|
+
margin: 0;
|
|
83
|
+
display: inline-grid;
|
|
84
|
+
padding: var(--dry-space-3);
|
|
85
|
+
border: 1px solid var(--dry-color-stroke-weak);
|
|
86
|
+
border-radius: var(--dry-radius-lg);
|
|
87
|
+
background: var(--dry-color-bg-overlay);
|
|
88
|
+
box-shadow: var(--dry-shadow-lg);
|
|
89
|
+
color: var(--dry-color-text-strong);
|
|
90
|
+
transition:
|
|
91
|
+
opacity var(--dry-duration-fast) var(--dry-ease-emphasized),
|
|
92
|
+
transform var(--dry-duration-fast) var(--dry-ease-emphasized);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
[data-picker-popover-content]:not(:popover-open) {
|
|
96
|
+
display: none;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
[data-picker-popover-content]:popover-open {
|
|
100
|
+
display: inline-grid;
|
|
101
|
+
opacity: 1;
|
|
102
|
+
transform: translateY(0) scale(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@starting-style {
|
|
106
|
+
[data-picker-popover-content]:popover-open {
|
|
107
|
+
opacity: 0;
|
|
108
|
+
transform: translateY(calc(var(--dry-motion-distance-xs) * -1))
|
|
109
|
+
scale(var(--dry-motion-scale-enter));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Placement } from '@dryui/primitives';
|
|
4
|
+
import type { PickerPopoverController } from './date-family-controller.svelte.js';
|
|
5
|
+
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
6
|
+
controller: PickerPopoverController;
|
|
7
|
+
dataAttribute: 'data-dp-content' | 'data-drp-content';
|
|
8
|
+
placement?: Placement;
|
|
9
|
+
offset?: number;
|
|
10
|
+
contentClass?: HTMLAttributes<HTMLDivElement>['class'];
|
|
11
|
+
contentStyle?: HTMLAttributes<HTMLDivElement>['style'];
|
|
12
|
+
children: Snippet;
|
|
13
|
+
}
|
|
14
|
+
declare const PickerPopoverContent: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type PickerPopoverContent = ReturnType<typeof PickerPopoverContent>;
|
|
16
|
+
export default PickerPopoverContent;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
-
import { createAnchoredPopover } from '@dryui/primitives';
|
|
5
4
|
import type { Placement } from '@dryui/primitives';
|
|
5
|
+
import { createAnchoredOverlayContent } from '../internal/anchored-overlay-content.svelte.js';
|
|
6
6
|
import { getLinkPreviewCtx } from './context.svelte.js';
|
|
7
7
|
|
|
8
8
|
interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
@@ -22,25 +22,22 @@
|
|
|
22
22
|
|
|
23
23
|
const ctx = getLinkPreviewCtx();
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const popover = createAnchoredPopover({
|
|
28
|
-
triggerEl: () => ctx.triggerEl,
|
|
29
|
-
contentEl: () => contentEl ?? null,
|
|
30
|
-
open: () => ctx.open,
|
|
25
|
+
const overlay = createAnchoredOverlayContent({
|
|
26
|
+
ctx,
|
|
31
27
|
placement: () => placement,
|
|
32
|
-
offset: () => offset
|
|
28
|
+
offset: () => offset,
|
|
29
|
+
style: () => style
|
|
33
30
|
});
|
|
34
31
|
</script>
|
|
35
32
|
|
|
36
33
|
<div
|
|
37
|
-
|
|
34
|
+
{@attach overlay.bindContent}
|
|
35
|
+
{@attach overlay.position}
|
|
38
36
|
id={ctx.contentId}
|
|
39
37
|
role="tooltip"
|
|
40
38
|
popover="manual"
|
|
41
39
|
data-link-preview-content
|
|
42
40
|
data-state={ctx.open ? 'open' : 'closed'}
|
|
43
|
-
use:popover.applyPosition={style}
|
|
44
41
|
onmouseenter={() => ctx.showImmediate()}
|
|
45
42
|
onmouseleave={() => ctx.close()}
|
|
46
43
|
class={className}
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
4
|
|
|
5
|
-
interface Props extends HTMLAttributes<
|
|
5
|
+
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
6
6
|
children: Snippet;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
let { class: className, children, ...rest }: Props = $props();
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
|
-
<
|
|
12
|
+
<span data-list-item-icon class={className} {...rest}>
|
|
13
13
|
{@render children()}
|
|
14
|
-
</
|
|
14
|
+
</span>
|
|
15
15
|
|
|
16
16
|
<style>
|
|
17
17
|
[data-list-item-icon] {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
interface Props extends HTMLAttributes<
|
|
3
|
+
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
4
4
|
children: Snippet;
|
|
5
5
|
}
|
|
6
6
|
declare const ListItemIcon: import("svelte").Component<Props, {}, "">;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
4
|
|
|
5
|
-
interface Props extends HTMLAttributes<
|
|
5
|
+
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
6
6
|
primary?: Snippet;
|
|
7
7
|
secondary?: Snippet;
|
|
8
8
|
children?: Snippet;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
let { class: className, primary, secondary, children, ...rest }: Props = $props();
|
|
12
12
|
</script>
|
|
13
13
|
|
|
14
|
-
<
|
|
14
|
+
<span data-list-item-text class={className} {...rest}>
|
|
15
15
|
{#if primary}
|
|
16
16
|
<span data-list-item-primary>{@render primary()}</span>
|
|
17
17
|
{:else if children}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
{#if secondary}
|
|
21
21
|
<span data-list-item-secondary>{@render secondary()}</span>
|
|
22
22
|
{/if}
|
|
23
|
-
</
|
|
23
|
+
</span>
|
|
24
24
|
|
|
25
25
|
<style>
|
|
26
26
|
[data-list-item-text] {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
interface Props extends HTMLAttributes<
|
|
3
|
+
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
4
4
|
primary?: Snippet;
|
|
5
5
|
secondary?: Snippet;
|
|
6
6
|
children?: Snippet;
|