@svelte-atoms/core 1.0.0-alpha.25 → 1.0.0-alpha.26

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 (152) hide show
  1. package/README.md +645 -645
  2. package/dist/components/accordion/accordion-root.svelte +1 -1
  3. package/dist/components/accordion/item/accordion-item-body.svelte +1 -1
  4. package/dist/components/accordion/item/accordion-item-header.svelte +5 -1
  5. package/dist/components/accordion/item/accordion-item-indicator.svelte +1 -1
  6. package/dist/components/accordion/item/accordion-item-root.svelte +1 -1
  7. package/dist/components/alert/alert-actions.svelte +1 -1
  8. package/dist/components/alert/alert-close-button.svelte +1 -1
  9. package/dist/components/alert/alert-content.svelte +1 -1
  10. package/dist/components/alert/alert-description.svelte +1 -1
  11. package/dist/components/alert/alert-icon.svelte +1 -1
  12. package/dist/components/alert/alert-root.svelte +1 -1
  13. package/dist/components/alert/alert-title.svelte +1 -1
  14. package/dist/components/atom/html-atom.svelte +201 -217
  15. package/dist/components/badge/badge.svelte +1 -1
  16. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  17. package/dist/components/breadcrumb/breadcrumb-root.svelte +1 -1
  18. package/dist/components/breadcrumb/breadcrumb-separator.svelte +1 -1
  19. package/dist/components/button/button.stories.svelte +57 -57
  20. package/dist/components/button/button.svelte +1 -1
  21. package/dist/components/button/button.svelte.d.ts +4 -1
  22. package/dist/components/button/types.d.ts +1 -1
  23. package/dist/components/card/card-body.svelte +1 -1
  24. package/dist/components/card/card-description.svelte +1 -1
  25. package/dist/components/card/card-footer.svelte +1 -1
  26. package/dist/components/card/card-header.svelte +1 -1
  27. package/dist/components/card/card-media.svelte +1 -1
  28. package/dist/components/card/card-subtitle.svelte +1 -1
  29. package/dist/components/card/card-title.svelte +5 -1
  30. package/dist/components/checkbox/checkbox.svelte +39 -28
  31. package/dist/components/collapsible/collapsible-body.svelte +1 -1
  32. package/dist/components/collapsible/collapsible-header.svelte +1 -1
  33. package/dist/components/collapsible/collapsible-indicator.svelte +1 -1
  34. package/dist/components/collapsible/collapsible-root.svelte +1 -1
  35. package/dist/components/combobox/atoms.d.ts +5 -1
  36. package/dist/components/combobox/atoms.js +5 -1
  37. package/dist/components/combobox/{combobox-input.svelte → combobox-control.svelte} +3 -3
  38. package/dist/components/combobox/{combobox-input.svelte.d.ts → combobox-control.svelte.d.ts} +3 -3
  39. package/dist/components/combobox/combobox-trigger.svelte +1 -1
  40. package/dist/components/combobox/compobox-item.svelte +1 -1
  41. package/dist/components/container/container.svelte +1 -1
  42. package/dist/components/datagrid/datagrid-body.svelte +1 -1
  43. package/dist/components/datagrid/datagrid-footer.svelte +1 -1
  44. package/dist/components/datagrid/datagrid-header.svelte +1 -1
  45. package/dist/components/datagrid/datagrid-root.svelte +1 -1
  46. package/dist/components/datagrid/datagrid.stories.svelte +75 -75
  47. package/dist/components/datagrid/td/datagrid-td.svelte +1 -1
  48. package/dist/components/datagrid/th/datagrid-th-sort-icon.svelte +1 -1
  49. package/dist/components/datagrid/th/datagrid-th.svelte +1 -1
  50. package/dist/components/dialog/dialog-body.svelte +1 -1
  51. package/dist/components/dialog/dialog-close-button.svelte +1 -1
  52. package/dist/components/dialog/dialog-content.svelte +8 -11
  53. package/dist/components/dialog/dialog-description.svelte +1 -1
  54. package/dist/components/dialog/dialog-footer.svelte +1 -1
  55. package/dist/components/dialog/dialog-header.svelte +1 -1
  56. package/dist/components/dialog/dialog-root.svelte +123 -120
  57. package/dist/components/dialog/dialog-root.svelte.d.ts +3 -1
  58. package/dist/components/dialog/dialog-title.svelte +1 -1
  59. package/dist/components/drawer/drawer-backdrop.svelte +1 -1
  60. package/dist/components/drawer/drawer-body.svelte +1 -1
  61. package/dist/components/drawer/drawer-description.svelte +1 -1
  62. package/dist/components/drawer/drawer-footer.svelte +1 -1
  63. package/dist/components/drawer/drawer-header.svelte +1 -1
  64. package/dist/components/drawer/drawer-root.svelte +118 -113
  65. package/dist/components/drawer/drawer-root.svelte.d.ts +5 -2
  66. package/dist/components/drawer/drawer-title.svelte +1 -1
  67. package/dist/components/dropdown/dropdown-placeholder.svelte +1 -1
  68. package/dist/components/dropdown/dropdown-query.svelte +1 -1
  69. package/dist/components/dropdown/dropdown-trigger.svelte +1 -1
  70. package/dist/components/dropdown/dropdown-value.svelte +1 -3
  71. package/dist/components/dropdown/item/bond.svelte.d.ts +4 -0
  72. package/dist/components/dropdown/item/bond.svelte.js +9 -0
  73. package/dist/components/dropdown/item/dropdown-item.svelte +10 -6
  74. package/dist/components/form/field/bond.svelte.d.ts +8 -0
  75. package/dist/components/form/field/bond.svelte.js +13 -1
  76. package/dist/components/form/field/field-control.svelte +7 -0
  77. package/dist/components/form/field/field-control.svelte.d.ts +2 -2
  78. package/dist/components/form/form.stories.svelte +3 -3
  79. package/dist/components/input/atoms.d.ts +5 -1
  80. package/dist/components/input/atoms.js +5 -1
  81. package/dist/components/input/{input-value.svelte → input-control.svelte} +107 -113
  82. package/dist/components/input/input-control.svelte.d.ts +27 -0
  83. package/dist/components/input/input-icon.svelte +1 -1
  84. package/dist/components/input/input-placeholder.svelte +54 -56
  85. package/dist/components/input/input-root.svelte +5 -12
  86. package/dist/components/input/input-root.svelte.d.ts +3 -20
  87. package/dist/components/input/input.stories.svelte +2 -2
  88. package/dist/components/input/types.d.ts +22 -0
  89. package/dist/components/input/types.js +1 -0
  90. package/dist/components/list/list-group.svelte +1 -1
  91. package/dist/components/list/list-item.svelte +1 -1
  92. package/dist/components/list/list-root.svelte +6 -1
  93. package/dist/components/list/list-title.svelte +1 -1
  94. package/dist/components/menu/menu-list.svelte +1 -1
  95. package/dist/components/popover/bond.svelte.d.ts +2 -0
  96. package/dist/components/popover/bond.svelte.js +1 -1
  97. package/dist/components/popover/popover-arrow.svelte +111 -117
  98. package/dist/components/popover/popover-arrow.svelte.d.ts +1 -2
  99. package/dist/components/popover/popover-content.svelte +139 -147
  100. package/dist/components/popover/popover-content.svelte.d.ts +3 -17
  101. package/dist/components/popover/popover-indicator.svelte +1 -1
  102. package/dist/components/popover/popover-root.svelte +49 -63
  103. package/dist/components/popover/popover-root.svelte.d.ts +1 -15
  104. package/dist/components/popover/popover-trigger.svelte +47 -56
  105. package/dist/components/popover/popover-trigger.svelte.d.ts +2 -8
  106. package/dist/components/popover/types.d.ts +39 -0
  107. package/dist/components/popover/types.js +1 -0
  108. package/dist/components/portal/active-portal.svelte +22 -16
  109. package/dist/components/portal/active-portal.svelte.d.ts +2 -2
  110. package/dist/components/portal/portal-inner.svelte +1 -1
  111. package/dist/components/portal/portal-root.svelte +1 -1
  112. package/dist/components/portal/teleport.svelte +55 -49
  113. package/dist/components/portal/teleport.svelte.d.ts +3 -2
  114. package/dist/components/radio/radio-group.stories.svelte +4 -4
  115. package/dist/components/radio/radio.svelte +3 -3
  116. package/dist/components/root/root.css +24 -66
  117. package/dist/components/root/root.svelte +1 -1
  118. package/dist/components/sidebar/sidebar-content.svelte +2 -16
  119. package/dist/components/sidebar/sidebar-content.svelte.d.ts +2 -9
  120. package/dist/components/sidebar/sidebar-root.svelte +4 -23
  121. package/dist/components/sidebar/sidebar-root.svelte.d.ts +2 -13
  122. package/dist/components/sidebar/types.d.ts +19 -0
  123. package/dist/components/sidebar/types.js +1 -0
  124. package/dist/components/stack/stack-item.svelte +5 -1
  125. package/dist/components/stack/stack-root.svelte +5 -1
  126. package/dist/components/tabs/tab/tab-body.svelte +1 -1
  127. package/dist/components/tabs/tab/tab-description.svelte +1 -1
  128. package/dist/components/tabs/tab/tab-header.svelte +2 -2
  129. package/dist/components/tabs/tab/tab-root.svelte +6 -1
  130. package/dist/components/tabs/tabs-body.svelte +1 -1
  131. package/dist/components/tabs/tabs-header.svelte +1 -1
  132. package/dist/components/tabs/tabs-root.svelte +1 -1
  133. package/dist/components/textarea/textarea-input.svelte +2 -1
  134. package/dist/components/toast/toast-description.svelte +1 -1
  135. package/dist/components/toast/toast-root.svelte +1 -1
  136. package/dist/components/toast/toast-title.svelte +1 -1
  137. package/dist/components/tree/tree-body.svelte +1 -1
  138. package/dist/components/tree/tree-header.svelte +1 -1
  139. package/dist/components/tree/tree-indicator.svelte +1 -1
  140. package/dist/components/tree/tree-root.svelte +1 -1
  141. package/dist/context/preset.svelte.d.ts +1 -1
  142. package/llm/composition.md +395 -395
  143. package/llm/crafting.md +838 -838
  144. package/llm/motion.md +970 -970
  145. package/llm/philosophy.md +23 -23
  146. package/llm/preset-variant-integration.md +516 -516
  147. package/llm/preset.md +383 -383
  148. package/llm/styling.md +216 -216
  149. package/llm/usage.md +46 -46
  150. package/llm/variants.md +712 -712
  151. package/package.json +437 -437
  152. package/dist/components/input/input-value.svelte.d.ts +0 -19
@@ -1,117 +1,111 @@
1
- <script module lang="ts">
2
- export type PopoverArrowProps<
3
- E extends keyof HTMLElementTagNameMap = 'div',
4
- B extends Base = Base
5
- > = HtmlAtomProps<E, B>;
6
- </script>
7
-
8
- <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
9
- import type { HTMLAttributes } from 'svelte/elements';
10
- import { animate as motion } from 'motion';
11
- import { HtmlAtom, type HtmlAtomProps, type Base } from '../atom';
12
- import { PopoverBond } from './bond.svelte';
13
-
14
- type Element = HTMLElementTagNameMap[E];
15
-
16
- const bond = PopoverBond.get();
17
-
18
- if (!bond) {
19
- throw new Error('');
20
- }
21
-
22
- let {
23
- class: klass = '',
24
- children = undefined,
25
- onmount = undefined,
26
- ondestroy = undefined,
27
- animate = _animate,
28
- enter = undefined,
29
- exit = undefined,
30
- initial = undefined,
31
- ...restProps
32
- }: PopoverArrowProps<E, B> & HTMLAttributes<Element> = $props();
33
-
34
- const position = $derived(bond.position);
35
- const middlewareArrowData = $derived(position?.middlewareData?.arrow);
36
- const isReady = $derived(!!middlewareArrowData);
37
- const side = $derived(position?.placement?.split('-')[0] ?? 'top');
38
-
39
- const arrowProps = $derived({
40
- ...bond.arrow(),
41
- ...restProps
42
- });
43
-
44
- // Rotation based on placement side
45
- const rotation = $derived.by(() => {
46
- switch (side) {
47
- case 'top':
48
- return 180;
49
- case 'bottom':
50
- return 0;
51
- case 'left':
52
- return 90;
53
- case 'right':
54
- return -90;
55
- default:
56
- return 0;
57
- }
58
- });
59
-
60
- function _animate(node: HTMLElement) {
61
- if (!middlewareArrowData) {
62
- return;
63
- }
64
-
65
- const { x, y } = middlewareArrowData;
66
-
67
- const isMainAxis = side === 'top' || side === 'bottom';
68
-
69
- const crossAxisStyle = isMainAxis
70
- ? {
71
- left: 0
72
- }
73
- : {
74
- top: 0
75
- };
76
-
77
- motion(
78
- node,
79
- {
80
- x: x ?? 0,
81
- y: y ?? 0,
82
- opacity: 1,
83
- ...crossAxisStyle
84
- },
85
- { duration: 0 }
86
- );
87
- }
88
- </script>
89
-
90
- <HtmlAtom
91
- {bond}
92
- preset="popover.arrow"
93
- class={['text-border pointer-events-none absolute opacity-0', '$preset', klass]}
94
- onmount={onmount?.bind(bond.state)}
95
- ondestroy={ondestroy?.bind(bond.state)}
96
- animate={animate?.bind(bond.state)}
97
- enter={enter?.bind(bond.state)}
98
- exit={exit?.bind(bond.state)}
99
- initial={initial?.bind(bond.state)}
100
- style="{side}: 100%;"
101
- {...arrowProps}
102
- >
103
- {#if children}
104
- {@render children({ popover: bond })}
105
- {:else}
106
- <svg
107
- width="12"
108
- height="12"
109
- viewBox="0 0 12 12"
110
- fill="none"
111
- xmlns="http://www.w3.org/2000/svg"
112
- style="transform: rotate({rotation}deg);"
113
- >
114
- <path d="M0 12L6 6L12 12H0Z" fill="currentColor" stroke="none" />
115
- </svg>
116
- {/if}
117
- </HtmlAtom>
1
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { animate as motion } from 'motion';
4
+ import { HtmlAtom, type HtmlAtomProps, type Base } from '../atom';
5
+ import { PopoverBond } from './bond.svelte';
6
+ import type { PopoverArrowProps } from './types';
7
+
8
+ type Element = HTMLElementTagNameMap[E];
9
+
10
+ const bond = PopoverBond.get();
11
+
12
+ if (!bond) {
13
+ throw new Error('');
14
+ }
15
+
16
+ let {
17
+ class: klass = '',
18
+ children = undefined,
19
+ onmount = undefined,
20
+ ondestroy = undefined,
21
+ animate = _animate,
22
+ enter = undefined,
23
+ exit = undefined,
24
+ initial = undefined,
25
+ ...restProps
26
+ }: PopoverArrowProps<E, B> & HTMLAttributes<Element> = $props();
27
+
28
+ const position = $derived(bond.position);
29
+ const middlewareArrowData = $derived(position?.middlewareData?.arrow);
30
+ const isReady = $derived(!!middlewareArrowData);
31
+ const side = $derived(position?.placement?.split('-')[0] ?? 'top');
32
+
33
+ const arrowProps = $derived({
34
+ ...bond.arrow(),
35
+ ...restProps
36
+ });
37
+
38
+ // Rotation based on placement side
39
+ const rotation = $derived.by(() => {
40
+ switch (side) {
41
+ case 'top':
42
+ return 180;
43
+ case 'bottom':
44
+ return 0;
45
+ case 'left':
46
+ return 90;
47
+ case 'right':
48
+ return -90;
49
+ default:
50
+ return 0;
51
+ }
52
+ });
53
+
54
+ function _animate(node: HTMLElement) {
55
+ if (!middlewareArrowData) {
56
+ return;
57
+ }
58
+
59
+ const { x, y } = middlewareArrowData;
60
+
61
+ const isMainAxis = side === 'top' || side === 'bottom';
62
+
63
+ const crossAxisStyle = isMainAxis
64
+ ? {
65
+ left: 0
66
+ }
67
+ : {
68
+ top: 0
69
+ };
70
+
71
+ motion(
72
+ node,
73
+ {
74
+ x: x ?? 0,
75
+ y: y ?? 0,
76
+ opacity: 1,
77
+ ...crossAxisStyle
78
+ },
79
+ { duration: 0 }
80
+ );
81
+ }
82
+ </script>
83
+
84
+ <HtmlAtom
85
+ {bond}
86
+ preset="popover.arrow"
87
+ class={['text-border border-border pointer-events-none absolute opacity-0', '$preset', klass]}
88
+ onmount={onmount?.bind(bond.state)}
89
+ ondestroy={ondestroy?.bind(bond.state)}
90
+ animate={animate?.bind(bond.state)}
91
+ enter={enter?.bind(bond.state)}
92
+ exit={exit?.bind(bond.state)}
93
+ initial={initial?.bind(bond.state)}
94
+ style="{side}: 100%;"
95
+ {...arrowProps}
96
+ >
97
+ {#if children}
98
+ {@render children({ popover: bond })}
99
+ {:else}
100
+ <svg
101
+ width="12"
102
+ height="12"
103
+ viewBox="0 0 12 12"
104
+ fill="none"
105
+ xmlns="http://www.w3.org/2000/svg"
106
+ style="transform: rotate({rotation}deg);"
107
+ >
108
+ <path d="M0 12L6 6L12 12H0Z" fill="currentColor" stroke="none" />
109
+ </svg>
110
+ {/if}
111
+ </HtmlAtom>
@@ -1,6 +1,5 @@
1
- export type PopoverArrowProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = HtmlAtomProps<E, B>;
2
1
  import type { HTMLAttributes } from 'svelte/elements';
3
- import { type HtmlAtomProps, type Base } from '../atom';
2
+ import { type Base } from '../atom';
4
3
  declare function $$render<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
5
4
  props: Record<string, unknown> & {
6
5
  [key: string]: unknown;
@@ -1,147 +1,139 @@
1
- <script module lang="ts">
2
- import type { Override } from '../../types';
3
-
4
- export type AnimateParams = {
5
- x: number;
6
- y: number;
7
- xOffset: number;
8
- yOffset: number;
9
- open: boolean;
10
- };
11
-
12
- export type PopoverOverlayProps<T extends HtmlElementTagName, B extends Base = Base> = Override<
13
- HtmlAtomProps<T, B>,
14
- {
15
- children?: Snippet<[{ popover?: PopoverBond }]>;
16
- }
17
- >;
18
-
19
- const k: PopoverOverlayProps<'div'> = {
20
- class: []
21
- };
22
- </script>
23
-
24
- <script lang="ts" generics="E extends HtmlElementTagName, B extends Base = Base">
25
- import { type Snippet } from 'svelte';
26
- import { animate as motion } from 'motion';
27
- import { PortalBond, Teleport } from '../portal';
28
- import { HtmlAtom, type HtmlAtomProps, type Base } from '../atom';
29
- import type { HtmlElementTagName, HtmlElementType } from '../element';
30
- import { PopoverBond } from './bond.svelte';
31
-
32
- type Element = HtmlElementType<E>;
33
-
34
- const bond = PopoverBond.get();
35
- const activePortalBond = PortalBond.get();
36
-
37
- if (!bond) {
38
- throw new Error('<PopoverOverlay /> must be used within a <Popover />');
39
- }
40
-
41
- let {
42
- class: klass = '',
43
- children = undefined,
44
- onmount = undefined,
45
- ondestroy = undefined,
46
- animate = _animate,
47
- enter = undefined,
48
- exit = undefined,
49
- initial = undefined,
50
- ...restProps
51
- }: PopoverOverlayProps<E, B> = $props();
52
-
53
- const isOpen = $derived(bond.state.isOpen && !!bond.elements.trigger);
54
- const portalId = $derived(activePortalBond?.id);
55
-
56
- const position = $derived(bond.position);
57
- const placement = $derived(position?.placement);
58
-
59
- const x = $derived(position?.x ?? 0);
60
- const y = $derived(position?.y ?? 0);
61
-
62
- const dy = $derived(placement?.startsWith('top') ? -1 : placement?.startsWith('bottom') ? 1 : 0);
63
- const dx = $derived(placement?.startsWith('left') ? -1 : placement?.startsWith('right') ? 1 : 0);
64
-
65
- const offset = $derived(bond.state.props.offset);
66
-
67
- const xOffset = $derived(dx * offset);
68
- const yOffset = $derived(dy * offset);
69
-
70
- let isInitialized = false;
71
-
72
- function _containerInitial(this: typeof bond.state, node: Element) {
73
- const openAsNumber = +this.isOpen;
74
-
75
- const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
76
- const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
77
- const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
78
-
79
- const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
80
- const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
81
-
82
- node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
83
-
84
- isInitialized = true;
85
- }
86
-
87
- function _containerAnimate(this: typeof bond.state, node: Element, _?: AnimateParams) {
88
- if (!isInitialized) {
89
- return;
90
- }
91
-
92
- const openAsNumber = +this.isOpen;
93
-
94
- const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
95
- const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
96
- const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
97
-
98
- const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
99
- const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
100
-
101
- node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
102
- }
103
-
104
- function _animate(this: typeof bond.state, node: Element) {
105
- const isOpen = this.isOpen;
106
-
107
- motion(
108
- node,
109
- {
110
- opacity: +isOpen,
111
- y: (isOpen ? 0 : -1) * dy * 8
112
- },
113
- { duration: 0.2 }
114
- );
115
- }
116
- </script>
117
-
118
- <Teleport
119
- portal={portalId ?? 'root.l0'}
120
- as="div"
121
- class={[
122
- 'pointer-events-auto absolute top-0 left-0 h-min w-fit',
123
- !isOpen && 'pointer-events-none'
124
- ]}
125
- initial={_containerInitial?.bind(bond.state)}
126
- animate={_containerAnimate?.bind(bond.state)}
127
- {...bond.content({ onchange: _containerInitial })}
128
- >
129
- <HtmlAtom
130
- {bond}
131
- preset="popover.content"
132
- class={[
133
- 'popover-content border-border bg-background rounded-md border p-2 opacity-0 shadow-lg',
134
- '$preset',
135
- klass
136
- ]}
137
- enter={enter?.bind(bond.state)}
138
- exit={exit?.bind(bond.state)}
139
- initial={initial?.bind(bond.state)}
140
- animate={animate?.bind(bond.state)}
141
- onmount={onmount?.bind(bond.state)}
142
- ondestroy={ondestroy?.bind(bond.state)}
143
- {...restProps}
144
- >
145
- {@render children?.({ popover: bond })}
146
- </HtmlAtom>
147
- </Teleport>
1
+ <script lang="ts" generics="E extends HtmlElementTagName, B extends Base = Base">
2
+ import { animate as motion } from 'motion';
3
+ import { PortalBond, PortalsBond, Teleport } from '../portal';
4
+ import { HtmlAtom, type Base } from '../atom';
5
+ import type { HtmlElementTagName, HtmlElementType } from '../element';
6
+ import { PopoverBond } from './bond.svelte';
7
+ import { DURATION } from '../../shared';
8
+ import type { AnimateParams, PopoverContentProps } from './types';
9
+
10
+ type Element = HtmlElementType<E>;
11
+
12
+ const bond = PopoverBond.get();
13
+ const activePortalBond = (() => {
14
+ const key = bond.state.props.portal;
15
+ if (key instanceof PortalBond) {
16
+ return key;
17
+ }
18
+
19
+ let portal: PortalBond | undefined | null = undefined;
20
+
21
+ if (typeof key === 'string') {
22
+ portal = PortalsBond.get()?.state.get(key);
23
+ console.error('portal was not found');
24
+ }
25
+
26
+ return portal ?? PortalBond.get();
27
+ })();
28
+
29
+ if (!bond) {
30
+ throw new Error('<PopoverOverlay /> must be used within a <Popover />');
31
+ }
32
+
33
+ let {
34
+ class: klass = '',
35
+ children = undefined,
36
+ onmount = undefined,
37
+ ondestroy = undefined,
38
+ animate = _animate,
39
+ enter = undefined,
40
+ exit = undefined,
41
+ initial = undefined,
42
+ ...restProps
43
+ }: PopoverContentProps<E, B> = $props();
44
+
45
+ const isOpen = $derived(bond.state.isOpen && !!bond.elements.trigger);
46
+ const portalId = $derived(activePortalBond?.id);
47
+
48
+ const position = $derived(bond.position);
49
+ const placement = $derived(position?.placement);
50
+
51
+ const x = $derived(position?.x ?? 0);
52
+ const y = $derived(position?.y ?? 0);
53
+
54
+ const dy = $derived(placement?.startsWith('top') ? -1 : placement?.startsWith('bottom') ? 1 : 0);
55
+ const dx = $derived(placement?.startsWith('left') ? -1 : placement?.startsWith('right') ? 1 : 0);
56
+
57
+ const offset = $derived(bond.state.props.offset);
58
+
59
+ const xOffset = $derived(dx * offset);
60
+ const yOffset = $derived(dy * offset);
61
+
62
+ let isInitialized = false;
63
+
64
+ function _containerInitial(this: typeof bond.state, node: Element) {
65
+ const openAsNumber = +this.isOpen;
66
+
67
+ const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
68
+ const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
69
+ const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
70
+
71
+ const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
72
+ const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
73
+
74
+ node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
75
+
76
+ isInitialized = true;
77
+ }
78
+
79
+ function _containerAnimate(this: typeof bond.state, node: Element, _?: AnimateParams) {
80
+ if (!isInitialized) {
81
+ return;
82
+ }
83
+
84
+ const openAsNumber = +this.isOpen;
85
+
86
+ const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
87
+ const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
88
+ const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
89
+
90
+ const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
91
+ const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
92
+
93
+ node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
94
+ }
95
+
96
+ function _animate(this: typeof bond.state, node: Element) {
97
+ const isOpen = this.isOpen;
98
+
99
+ motion(
100
+ node,
101
+ {
102
+ opacity: +isOpen,
103
+ y: (isOpen ? 0 : -1) * dy * 8
104
+ },
105
+ { duration: DURATION.fast / 1000 }
106
+ );
107
+ }
108
+ </script>
109
+
110
+ <Teleport
111
+ portal={portalId ?? 'root.l0'}
112
+ as="div"
113
+ class={[
114
+ 'pointer-events-auto absolute top-0 left-0 h-min w-fit',
115
+ !isOpen && 'pointer-events-none'
116
+ ]}
117
+ initial={_containerInitial?.bind(bond.state)}
118
+ animate={_containerAnimate?.bind(bond.state)}
119
+ {...bond.content({ onchange: _containerInitial })}
120
+ >
121
+ <HtmlAtom
122
+ {bond}
123
+ preset="popover.content"
124
+ class={[
125
+ 'popover-content bg-popover text-popover-foreground border-border rounded-md border p-2 opacity-0 shadow-lg',
126
+ '$preset',
127
+ klass
128
+ ]}
129
+ enter={enter?.bind(bond.state)}
130
+ exit={exit?.bind(bond.state)}
131
+ initial={initial?.bind(bond.state)}
132
+ animate={animate?.bind(bond.state)}
133
+ onmount={onmount?.bind(bond.state)}
134
+ ondestroy={ondestroy?.bind(bond.state)}
135
+ {...restProps}
136
+ >
137
+ {@render children?.({ popover: bond })}
138
+ </HtmlAtom>
139
+ </Teleport>
@@ -1,22 +1,8 @@
1
- import type { Override } from '../../types';
2
- export type AnimateParams = {
3
- x: number;
4
- y: number;
5
- xOffset: number;
6
- yOffset: number;
7
- open: boolean;
8
- };
9
- export type PopoverOverlayProps<T extends HtmlElementTagName, B extends Base = Base> = Override<HtmlAtomProps<T, B>, {
10
- children?: Snippet<[{
11
- popover?: PopoverBond;
12
- }]>;
13
- }>;
14
- import { type Snippet } from 'svelte';
15
- import { type HtmlAtomProps, type Base } from '../atom';
1
+ import { type Base } from '../atom';
16
2
  import type { HtmlElementTagName } from '../element';
17
- import { PopoverBond } from './bond.svelte';
3
+ import type { PopoverContentProps } from './types';
18
4
  declare function $$render<E extends HtmlElementTagName, B extends Base = Base>(): {
19
- props: PopoverOverlayProps<E, B>;
5
+ props: PopoverContentProps<E, B>;
20
6
  exports: {};
21
7
  bindings: "";
22
8
  slots: {};
@@ -24,7 +24,7 @@
24
24
  <HtmlAtom
25
25
  {bond}
26
26
  preset="popover.indicator"
27
- class={['flex items-center justify-center', '$preset', klass]}
27
+ class={['border-border flex items-center justify-center', '$preset', klass]}
28
28
  onmount={onmount?.bind(bond.state)}
29
29
  ondestroy={ondestroy?.bind(bond.state)}
30
30
  animate={animate?.bind(bond.state)}