@svelte-atoms/core 1.0.0-alpha.30 → 1.0.0-alpha.32

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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -739
  3. package/dist/attachments/index.d.ts +1 -0
  4. package/dist/attachments/index.js +1 -0
  5. package/dist/components/accordion/accordion-root.svelte +65 -61
  6. package/dist/components/accordion/accordion.stories.svelte +70 -145
  7. package/dist/components/accordion/item/accordion-item-body.svelte +6 -4
  8. package/dist/components/accordion/item/accordion-item-header.svelte +2 -1
  9. package/dist/components/accordion/item/accordion-item-indicator.svelte +2 -1
  10. package/dist/components/accordion/item/accordion-item-root.svelte +2 -1
  11. package/dist/components/accordion/item/bond.svelte.d.ts +2 -0
  12. package/dist/components/accordion/item/index.d.ts +3 -0
  13. package/dist/components/accordion/item/index.js +3 -0
  14. package/dist/components/accordion/item/motion.svelte.d.ts +15 -0
  15. package/dist/components/accordion/item/motion.svelte.js +30 -0
  16. package/dist/components/accordion/item/types.d.ts +7 -24
  17. package/dist/components/alert/alert-close-button.svelte +32 -36
  18. package/dist/components/alert/alert-description.svelte +1 -1
  19. package/dist/components/alert/alert-description.svelte.d.ts +3 -6
  20. package/dist/components/alert/alert-root.svelte +3 -38
  21. package/dist/components/alert/alert-root.svelte.d.ts +2 -2
  22. package/dist/components/alert/alert.stories.svelte +400 -400
  23. package/dist/components/alert/bond.svelte.d.ts +0 -13
  24. package/dist/components/alert/bond.svelte.js +0 -32
  25. package/dist/components/alert/types.d.ts +8 -32
  26. package/dist/components/atom/html-atom.svelte +93 -261
  27. package/dist/components/atom/types.d.ts +3 -2
  28. package/dist/components/atom/utils.d.ts +37 -0
  29. package/dist/components/atom/utils.js +208 -0
  30. package/dist/components/avatar/avatar.stories.svelte +22 -22
  31. package/dist/components/badge/badge.stories.svelte +12 -12
  32. package/dist/components/badge/badge.svelte +19 -19
  33. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  34. package/dist/components/breadcrumb/breadcrumb-separator.svelte +5 -1
  35. package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -16
  36. package/dist/components/button/button.stories.svelte +27 -27
  37. package/dist/components/calendar/calendar-day.svelte +9 -4
  38. package/dist/components/calendar/calendar.stories.svelte +26 -26
  39. package/dist/components/card/card-body.svelte +39 -39
  40. package/dist/components/card/card-footer.svelte +41 -41
  41. package/dist/components/card/card-root.svelte +91 -91
  42. package/dist/components/card/card.stories.svelte +133 -133
  43. package/dist/components/checkbox/checkbox.stories.svelte +22 -22
  44. package/dist/components/checkbox/checkbox.svelte +159 -155
  45. package/dist/components/collapsible/bond.svelte.js +2 -1
  46. package/dist/components/collapsible/collapsible-body.svelte +3 -2
  47. package/dist/components/collapsible/collapsible.stories.svelte +172 -172
  48. package/dist/components/collapsible/motion.svelte.d.ts +6 -0
  49. package/dist/components/collapsible/motion.svelte.js +15 -0
  50. package/dist/components/combobox/atoms.d.ts +3 -3
  51. package/dist/components/combobox/atoms.js +3 -3
  52. package/dist/components/combobox/bond.svelte.d.ts +6 -6
  53. package/dist/components/combobox/bond.svelte.js +3 -26
  54. package/dist/components/combobox/combobox-control.svelte +52 -52
  55. package/dist/components/combobox/{compobox-item.svelte → combobox-item.svelte} +62 -68
  56. package/dist/components/combobox/combobox-item.svelte.d.ts +12 -0
  57. package/dist/components/combobox/combobox-root.svelte +65 -65
  58. package/dist/components/combobox/combobox.stories.svelte +50 -0
  59. package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
  60. package/dist/components/combobox/index.d.ts +1 -0
  61. package/dist/components/container/container.stories.svelte +20 -20
  62. package/dist/components/container/container.svelte.d.ts +1 -1
  63. package/dist/components/datagrid/datagrid.stories.svelte +72 -72
  64. package/dist/components/datagrid/tr/bond.svelte.d.ts +4 -2
  65. package/dist/components/datagrid/tr/bond.svelte.js +9 -7
  66. package/dist/components/datagrid/tr/datagrid-tr.svelte +9 -7
  67. package/dist/components/date-picker/bond.svelte.d.ts +15 -5
  68. package/dist/components/date-picker/bond.svelte.js +5 -11
  69. package/dist/components/date-picker/date-picker-calendar.svelte +2 -2
  70. package/dist/components/date-picker/date-picker-root.svelte +95 -95
  71. package/dist/components/date-picker/date-picker.stories.svelte +35 -35
  72. package/dist/components/dialog/bond.svelte.d.ts +13 -3
  73. package/dist/components/dialog/bond.svelte.js +52 -6
  74. package/dist/components/dialog/dialog-content.svelte +2 -20
  75. package/dist/components/dialog/dialog-root.svelte +3 -22
  76. package/dist/components/dialog/dialog.stories.svelte +64 -64
  77. package/dist/components/dialog/motion.svelte.d.ts +13 -0
  78. package/dist/components/dialog/motion.svelte.js +44 -0
  79. package/dist/components/drawer/attachments.svelte.d.ts +1 -1
  80. package/dist/components/drawer/attachments.svelte.js +1 -3
  81. package/dist/components/drawer/bond.svelte.d.ts +30 -9
  82. package/dist/components/drawer/bond.svelte.js +80 -24
  83. package/dist/components/drawer/drawer-content.svelte +49 -57
  84. package/dist/components/drawer/drawer-root.svelte +5 -4
  85. package/dist/components/drawer/drawer.stories.svelte +141 -212
  86. package/dist/components/drawer/index.d.ts +2 -0
  87. package/dist/components/drawer/index.js +2 -0
  88. package/dist/components/drawer/motion.d.ts +15 -0
  89. package/dist/components/drawer/motion.js +28 -0
  90. package/dist/components/dropdown/atoms.d.ts +1 -1
  91. package/dist/components/dropdown/atoms.js +1 -1
  92. package/dist/components/dropdown/bond.svelte.d.ts +22 -19
  93. package/dist/components/dropdown/bond.svelte.js +29 -53
  94. package/dist/components/dropdown/dropdown-root.svelte +7 -1
  95. package/dist/components/dropdown/dropdown-values.svelte +17 -17
  96. package/dist/components/dropdown/dropdown-values.svelte.d.ts +1 -2
  97. package/dist/components/dropdown/dropdown.stories.svelte +13 -10
  98. package/dist/components/dropdown/index.d.ts +2 -0
  99. package/dist/components/dropdown/index.js +1 -0
  100. package/dist/components/dropdown/item/attachments.svelte.d.ts +2 -2
  101. package/dist/components/dropdown/item/attachments.svelte.js +2 -2
  102. package/dist/components/dropdown/item/controller.svelte.d.ts +34 -0
  103. package/dist/components/dropdown/item/controller.svelte.js +82 -0
  104. package/dist/components/dropdown/item/dropdown-item.svelte +109 -102
  105. package/dist/components/dropdown/item/dropdown-item.svelte.d.ts +13 -28
  106. package/dist/components/dropdown/item/index.d.ts +3 -0
  107. package/dist/components/dropdown/item/index.js +3 -0
  108. package/dist/components/dropdown/item/types.d.ts +29 -0
  109. package/dist/components/dropdown/item/types.js +1 -0
  110. package/dist/components/form/form.stories.svelte +96 -96
  111. package/dist/components/image/image.stories.svelte +20 -20
  112. package/dist/components/input/input.stories.svelte +35 -35
  113. package/dist/components/label/label.stories.svelte +15 -15
  114. package/dist/components/lazy/lazy.stories.svelte +28 -28
  115. package/dist/components/link/link.stories.svelte +15 -15
  116. package/dist/components/list/list-item.svelte +2 -2
  117. package/dist/components/menu/atoms.d.ts +9 -3
  118. package/dist/components/menu/atoms.js +9 -3
  119. package/dist/components/menu/bond.svelte.d.ts +54 -0
  120. package/dist/components/menu/bond.svelte.js +132 -0
  121. package/dist/components/menu/index.d.ts +3 -1
  122. package/dist/components/menu/index.js +2 -1
  123. package/dist/components/menu/item/controller.svelte.d.ts +26 -0
  124. package/dist/components/menu/item/controller.svelte.js +69 -0
  125. package/dist/components/menu/item/index.d.ts +2 -0
  126. package/dist/components/menu/item/index.js +2 -0
  127. package/dist/components/menu/item/menu-item.svelte +103 -0
  128. package/dist/components/menu/item/menu-item.svelte.d.ts +31 -0
  129. package/dist/components/menu/item/types.d.ts +62 -0
  130. package/dist/components/menu/item/types.js +1 -0
  131. package/dist/components/menu/{menu-list.svelte → menu-content.svelte} +40 -40
  132. package/dist/components/menu/{menu-list.svelte.d.ts → menu-content.svelte.d.ts} +3 -3
  133. package/dist/components/menu/menu-root.svelte +15 -0
  134. package/dist/components/menu/menu-root.svelte.d.ts +8 -0
  135. package/dist/components/menu/menu.stories.svelte +5 -5
  136. package/dist/components/menu/types.d.ts +0 -7
  137. package/dist/components/popover/bond.svelte.d.ts +18 -8
  138. package/dist/components/popover/bond.svelte.js +76 -40
  139. package/dist/components/popover/motion.d.ts +6 -0
  140. package/dist/components/popover/motion.js +56 -0
  141. package/dist/components/popover/popover-arrow.svelte +111 -111
  142. package/dist/components/popover/popover-content.svelte +137 -175
  143. package/dist/components/popover/popover-indicator.svelte +44 -44
  144. package/dist/components/popover/popover-root.svelte +48 -48
  145. package/dist/components/popover/popover.stories.svelte +37 -49
  146. package/dist/components/popover/types.d.ts +9 -7
  147. package/dist/components/portal/active-portal.svelte +12 -5
  148. package/dist/components/portal/active-portal.svelte.d.ts +2 -9
  149. package/dist/components/portal/portal-root.svelte +1 -8
  150. package/dist/components/portal/portal-root.svelte.d.ts +4 -6
  151. package/dist/components/portal/teleport.svelte +1 -2
  152. package/dist/components/portal/teleport.svelte.d.ts +3 -4
  153. package/dist/components/qr-code/qr-code.stories.svelte +18 -18
  154. package/dist/components/radio/radio-group.stories.svelte +41 -41
  155. package/dist/components/radio/radio.stories.svelte +17 -17
  156. package/dist/components/radio/radio.svelte +109 -109
  157. package/dist/components/radio/types.d.ts +98 -0
  158. package/dist/components/radio/types.js +2 -0
  159. package/dist/components/root/index.d.ts +1 -0
  160. package/dist/components/root/index.js +1 -0
  161. package/dist/components/root/l0-portal.svelte +8 -0
  162. package/dist/components/{radio/types.svelte.d.ts → root/l0-portal.svelte.d.ts} +3 -3
  163. package/dist/components/root/l1-portal.svelte +7 -0
  164. package/dist/components/root/l1-portal.svelte.d.ts +26 -0
  165. package/dist/components/root/root.css +119 -119
  166. package/dist/components/root/root.svelte +26 -44
  167. package/dist/components/root/root.svelte.d.ts +2 -6
  168. package/dist/components/root/toasts-portal.svelte +7 -0
  169. package/dist/components/root/toasts-portal.svelte.d.ts +26 -0
  170. package/dist/components/root/types.d.ts +17 -0
  171. package/dist/components/scrollable/scrollable-root.svelte.d.ts +2 -2
  172. package/dist/components/scrollable/scrollable.stories.svelte +116 -116
  173. package/dist/components/sidebar/index.d.ts +2 -0
  174. package/dist/components/sidebar/index.js +2 -0
  175. package/dist/components/sidebar/motion.svelte.d.ts +11 -0
  176. package/dist/components/sidebar/motion.svelte.js +16 -0
  177. package/dist/components/sidebar/sidebar-content.svelte +40 -50
  178. package/dist/components/sidebar/sidebar-root.svelte +39 -39
  179. package/dist/components/sidebar/sidebar.stories.svelte +43 -43
  180. package/dist/components/sidebar/types.d.ts +2 -12
  181. package/dist/components/tabs/tabs.stories.svelte +56 -56
  182. package/dist/components/textarea/atoms.d.ts +1 -0
  183. package/dist/components/textarea/atoms.js +1 -0
  184. package/dist/components/textarea/textarea-input.svelte +4 -1
  185. package/dist/components/textarea/textarea-root.svelte +2 -2
  186. package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
  187. package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
  188. package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
  189. package/dist/components/tooltip/tooltip.stories.svelte +32 -32
  190. package/dist/components/tree/index.d.ts +1 -0
  191. package/dist/components/tree/index.js +1 -0
  192. package/dist/components/tree/motion.svelte.d.ts +6 -0
  193. package/dist/components/tree/motion.svelte.js +14 -0
  194. package/dist/components/tree/tree-body.svelte +4 -3
  195. package/dist/components/tree/tree.stories.svelte +142 -142
  196. package/dist/context/preset.svelte.d.ts +3 -1
  197. package/dist/icons/icon-copy.svelte +6 -0
  198. package/dist/icons/icon-copy.svelte.d.ts +26 -0
  199. package/dist/utils/dom.svelte.d.ts +2 -0
  200. package/dist/utils/dom.svelte.js +21 -0
  201. package/dist/utils/function.d.ts +1 -1
  202. package/dist/utils/promise.svelte.d.ts +5 -0
  203. package/dist/utils/promise.svelte.js +20 -0
  204. package/package.json +4 -3
  205. package/dist/components/combobox/compobox-item.svelte.d.ts +0 -34
  206. package/dist/components/combobox/compobox.stories.svelte +0 -51
  207. package/dist/components/combobox/compobox.stories.svelte.d.ts +0 -3
  208. package/dist/components/dropdown/item/bond.svelte.d.ts +0 -42
  209. package/dist/components/dropdown/item/bond.svelte.js +0 -99
  210. package/dist/components/menu/menu-item.svelte +0 -51
  211. package/dist/components/menu/menu-item.svelte.d.ts +0 -36
  212. package/dist/components/radio/types.svelte +0 -0
  213. package/llm/composition.md +0 -395
  214. package/llm/crafting.md +0 -838
  215. package/llm/motion.md +0 -970
  216. package/llm/philosophy.md +0 -23
  217. package/llm/preset-variant-integration.md +0 -516
  218. package/llm/preset.md +0 -383
  219. package/llm/styling.md +0 -216
  220. package/llm/usage.md +0 -46
  221. package/llm/variants.md +0 -1259
@@ -1,175 +1,137 @@
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 { DURATION } from '../../shared';
7
- import { PopoverBond } from './bond.svelte';
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
- const openAsNumber = $derived(+isOpen);
63
- const deltaArrow = $derived(position?.middlewareData?.arrow ? 1 : 0);
64
-
65
- let isInitialized = false;
66
-
67
- function _containerInitial(this: typeof bond.state, node: Element) {
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 deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
85
- const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
86
- const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
87
-
88
- const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
89
- const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
90
-
91
- node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
92
- }
93
-
94
- let isOpened = false;
95
-
96
- function _animate(this: typeof bond.state, node: Element) {
97
- const isOpen = this.isOpen;
98
-
99
- const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
100
- const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
101
-
102
- const getTransformOrigin = () => {
103
- switch (placement) {
104
- case 'top':
105
- case 'top-start':
106
- case 'top-end':
107
- return 'bottom';
108
- case 'bottom':
109
- case 'bottom-start':
110
- case 'bottom-end':
111
- return 'top';
112
- case 'left':
113
- case 'left-start':
114
- case 'left-end':
115
- return 'right';
116
- case 'right':
117
- case 'right-start':
118
- case 'right-end':
119
- return 'left';
120
- default:
121
- return 'center';
122
- }
123
- };
124
-
125
- const transformOrigin = getTransformOrigin();
126
-
127
- const from = isOpened ? 1 : 0.95;
128
-
129
- motion(
130
- node,
131
- {
132
- opacity: openAsNumber,
133
- y: dy * (!isOpen ? -1 : 0) * (arrowClientHeight + yOffset),
134
- x: dx * (!isOpen ? -1 : 0) * (arrowClientWidth + xOffset),
135
- scaleY: dy ? (isOpen ? [from, 1] : [1, 0.8]) : undefined,
136
- scaleX: dx ? (isOpen ? [from, 1] : [1, 0.8]) : undefined,
137
- transformOrigin
138
- },
139
- { duration: DURATION.fast / 1000 }
140
- );
141
-
142
- isOpened = isOpen;
143
- }
144
- </script>
145
-
146
- <Teleport
147
- portal={portalId ?? 'root.l0'}
148
- as="div"
149
- class={[
150
- 'pointer-events-auto absolute top-0 left-0 h-min w-fit',
151
- !isOpen && 'pointer-events-none'
152
- ]}
153
- initial={_containerInitial?.bind(bond.state)}
154
- animate={_containerAnimate?.bind(bond.state)}
155
- {...bond.content({ onchange: _containerInitial })}
156
- >
157
- <HtmlAtom
158
- {bond}
159
- preset="popover.content"
160
- class={[
161
- 'popover-content bg-popover text-popover-foreground border-border rounded-md border p-2 opacity-0 shadow-lg',
162
- '$preset',
163
- klass
164
- ]}
165
- enter={enter?.bind(bond.state)}
166
- exit={exit?.bind(bond.state)}
167
- initial={initial?.bind(bond.state)}
168
- animate={animate?.bind(bond.state)}
169
- onmount={onmount?.bind(bond.state)}
170
- ondestroy={ondestroy?.bind(bond.state)}
171
- {...restProps}
172
- >
173
- {@render children?.({ popover: bond })}
174
- </HtmlAtom>
175
- </Teleport>
1
+ <script lang="ts" generics="E extends HtmlElementTagName, B extends Base = Base">
2
+ import { PortalBond, PortalsBond, Teleport } from '../portal';
3
+ import { HtmlAtom, type Base } from '../atom';
4
+ import type { HtmlElementTagName, HtmlElementType } from '../element';
5
+ import { PopoverBond } from './bond.svelte';
6
+ import type { AnimateParams, PopoverContentProps } from './types';
7
+ import { animatePopoverContent } from './motion';
8
+
9
+ type Element = HtmlElementType<E>;
10
+
11
+ const bond = PopoverBond.get();
12
+ const activePortalBond = (() => {
13
+ const key = bond.state.props.portal;
14
+ if (key instanceof PortalBond) {
15
+ return key;
16
+ }
17
+
18
+ let portal: PortalBond | undefined | null = undefined;
19
+
20
+ if (typeof key === 'string') {
21
+ portal = PortalsBond.get()?.state.get(key);
22
+ console.error('portal was not found');
23
+ }
24
+
25
+ return portal ?? PortalBond.get();
26
+ })();
27
+
28
+ if (!bond) {
29
+ throw new Error('<PopoverOverlay /> must be used within a <Popover />');
30
+ }
31
+
32
+ let {
33
+ class: klass = '',
34
+ children = undefined,
35
+ onmount = undefined,
36
+ ondestroy = undefined,
37
+ animate = animatePopoverContent(),
38
+ enter = undefined,
39
+ exit = undefined,
40
+ initial = undefined,
41
+ ...restProps
42
+ }: PopoverContentProps<E, B> = $props();
43
+
44
+ const isOpen = $derived(bond.state.isOpen && !!bond.elements.trigger);
45
+ const portalId = $derived(activePortalBond?.id);
46
+
47
+ let isInitialized = false;
48
+
49
+ function _containerInitial(this: typeof bond.state, node: Element) {
50
+ const position = bond.position;
51
+ const placement = position?.placement;
52
+
53
+ const x = position?.x ?? 0;
54
+ const y = position?.y ?? 0;
55
+
56
+ const dy = placement?.startsWith('top') ? -1 : placement?.startsWith('bottom') ? 1 : 0;
57
+ const dx = placement?.startsWith('left') ? -1 : placement?.startsWith('right') ? 1 : 0;
58
+
59
+ const offset = bond.state.props.offset;
60
+
61
+ const xOffset = dx * offset;
62
+ const yOffset = dy * offset;
63
+
64
+ const openAsNumber = +isOpen;
65
+ const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
66
+
67
+ const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
68
+ const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
69
+
70
+ const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
71
+ const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
72
+
73
+ node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
74
+
75
+ isInitialized = true;
76
+ }
77
+
78
+ function _containerAnimate(this: typeof bond.state, node: Element, _?: AnimateParams) {
79
+ if (!isInitialized) {
80
+ return;
81
+ }
82
+
83
+ const position = bond.position;
84
+ const placement = position?.placement;
85
+
86
+ const x = position?.x ?? 0;
87
+ const y = position?.y ?? 0;
88
+
89
+ const dy = placement?.startsWith('top') ? -1 : placement?.startsWith('bottom') ? 1 : 0;
90
+ const dx = placement?.startsWith('left') ? -1 : placement?.startsWith('right') ? 1 : 0;
91
+
92
+ const offset = bond.state.props.offset;
93
+
94
+ const xOffset = dx * offset;
95
+ const yOffset = dy * offset;
96
+
97
+ const openAsNumber = +isOpen;
98
+ const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
99
+
100
+ const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
101
+ const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
102
+
103
+ const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
104
+ const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
105
+
106
+ node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
107
+ }
108
+ </script>
109
+
110
+ <Teleport
111
+ portal={portalId ?? 'root.l0'}
112
+ as="div"
113
+ class="absolute top-0 left-0 h-min w-fit outline-none"
114
+ initial={_containerInitial?.bind(bond.state)}
115
+ animate={_containerAnimate?.bind(bond.state)}
116
+ {...bond.content({ onchange: _containerInitial })}
117
+ >
118
+ <HtmlAtom
119
+ {bond}
120
+ preset="popover.content"
121
+ class={[
122
+ 'popover-content bg-popover text-popover-foreground border-border rounded-md border p-2 opacity-0 shadow-lg outline-none',
123
+ isOpen && 'pointer-events-auto',
124
+ '$preset',
125
+ klass
126
+ ]}
127
+ enter={enter?.bind(bond.state)}
128
+ exit={exit?.bind(bond.state)}
129
+ initial={initial?.bind(bond.state)}
130
+ animate={animate?.bind(bond.state)}
131
+ onmount={onmount?.bind(bond.state)}
132
+ ondestroy={ondestroy?.bind(bond.state)}
133
+ {...restProps}
134
+ >
135
+ {@render children?.({ popover: bond })}
136
+ </HtmlAtom>
137
+ </Teleport>
@@ -1,44 +1,44 @@
1
- <script lang="ts">
2
- import { animate as motion } from 'motion';
3
- import { Icon } from '../icon';
4
- import IconArrowDown from '../../icons/icon-arrow-down.svelte';
5
- import { HtmlAtom } from '../atom';
6
- import { PopoverBond } from './bond.svelte';
7
-
8
- const bond = PopoverBond.get();
9
-
10
- let {
11
- class: klass = '',
12
- children = undefined,
13
- onmount = undefined,
14
- ondestroy = undefined,
15
- animate = undefined,
16
- enter = undefined,
17
- exit = undefined,
18
- initial = undefined
19
- } = $props();
20
-
21
- const isOpen = $derived(bond?.state.props.open ?? false);
22
- </script>
23
-
24
- <HtmlAtom
25
- {bond}
26
- preset="popover.indicator"
27
- class={['border-border flex h-5 items-center justify-center', '$preset', klass]}
28
- onmount={onmount?.bind(bond.state)}
29
- ondestroy={ondestroy?.bind(bond.state)}
30
- animate={animate?.bind(bond.state)}
31
- enter={enter?.bind(bond.state)}
32
- exit={exit?.bind(bond.state)}
33
- initial={initial?.bind(bond.state)}
34
- >
35
- {#if children}
36
- {@render children?.({ popover: bond })}
37
- {:else}
38
- <Icon
39
- class="h-full"
40
- src={IconArrowDown}
41
- animate={(node) => motion(node, { rotate: 180 * +isOpen }, { duration: 0.2 })}
42
- />
43
- {/if}
44
- </HtmlAtom>
1
+ <script lang="ts">
2
+ import { animate as motion } from 'motion';
3
+ import { Icon } from '../icon';
4
+ import IconArrowDown from '../../icons/icon-arrow-down.svelte';
5
+ import { HtmlAtom } from '../atom';
6
+ import { PopoverBond } from './bond.svelte';
7
+
8
+ const bond = PopoverBond.get();
9
+
10
+ let {
11
+ class: klass = '',
12
+ children = undefined,
13
+ onmount = undefined,
14
+ ondestroy = undefined,
15
+ animate = undefined,
16
+ enter = undefined,
17
+ exit = undefined,
18
+ initial = undefined
19
+ } = $props();
20
+
21
+ const isOpen = $derived(bond?.state.props.open ?? false);
22
+ </script>
23
+
24
+ <HtmlAtom
25
+ {bond}
26
+ preset="popover.indicator"
27
+ class={['border-border flex h-5 items-center justify-center', '$preset', klass]}
28
+ onmount={onmount?.bind(bond.state)}
29
+ ondestroy={ondestroy?.bind(bond.state)}
30
+ animate={animate?.bind(bond.state)}
31
+ enter={enter?.bind(bond.state)}
32
+ exit={exit?.bind(bond.state)}
33
+ initial={initial?.bind(bond.state)}
34
+ >
35
+ {#if children}
36
+ {@render children?.({ popover: bond })}
37
+ {:else}
38
+ <Icon
39
+ class="h-full"
40
+ src={IconArrowDown}
41
+ animate={(node) => motion(node, { rotate: 180 * +isOpen }, { duration: 0.2 })}
42
+ />
43
+ {/if}
44
+ </HtmlAtom>
@@ -1,48 +1,48 @@
1
- <script lang="ts">
2
- import { PopoverState, PopoverBond, type PopoverStateProps } from './bond.svelte';
3
- import { defineProperty, defineState } from '../../utils';
4
- import type { PopoverRootProps } from './types';
5
-
6
- let {
7
- open = $bindable(false),
8
- disabled = false,
9
- placements = ['bottom-start', 'bottom-end', 'top-start', 'top-end'],
10
- placement = 'bottom-start',
11
- offset = 1,
12
- portal = undefined,
13
- extend = {},
14
- factory = _factory,
15
- children = undefined
16
- }: PopoverRootProps = $props();
17
-
18
- const bondProps = defineState<PopoverStateProps>([
19
- defineProperty(
20
- 'open',
21
- () => open,
22
- (v) => {
23
- open = v;
24
- }
25
- ),
26
- defineProperty('disabled', () => disabled),
27
- defineProperty('placement', () => placement),
28
- defineProperty('offset', () => offset),
29
- defineProperty('placements', () => placements ?? []),
30
- defineProperty('portal', () => portal),
31
- defineProperty('extend', () => extend)
32
- ]);
33
-
34
- const bond = factory(bondProps).share();
35
-
36
- function _factory(props: typeof bondProps) {
37
- const popoverState = new PopoverState(() => props);
38
- const popoverBond = new PopoverBond(popoverState);
39
-
40
- return popoverBond;
41
- }
42
-
43
- export function getBond() {
44
- return bond;
45
- }
46
- </script>
47
-
48
- {@render children?.({ popover: bond })}
1
+ <script lang="ts">
2
+ import { PopoverState, PopoverBond, type PopoverStateProps } from './bond.svelte';
3
+ import { defineProperty, defineState } from '../../utils';
4
+ import type { PopoverRootProps } from './types';
5
+
6
+ let {
7
+ open = $bindable(false),
8
+ disabled = false,
9
+ placements = ['bottom-start', 'bottom-end', 'top-start', 'top-end'],
10
+ placement = 'bottom-start',
11
+ offset = 1,
12
+ portal = undefined,
13
+ extend = {},
14
+ factory = _factory,
15
+ children = undefined
16
+ }: PopoverRootProps = $props();
17
+
18
+ const bondProps = defineState<PopoverStateProps>([
19
+ defineProperty(
20
+ 'open',
21
+ () => open,
22
+ (v) => {
23
+ open = v;
24
+ }
25
+ ),
26
+ defineProperty('disabled', () => disabled),
27
+ defineProperty('placement', () => placement),
28
+ defineProperty('offset', () => offset),
29
+ defineProperty('placements', () => placements ?? []),
30
+ defineProperty('portal', () => portal),
31
+ defineProperty('extend', () => extend)
32
+ ]);
33
+
34
+ const bond = factory(bondProps).share();
35
+
36
+ function _factory(props: typeof bondProps) {
37
+ const popoverState = new PopoverState(() => props);
38
+ const popoverBond = new PopoverBond(popoverState);
39
+
40
+ return popoverBond;
41
+ }
42
+
43
+ export function getBond() {
44
+ return bond;
45
+ }
46
+ </script>
47
+
48
+ {@render children?.({ popover: bond })}
@@ -1,49 +1,37 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { Popover as Popover_ } from '.';
4
- import { clickoutPopover } from './attachments.svelte';
5
- import { Button } from '../button';
6
-
7
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
8
- const { Story } = defineMeta({
9
- title: 'Atoms/Popover',
10
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
11
-
12
- parameters: {
13
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
14
- layout: 'fullscreen'
15
- },
16
- args: {}
17
- });
18
- </script>
19
-
20
- <script lang="ts">
21
- let open = $state(false);
22
- </script>
23
-
24
- <Story name="Popover" args={{}}>
25
- {#snippet children(args)}
26
- <Popover_.Root bind:open offset={0} {...args}>
27
- {#snippet children({ popover })}
28
- <!-- {#if dev}
29
- <RenderScan duration={400} />
30
- {/if} -->
31
-
32
- <Popover_.Trigger base={Button} class="items-center gap-4">
33
- <div>Open Popover</div>
34
- <Popover_.Indicator />
35
- </Popover_.Trigger>
36
-
37
- <Popover_.Content
38
- {@attach clickoutPopover((ev, atom) => {
39
- atom.state.close();
40
- })}
41
- class="bg-card"
42
- >
43
- <div>Hello World !</div>
44
- <Popover_.Arrow />
45
- </Popover_.Content>
46
- {/snippet}
47
- </Popover_.Root>
48
- {/snippet}
49
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { Popover as Popover_ } from '.';
4
+ import { Button } from '../button';
5
+
6
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
7
+ const { Story } = defineMeta({
8
+ title: 'Atoms/Popover',
9
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
10
+
11
+ parameters: {
12
+ // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
13
+ layout: 'fullscreen'
14
+ },
15
+ args: {}
16
+ });
17
+ </script>
18
+
19
+ <script lang="ts">
20
+ let open = $state(false);
21
+ </script>
22
+
23
+ <Story name="Popover" args={{}}>
24
+ {#snippet children(args)}
25
+ <Popover_.Root bind:open offset={0} {...args}>
26
+ <Popover_.Trigger base={Button} class="items-center gap-4">
27
+ <div>Open Popover</div>
28
+ <Popover_.Indicator />
29
+ </Popover_.Trigger>
30
+
31
+ <Popover_.Content class="bg-card" autoClose>
32
+ <div>Hello World !</div>
33
+ <Popover_.Arrow />
34
+ </Popover_.Content>
35
+ </Popover_.Root>
36
+ {/snippet}
37
+ </Story>
@@ -1,7 +1,6 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { Placement } from '@floating-ui/dom';
3
3
  import type { Factory } from '../../types';
4
- import type { Override } from '../../types';
5
4
  import type { PopoverBond } from './bond.svelte';
6
5
  import type { Base, HtmlAtomProps } from '../atom';
7
6
  import type { HtmlElementTagName } from '../element';
@@ -16,6 +15,11 @@ export interface PopoverRootExtendProps {
16
15
  */
17
16
  export interface PopoverContentExtendProps {
18
17
  }
18
+ /**
19
+ * Extend this interface to add custom popover indicator properties in your application.
20
+ */
21
+ export interface PopoverIndicatorExtendProps {
22
+ }
19
23
  /**
20
24
  * Extend this interface to add custom popover arrow properties in your application.
21
25
  */
@@ -46,15 +50,13 @@ export interface AnimateParams {
46
50
  yOffset: number;
47
51
  open: boolean;
48
52
  }
49
- export interface PopoverContentProps<T extends HtmlElementTagName, B extends Base = Base> extends Override<HtmlAtomProps<T, B>, {
50
- children?: Snippet<[{
51
- popover?: PopoverBond;
52
- }]>;
53
- }>, PopoverContentExtendProps {
53
+ export interface PopoverContentProps<T extends HtmlElementTagName, B extends Base = Base> extends HtmlAtomProps<T, B>, PopoverContentExtendProps {
54
+ }
55
+ export interface PopoverIndicatorProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends HtmlAtomProps<E, B>, PopoverIndicatorExtendProps {
54
56
  }
55
57
  export interface PopoverArrowProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends HtmlAtomProps<E, B>, PopoverArrowExtendProps {
56
58
  }
57
- export interface PopoverTriggerProps<T extends keyof HTMLElementTagNameMap, B extends Base = Base> extends Omit<HtmlAtomProps<T, B>, 'children'>, PopoverTriggerExtendProps {
59
+ export interface PopoverTriggerProps<T extends keyof HTMLElementTagNameMap, B extends Base = Base> extends HtmlAtomProps<T, B>, PopoverTriggerExtendProps {
58
60
  children?: Snippet<[{
59
61
  popover?: PopoverBond;
60
62
  }]>;
@@ -1,22 +1,29 @@
1
- <script>
1
+ <script lang="ts">
2
+ import type { PortalBond } from './bond.svelte';
2
3
  import { PortalsBond } from './portals/bond.svelte';
3
4
 
4
5
  let { portal, children = undefined } = $props();
5
6
 
6
7
  const portalsBond = PortalsBond.get();
7
- const activePortal = (() => {
8
+ const activePortal = $derived.by(() => {
8
9
  if (typeof portal === 'string') {
9
10
  return portalsBond?.state?.get(portal) ?? undefined;
10
11
  }
11
12
 
12
- return portal;
13
- })()?.share();
13
+ return portal as PortalBond;
14
+ });
14
15
 
15
16
  if (!portalsBond) {
16
17
  throw new Error('Portals bond is not found');
17
18
  }
19
+
20
+ function proxy(...args: any[]) {
21
+ activePortal?.share();
22
+
23
+ return children?.(...args);
24
+ }
18
25
  </script>
19
26
 
20
27
  {#if activePortal}
21
- {@render children?.()}
28
+ {@render proxy?.()}
22
29
  {/if}