@rkosafo/cai.components 0.0.75 → 0.0.78

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 (127) hide show
  1. package/README.md +8 -8
  2. package/dist/baseEditor/index.svelte +32 -32
  3. package/dist/builders/filters/FilterBuilder.svelte +641 -641
  4. package/dist/forms/FormCheckbox/FormCheckbox.svelte +53 -53
  5. package/dist/forms/FormClEditor/ClEdito.svelte +68 -68
  6. package/dist/forms/FormDatepicker/FormDatepicker.svelte +159 -159
  7. package/dist/forms/FormFileUpload/FormFileUplad.svelte +134 -134
  8. package/dist/forms/FormInput/FormInput.svelte +87 -87
  9. package/dist/forms/FormRadio/FormRadio.svelte +53 -53
  10. package/dist/forms/FormSelect/FormSelect.svelte +88 -88
  11. package/dist/forms/FormTextarea/FormTextarea.svelte +78 -78
  12. package/dist/forms/button-toggle/ButtonToggle.svelte +119 -0
  13. package/dist/forms/button-toggle/ButtonToggle.svelte.d.ts +139 -0
  14. package/dist/forms/button-toggle/ButtonToggleGroup.svelte +0 -0
  15. package/dist/forms/button-toggle/ButtonToggleGroup.svelte.d.ts +26 -0
  16. package/dist/forms/button-toggle/CheckIcon.svelte +28 -0
  17. package/dist/forms/button-toggle/CheckIcon.svelte.d.ts +4 -0
  18. package/dist/forms/button-toggle/index.d.ts +4 -0
  19. package/dist/forms/button-toggle/index.js +4 -0
  20. package/dist/forms/button-toggle/theme.d.ts +347 -0
  21. package/dist/forms/button-toggle/theme.js +129 -0
  22. package/dist/forms/checkbox/Checkbox.svelte +82 -82
  23. package/dist/forms/checkbox/CheckboxButton.svelte +92 -92
  24. package/dist/forms/datepicker/Datepicker.svelte +707 -707
  25. package/dist/forms/form/Form.svelte +69 -69
  26. package/dist/forms/input/Input.svelte +363 -363
  27. package/dist/forms/label/Label.svelte +38 -38
  28. package/dist/forms/radio/Radio.svelte +48 -48
  29. package/dist/forms/radio/RadioButton.svelte +22 -22
  30. package/dist/forms/select/Select.svelte +56 -56
  31. package/dist/forms/textarea/Textarea.svelte +165 -165
  32. package/dist/forms/toggle/Toggle.svelte +70 -0
  33. package/dist/forms/toggle/Toggle.svelte.d.ts +3 -0
  34. package/dist/forms/toggle/index.d.ts +2 -0
  35. package/dist/forms/toggle/index.js +2 -0
  36. package/dist/forms/toggle/theme.d.ts +280 -0
  37. package/dist/forms/toggle/theme.js +97 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.js +3 -0
  40. package/dist/layout/Chat/CategorySelector.svelte +52 -52
  41. package/dist/layout/Chat/ChatEntry.svelte +246 -246
  42. package/dist/layout/Chat/ChatEntrySkeleton.svelte +81 -81
  43. package/dist/layout/Chat/ChatHeader.svelte +172 -172
  44. package/dist/layout/Chat/ChatInput.svelte +207 -207
  45. package/dist/layout/Chat/DraggableWindow.svelte +230 -230
  46. package/dist/layout/Chat/PreviewPage.svelte +182 -182
  47. package/dist/layout/Chat/RichText.svelte +216 -216
  48. package/dist/layout/ComponentCanvas/Canvas.svelte +40 -40
  49. package/dist/layout/ComponentCanvas/ComponentRenderer.svelte +85 -85
  50. package/dist/layout/TF/Content/Content.svelte +21 -21
  51. package/dist/layout/TF/Header/Header.svelte +166 -166
  52. package/dist/layout/TF/Sidebar/Sidebar.svelte +148 -148
  53. package/dist/layout/TF/Wrapper/Wrapper.svelte +17 -17
  54. package/dist/layout/mailing/MailPaginator.svelte +36 -36
  55. package/dist/layout/mailing/MailSidebar.svelte +39 -39
  56. package/dist/layout/mailing/MailToolBar.svelte +174 -174
  57. package/dist/layout/mailing/MailingContent.svelte +10 -10
  58. package/dist/layout/mailing/MailingHeader.svelte +55 -55
  59. package/dist/layout/mailing/MailingMessageCard.svelte +112 -112
  60. package/dist/layout/mailing/MailingMessageViewer.svelte +87 -87
  61. package/dist/layout/mailing/MailingModule.svelte +448 -448
  62. package/dist/styles/docs.css +615 -615
  63. package/dist/styles/tf-layout.css +185 -185
  64. package/dist/themes/ThemeProvider.svelte +20 -20
  65. package/dist/themes/themes.d.ts +3 -0
  66. package/dist/themes/themes.js +3 -0
  67. package/dist/types/index.d.ts +57 -1
  68. package/dist/typography/heading/Heading.svelte +35 -35
  69. package/dist/ui/accordion/Accordion.svelte +49 -49
  70. package/dist/ui/accordion/AccordionItem.svelte +173 -173
  71. package/dist/ui/alert/Alert.svelte +83 -83
  72. package/dist/ui/alertDialog/AlertDialog.svelte +40 -40
  73. package/dist/ui/avatar/Avatar.svelte +77 -77
  74. package/dist/ui/box/Box.svelte +28 -28
  75. package/dist/ui/breadcrumb/Breadcrumb.svelte +39 -39
  76. package/dist/ui/buttons/ActionButton.svelte +234 -234
  77. package/dist/ui/buttons/Button.svelte +102 -102
  78. package/dist/ui/buttons/GradientButton.svelte +59 -59
  79. package/dist/ui/datatable/Datatable.svelte +525 -525
  80. package/dist/ui/drawer/Drawer.svelte +300 -300
  81. package/dist/ui/dropdown/Dropdown.svelte +36 -36
  82. package/dist/ui/dropdown/DropdownDivider.svelte +11 -11
  83. package/dist/ui/dropdown/DropdownGroup.svelte +14 -14
  84. package/dist/ui/dropdown/DropdownHeader.svelte +14 -14
  85. package/dist/ui/dropdown/DropdownItem.svelte +52 -52
  86. package/dist/ui/footer/Footer.svelte +15 -15
  87. package/dist/ui/footer/FooterBrand.svelte +37 -37
  88. package/dist/ui/footer/FooterCopyright.svelte +45 -45
  89. package/dist/ui/footer/FooterIcon.svelte +22 -22
  90. package/dist/ui/footer/FooterLink.svelte +33 -33
  91. package/dist/ui/footer/FooterLinkGroup.svelte +13 -13
  92. package/dist/ui/icons/IconifyIcon.svelte +7 -7
  93. package/dist/ui/indicator/Indicator.svelte +42 -42
  94. package/dist/ui/modal/Modal.svelte +265 -265
  95. package/dist/ui/modal/theme.d.ts +26 -26
  96. package/dist/ui/modal/theme.js +25 -25
  97. package/dist/ui/notificationList/NotificationList.svelte +123 -123
  98. package/dist/ui/pageLoader/PageLoader.svelte +14 -14
  99. package/dist/ui/paginate/Paginate.svelte +96 -96
  100. package/dist/ui/speedDial/SpeedDial.svelte +77 -0
  101. package/dist/ui/speedDial/SpeedDial.svelte.d.ts +21 -0
  102. package/dist/ui/speedDial/SpeedDialButton.svelte +75 -0
  103. package/dist/ui/speedDial/SpeedDialButton.svelte.d.ts +20 -0
  104. package/dist/ui/speedDial/SpeedDialTrigger.svelte +79 -0
  105. package/dist/ui/speedDial/SpeedDialTrigger.svelte.d.ts +18 -0
  106. package/dist/ui/speedDial/index.d.ts +4 -0
  107. package/dist/ui/speedDial/index.js +4 -0
  108. package/dist/ui/speedDial/theme.d.ts +75 -0
  109. package/dist/ui/speedDial/theme.js +35 -0
  110. package/dist/ui/tab/Tab.svelte +67 -67
  111. package/dist/ui/table/Table.svelte +396 -396
  112. package/dist/ui/tableLoader/TableLoader.svelte +24 -24
  113. package/dist/ui/toast/Toast.svelte +337 -337
  114. package/dist/ui/toast/Toast.svelte.d.ts +10 -10
  115. package/dist/ui/toast/index.d.ts +1 -2
  116. package/dist/ui/toast/index.js +3 -1
  117. package/dist/ui/toolbar/Toolbar.svelte +59 -59
  118. package/dist/ui/toolbar/ToolbarButton.svelte +56 -56
  119. package/dist/ui/toolbar/ToolbarGroup.svelte +43 -43
  120. package/dist/ui/tooltip/Tooltip.svelte +51 -51
  121. package/dist/utils/Popper.svelte +257 -257
  122. package/dist/utils/closeButton/CloseButton.svelte +88 -88
  123. package/dist/utils/index.d.ts +3 -2
  124. package/dist/utils/index.js +13 -3
  125. package/dist/utils/singleSelection.svelte.js +48 -48
  126. package/dist/youtube/index.svelte +12 -12
  127. package/package.json +2 -1
@@ -1,257 +1,257 @@
1
- <script lang="ts">
2
- import type { Coords, Middleware, Placement, Strategy } from '@floating-ui/dom';
3
- import * as dom from '@floating-ui/dom';
4
- // import Arrow from './Arrow.svelte';
5
- import { fade } from 'svelte/transition';
6
- import { sineIn } from 'svelte/easing';
7
- import clsx from 'clsx';
8
- import type { ParamsType, PopperProps, TriggeredToggleEvent } from '../types/index.js';
9
-
10
- let {
11
- triggeredBy,
12
- triggerDelay = 200,
13
- trigger = 'click',
14
- placement = 'top',
15
- offset = 8,
16
- arrow = false,
17
- yOnly = false,
18
- strategy = 'absolute',
19
- reference,
20
- middlewares = [dom.flip(), dom.shift()],
21
- onbeforetoggle: _onbeforetoggle,
22
- ontoggle: _ontoggle,
23
- class: className = '',
24
- arrowClass = '',
25
- isOpen = $bindable(false),
26
- transitionParams,
27
- transition = fade,
28
- children,
29
- ...restProps
30
- }: PopperProps = $props();
31
-
32
- let focusable: boolean = true;
33
- let clickable: boolean = $derived(trigger === 'click');
34
- let hoverable: boolean = $derived(trigger === 'hover');
35
-
36
- let popover: HTMLElement | null = $state(null);
37
- let invoker: HTMLElement | null = null;
38
- let referenceElement: HTMLElement | null = null;
39
- let triggerEls: HTMLElement[] = [];
40
- let arrowParams: { placement: Placement; cords: Partial<Coords>; strategy: Strategy } = $state({
41
- placement,
42
- cords: { x: 0, y: 0 },
43
- strategy
44
- });
45
-
46
- const paramsDefault = { duration: 100, easing: sineIn };
47
- const paramsOptions = $derived(transitionParams ?? paramsDefault);
48
-
49
- const px = (n: number | undefined) => (n ? `${n}px` : '');
50
-
51
- function updatePopoverPosition() {
52
- if (!invoker || !popover) {
53
- return;
54
- }
55
-
56
- const arrowEl: HTMLElement | null = popover.querySelector('.popover-arrow');
57
-
58
- let middleware: Middleware[] = [...middlewares, dom.offset(offset)];
59
- if (arrowEl) middleware.push(dom.arrow({ element: arrowEl }));
60
-
61
- return dom
62
- .computePosition(referenceElement ?? invoker, popover, { placement, middleware, strategy })
63
- .then(({ x, y, middlewareData: { arrow }, placement: pl, strategy }) => {
64
- if (popover) {
65
- Object.assign(popover.style, {
66
- position: strategy,
67
- left: yOnly ? '0' : px(x),
68
- top: px(y)
69
- });
70
-
71
- if (arrow && arrowEl) {
72
- arrowParams = { placement: pl, cords: { x: arrow.x, y: arrow.y }, strategy };
73
- }
74
- }
75
- });
76
- }
77
-
78
- let isTriggered: boolean = false;
79
-
80
- async function open_popover(ev: Event) {
81
- // throttle
82
- isTriggered = true;
83
- await new Promise((resolve) => setTimeout(resolve, triggerDelay));
84
- if (!isTriggered) {
85
- return;
86
- }
87
-
88
- ev.preventDefault();
89
-
90
- if (ev.target !== invoker && triggerEls.includes(ev.target as HTMLElement)) {
91
- invoker = ev.target as HTMLElement;
92
- // if (invoker) invoker.popoverTargetElement = popover;
93
- isOpen = false;
94
- await new Promise((resolve) => setTimeout(resolve, triggerDelay));
95
- }
96
-
97
- if (ev.type === 'mousedown') {
98
- isOpen = !isOpen;
99
- } else {
100
- isOpen = true;
101
- }
102
- }
103
-
104
- async function close_popover(ev: Event) {
105
- // For click triggers, don't close on focusout events from inside the popover
106
- if (trigger === 'click' && ev.type === 'focusout') {
107
- const relatedTarget = (ev as FocusEvent).relatedTarget as HTMLElement;
108
-
109
- // If focus is moving to somewhere inside the popover, don't close
110
- if (popover && relatedTarget && popover.contains(relatedTarget)) {
111
- return;
112
- }
113
-
114
- // If focus is moving to nowhere (like when clicking), don't close for click triggers
115
- if (!relatedTarget) {
116
- return;
117
- }
118
- }
119
-
120
- isTriggered = false;
121
- await new Promise((resolve) => setTimeout(resolve, triggerDelay));
122
- if (isTriggered) {
123
- return;
124
- }
125
-
126
- // if popover has focus don't close when leaving the invoker
127
- if (ev?.type === 'mouseleave' && popover?.contains(popover.ownerDocument.activeElement)) {
128
- return;
129
- }
130
- if (ev?.type === 'focusout' && popover?.contains(popover.ownerDocument.activeElement)) {
131
- return;
132
- }
133
-
134
- isOpen = false;
135
- }
136
-
137
- let autoUpdateDestroy = () => {};
138
-
139
- function on_before_toggle(ev: ToggleEvent) {
140
- if (!invoker || !popover) return;
141
-
142
- (ev as TriggeredToggleEvent).trigger = invoker;
143
- _onbeforetoggle?.(ev as TriggeredToggleEvent);
144
-
145
- // Floating UI instance when it's closed we need to keep a autoUpdate destroy function
146
-
147
- if (ev.newState === 'open') {
148
- autoUpdateDestroy = dom.autoUpdate(
149
- referenceElement ?? invoker,
150
- popover,
151
- updatePopoverPosition
152
- );
153
- popover.ownerDocument.addEventListener('click', closeOnClickOutside);
154
- popover.ownerDocument.addEventListener('keydown', closeOnEscape);
155
- } else {
156
- autoUpdateDestroy();
157
- popover.ownerDocument.removeEventListener('click', closeOnClickOutside);
158
- popover.ownerDocument.removeEventListener('keydown', closeOnEscape);
159
- }
160
- }
161
-
162
- function on_toggle(ev: ToggleEvent) {
163
- if (!invoker) return;
164
-
165
- // Update isOpen value when popover state changes through other means
166
- isOpen = ev.newState === 'open';
167
-
168
- (ev as TriggeredToggleEvent).trigger = invoker;
169
- _ontoggle?.(ev as TriggeredToggleEvent);
170
- }
171
-
172
- function set_triggers(node: HTMLElement) {
173
- const events: [string, any, boolean][] = [
174
- ['focusin', open_popover, focusable],
175
- ['focusout', close_popover, focusable],
176
- ['mousedown', open_popover, clickable],
177
- ['mouseenter', open_popover, hoverable],
178
- ['mouseleave', close_popover, hoverable]
179
- ];
180
-
181
- if (triggeredBy)
182
- triggerEls = [...node.ownerDocument.querySelectorAll<HTMLElement>(triggeredBy)];
183
- else if (node.previousElementSibling) triggerEls = [node.previousElementSibling as HTMLElement];
184
- else if (node.parentElement) triggerEls = [node.parentElement];
185
-
186
- if (!triggerEls.length) {
187
- console.error('No triggers found.', triggeredBy);
188
- return;
189
- }
190
-
191
- if (reference) referenceElement = node.ownerDocument.querySelector<HTMLElement>(reference);
192
- invoker = triggerEls[0];
193
-
194
- triggerEls.forEach((element: HTMLElement) => {
195
- if (element.tabIndex < 0) element.tabIndex = 0; // trigger must be focusable
196
- for (const [name, handler, cond] of events) if (cond) element.addEventListener(name, handler);
197
- });
198
-
199
- $effect(() => {
200
- return () => {
201
- triggerEls.forEach((element: HTMLElement) => {
202
- for (const [name, handler, cond] of events)
203
- if (cond) element.removeEventListener(name, handler);
204
- });
205
- };
206
- });
207
- }
208
-
209
- function closeOnEscape(event: KeyboardEvent) {
210
- if (event.key === 'Escape') {
211
- isOpen = false;
212
- }
213
- }
214
-
215
- function closeOnClickOutside(event: MouseEvent) {
216
- if (!popover) {
217
- return;
218
- }
219
-
220
- const clickPath = event.composedPath();
221
-
222
- const isClickInsidePopover = clickPath.includes(popover);
223
- const isClickOnTrigger = triggerEls.some((el) => clickPath.includes(el));
224
-
225
- // Only close if click is outside both popover and trigger elements
226
- if (!isClickInsidePopover && !isClickOnTrigger) {
227
- close_popover(event);
228
- isOpen = false;
229
- }
230
- }
231
- </script>
232
-
233
- <div use:set_triggers hidden></div>
234
-
235
- {#if isOpen}
236
- <div
237
- popover="manual"
238
- role="tooltip"
239
- bind:this={popover}
240
- class:overflow-visible={true}
241
- onfocusout={close_popover}
242
- onmouseleave={hoverable ? close_popover : undefined}
243
- onmouseenter={hoverable ? open_popover : undefined}
244
- onbeforetoggle={on_before_toggle}
245
- ontoggle={on_toggle}
246
- class={clsx(className)}
247
- transition:transition={paramsOptions as ParamsType}
248
- onintrostart={() => popover?.showPopover()}
249
- onoutroend={() => popover?.hidePopover()}
250
- {...restProps}
251
- >
252
- {@render children()}
253
- <!-- {#if arrow}
254
- <Arrow {...arrowParams} class={arrowClass} />
255
- {/if} -->
256
- </div>
257
- {/if}
1
+ <script lang="ts">
2
+ import type { Coords, Middleware, Placement, Strategy } from '@floating-ui/dom';
3
+ import * as dom from '@floating-ui/dom';
4
+ // import Arrow from './Arrow.svelte';
5
+ import { fade } from 'svelte/transition';
6
+ import { sineIn } from 'svelte/easing';
7
+ import clsx from 'clsx';
8
+ import type { ParamsType, PopperProps, TriggeredToggleEvent } from '../types/index.js';
9
+
10
+ let {
11
+ triggeredBy,
12
+ triggerDelay = 200,
13
+ trigger = 'click',
14
+ placement = 'top',
15
+ offset = 8,
16
+ arrow = false,
17
+ yOnly = false,
18
+ strategy = 'absolute',
19
+ reference,
20
+ middlewares = [dom.flip(), dom.shift()],
21
+ onbeforetoggle: _onbeforetoggle,
22
+ ontoggle: _ontoggle,
23
+ class: className = '',
24
+ arrowClass = '',
25
+ isOpen = $bindable(false),
26
+ transitionParams,
27
+ transition = fade,
28
+ children,
29
+ ...restProps
30
+ }: PopperProps = $props();
31
+
32
+ let focusable: boolean = true;
33
+ let clickable: boolean = $derived(trigger === 'click');
34
+ let hoverable: boolean = $derived(trigger === 'hover');
35
+
36
+ let popover: HTMLElement | null = $state(null);
37
+ let invoker: HTMLElement | null = null;
38
+ let referenceElement: HTMLElement | null = null;
39
+ let triggerEls: HTMLElement[] = [];
40
+ let arrowParams: { placement: Placement; cords: Partial<Coords>; strategy: Strategy } = $state({
41
+ placement,
42
+ cords: { x: 0, y: 0 },
43
+ strategy
44
+ });
45
+
46
+ const paramsDefault = { duration: 100, easing: sineIn };
47
+ const paramsOptions = $derived(transitionParams ?? paramsDefault);
48
+
49
+ const px = (n: number | undefined) => (n ? `${n}px` : '');
50
+
51
+ function updatePopoverPosition() {
52
+ if (!invoker || !popover) {
53
+ return;
54
+ }
55
+
56
+ const arrowEl: HTMLElement | null = popover.querySelector('.popover-arrow');
57
+
58
+ let middleware: Middleware[] = [...middlewares, dom.offset(offset)];
59
+ if (arrowEl) middleware.push(dom.arrow({ element: arrowEl }));
60
+
61
+ return dom
62
+ .computePosition(referenceElement ?? invoker, popover, { placement, middleware, strategy })
63
+ .then(({ x, y, middlewareData: { arrow }, placement: pl, strategy }) => {
64
+ if (popover) {
65
+ Object.assign(popover.style, {
66
+ position: strategy,
67
+ left: yOnly ? '0' : px(x),
68
+ top: px(y)
69
+ });
70
+
71
+ if (arrow && arrowEl) {
72
+ arrowParams = { placement: pl, cords: { x: arrow.x, y: arrow.y }, strategy };
73
+ }
74
+ }
75
+ });
76
+ }
77
+
78
+ let isTriggered: boolean = false;
79
+
80
+ async function open_popover(ev: Event) {
81
+ // throttle
82
+ isTriggered = true;
83
+ await new Promise((resolve) => setTimeout(resolve, triggerDelay));
84
+ if (!isTriggered) {
85
+ return;
86
+ }
87
+
88
+ ev.preventDefault();
89
+
90
+ if (ev.target !== invoker && triggerEls.includes(ev.target as HTMLElement)) {
91
+ invoker = ev.target as HTMLElement;
92
+ // if (invoker) invoker.popoverTargetElement = popover;
93
+ isOpen = false;
94
+ await new Promise((resolve) => setTimeout(resolve, triggerDelay));
95
+ }
96
+
97
+ if (ev.type === 'mousedown') {
98
+ isOpen = !isOpen;
99
+ } else {
100
+ isOpen = true;
101
+ }
102
+ }
103
+
104
+ async function close_popover(ev: Event) {
105
+ // For click triggers, don't close on focusout events from inside the popover
106
+ if (trigger === 'click' && ev.type === 'focusout') {
107
+ const relatedTarget = (ev as FocusEvent).relatedTarget as HTMLElement;
108
+
109
+ // If focus is moving to somewhere inside the popover, don't close
110
+ if (popover && relatedTarget && popover.contains(relatedTarget)) {
111
+ return;
112
+ }
113
+
114
+ // If focus is moving to nowhere (like when clicking), don't close for click triggers
115
+ if (!relatedTarget) {
116
+ return;
117
+ }
118
+ }
119
+
120
+ isTriggered = false;
121
+ await new Promise((resolve) => setTimeout(resolve, triggerDelay));
122
+ if (isTriggered) {
123
+ return;
124
+ }
125
+
126
+ // if popover has focus don't close when leaving the invoker
127
+ if (ev?.type === 'mouseleave' && popover?.contains(popover.ownerDocument.activeElement)) {
128
+ return;
129
+ }
130
+ if (ev?.type === 'focusout' && popover?.contains(popover.ownerDocument.activeElement)) {
131
+ return;
132
+ }
133
+
134
+ isOpen = false;
135
+ }
136
+
137
+ let autoUpdateDestroy = () => {};
138
+
139
+ function on_before_toggle(ev: ToggleEvent) {
140
+ if (!invoker || !popover) return;
141
+
142
+ (ev as TriggeredToggleEvent).trigger = invoker;
143
+ _onbeforetoggle?.(ev as TriggeredToggleEvent);
144
+
145
+ // Floating UI instance when it's closed we need to keep a autoUpdate destroy function
146
+
147
+ if (ev.newState === 'open') {
148
+ autoUpdateDestroy = dom.autoUpdate(
149
+ referenceElement ?? invoker,
150
+ popover,
151
+ updatePopoverPosition
152
+ );
153
+ popover.ownerDocument.addEventListener('click', closeOnClickOutside);
154
+ popover.ownerDocument.addEventListener('keydown', closeOnEscape);
155
+ } else {
156
+ autoUpdateDestroy();
157
+ popover.ownerDocument.removeEventListener('click', closeOnClickOutside);
158
+ popover.ownerDocument.removeEventListener('keydown', closeOnEscape);
159
+ }
160
+ }
161
+
162
+ function on_toggle(ev: ToggleEvent) {
163
+ if (!invoker) return;
164
+
165
+ // Update isOpen value when popover state changes through other means
166
+ isOpen = ev.newState === 'open';
167
+
168
+ (ev as TriggeredToggleEvent).trigger = invoker;
169
+ _ontoggle?.(ev as TriggeredToggleEvent);
170
+ }
171
+
172
+ function set_triggers(node: HTMLElement) {
173
+ const events: [string, any, boolean][] = [
174
+ ['focusin', open_popover, focusable],
175
+ ['focusout', close_popover, focusable],
176
+ ['mousedown', open_popover, clickable],
177
+ ['mouseenter', open_popover, hoverable],
178
+ ['mouseleave', close_popover, hoverable]
179
+ ];
180
+
181
+ if (triggeredBy)
182
+ triggerEls = [...node.ownerDocument.querySelectorAll<HTMLElement>(triggeredBy)];
183
+ else if (node.previousElementSibling) triggerEls = [node.previousElementSibling as HTMLElement];
184
+ else if (node.parentElement) triggerEls = [node.parentElement];
185
+
186
+ if (!triggerEls.length) {
187
+ console.error('No triggers found.', triggeredBy);
188
+ return;
189
+ }
190
+
191
+ if (reference) referenceElement = node.ownerDocument.querySelector<HTMLElement>(reference);
192
+ invoker = triggerEls[0];
193
+
194
+ triggerEls.forEach((element: HTMLElement) => {
195
+ if (element.tabIndex < 0) element.tabIndex = 0; // trigger must be focusable
196
+ for (const [name, handler, cond] of events) if (cond) element.addEventListener(name, handler);
197
+ });
198
+
199
+ $effect(() => {
200
+ return () => {
201
+ triggerEls.forEach((element: HTMLElement) => {
202
+ for (const [name, handler, cond] of events)
203
+ if (cond) element.removeEventListener(name, handler);
204
+ });
205
+ };
206
+ });
207
+ }
208
+
209
+ function closeOnEscape(event: KeyboardEvent) {
210
+ if (event.key === 'Escape') {
211
+ isOpen = false;
212
+ }
213
+ }
214
+
215
+ function closeOnClickOutside(event: MouseEvent) {
216
+ if (!popover) {
217
+ return;
218
+ }
219
+
220
+ const clickPath = event.composedPath();
221
+
222
+ const isClickInsidePopover = clickPath.includes(popover);
223
+ const isClickOnTrigger = triggerEls.some((el) => clickPath.includes(el));
224
+
225
+ // Only close if click is outside both popover and trigger elements
226
+ if (!isClickInsidePopover && !isClickOnTrigger) {
227
+ close_popover(event);
228
+ isOpen = false;
229
+ }
230
+ }
231
+ </script>
232
+
233
+ <div use:set_triggers hidden></div>
234
+
235
+ {#if isOpen}
236
+ <div
237
+ popover="manual"
238
+ role="tooltip"
239
+ bind:this={popover}
240
+ class:overflow-visible={true}
241
+ onfocusout={close_popover}
242
+ onmouseleave={hoverable ? close_popover : undefined}
243
+ onmouseenter={hoverable ? open_popover : undefined}
244
+ onbeforetoggle={on_before_toggle}
245
+ ontoggle={on_toggle}
246
+ class={clsx(className)}
247
+ transition:transition={paramsOptions as ParamsType}
248
+ onintrostart={() => popover?.showPopover()}
249
+ onoutroend={() => popover?.hidePopover()}
250
+ {...restProps}
251
+ >
252
+ {@render children()}
253
+ <!-- {#if arrow}
254
+ <Arrow {...arrowParams} class={arrowClass} />
255
+ {/if} -->
256
+ </div>
257
+ {/if}