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

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 (147) hide show
  1. package/README.md +853 -852
  2. package/dist/components/accordion/accordion-root.svelte +7 -3
  3. package/dist/components/accordion/accordion.stories.svelte +7 -82
  4. package/dist/components/accordion/item/accordion-item-body.svelte +44 -42
  5. package/dist/components/accordion/item/accordion-item-header.svelte +51 -50
  6. package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -50
  7. package/dist/components/accordion/item/accordion-item-root.svelte +66 -65
  8. package/dist/components/accordion/item/bond.svelte.d.ts +2 -0
  9. package/dist/components/accordion/item/index.d.ts +3 -0
  10. package/dist/components/accordion/item/index.js +3 -0
  11. package/dist/components/accordion/item/motion.svelte.d.ts +15 -0
  12. package/dist/components/accordion/item/motion.svelte.js +30 -0
  13. package/dist/components/accordion/item/types.d.ts +7 -24
  14. package/dist/components/alert/alert-close-button.svelte +66 -70
  15. package/dist/components/alert/alert-description.svelte +42 -42
  16. package/dist/components/alert/alert-description.svelte.d.ts +3 -6
  17. package/dist/components/alert/alert-root.svelte +68 -103
  18. package/dist/components/alert/alert-root.svelte.d.ts +2 -2
  19. package/dist/components/alert/alert.stories.svelte +400 -400
  20. package/dist/components/alert/bond.svelte.d.ts +0 -13
  21. package/dist/components/alert/bond.svelte.js +0 -32
  22. package/dist/components/alert/types.d.ts +8 -32
  23. package/dist/components/atom/html-atom.svelte +261 -261
  24. package/dist/components/avatar/avatar.stories.svelte +22 -22
  25. package/dist/components/badge/badge.stories.svelte +12 -12
  26. package/dist/components/badge/badge.svelte +19 -19
  27. package/dist/components/breadcrumb/breadcrumb.stories.svelte +5 -5
  28. package/dist/components/button/button.stories.svelte +27 -27
  29. package/dist/components/calendar/calendar-day.svelte +101 -96
  30. package/dist/components/calendar/calendar.stories.svelte +26 -26
  31. package/dist/components/card/card-body.svelte +39 -39
  32. package/dist/components/card/card-footer.svelte +41 -41
  33. package/dist/components/card/card-root.svelte +91 -91
  34. package/dist/components/card/card.stories.svelte +133 -133
  35. package/dist/components/checkbox/checkbox.stories.svelte +22 -22
  36. package/dist/components/checkbox/checkbox.svelte +6 -2
  37. package/dist/components/collapsible/collapsible.stories.svelte +172 -172
  38. package/dist/components/combobox/atoms.d.ts +1 -1
  39. package/dist/components/combobox/atoms.js +1 -1
  40. package/dist/components/combobox/combobox-root.svelte +65 -65
  41. package/dist/components/combobox/compobox.stories.svelte +51 -51
  42. package/dist/components/combobox/index.d.ts +1 -0
  43. package/dist/components/container/container.stories.svelte +20 -20
  44. package/dist/components/container/container.svelte.d.ts +1 -1
  45. package/dist/components/datagrid/datagrid.stories.svelte +72 -72
  46. package/dist/components/datagrid/tr/bond.svelte.d.ts +4 -2
  47. package/dist/components/datagrid/tr/bond.svelte.js +9 -7
  48. package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -88
  49. package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
  50. package/dist/components/date-picker/date-picker-root.svelte +95 -95
  51. package/dist/components/date-picker/date-picker.stories.svelte +35 -35
  52. package/dist/components/dialog/bond.svelte.d.ts +13 -3
  53. package/dist/components/dialog/bond.svelte.js +66 -5
  54. package/dist/components/dialog/dialog-content.svelte +44 -62
  55. package/dist/components/dialog/dialog-root.svelte +91 -110
  56. package/dist/components/dialog/dialog.stories.svelte +64 -64
  57. package/dist/components/dialog/motion.svelte.d.ts +13 -0
  58. package/dist/components/dialog/motion.svelte.js +44 -0
  59. package/dist/components/drawer/attachments.svelte.d.ts +1 -1
  60. package/dist/components/drawer/attachments.svelte.js +1 -3
  61. package/dist/components/drawer/bond.svelte.d.ts +24 -5
  62. package/dist/components/drawer/bond.svelte.js +77 -11
  63. package/dist/components/drawer/drawer-content.svelte +6 -14
  64. package/dist/components/drawer/drawer.stories.svelte +27 -95
  65. package/dist/components/drawer/index.d.ts +2 -0
  66. package/dist/components/drawer/index.js +2 -0
  67. package/dist/components/drawer/motion.d.ts +15 -0
  68. package/dist/components/drawer/motion.js +28 -0
  69. package/dist/components/dropdown/atoms.d.ts +1 -1
  70. package/dist/components/dropdown/atoms.js +1 -1
  71. package/dist/components/dropdown/bond.svelte.d.ts +5 -1
  72. package/dist/components/dropdown/dropdown-root.svelte +59 -59
  73. package/dist/components/dropdown/dropdown.stories.svelte +80 -80
  74. package/dist/components/dropdown/index.d.ts +1 -0
  75. package/dist/components/form/form.stories.svelte +96 -96
  76. package/dist/components/image/image.stories.svelte +20 -20
  77. package/dist/components/input/input.stories.svelte +35 -35
  78. package/dist/components/label/label.stories.svelte +15 -15
  79. package/dist/components/lazy/lazy.stories.svelte +28 -28
  80. package/dist/components/link/link.stories.svelte +15 -15
  81. package/dist/components/list/list-item.svelte +20 -20
  82. package/dist/components/menu/atoms.d.ts +1 -0
  83. package/dist/components/menu/atoms.js +1 -0
  84. package/dist/components/menu/index.d.ts +2 -1
  85. package/dist/components/menu/index.js +1 -1
  86. package/dist/components/menu/menu-item.svelte +69 -51
  87. package/dist/components/menu/menu-item.svelte.d.ts +1 -0
  88. package/dist/components/menu/menu.stories.svelte +33 -33
  89. package/dist/components/popover/bond.svelte.d.ts +20 -7
  90. package/dist/components/popover/bond.svelte.js +80 -27
  91. package/dist/components/popover/motion.d.ts +6 -0
  92. package/dist/components/popover/motion.js +56 -0
  93. package/dist/components/popover/popover-arrow.svelte +111 -111
  94. package/dist/components/popover/popover-content.svelte +34 -72
  95. package/dist/components/popover/popover-indicator.svelte +44 -44
  96. package/dist/components/popover/popover-root.svelte +48 -48
  97. package/dist/components/popover/popover.stories.svelte +3 -3
  98. package/dist/components/popover/types.d.ts +9 -7
  99. package/dist/components/portal/active-portal.svelte +29 -22
  100. package/dist/components/portal/active-portal.svelte.d.ts +2 -9
  101. package/dist/components/portal/portal-root.svelte +76 -83
  102. package/dist/components/portal/portal-root.svelte.d.ts +4 -6
  103. package/dist/components/portal/teleport.svelte +49 -50
  104. package/dist/components/portal/teleport.svelte.d.ts +3 -4
  105. package/dist/components/qr-code/qr-code.stories.svelte +18 -18
  106. package/dist/components/radio/radio-group.stories.svelte +41 -41
  107. package/dist/components/radio/radio.stories.svelte +17 -17
  108. package/dist/components/radio/radio.svelte +1 -1
  109. package/dist/components/radio/types.d.ts +98 -0
  110. package/dist/components/radio/types.js +2 -0
  111. package/dist/components/root/root.svelte +13 -30
  112. package/dist/components/root/root.svelte.d.ts +1 -1
  113. package/dist/components/scrollable/scrollable-root.svelte.d.ts +2 -2
  114. package/dist/components/scrollable/scrollable.stories.svelte +116 -116
  115. package/dist/components/sidebar/index.d.ts +2 -0
  116. package/dist/components/sidebar/index.js +2 -0
  117. package/dist/components/sidebar/motion.svelte.d.ts +11 -0
  118. package/dist/components/sidebar/motion.svelte.js +16 -0
  119. package/dist/components/sidebar/sidebar-content.svelte +3 -13
  120. package/dist/components/sidebar/sidebar-root.svelte +39 -39
  121. package/dist/components/sidebar/sidebar.stories.svelte +43 -43
  122. package/dist/components/sidebar/types.d.ts +2 -12
  123. package/dist/components/tabs/tabs.stories.svelte +56 -56
  124. package/dist/components/textarea/atoms.d.ts +1 -0
  125. package/dist/components/textarea/atoms.js +1 -0
  126. package/dist/components/textarea/textarea-input.svelte +9 -6
  127. package/dist/components/textarea/textarea-root.svelte +9 -9
  128. package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
  129. package/dist/components/tooltip/tooltip-trigger.svelte +2 -2
  130. package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
  131. package/dist/components/tooltip/tooltip.stories.svelte +32 -32
  132. package/dist/components/tree/tree.stories.svelte +142 -142
  133. package/dist/icons/icon-copy.svelte +6 -0
  134. package/dist/{components/radio/types.svelte.d.ts → icons/icon-copy.svelte.d.ts} +3 -3
  135. package/dist/utils/markdown-to-llm.d.ts +28 -0
  136. package/dist/utils/markdown-to-llm.js +76 -0
  137. package/package.json +1 -2
  138. package/dist/components/radio/types.svelte +0 -0
  139. package/llm/composition.md +0 -395
  140. package/llm/crafting.md +0 -838
  141. package/llm/motion.md +0 -970
  142. package/llm/philosophy.md +0 -23
  143. package/llm/preset-variant-integration.md +0 -516
  144. package/llm/preset.md +0 -383
  145. package/llm/styling.md +0 -216
  146. package/llm/usage.md +0 -46
  147. package/llm/variants.md +0 -1259
@@ -1,11 +1,10 @@
1
1
  <script lang="ts" generics="E extends HtmlElementTagName, B extends Base = Base">
2
- import { animate as motion } from 'motion';
3
2
  import { PortalBond, PortalsBond, Teleport } from '../portal';
4
3
  import { HtmlAtom, type Base } from '../atom';
5
4
  import type { HtmlElementTagName, HtmlElementType } from '../element';
6
- import { DURATION } from '../../shared';
7
5
  import { PopoverBond } from './bond.svelte';
8
6
  import type { AnimateParams, PopoverContentProps } from './types';
7
+ import { animatePopoverContent } from './motion';
9
8
 
10
9
  type Element = HtmlElementType<E>;
11
10
 
@@ -35,7 +34,7 @@
35
34
  children = undefined,
36
35
  onmount = undefined,
37
36
  ondestroy = undefined,
38
- animate = _animate,
37
+ animate = animatePopoverContent(),
39
38
  enter = undefined,
40
39
  exit = undefined,
41
40
  initial = undefined,
@@ -45,26 +44,26 @@
45
44
  const isOpen = $derived(bond.state.isOpen && !!bond.elements.trigger);
46
45
  const portalId = $derived(activePortalBond?.id);
47
46
 
48
- const position = $derived(bond.position);
49
- const placement = $derived(position?.placement);
47
+ let isInitialized = false;
50
48
 
51
- const x = $derived(position?.x ?? 0);
52
- const y = $derived(position?.y ?? 0);
49
+ function _containerInitial(this: typeof bond.state, node: Element) {
50
+ const position = bond.position;
51
+ const placement = position?.placement;
53
52
 
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);
53
+ const x = position?.x ?? 0;
54
+ const y = position?.y ?? 0;
56
55
 
57
- const offset = $derived(bond.state.props.offset);
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
58
 
59
- const xOffset = $derived(dx * offset);
60
- const yOffset = $derived(dy * offset);
59
+ const offset = bond.state.props.offset;
61
60
 
62
- const openAsNumber = $derived(+isOpen);
63
- const deltaArrow = $derived(position?.middlewareData?.arrow ? 1 : 0);
61
+ const xOffset = dx * offset;
62
+ const yOffset = dy * offset;
64
63
 
65
- let isInitialized = false;
64
+ const openAsNumber = +isOpen;
65
+ const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
66
66
 
67
- function _containerInitial(this: typeof bond.state, node: Element) {
68
67
  const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
69
68
  const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
70
69
 
@@ -81,75 +80,37 @@
81
80
  return;
82
81
  }
83
82
 
84
- const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
85
- const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
86
- const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
83
+ const position = bond.position;
84
+ const placement = position?.placement;
87
85
 
88
- const _x = x + xOffset * openAsNumber + deltaArrow * dx * arrowClientWidth;
89
- const _y = y + yOffset * openAsNumber + deltaArrow * dy * arrowClientHeight;
86
+ const x = position?.x ?? 0;
87
+ const y = position?.y ?? 0;
90
88
 
91
- node.style.transform = `translate3d(${_x}px, ${_y}px, 1px)`;
92
- }
89
+ const dy = placement?.startsWith('top') ? -1 : placement?.startsWith('bottom') ? 1 : 0;
90
+ const dx = placement?.startsWith('left') ? -1 : placement?.startsWith('right') ? 1 : 0;
93
91
 
94
- let isOpened = false;
92
+ const offset = bond.state.props.offset;
95
93
 
96
- function _animate(this: typeof bond.state, node: Element) {
97
- const isOpen = this.isOpen;
94
+ const xOffset = dx * offset;
95
+ const yOffset = dy * offset;
96
+
97
+ const openAsNumber = +isOpen;
98
+ const deltaArrow = position?.middlewareData?.arrow ? 1 : 0;
98
99
 
99
100
  const arrowClientWidth = bond?.elements.arrow?.clientWidth ?? 0;
100
101
  const arrowClientHeight = bond?.elements.arrow?.clientHeight ?? 0;
101
102
 
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;
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)`;
143
107
  }
144
108
  </script>
145
109
 
146
110
  <Teleport
147
111
  portal={portalId ?? 'root.l0'}
148
112
  as="div"
149
- class={[
150
- 'pointer-events-auto absolute top-0 left-0 h-min w-fit',
151
- !isOpen && 'pointer-events-none'
152
- ]}
113
+ class="absolute top-0 left-0 h-min w-fit outline-none"
153
114
  initial={_containerInitial?.bind(bond.state)}
154
115
  animate={_containerAnimate?.bind(bond.state)}
155
116
  {...bond.content({ onchange: _containerInitial })}
@@ -158,7 +119,8 @@
158
119
  {bond}
159
120
  preset="popover.content"
160
121
  class={[
161
- 'popover-content bg-popover text-popover-foreground border-border rounded-md border p-2 opacity-0 shadow-lg',
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',
162
124
  '$preset',
163
125
  klass
164
126
  ]}
@@ -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 })}
@@ -26,8 +26,8 @@
26
26
  <Popover_.Root bind:open offset={0} {...args}>
27
27
  {#snippet children({ popover })}
28
28
  <!-- {#if dev}
29
- <RenderScan duration={400} />
30
- {/if} -->
29
+ <RenderScan duration={400} />
30
+ {/if} -->
31
31
 
32
32
  <Popover_.Trigger base={Button} class="items-center gap-4">
33
33
  <div>Open Popover</div>
@@ -35,7 +35,7 @@
35
35
  </Popover_.Trigger>
36
36
 
37
37
  <Popover_.Content
38
- {@attach clickoutPopover((ev, atom) => {
38
+ {@attach clickoutPopover((_, atom) => {
39
39
  atom.state.close();
40
40
  })}
41
41
  class="bg-card"
@@ -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>
2
- import { PortalsBond } from './portals/bond.svelte';
3
-
4
- let { portal, children = undefined } = $props();
5
-
6
- const portalsBond = PortalsBond.get();
7
- const activePortal = (() => {
8
- if (typeof portal === 'string') {
9
- return portalsBond?.state?.get(portal) ?? undefined;
10
- }
11
-
12
- return portal;
13
- })()?.share();
14
-
15
- if (!portalsBond) {
16
- throw new Error('Portals bond is not found');
17
- }
18
- </script>
19
-
20
- {#if activePortal}
21
- {@render children?.()}
22
- {/if}
1
+ <script lang="ts">
2
+ import type { PortalBond } from './bond.svelte';
3
+ import { PortalsBond } from './portals/bond.svelte';
4
+
5
+ let { portal, children = undefined } = $props();
6
+
7
+ const portalsBond = PortalsBond.get();
8
+ const activePortal = $derived.by(() => {
9
+ if (typeof portal === 'string') {
10
+ return portalsBond?.state?.get(portal) ?? undefined;
11
+ }
12
+
13
+ return portal as PortalBond;
14
+ });
15
+
16
+ if (!portalsBond) {
17
+ throw new Error('Portals bond is not found');
18
+ }
19
+
20
+ function proxy(...args: any[]) {
21
+ activePortal?.share();
22
+
23
+ return children?.(...args);
24
+ }
25
+ </script>
26
+
27
+ {#if activePortal}
28
+ {@render proxy?.()}
29
+ {/if}
@@ -1,13 +1,6 @@
1
- export default ActivePortal;
2
- type ActivePortal = {
3
- $on?(type: string, callback: (e: any) => void): () => void;
4
- $set?(props: Partial<$$ComponentProps>): void;
5
- };
6
1
  declare const ActivePortal: import("svelte").Component<{
7
2
  portal: any;
8
3
  children?: any;
9
4
  }, {}, "">;
10
- type $$ComponentProps = {
11
- portal: any;
12
- children?: any;
13
- };
5
+ type ActivePortal = ReturnType<typeof ActivePortal>;
6
+ export default ActivePortal;
@@ -1,83 +1,76 @@
1
- <script module lang="ts">
2
- export type { PortalOuterProps } from './types';
3
- </script>
4
-
5
- <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
6
- import type { Snippet } from 'svelte';
7
- import type { HTMLAttributes } from 'svelte/elements';
8
- import type { PortalOuterProps } from './types';
9
- import { PortalsBond, PortalBond, PortalState, type PortalStateProps } from '.';
10
- import { RootBond } from '../root';
11
- import type { RootPortals } from '../root/root.svelte';
12
- import {
13
- HtmlAtom,
14
- type ElementType,
15
- type HtmlAtomProps,
16
- type Base
17
- } from '../atom';
18
- import { defineProperty, defineState } from '../../utils';
19
-
20
- type Element = ElementType<E>;
21
-
22
- let {
23
- class: klass = '',
24
- id,
25
- factory = _factory,
26
- children = undefined,
27
- onmount = undefined,
28
- ondestroy = undefined,
29
- animate = undefined,
30
- enter = undefined,
31
- exit = undefined,
32
- initial = undefined,
33
- ...restProps
34
- }: PortalOuterProps<E, B> & HTMLAttributes<Element> = $props();
35
-
36
- const rootBond = RootBond.get();
37
- const portalsBond = PortalsBond.get();
38
-
39
- const bondProps = defineState<PortalStateProps>([defineProperty('id', () => id)]);
40
- const bond = factory(bondProps).share() as PortalBond;
41
-
42
- portalsBond?.state.set(id, bond);
43
-
44
- $effect(() => {
45
- if (rootBond) {
46
- rootBond.state.setPortal(id, bond);
47
- }
48
-
49
- return () => {
50
- portalsBond?.state.delete(id);
51
- bond.destroy();
52
- };
53
- });
54
-
55
- const rootProps = $derived({
56
- ...bond.root(),
57
- ...restProps
58
- });
59
-
60
- function _factory(props: typeof bondProps) {
61
- const portalState = new PortalState(() => props);
62
- return new PortalBond(portalState);
63
- }
64
-
65
- export function getBond() {
66
- return bond;
67
- }
68
- </script>
69
-
70
- <HtmlAtom
71
- {bond}
72
- preset="portal"
73
- class={['border-border pointer-events-none', '$preset', klass]}
74
- enter={enter?.bind(bond.state)}
75
- exit={exit?.bind(bond.state)}
76
- initial={initial?.bind(bond.state)}
77
- animate={animate?.bind(bond.state)}
78
- onmount={onmount?.bind(bond.state)}
79
- ondestroy={ondestroy?.bind(bond.state)}
80
- {...rootProps}
81
- >
82
- {@render children?.()}
83
- </HtmlAtom>
1
+ <script module lang="ts">
2
+ export type { PortalOuterProps } from './types';
3
+ </script>
4
+
5
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
6
+ import type { HTMLAttributes } from 'svelte/elements';
7
+ import type { PortalOuterProps } from './types';
8
+ import { PortalsBond, PortalBond, PortalState, type PortalStateProps } from '.';
9
+ import { RootBond } from '../root';
10
+ import { HtmlAtom, type ElementType, type Base } from '../atom';
11
+ import { defineProperty, defineState } from '../../utils';
12
+
13
+ type Element = ElementType<E>;
14
+
15
+ let {
16
+ class: klass = '',
17
+ id,
18
+ factory = _factory,
19
+ children = undefined,
20
+ onmount = undefined,
21
+ ondestroy = undefined,
22
+ animate = undefined,
23
+ enter = undefined,
24
+ exit = undefined,
25
+ initial = undefined,
26
+ ...restProps
27
+ }: PortalOuterProps<E, B> & HTMLAttributes<Element> = $props();
28
+
29
+ const rootBond = RootBond.get();
30
+ const portalsBond = PortalsBond.get();
31
+
32
+ const bondProps = defineState<PortalStateProps>([defineProperty('id', () => id)]);
33
+ const bond = factory(bondProps).share() as PortalBond;
34
+
35
+ portalsBond?.state.set(id, bond);
36
+
37
+ $effect(() => {
38
+ if (rootBond) {
39
+ rootBond.state.setPortal(id, bond);
40
+ }
41
+
42
+ return () => {
43
+ portalsBond?.state.delete(id);
44
+ bond.destroy();
45
+ };
46
+ });
47
+
48
+ const rootProps = $derived({
49
+ ...bond.root(),
50
+ ...restProps
51
+ });
52
+
53
+ function _factory(props: typeof bondProps) {
54
+ const portalState = new PortalState(() => props);
55
+ return new PortalBond(portalState);
56
+ }
57
+
58
+ export function getBond() {
59
+ return bond;
60
+ }
61
+ </script>
62
+
63
+ <HtmlAtom
64
+ {bond}
65
+ preset="portal"
66
+ class={['border-border pointer-events-none', '$preset', klass]}
67
+ enter={enter?.bind(bond.state)}
68
+ exit={exit?.bind(bond.state)}
69
+ initial={initial?.bind(bond.state)}
70
+ animate={animate?.bind(bond.state)}
71
+ onmount={onmount?.bind(bond.state)}
72
+ ondestroy={ondestroy?.bind(bond.state)}
73
+ {...rootProps}
74
+ >
75
+ {@render children?.()}
76
+ </HtmlAtom>
@@ -1,13 +1,11 @@
1
1
  export type { PortalOuterProps } from './types';
2
- import type { Snippet } from 'svelte';
3
2
  import type { HTMLAttributes } from 'svelte/elements';
4
3
  import { PortalBond } from '.';
5
- import type { RootPortals } from '../root/root.svelte';
6
- import { type ElementType, type HtmlAtomProps, type Base } from '../atom';
4
+ import { type ElementType, type Base } from '../atom';
7
5
  declare function $$render<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
8
- props: HtmlAtomProps<E, B> & import("./types").PortalOuterExtendProps & {
9
- id: RootPortals | (string & {});
10
- children?: Snippet;
6
+ props: import("../atom").HtmlAtomProps<E, B> & import("./types").PortalOuterExtendProps & {
7
+ id: import("../root/root.svelte").RootPortals | (string & {});
8
+ children?: import("svelte").Snippet;
11
9
  } & HTMLAttributes<ElementType<E>>;
12
10
  exports: {
13
11
  getBond: () => PortalBond;