@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.
Files changed (118) hide show
  1. package/dist/accordion/accordion-item.svelte +9 -0
  2. package/dist/accordion/accordion-root.svelte +1 -1
  3. package/dist/alert/alert.svelte +1 -0
  4. package/dist/avatar/avatar.svelte +1 -1
  5. package/dist/button/button.svelte +3 -2
  6. package/dist/button-group/context.svelte.js +4 -7
  7. package/dist/calendar/calendar-root.svelte +15 -32
  8. package/dist/card/card-root.svelte +1 -0
  9. package/dist/chart/chart-y-axis.svelte +5 -0
  10. package/dist/checkbox/checkbox-input.svelte +30 -31
  11. package/dist/chip-group/context.svelte.d.ts +2 -4
  12. package/dist/chip-group/context.svelte.js +2 -9
  13. package/dist/combobox/combobox-content.svelte +1 -0
  14. package/dist/combobox/combobox-item.svelte +9 -0
  15. package/dist/command-palette/command-palette-item.svelte +9 -0
  16. package/dist/command-palette/command-palette-list.svelte +1 -0
  17. package/dist/context-menu/context-menu-content.svelte +25 -12
  18. package/dist/context-menu/context-menu-group.svelte +3 -2
  19. package/dist/context-menu/context-menu-item.svelte +8 -61
  20. package/dist/context-menu/context-menu-label.svelte +3 -11
  21. package/dist/context-menu/context-menu-root.svelte +10 -29
  22. package/dist/context-menu/context-menu-separator.svelte +2 -9
  23. package/dist/context-menu/context.svelte.d.ts +2 -12
  24. package/dist/data-grid/data-grid-cell.svelte +5 -0
  25. package/dist/date-picker/datepicker-content.svelte +11 -81
  26. package/dist/date-picker/datepicker-content.svelte.d.ts +1 -1
  27. package/dist/date-picker/datepicker-input-root.svelte +39 -47
  28. package/dist/date-range-picker/date-range-picker-content.svelte +11 -75
  29. package/dist/date-range-picker/date-range-picker-content.svelte.d.ts +1 -1
  30. package/dist/date-range-picker/date-range-picker-root.svelte +44 -49
  31. package/dist/drag-and-drop/group-context.svelte.d.ts +1 -1
  32. package/dist/drag-and-drop/group-context.svelte.js +4 -4
  33. package/dist/dropdown-menu/context.svelte.d.ts +2 -8
  34. package/dist/dropdown-menu/dropdown-menu-content.svelte +22 -3
  35. package/dist/dropdown-menu/dropdown-menu-group.svelte +3 -2
  36. package/dist/dropdown-menu/dropdown-menu-item.svelte +8 -61
  37. package/dist/dropdown-menu/dropdown-menu-label.svelte +3 -11
  38. package/dist/dropdown-menu/dropdown-menu-root.svelte +10 -21
  39. package/dist/dropdown-menu/dropdown-menu-separator.svelte +2 -9
  40. package/dist/flip-card/context.svelte.d.ts +5 -0
  41. package/dist/flip-card/context.svelte.js +2 -0
  42. package/dist/flip-card/flip-card-back.svelte +2 -2
  43. package/dist/flip-card/flip-card-root.svelte +42 -15
  44. package/dist/heading/heading.svelte +10 -1
  45. package/dist/heading/heading.svelte.d.ts +1 -0
  46. package/dist/heading/index.d.ts +1 -0
  47. package/dist/hover-card/hover-card-content.svelte +9 -21
  48. package/dist/hover-card/hover-card-root.svelte +2 -2
  49. package/dist/hover-card/hover-card-root.svelte.d.ts +4 -0
  50. package/dist/image/image.svelte +5 -0
  51. package/dist/index.d.ts +2 -0
  52. package/dist/index.js +1 -0
  53. package/dist/internal/anchored-overlay-content.svelte.d.ts +20 -0
  54. package/dist/internal/anchored-overlay-content.svelte.js +28 -0
  55. package/dist/internal/date-family-controller.svelte.d.ts +45 -0
  56. package/dist/internal/date-family-controller.svelte.js +99 -0
  57. package/dist/internal/menu-group.svelte +15 -0
  58. package/dist/internal/menu-group.svelte.d.ts +9 -0
  59. package/dist/internal/menu-item.svelte +91 -0
  60. package/dist/internal/menu-item.svelte.d.ts +11 -0
  61. package/dist/internal/menu-label.svelte +24 -0
  62. package/dist/internal/menu-label.svelte.d.ts +9 -0
  63. package/dist/internal/menu-root-state.svelte.d.ts +24 -0
  64. package/dist/internal/menu-root-state.svelte.js +42 -0
  65. package/dist/internal/menu-separator.svelte +19 -0
  66. package/dist/internal/menu-separator.svelte.d.ts +7 -0
  67. package/dist/internal/modal-content.svelte +18 -0
  68. package/dist/internal/motion.js +12 -1
  69. package/dist/internal/nav-arrow-button.svelte +21 -5
  70. package/dist/internal/picker-popover-content.svelte +112 -0
  71. package/dist/internal/picker-popover-content.svelte.d.ts +16 -0
  72. package/dist/link-preview/link-preview-content.svelte +7 -10
  73. package/dist/list/list-item-icon.svelte +3 -3
  74. package/dist/list/list-item-icon.svelte.d.ts +1 -1
  75. package/dist/list/list-item-text.svelte +3 -3
  76. package/dist/list/list-item-text.svelte.d.ts +1 -1
  77. package/dist/list/list-item.svelte +58 -35
  78. package/dist/list/list-item.svelte.d.ts +8 -2
  79. package/dist/menubar/menubar-content.svelte +1 -0
  80. package/dist/menubar/menubar-item.svelte +10 -1
  81. package/dist/number-input/number-input-button.svelte +1 -0
  82. package/dist/pin-input/pin-input-cell.svelte +1 -0
  83. package/dist/popover/popover-content.svelte +15 -11
  84. package/dist/progress/progress.svelte +1 -0
  85. package/dist/radio-group/radio-group-item-input.svelte +17 -2
  86. package/dist/range-calendar/range-calendar-root.svelte +13 -19
  87. package/dist/reveal/reveal.svelte +1 -1
  88. package/dist/select/select-content.svelte +1 -0
  89. package/dist/select/select-item.svelte +9 -0
  90. package/dist/select/select-trigger-button.svelte +18 -1
  91. package/dist/skeleton/skeleton.svelte +2 -0
  92. package/dist/slider/slider-input.svelte +1 -0
  93. package/dist/text/index.d.ts +1 -0
  94. package/dist/text/text.svelte +4 -1
  95. package/dist/text/text.svelte.d.ts +1 -0
  96. package/dist/theme-toggle/index.d.ts +18 -0
  97. package/dist/theme-toggle/index.js +3 -0
  98. package/dist/theme-toggle/theme-controller.svelte.d.ts +54 -0
  99. package/dist/theme-toggle/theme-controller.svelte.js +121 -0
  100. package/dist/theme-toggle/theme-flash.d.ts +16 -0
  101. package/dist/theme-toggle/theme-flash.js +38 -0
  102. package/dist/theme-toggle/theme-toggle.svelte +199 -0
  103. package/dist/theme-toggle/theme-toggle.svelte.d.ts +40 -0
  104. package/dist/themes/dark.css +6 -0
  105. package/dist/themes/default.css +92 -0
  106. package/dist/toast/toast-provider.svelte +1 -0
  107. package/dist/toast/toast-root.svelte +1 -0
  108. package/dist/tooltip/tooltip-content.svelte +13 -10
  109. package/dist/typography/heading.svelte +13 -89
  110. package/dist/typography/heading.svelte.d.ts +3 -8
  111. package/dist/typography/index.d.ts +8 -7
  112. package/dist/typography/text.svelte +12 -84
  113. package/dist/typography/text.svelte.d.ts +3 -10
  114. package/dist/video-embed/video-embed-button.svelte +2 -1
  115. package/package.json +7 -2
  116. package/skills/dryui/SKILL.md +18 -5
  117. package/skills/dryui/rules/composition.md +1 -1
  118. 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%;
@@ -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 = getComputedStyle(el).getPropertyValue(property).trim();
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
- {#if children}
22
- {@render children()}
23
- {:else}
24
- {glyph}
25
- {/if}
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
- let contentEl = $state<HTMLDivElement>();
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
- bind:this={contentEl}
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<HTMLDivElement> {
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
- <div data-list-item-icon class={className} {...rest}>
12
+ <span data-list-item-icon class={className} {...rest}>
13
13
  {@render children()}
14
- </div>
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<HTMLDivElement> {
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<HTMLDivElement> {
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
- <div data-list-item-text class={className} {...rest}>
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
- </div>
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<HTMLDivElement> {
3
+ interface Props extends HTMLAttributes<HTMLSpanElement> {
4
4
  primary?: Snippet;
5
5
  secondary?: Snippet;
6
6
  children?: Snippet;