@exponential-at/ui-solid 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +135 -2
  4. package/dist/chunks/image-loading-status-DZOoj4RQ.js +1724 -0
  5. package/dist/chunks/image-loading-status-DZOoj4RQ.js.map +1 -0
  6. package/dist/exponential-ui-solid.css +2 -0
  7. package/dist/index.js +12305 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/primitives.js +8439 -0
  10. package/dist/primitives.js.map +1 -0
  11. package/dist/types/behaviors/bubble-input.d.ts +35 -0
  12. package/dist/types/behaviors/collapsible.d.ts +15 -0
  13. package/dist/types/behaviors/dialog.d.ts +116 -0
  14. package/dist/types/behaviors/dismissable-layer.d.ts +48 -0
  15. package/dist/types/behaviors/drag-to-dismiss.d.ts +10 -0
  16. package/dist/types/behaviors/element-size.d.ts +7 -0
  17. package/dist/types/behaviors/focus-guards.d.ts +4 -0
  18. package/dist/types/behaviors/focus-scope.d.ts +20 -0
  19. package/dist/types/behaviors/grace-area.d.ts +10 -0
  20. package/dist/types/behaviors/image-loading-status.d.ts +4 -0
  21. package/dist/types/behaviors/index.d.ts +23 -0
  22. package/dist/types/behaviors/listbox.d.ts +44 -0
  23. package/dist/types/behaviors/menu.d.ts +95 -0
  24. package/dist/types/behaviors/modal.d.ts +3 -0
  25. package/dist/types/behaviors/picker-popover.d.ts +22 -0
  26. package/dist/types/behaviors/popper.d.ts +49 -0
  27. package/dist/types/behaviors/portal.d.ts +11 -0
  28. package/dist/types/behaviors/presence.d.ts +7 -0
  29. package/dist/types/behaviors/roving-focus.d.ts +30 -0
  30. package/dist/types/behaviors/scroll-lock.d.ts +4 -0
  31. package/dist/types/behaviors/search-match.d.ts +6 -0
  32. package/dist/types/behaviors/slider.d.ts +8 -0
  33. package/dist/types/behaviors/style-writer.d.ts +8 -0
  34. package/dist/types/behaviors/typeahead.d.ts +11 -0
  35. package/dist/types/behaviors/visually-hidden.d.ts +6 -0
  36. package/dist/types/bind-attrs.d.ts +4 -0
  37. package/dist/types/context.d.ts +74 -0
  38. package/dist/types/create-surface.d.ts +58 -0
  39. package/dist/types/extensions.d.ts +25 -0
  40. package/dist/types/form.d.ts +63 -0
  41. package/dist/types/host-surface.d.ts +33 -0
  42. package/dist/types/host.d.ts +37 -0
  43. package/dist/types/icons.d.ts +56 -0
  44. package/dist/types/index.d.ts +39 -0
  45. package/dist/types/inputs.d.ts +27 -0
  46. package/dist/types/list.d.ts +33 -0
  47. package/dist/types/markdown.d.ts +10 -0
  48. package/dist/types/media.d.ts +16 -0
  49. package/dist/types/natives/actions.d.ts +13 -0
  50. package/dist/types/natives/bound.d.ts +3 -0
  51. package/dist/types/natives/chart.d.ts +4 -0
  52. package/dist/types/natives/chips.d.ts +7 -0
  53. package/dist/types/natives/choice-tiles.d.ts +4 -0
  54. package/dist/types/natives/code.d.ts +4 -0
  55. package/dist/types/natives/dates.d.ts +30 -0
  56. package/dist/types/natives/feedback.d.ts +19 -0
  57. package/dist/types/natives/index.d.ts +6 -0
  58. package/dist/types/natives/inputs.d.ts +20 -0
  59. package/dist/types/natives/layout.d.ts +12 -0
  60. package/dist/types/natives/media.d.ts +14 -0
  61. package/dist/types/natives/nav.d.ts +14 -0
  62. package/dist/types/natives/overlays.d.ts +19 -0
  63. package/dist/types/natives/owners.d.ts +2 -0
  64. package/dist/types/natives/pending.d.ts +3 -0
  65. package/dist/types/natives/resizable.d.ts +4 -0
  66. package/dist/types/natives/search.d.ts +45 -0
  67. package/dist/types/natives/select.d.ts +10 -0
  68. package/dist/types/natives/shared.d.ts +50 -0
  69. package/dist/types/natives/table.d.ts +7 -0
  70. package/dist/types/natives/text.d.ts +5 -0
  71. package/dist/types/node-view.d.ts +83 -0
  72. package/dist/types/platform.d.ts +12 -0
  73. package/dist/types/primitives/alert-dialog.d.ts +24 -0
  74. package/dist/types/primitives/alert.d.ts +6 -0
  75. package/dist/types/primitives/avatar-color.d.ts +1 -0
  76. package/dist/types/primitives/avatar.d.ts +12 -0
  77. package/dist/types/primitives/badge.d.ts +8 -0
  78. package/dist/types/primitives/breadcrumb.d.ts +12 -0
  79. package/dist/types/primitives/button.d.ts +12 -0
  80. package/dist/types/primitives/calendar.d.ts +188 -0
  81. package/dist/types/primitives/card.d.ts +9 -0
  82. package/dist/types/primitives/checkbox.d.ts +14 -0
  83. package/dist/types/primitives/choice-tiles.d.ts +59 -0
  84. package/dist/types/primitives/cn.d.ts +1 -0
  85. package/dist/types/primitives/code-block.d.ts +34 -0
  86. package/dist/types/primitives/collapsible.d.ts +15 -0
  87. package/dist/types/primitives/command.d.ts +51 -0
  88. package/dist/types/primitives/context-ring.d.ts +14 -0
  89. package/dist/types/primitives/dialog-arms.d.ts +2 -0
  90. package/dist/types/primitives/dialog.d.ts +34 -0
  91. package/dist/types/primitives/disclosure-header.d.ts +7 -0
  92. package/dist/types/primitives/dock-card.d.ts +41 -0
  93. package/dist/types/primitives/dropdown-menu.d.ts +73 -0
  94. package/dist/types/primitives/empty-state.d.ts +19 -0
  95. package/dist/types/primitives/glass-card.d.ts +3 -0
  96. package/dist/types/primitives/hover-card.d.ts +28 -0
  97. package/dist/types/primitives/icon-disc.d.ts +11 -0
  98. package/dist/types/primitives/index.d.ts +51 -0
  99. package/dist/types/primitives/input.d.ts +6 -0
  100. package/dist/types/primitives/kbd.d.ts +4 -0
  101. package/dist/types/primitives/label.d.ts +3 -0
  102. package/dist/types/primitives/menu-surface.d.ts +1 -0
  103. package/dist/types/primitives/meter.d.ts +8 -0
  104. package/dist/types/primitives/popover.d.ts +31 -0
  105. package/dist/types/primitives/progress-ring.d.ts +12 -0
  106. package/dist/types/primitives/progress.d.ts +9 -0
  107. package/dist/types/primitives/scroll-area.d.ts +19 -0
  108. package/dist/types/primitives/segmented-control.d.ts +23 -0
  109. package/dist/types/primitives/select.d.ts +51 -0
  110. package/dist/types/primitives/separator.d.ts +6 -0
  111. package/dist/types/primitives/sheet-chrome.d.ts +11 -0
  112. package/dist/types/primitives/sheet.d.ts +21 -0
  113. package/dist/types/primitives/skeleton.d.ts +3 -0
  114. package/dist/types/primitives/spinner.d.ts +9 -0
  115. package/dist/types/primitives/switch.d.ts +14 -0
  116. package/dist/types/primitives/table.d.ts +11 -0
  117. package/dist/types/primitives/tabs.d.ts +29 -0
  118. package/dist/types/primitives/textarea.d.ts +5 -0
  119. package/dist/types/primitives/toast.d.ts +16 -0
  120. package/dist/types/primitives/tooltip.d.ts +34 -0
  121. package/dist/types/primitives/truncate.d.ts +1 -0
  122. package/dist/types/primitives/use-media-query.d.ts +4 -0
  123. package/dist/types/primitives/use-mobile.d.ts +4 -0
  124. package/dist/types/primitives/use-sheet-drag.d.ts +20 -0
  125. package/dist/types/style.d.ts +6 -0
  126. package/dist/types/surface.d.ts +99 -0
  127. package/package.json +55 -4
@@ -0,0 +1,1724 @@
1
+ import { createComponent, mergeProps, Dynamic, spread, insert, template, effect, setAttribute, style, use } from "solid-js/web";
2
+ import { splitProps, createRoot, For, createSignal, createEffect, onCleanup, getOwner, createRenderEffect, Show, children, untrack, on, createContext, useContext, onMount, createMemo, createComputed } from "solid-js";
3
+ import { Loader, CircleDashed, Star, Upload, Search, Calendar, Menu, Ellipsis, ArrowLeft, Send, Paperclip, CircleStop, CircleX, TriangleAlert, CircleCheck, Info, Clock, Plus, Minus, File, Copy, X, ChevronsUpDown, ChevronRight, ChevronLeft, ChevronUp, ChevronDown, Check, Play, Square } from "lucide-solid";
4
+ import { lookupIcon, typeaheadStep, nextEnabledIndex, str, bool } from "@exponential-at/ui/web";
5
+ import { OVERLAY_PADDING } from "@exponential-at/ui";
6
+ import { hideOthers } from "aria-hidden";
7
+ import { offset, shift, limitShift, flip, size, autoUpdate, computePosition } from "@floating-ui/dom";
8
+ var _tmpl$$4 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round>`);
9
+ const CHROME = {
10
+ check: Check,
11
+ chevronDown: ChevronDown,
12
+ chevronUp: ChevronUp,
13
+ chevronLeft: ChevronLeft,
14
+ chevronRight: ChevronRight,
15
+ close: X,
16
+ search: Search,
17
+ calendar: Calendar,
18
+ send: Send,
19
+ stop: Square,
20
+ play: Play,
21
+ attach: Paperclip,
22
+ spinner: Loader,
23
+ placeholder: CircleDashed
24
+ };
25
+ const FALLBACK_ICONS = {
26
+ "ui-check": Check,
27
+ "ui-chevron-down": ChevronDown,
28
+ "ui-chevron-up": ChevronUp,
29
+ "ui-chevron-left": ChevronLeft,
30
+ "ui-chevron-right": ChevronRight,
31
+ "ui-selector": ChevronsUpDown,
32
+ "ui-close": X,
33
+ "ui-copy": Copy,
34
+ "ui-file": File,
35
+ "ui-minus": Minus,
36
+ "ui-add": Plus,
37
+ "ui-clock": Clock,
38
+ "ui-info": Info,
39
+ "ui-success": CircleCheck,
40
+ "ui-warning": TriangleAlert,
41
+ "ui-error": CircleX,
42
+ "ui-stop": CircleStop,
43
+ "ui-attach": Paperclip,
44
+ "ui-send": Send,
45
+ "ui-back": ArrowLeft,
46
+ "ui-more": Ellipsis,
47
+ "ui-menu": Menu,
48
+ "ui-search": Search,
49
+ "ui-icon-placeholder": CircleDashed,
50
+ calendar: Calendar,
51
+ search: Search,
52
+ upload: Upload,
53
+ star: Star
54
+ };
55
+ function resolveIcon(icons, name) {
56
+ return lookupIcon(icons, name, FALLBACK_ICONS);
57
+ }
58
+ const shapes = /* @__PURE__ */ new WeakMap();
59
+ function probe(icon) {
60
+ if (shapes.has(icon)) return shapes.get(icon);
61
+ let shape = null;
62
+ if (typeof document !== `undefined`) {
63
+ try {
64
+ createRoot((dispose) => {
65
+ const el = icon({});
66
+ if (el instanceof Element && el.localName === `svg` && el.classList.contains(`lucide`)) {
67
+ const classes = Array.from(el.classList).filter((c) => c !== `lucide` && c !== `lucide-icon`);
68
+ const nodes = Array.from(el.children).map((child) => {
69
+ const attrs = {};
70
+ for (const a of Array.from(child.attributes)) if (a.name !== `key`) attrs[a.name] = a.value;
71
+ return [child.localName, attrs];
72
+ });
73
+ shape = {
74
+ classes,
75
+ nodes
76
+ };
77
+ }
78
+ dispose();
79
+ });
80
+ } catch {
81
+ shape = null;
82
+ }
83
+ }
84
+ shapes.set(icon, shape);
85
+ return shape;
86
+ }
87
+ const mergeClasses = (...classes) => classes.filter((c, i, all) => Boolean(c) && c.trim() !== `` && all.indexOf(c) === i).join(` `).trim();
88
+ function LucideSvg(props) {
89
+ const [local, rest] = splitProps(props, [`shape`, `size`, `class`]);
90
+ const hasA11y = () => Object.keys(rest).some((k) => k.startsWith(`aria-`) || k === `role` || k === `title`);
91
+ const size2 = () => local.size ?? 24;
92
+ const attr = (name, fallback) => name in rest ? rest[name] : fallback;
93
+ return (() => {
94
+ var _el$ = _tmpl$$4();
95
+ spread(_el$, mergeProps({
96
+ get ["aria-hidden"]() {
97
+ return hasA11y() ? void 0 : `true`;
98
+ }
99
+ }, rest, {
100
+ get width() {
101
+ return attr(`width`, size2());
102
+ },
103
+ get height() {
104
+ return attr(`height`, size2());
105
+ },
106
+ get ["class"]() {
107
+ return mergeClasses(`lucide`, mergeClasses(...local.shape.classes, local.class));
108
+ }
109
+ }), true, true);
110
+ insert(_el$, createComponent(For, {
111
+ get each() {
112
+ return local.shape.nodes;
113
+ },
114
+ children: ([tag, attrs]) => createComponent(Dynamic, mergeProps({
115
+ component: tag
116
+ }, attrs))
117
+ }));
118
+ return _el$;
119
+ })();
120
+ }
121
+ function PaintIcon(props) {
122
+ const [local, rest] = splitProps(props, [`icon`]);
123
+ return createComponent(Dynamic, mergeProps({
124
+ get component() {
125
+ const icon = local.icon;
126
+ const shape = probe(icon);
127
+ return shape ? (p) => createComponent(LucideSvg, mergeProps({
128
+ shape
129
+ }, p)) : icon;
130
+ }
131
+ }, rest));
132
+ }
133
+ function IconGlyph(props) {
134
+ const [local, rest] = splitProps(props, [`icons`, `name`, `size`, `class`]);
135
+ const resolved = () => resolveIcon(local.icons, local.name);
136
+ return createComponent(PaintIcon, mergeProps({
137
+ get icon() {
138
+ return resolved() ?? CircleDashed;
139
+ },
140
+ "aria-hidden": "true",
141
+ get ["data-icon"]() {
142
+ return local.name;
143
+ },
144
+ get ["data-icon-missing"]() {
145
+ return resolved() ? void 0 : `true`;
146
+ },
147
+ get size() {
148
+ return local.size;
149
+ },
150
+ get ["class"]() {
151
+ return local.class;
152
+ }
153
+ }, rest));
154
+ }
155
+ const UNITLESS = new Set(
156
+ `animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp`.split(` `)
157
+ );
158
+ const hyphenated = /* @__PURE__ */ new Map();
159
+ function hyphenate(name) {
160
+ let hit = hyphenated.get(name);
161
+ if (hit === void 0) {
162
+ hit = name.includes(`-`) ? name : name.replace(/([A-Z])/g, `-$1`).toLowerCase().replace(/^ms-/, `-ms-`);
163
+ hyphenated.set(name, hit);
164
+ }
165
+ return hit;
166
+ }
167
+ function css(style2) {
168
+ if (!style2) return void 0;
169
+ const out = {};
170
+ for (const [name, value] of Object.entries(style2)) {
171
+ if (value === null || value === void 0 || typeof value === `boolean` || value === ``) continue;
172
+ if (name.startsWith(`--`)) {
173
+ out[name] = String(value);
174
+ continue;
175
+ }
176
+ const key = name === `cssFloat` ? `float` : hyphenate(name);
177
+ out[key] = typeof value === `number` && value !== 0 && !UNITLESS.has(name) ? `${value}px` : String(value).trim();
178
+ }
179
+ return out;
180
+ }
181
+ const px = (v) => typeof v === `number` ? v === 0 ? `0` : `${v}px` : v;
182
+ function createMediaQuery(query, fallback = false) {
183
+ if (typeof window === `undefined` || typeof window.matchMedia !== `function`) return () => fallback;
184
+ const mql = window.matchMedia(query);
185
+ const [matches, setMatches] = createSignal(mql.matches);
186
+ const onChange = () => setMatches(mql.matches);
187
+ mql.addEventListener?.(`change`, onChange);
188
+ if (getOwner()) onCleanup(() => mql.removeEventListener?.(`change`, onChange));
189
+ return matches;
190
+ }
191
+ function createElementSize$1(el, initialWidth = 0) {
192
+ const [size2, setSize] = createSignal({ width: initialWidth, height: 0, measured: false });
193
+ createEffect(() => {
194
+ const node = el();
195
+ if (!node) return;
196
+ const read = () => {
197
+ const r = node.getBoundingClientRect();
198
+ const cur = size2();
199
+ if (!cur.measured && r.width === 0 && r.height === 0) return;
200
+ if (cur.measured && cur.width === r.width && cur.height === r.height) return;
201
+ setSize({ width: r.width, height: r.height, measured: true });
202
+ };
203
+ read();
204
+ if (typeof ResizeObserver === `undefined`) return;
205
+ const ro = new ResizeObserver(read);
206
+ ro.observe(node);
207
+ onCleanup(() => ro.disconnect());
208
+ });
209
+ return size2;
210
+ }
211
+ function styleWriter(el) {
212
+ let prev = null;
213
+ const write = (k, v) => el.style.setProperty(k, v === void 0 ? `` : v);
214
+ return (next) => {
215
+ if (prev) {
216
+ for (const k of Object.keys(prev)) if (!(k in next)) write(k, ``);
217
+ for (const k of Object.keys(next)) if (prev[k] !== next[k]) write(k, next[k]);
218
+ } else for (const k of Object.keys(next)) write(k, next[k]);
219
+ prev = { ...next };
220
+ };
221
+ }
222
+ function bindStyle(el, style2) {
223
+ const write = styleWriter(el);
224
+ createRenderEffect(() => write(style2()));
225
+ }
226
+ function LayerPortal(props) {
227
+ return createComponent(Show, {
228
+ get when() {
229
+ return props.mount;
230
+ },
231
+ children: (mount) => {
232
+ const el = mount();
233
+ const nodes = children(() => props.children);
234
+ const marker = document.createTextNode(``);
235
+ el.appendChild(marker);
236
+ insert(el, nodes, marker);
237
+ onCleanup(() => {
238
+ for (const n of [nodes()].flat(Infinity)) if (n instanceof Node && n.parentNode === el) el.removeChild(n);
239
+ marker.remove();
240
+ });
241
+ return null;
242
+ }
243
+ });
244
+ }
245
+ function mountIn(container, el) {
246
+ container.appendChild(el);
247
+ onCleanup(() => el.parentNode?.removeChild(el));
248
+ }
249
+ function createPresence(present) {
250
+ const [mounted, setMounted] = createSignal(untrack(present));
251
+ let node;
252
+ let openName = `none`;
253
+ let stop;
254
+ const nameOf = (el) => getComputedStyle(el).animationName || `none`;
255
+ createEffect(
256
+ on(present, (p) => {
257
+ stop?.();
258
+ stop = void 0;
259
+ if (p) {
260
+ setMounted(true);
261
+ return;
262
+ }
263
+ const el = node;
264
+ if (!el || !el.isConnected) return setMounted(false);
265
+ const styles = getComputedStyle(el);
266
+ const current = styles.animationName || `none`;
267
+ if (current === `none` || styles.display === `none` || current === openName) return setMounted(false);
268
+ const done = (e) => {
269
+ if (e.target !== el || !nameOf(el).split(`,`).map((s) => s.trim()).includes(e.animationName)) return;
270
+ stop?.();
271
+ setMounted(false);
272
+ };
273
+ el.addEventListener(`animationend`, done);
274
+ el.addEventListener(`animationcancel`, done);
275
+ stop = () => {
276
+ el.removeEventListener(`animationend`, done);
277
+ el.removeEventListener(`animationcancel`, done);
278
+ };
279
+ }, { defer: true })
280
+ );
281
+ onCleanup(() => stop?.());
282
+ return {
283
+ mounted,
284
+ ref: (el) => {
285
+ node = el;
286
+ el.addEventListener(`animationstart`, (e) => {
287
+ if (e.target === el && untrack(present)) openName = nameOf(el);
288
+ });
289
+ }
290
+ };
291
+ }
292
+ const LAYERS = [];
293
+ const MODAL_LAYERS = [];
294
+ const [layersVersion, setLayersVersion] = createSignal(0);
295
+ let originalBodyPointerEvents = ``;
296
+ const LayerContext = createContext();
297
+ function layerContains(layer, target) {
298
+ if (!target) return false;
299
+ if (layer.el?.contains(target)) return true;
300
+ for (const kid of layer.kids) if (layerContains(kid, target)) return true;
301
+ return false;
302
+ }
303
+ const outsideEvent = (originalEvent) => {
304
+ const e = { target: originalEvent.target, detail: { originalEvent }, defaultPrevented: false, preventDefault: () => e.defaultPrevented = true };
305
+ return e;
306
+ };
307
+ function createLayer(o) {
308
+ const parent = useContext(LayerContext);
309
+ const layer = { parent, kids: /* @__PURE__ */ new Set() };
310
+ const modal = () => o.disableOutsidePointerEvents?.() ?? false;
311
+ const enabled = () => {
312
+ const highest = MODAL_LAYERS[MODAL_LAYERS.length - 1];
313
+ return LAYERS.indexOf(layer) >= (highest ? LAYERS.indexOf(highest) : -1);
314
+ };
315
+ const pointerEvents = (registered) => {
316
+ layersVersion();
317
+ if (MODAL_LAYERS.length === 0) return void 0;
318
+ const highest = MODAL_LAYERS[MODAL_LAYERS.length - 1];
319
+ const index = registered ? LAYERS.indexOf(layer) : -1;
320
+ return index >= LAYERS.indexOf(highest) ? `auto` : `none`;
321
+ };
322
+ const attach = (el) => {
323
+ layer.el = el;
324
+ const doc = el.ownerDocument;
325
+ const disable = untrack(modal);
326
+ if (disable) {
327
+ if (MODAL_LAYERS.length === 0) {
328
+ originalBodyPointerEvents = doc.body.style.pointerEvents;
329
+ doc.body.style.pointerEvents = `none`;
330
+ }
331
+ MODAL_LAYERS.push(layer);
332
+ }
333
+ LAYERS.push(layer);
334
+ parent?.kids.add(layer);
335
+ setLayersVersion((v) => v + 1);
336
+ let clickHandler;
337
+ const pointerDown = (event) => {
338
+ if (event.target && !layerContains(layer, event.target)) {
339
+ const run = () => {
340
+ if (!enabled()) return;
341
+ const e = outsideEvent(event);
342
+ o.onPointerDownOutside?.(e);
343
+ o.onInteractOutside?.(e);
344
+ if (!e.defaultPrevented) o.onDismiss();
345
+ };
346
+ if (event.pointerType === `touch`) {
347
+ if (clickHandler) doc.removeEventListener(`click`, clickHandler);
348
+ clickHandler = run;
349
+ doc.addEventListener(`click`, clickHandler, { once: true });
350
+ } else run();
351
+ } else if (clickHandler) doc.removeEventListener(`click`, clickHandler);
352
+ };
353
+ const focusIn = (event) => {
354
+ if (!event.target || layerContains(layer, event.target)) return;
355
+ const e = outsideEvent(event);
356
+ o.onFocusOutside?.(e);
357
+ o.onInteractOutside?.(e);
358
+ if (!e.defaultPrevented) o.onDismiss();
359
+ };
360
+ const keyDown = (event) => {
361
+ if (event.key !== `Escape`) return;
362
+ if (LAYERS.indexOf(layer) !== LAYERS.length - 1) return;
363
+ o.onEscapeKeyDown?.(event);
364
+ if (!event.defaultPrevented) {
365
+ event.preventDefault();
366
+ o.onDismiss();
367
+ }
368
+ };
369
+ const timer = setTimeout(() => doc.addEventListener(`pointerdown`, pointerDown), 0);
370
+ doc.addEventListener(`focusin`, focusIn);
371
+ doc.addEventListener(`keydown`, keyDown, { capture: true });
372
+ onCleanup(() => {
373
+ clearTimeout(timer);
374
+ doc.removeEventListener(`pointerdown`, pointerDown);
375
+ if (clickHandler) doc.removeEventListener(`click`, clickHandler);
376
+ doc.removeEventListener(`focusin`, focusIn);
377
+ doc.removeEventListener(`keydown`, keyDown, { capture: true });
378
+ if (disable && MODAL_LAYERS.length === 1) doc.body.style.pointerEvents = originalBodyPointerEvents;
379
+ LAYERS.splice(LAYERS.indexOf(layer), 1);
380
+ const m = MODAL_LAYERS.indexOf(layer);
381
+ if (m >= 0) MODAL_LAYERS.splice(m, 1);
382
+ parent?.kids.delete(layer);
383
+ setLayersVersion((v) => v + 1);
384
+ });
385
+ };
386
+ return { layer, attach, pointerEvents };
387
+ }
388
+ const layers = [];
389
+ function dismissable(opts) {
390
+ onMount(() => {
391
+ const layer = opts.layer();
392
+ if (!layer) return;
393
+ layers.push(layer);
394
+ const inside = (t) => t instanceof Node && (layer.contains(t) || Boolean(opts.isInside?.(t)));
395
+ const onKey = (e) => {
396
+ if (e.key !== `Escape` || layers[layers.length - 1] !== layer) return;
397
+ e.preventDefault();
398
+ e.stopImmediatePropagation();
399
+ opts.onDismiss();
400
+ };
401
+ const onPointer = (e) => {
402
+ if (inside(e.target)) return;
403
+ opts.onOutside?.();
404
+ opts.onDismiss();
405
+ };
406
+ const onFocusIn = (e) => {
407
+ if (opts.keepOnFocusOutside || inside(e.target)) return;
408
+ opts.onOutside?.();
409
+ opts.onDismiss();
410
+ };
411
+ document.addEventListener(`keydown`, onKey, { capture: true });
412
+ document.addEventListener(`focusin`, onFocusIn);
413
+ const timer = window.setTimeout(() => document.addEventListener(`pointerdown`, onPointer));
414
+ onCleanup(() => {
415
+ window.clearTimeout(timer);
416
+ document.removeEventListener(`keydown`, onKey, { capture: true });
417
+ document.removeEventListener(`focusin`, onFocusIn);
418
+ document.removeEventListener(`pointerdown`, onPointer);
419
+ const i = layers.indexOf(layer);
420
+ if (i >= 0) layers.splice(i, 1);
421
+ });
422
+ });
423
+ }
424
+ let SCOPES = [];
425
+ const scopesAdd = (s) => {
426
+ const active = SCOPES[0];
427
+ if (active && active !== s) active.paused = true;
428
+ SCOPES = [s, ...SCOPES.filter((x) => x !== s)];
429
+ };
430
+ const scopesRemove = (s) => {
431
+ SCOPES = SCOPES.filter((x) => x !== s);
432
+ if (SCOPES[0]) SCOPES[0].paused = false;
433
+ };
434
+ function tabbables(container) {
435
+ const nodes = [];
436
+ const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
437
+ acceptNode: (node) => {
438
+ const el = node;
439
+ const hiddenInput = el.tagName === `INPUT` && el.type === `hidden`;
440
+ if (el.disabled || el.hidden || hiddenInput) return NodeFilter.FILTER_SKIP;
441
+ return el.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
442
+ }
443
+ });
444
+ while (walker.nextNode()) nodes.push(walker.currentNode);
445
+ return nodes;
446
+ }
447
+ function isHidden(node, upTo) {
448
+ if (node && getComputedStyle(node).visibility === `hidden`) return true;
449
+ while (node) {
450
+ if (node === upTo) return false;
451
+ if (getComputedStyle(node).display === `none`) return true;
452
+ node = node.parentElement;
453
+ }
454
+ return false;
455
+ }
456
+ function focusEl(el, select = false) {
457
+ if (!el?.focus) return;
458
+ const prev = document.activeElement;
459
+ el.focus({ preventScroll: true });
460
+ if (el !== prev && select && el instanceof HTMLInputElement && `select` in el) el.select();
461
+ }
462
+ function focusFirst(candidates, select = false) {
463
+ const prev = document.activeElement;
464
+ for (const c of candidates) {
465
+ focusEl(c, select);
466
+ if (document.activeElement !== prev) return;
467
+ }
468
+ }
469
+ const AUTOFOCUS_ON_MOUNT = `focusScope.autoFocusOnMount`;
470
+ const AUTOFOCUS_ON_UNMOUNT = `focusScope.autoFocusOnUnmount`;
471
+ function createFocusScope(o) {
472
+ const scope = { paused: false };
473
+ let container;
474
+ const attach = (el) => {
475
+ let started = false;
476
+ let disposed = false;
477
+ let previouslyFocused = null;
478
+ let lastFocused = null;
479
+ const focusIn = (event) => {
480
+ if (!untrack(o.trapped) || scope.paused) return;
481
+ const target = event.target;
482
+ if (el.contains(target)) lastFocused = target;
483
+ else focusEl(lastFocused, true);
484
+ };
485
+ const focusOut = (event) => {
486
+ if (!untrack(o.trapped) || scope.paused) return;
487
+ const related = event.relatedTarget;
488
+ if (related === null) return;
489
+ if (!el.contains(related)) focusEl(lastFocused, true);
490
+ };
491
+ const observer = new MutationObserver((mutations) => {
492
+ if (!untrack(o.trapped) || scope.paused) return;
493
+ if (document.activeElement !== document.body) return;
494
+ for (const m of mutations) if (m.removedNodes.length > 0) focusEl(el);
495
+ });
496
+ queueMicrotask(() => {
497
+ if (disposed || !el.isConnected) return;
498
+ started = true;
499
+ container = el;
500
+ scopesAdd(scope);
501
+ previouslyFocused = document.activeElement;
502
+ if (!el.contains(previouslyFocused)) {
503
+ const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, { bubbles: false, cancelable: true });
504
+ const onMount2 = (e) => o.onMountAutoFocus?.(e);
505
+ el.addEventListener(AUTOFOCUS_ON_MOUNT, onMount2);
506
+ el.dispatchEvent(mountEvent);
507
+ el.removeEventListener(AUTOFOCUS_ON_MOUNT, onMount2);
508
+ if (!mountEvent.defaultPrevented) {
509
+ focusFirst(tabbables(el).filter((n) => n.tagName !== `A`), true);
510
+ if (document.activeElement === previouslyFocused) focusEl(el);
511
+ }
512
+ }
513
+ document.addEventListener(`focusin`, focusIn);
514
+ document.addEventListener(`focusout`, focusOut);
515
+ observer.observe(el, { childList: true, subtree: true });
516
+ });
517
+ onCleanup(() => {
518
+ disposed = true;
519
+ if (!started) return;
520
+ document.removeEventListener(`focusin`, focusIn);
521
+ document.removeEventListener(`focusout`, focusOut);
522
+ observer.disconnect();
523
+ const prev = previouslyFocused;
524
+ setTimeout(() => {
525
+ const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, { bubbles: false, cancelable: true });
526
+ const onUnmount = (e) => o.onUnmountAutoFocus?.(e);
527
+ el.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmount);
528
+ el.dispatchEvent(unmountEvent);
529
+ if (!unmountEvent.defaultPrevented) focusEl(prev ?? document.body, true);
530
+ el.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmount);
531
+ scopesRemove(scope);
532
+ }, 0);
533
+ });
534
+ };
535
+ const onKeyDown = (event) => {
536
+ if (!o.loop && !untrack(o.trapped)) return;
537
+ if (scope.paused || !container) return;
538
+ const isTab = event.key === `Tab` && !event.altKey && !event.ctrlKey && !event.metaKey;
539
+ const focused = document.activeElement;
540
+ if (!isTab || !focused) return;
541
+ const candidates = tabbables(container);
542
+ const first = candidates.find((c) => !isHidden(c, container));
543
+ const last = [...candidates].reverse().find((c) => !isHidden(c, container));
544
+ if (!first || !last) {
545
+ if (focused === container) event.preventDefault();
546
+ } else if (!event.shiftKey && focused === last) {
547
+ event.preventDefault();
548
+ if (o.loop) focusEl(first, true);
549
+ } else if (event.shiftKey && focused === first) {
550
+ event.preventDefault();
551
+ if (o.loop) focusEl(last, true);
552
+ }
553
+ };
554
+ return { attach, onKeyDown };
555
+ }
556
+ let guardCount = 0;
557
+ function createGuard() {
558
+ const el = document.createElement(`span`);
559
+ el.setAttribute(`data-radix-focus-guard`, ``);
560
+ el.tabIndex = 0;
561
+ el.style.outline = `none`;
562
+ el.style.opacity = `0`;
563
+ el.style.position = `fixed`;
564
+ el.style.pointerEvents = `none`;
565
+ return el;
566
+ }
567
+ function useFocusGuards() {
568
+ const edges = document.querySelectorAll(`[data-radix-focus-guard]`);
569
+ document.body.insertAdjacentElement(`afterbegin`, edges[0] ?? createGuard());
570
+ document.body.insertAdjacentElement(`beforeend`, edges[1] ?? createGuard());
571
+ guardCount++;
572
+ onCleanup(() => {
573
+ if (guardCount === 1) document.querySelectorAll(`[data-radix-focus-guard]`).forEach((n) => n.remove());
574
+ guardCount--;
575
+ });
576
+ }
577
+ const LOCK_ATTRIBUTE = `data-scroll-locked`;
578
+ let lockSheets = 0;
579
+ let lockSheet = null;
580
+ function useScrollLock() {
581
+ const body = document.body;
582
+ const count = () => {
583
+ const n = parseInt(body.getAttribute(LOCK_ATTRIBUTE) || `0`, 10);
584
+ return isFinite(n) ? n : 0;
585
+ };
586
+ body.setAttribute(LOCK_ATTRIBUTE, String(count() + 1));
587
+ if (lockSheets === 0) {
588
+ const cs = getComputedStyle(body);
589
+ const parse = (x) => parseInt(x || ``, 10) || 0;
590
+ const [left, top, right] = [parse(cs.marginLeft), parse(cs.marginTop), parse(cs.marginRight)];
591
+ const gap = Math.max(0, window.innerWidth - document.documentElement.clientWidth + right - left);
592
+ const important = `!important`;
593
+ const css2 = `
594
+ .with-scroll-bars-hidden {
595
+ overflow: hidden ${important};
596
+ padding-right: ${gap}px ${important};
597
+ }
598
+ body[${LOCK_ATTRIBUTE}] {
599
+ overflow: hidden ${important};
600
+ overscroll-behavior: contain;
601
+ ${[`position: relative ${important};`, `
602
+ padding-left: ${left}px;
603
+ padding-top: ${top}px;
604
+ padding-right: ${right}px;
605
+ margin-left:0;
606
+ margin-top:0;
607
+ margin-right: ${gap}px ${important};
608
+ `].join(``)}
609
+ }
610
+
611
+ .right-scroll-bar-position {
612
+ right: ${gap}px ${important};
613
+ }
614
+
615
+ .width-before-scroll-bar {
616
+ margin-right: ${gap}px ${important};
617
+ }
618
+
619
+ .right-scroll-bar-position .right-scroll-bar-position {
620
+ right: 0 ${important};
621
+ }
622
+
623
+ .width-before-scroll-bar .width-before-scroll-bar {
624
+ margin-right: 0 ${important};
625
+ }
626
+
627
+ body[${LOCK_ATTRIBUTE}] {
628
+ --removed-body-scroll-bar-size: ${gap}px;
629
+ }
630
+ `;
631
+ lockSheet = document.createElement(`style`);
632
+ lockSheet.type = `text/css`;
633
+ lockSheet.appendChild(document.createTextNode(css2));
634
+ (document.head || document.getElementsByTagName(`head`)[0]).appendChild(lockSheet);
635
+ }
636
+ lockSheets++;
637
+ onCleanup(() => {
638
+ const n = count() - 1;
639
+ if (n <= 0) body.removeAttribute(LOCK_ATTRIBUTE);
640
+ else body.setAttribute(LOCK_ATTRIBUTE, String(n));
641
+ lockSheets--;
642
+ if (!lockSheets && lockSheet) {
643
+ lockSheet.remove();
644
+ lockSheet = null;
645
+ }
646
+ });
647
+ }
648
+ function useModalEffects(el, lockScroll) {
649
+ const undo = hideOthers(el);
650
+ onCleanup(undo);
651
+ if (lockScroll) useScrollLock();
652
+ }
653
+ var _tmpl$$3 = /* @__PURE__ */ template(`<div data-radix-popper-content-wrapper>`);
654
+ const transformOrigin = {
655
+ name: `transformOrigin`,
656
+ fn(data) {
657
+ const [placedSide, placedAlign = `center`] = data.placement.split(`-`);
658
+ const noArrowAlign = {
659
+ start: `0%`,
660
+ center: `50%`,
661
+ end: `100%`
662
+ }[placedAlign];
663
+ let x = ``;
664
+ let y = ``;
665
+ if (placedSide === `bottom`) {
666
+ x = noArrowAlign;
667
+ y = `${-0}px`;
668
+ } else if (placedSide === `top`) {
669
+ x = noArrowAlign;
670
+ y = `${data.rects.floating.height + 0}px`;
671
+ } else if (placedSide === `right`) {
672
+ x = `${-0}px`;
673
+ y = noArrowAlign;
674
+ } else if (placedSide === `left`) {
675
+ x = `${data.rects.floating.width + 0}px`;
676
+ y = noArrowAlign;
677
+ }
678
+ return {
679
+ data: {
680
+ x,
681
+ y
682
+ }
683
+ };
684
+ }
685
+ };
686
+ function Popper(props) {
687
+ const desired = () => props.align === `center` ? props.side : `${props.side}-${props.align}`;
688
+ const [placement, setPlacement] = createSignal(untrack(desired));
689
+ const [isPositioned, setPositioned] = createSignal(false);
690
+ const [content, setContent] = createSignal();
691
+ let pos = {
692
+ x: 0,
693
+ y: 0,
694
+ origin: void 0
695
+ };
696
+ let floatingSet = false;
697
+ let zIndex;
698
+ let disposed = false;
699
+ const wrapper = (() => {
700
+ var _el$ = _tmpl$$3();
701
+ effect(() => setAttribute(_el$, "dir", props.dir));
702
+ return _el$;
703
+ })();
704
+ const writeWrapper = styleWriter(wrapper);
705
+ const dpr = () => wrapper.ownerDocument.defaultView?.devicePixelRatio || 1;
706
+ const roundByDPR = (v) => Math.round(v * dpr()) / dpr();
707
+ const paintWrapper = () => {
708
+ const s = {
709
+ position: `fixed`,
710
+ left: `0`,
711
+ top: `0`
712
+ };
713
+ if (floatingSet) {
714
+ s.transform = `translate(${roundByDPR(pos.x)}px, ${roundByDPR(pos.y)}px)`;
715
+ if (dpr() >= 1.5) s[`will-change`] = `transform`;
716
+ }
717
+ s.transform = untrack(isPositioned) ? s.transform : `translate(0, -200%)`;
718
+ s[`min-width`] = `max-content`;
719
+ s[`z-index`] = zIndex || void 0;
720
+ s[`--radix-popper-transform-origin`] = [pos.origin?.x, pos.origin?.y].join(` `);
721
+ writeWrapper(s);
722
+ };
723
+ paintWrapper();
724
+ const state = {
725
+ placedSide: () => placement().split(`-`)[0],
726
+ placedAlign: () => placement().split(`-`)[1] ?? `center`,
727
+ isPositioned,
728
+ setContent
729
+ };
730
+ insert(wrapper, untrack(() => props.children(state)));
731
+ createEffect(() => {
732
+ const anchor = props.anchor;
733
+ const el = content();
734
+ if (!anchor || !el) return;
735
+ untrack(() => {
736
+ floatingSet = true;
737
+ paintWrapper();
738
+ zIndex = getComputedStyle(el).zIndex;
739
+ paintWrapper();
740
+ });
741
+ const padding = props.collisionPadding;
742
+ const detect = {
743
+ padding,
744
+ boundary: [],
745
+ altBoundary: false
746
+ };
747
+ const middleware = [offset({
748
+ mainAxis: props.sideOffset,
749
+ alignmentAxis: props.alignOffset ?? 0
750
+ }), shift({
751
+ mainAxis: true,
752
+ crossAxis: false,
753
+ limiter: limitShift(),
754
+ ...detect
755
+ }), flip({
756
+ ...detect
757
+ }), size({
758
+ ...detect,
759
+ apply: ({
760
+ elements,
761
+ rects,
762
+ availableWidth,
763
+ availableHeight
764
+ }) => {
765
+ const st = elements.floating.style;
766
+ st.setProperty(`--radix-popper-available-width`, `${availableWidth}px`);
767
+ st.setProperty(`--radix-popper-available-height`, `${availableHeight}px`);
768
+ st.setProperty(`--radix-popper-anchor-width`, `${rects.reference.width}px`);
769
+ st.setProperty(`--radix-popper-anchor-height`, `${rects.reference.height}px`);
770
+ }
771
+ }), transformOrigin];
772
+ const placementNow = desired();
773
+ const update = () => {
774
+ void computePosition(anchor, wrapper, {
775
+ strategy: `fixed`,
776
+ placement: placementNow,
777
+ middleware
778
+ }).then((d) => {
779
+ if (disposed) return;
780
+ const origin = d.middlewareData.transformOrigin;
781
+ const same = untrack(isPositioned) && pos.x === d.x && pos.y === d.y && pos.origin?.x === origin?.x && pos.origin?.y === origin?.y && untrack(placement) === d.placement;
782
+ if (same) return;
783
+ pos = {
784
+ x: d.x,
785
+ y: d.y,
786
+ origin
787
+ };
788
+ setPlacement(d.placement);
789
+ setPositioned(true);
790
+ paintWrapper();
791
+ });
792
+ };
793
+ const stop = autoUpdate(anchor, wrapper, update, {
794
+ animationFrame: false
795
+ });
796
+ onCleanup(stop);
797
+ });
798
+ onCleanup(() => disposed = true);
799
+ return wrapper;
800
+ }
801
+ function popperContentStyle(kind, trigger, pointerEvents, positioned, prefix = {}) {
802
+ return {
803
+ ...prefix,
804
+ "pointer-events": pointerEvents,
805
+ [`--radix-${kind}-content-transform-origin`]: `var(--radix-popper-transform-origin)`,
806
+ [`--radix-${kind}-content-available-width`]: `var(--radix-popper-available-width)`,
807
+ [`--radix-${kind}-content-available-height`]: `var(--radix-popper-available-height)`,
808
+ [`--radix-${kind}-${trigger}-width`]: `var(--radix-popper-anchor-width)`,
809
+ [`--radix-${kind}-${trigger}-height`]: `var(--radix-popper-anchor-height)`,
810
+ animation: positioned ? void 0 : `none`
811
+ };
812
+ }
813
+ function popperWrapper(opts) {
814
+ const [pos, setPos] = createSignal(null);
815
+ const [zIndex, setZIndex] = createSignal();
816
+ let contentEl;
817
+ const dpr = () => typeof window === `undefined` ? 1 : window.devicePixelRatio || 1;
818
+ const round = (v) => Math.round(v * dpr()) / dpr();
819
+ const placed = createMemo(() => {
820
+ const p = pos();
821
+ const [side, align = `center`] = (p?.placement ?? `bottom-${opts.align}`).split(`-`);
822
+ return {
823
+ side,
824
+ align: opts.align === `center` && !p ? `center` : align,
825
+ positioned: p !== null
826
+ };
827
+ });
828
+ const style$1 = () => {
829
+ const p = pos();
830
+ const s = {
831
+ position: `fixed`,
832
+ left: 0,
833
+ top: 0,
834
+ transform: p ? `translate(${round(p.x)}px, ${round(p.y)}px)` : `translate(0, -200%)`
835
+ };
836
+ if (dpr() >= 1.5) s.willChange = `transform`;
837
+ s.minWidth = `max-content`;
838
+ s.zIndex = zIndex();
839
+ s[`--radix-popper-transform-origin`] = p ? p.origin.join(` `) : ` `;
840
+ return css(s);
841
+ };
842
+ const wrapper = (() => {
843
+ var _el$2 = _tmpl$$3();
844
+ insert(_el$2, () => opts.content(placed, (el) => contentEl = el));
845
+ effect((_p$) => {
846
+ var _v$ = style$1(), _v$2 = opts.dir?.();
847
+ _p$.e = style(_el$2, _v$, _p$.e);
848
+ _v$2 !== _p$.t && setAttribute(_el$2, "dir", _p$.t = _v$2);
849
+ return _p$;
850
+ }, {
851
+ e: void 0,
852
+ t: void 0
853
+ });
854
+ return _el$2;
855
+ })();
856
+ onMount(() => {
857
+ if (contentEl) setZIndex(getComputedStyle(contentEl).zIndex);
858
+ const anchor = opts.anchor();
859
+ if (!anchor) return;
860
+ const detect = {
861
+ padding: opts.collisionPadding,
862
+ boundary: [],
863
+ altBoundary: false
864
+ };
865
+ let alive = true;
866
+ const update = () => void computePosition(anchor, wrapper, {
867
+ strategy: `fixed`,
868
+ placement: opts.align === `center` ? `bottom` : `bottom-${opts.align}`,
869
+ middleware: [offset({
870
+ mainAxis: opts.sideOffset,
871
+ alignmentAxis: 0
872
+ }), shift({
873
+ mainAxis: true,
874
+ crossAxis: false,
875
+ limiter: limitShift(),
876
+ ...detect
877
+ }), flip({
878
+ ...detect
879
+ }), size({
880
+ ...detect,
881
+ apply: ({
882
+ elements,
883
+ rects,
884
+ availableWidth,
885
+ availableHeight
886
+ }) => {
887
+ const st = elements.floating.style;
888
+ st.setProperty(`--radix-popper-available-width`, `${availableWidth}px`);
889
+ st.setProperty(`--radix-popper-available-height`, `${availableHeight}px`);
890
+ st.setProperty(`--radix-popper-anchor-width`, `${rects.reference.width}px`);
891
+ st.setProperty(`--radix-popper-anchor-height`, `${rects.reference.height}px`);
892
+ }
893
+ }), transformOrigin]
894
+ }).then((r) => {
895
+ if (!alive) return;
896
+ const first = pos() === null;
897
+ const origin = r.middlewareData.transformOrigin;
898
+ setPos({
899
+ x: r.x,
900
+ y: r.y,
901
+ placement: r.placement,
902
+ origin: [origin?.x ?? ``, origin?.y ?? ``]
903
+ });
904
+ if (first) opts.onPlaced?.();
905
+ });
906
+ const stop = autoUpdate(anchor, wrapper, update, {
907
+ animationFrame: false
908
+ });
909
+ onCleanup(() => {
910
+ alive = false;
911
+ stop();
912
+ });
913
+ });
914
+ return wrapper;
915
+ }
916
+ function inPolygon(point, polygon) {
917
+ let inside = false;
918
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
919
+ const a = polygon[i];
920
+ const b = polygon[j];
921
+ if (a.y > point.y !== b.y > point.y && point.x < (b.x - a.x) * (point.y - a.y) / (b.y - a.y) + a.x) inside = !inside;
922
+ }
923
+ return inside;
924
+ }
925
+ function hull(points) {
926
+ const sorted = [...points].sort((a, b) => a.x < b.x ? -1 : a.x > b.x ? 1 : a.y < b.y ? -1 : a.y > b.y ? 1 : 0);
927
+ if (sorted.length <= 1) return sorted;
928
+ const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
929
+ const upper = [];
930
+ for (const p of sorted) {
931
+ while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) >= 0) upper.pop();
932
+ upper.push(p);
933
+ }
934
+ upper.pop();
935
+ const lower = [];
936
+ for (let i = sorted.length - 1; i >= 0; i--) {
937
+ const p = sorted[i];
938
+ while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) >= 0) lower.pop();
939
+ lower.push(p);
940
+ }
941
+ lower.pop();
942
+ return upper.length === 1 && lower.length === 1 && upper[0].x === lower[0].x && upper[0].y === lower[0].y ? upper : upper.concat(lower);
943
+ }
944
+ function graceArea(exit, from, to) {
945
+ const padding = 5;
946
+ const top = Math.abs(from.top - exit.y);
947
+ const bottom = Math.abs(from.bottom - exit.y);
948
+ const right = Math.abs(from.right - exit.x);
949
+ const left = Math.abs(from.left - exit.x);
950
+ const m = Math.min(top, bottom, right, left);
951
+ const padded = m === left ? [{ x: exit.x + padding, y: exit.y - padding }, { x: exit.x + padding, y: exit.y + padding }] : m === right ? [{ x: exit.x - padding, y: exit.y - padding }, { x: exit.x - padding, y: exit.y + padding }] : m === top ? [{ x: exit.x - padding, y: exit.y + padding }, { x: exit.x + padding, y: exit.y + padding }] : [{ x: exit.x - padding, y: exit.y - padding }, { x: exit.x + padding, y: exit.y - padding }];
952
+ return hull([...padded, { x: to.left, y: to.top }, { x: to.right, y: to.top }, { x: to.right, y: to.bottom }, { x: to.left, y: to.bottom }]);
953
+ }
954
+ var _tmpl$$2 = /* @__PURE__ */ template(`<span role=tooltip>`);
955
+ function VisuallyHidden(props) {
956
+ const el = (() => {
957
+ var _el$ = _tmpl$$2();
958
+ insert(_el$, () => props.children);
959
+ effect(() => setAttribute(_el$, "id", props.id));
960
+ return _el$;
961
+ })();
962
+ styleWriter(el)({
963
+ position: `absolute`,
964
+ border: `0`,
965
+ width: `1px`,
966
+ height: `1px`,
967
+ padding: `0`,
968
+ margin: `-1px`,
969
+ overflow: `hidden`,
970
+ clip: `rect(0, 0, 0, 0)`,
971
+ "white-space": `nowrap`,
972
+ "word-wrap": `normal`
973
+ });
974
+ return el;
975
+ }
976
+ const wrapArray = (array, start) => array.map((_, i) => array[(start + i) % array.length]);
977
+ function getNextMatch(values, search, currentMatch) {
978
+ const isRepeated = search.length > 1 && Array.from(search).every((c) => c === search[0]);
979
+ const normalized = isRepeated ? search[0] : search;
980
+ const currentIndex = currentMatch ? values.indexOf(currentMatch) : -1;
981
+ let wrapped = wrapArray(values, Math.max(currentIndex, 0));
982
+ if (normalized.length === 1) wrapped = wrapped.filter((v) => v !== currentMatch);
983
+ const next = wrapped.find((v) => v.toLowerCase().startsWith(normalized.toLowerCase()));
984
+ return next !== currentMatch ? next : void 0;
985
+ }
986
+ function radixTypeahead(onSearch) {
987
+ let search = ``;
988
+ let timer = 0;
989
+ const update = (v) => {
990
+ search = v;
991
+ window.clearTimeout(timer);
992
+ if (v !== ``) timer = window.setTimeout(() => update(``), 1e3);
993
+ };
994
+ onCleanup(() => window.clearTimeout(timer));
995
+ return {
996
+ get search() {
997
+ return search;
998
+ },
999
+ type: (key) => {
1000
+ const next = search + key;
1001
+ onSearch(next);
1002
+ update(next);
1003
+ },
1004
+ reset: () => {
1005
+ search = ``;
1006
+ window.clearTimeout(timer);
1007
+ }
1008
+ };
1009
+ }
1010
+ function findNextItem(items, search, current) {
1011
+ const repeated = search.length > 1 && Array.from(search).every((c) => c === search[0]);
1012
+ const normalized = repeated ? search[0] : search;
1013
+ const at = current ? items.indexOf(current) : -1;
1014
+ let wrapped = items.map((_, i) => items[(Math.max(at, 0) + i) % items.length]);
1015
+ if (normalized.length === 1) wrapped = wrapped.filter((v) => v !== current);
1016
+ const next = wrapped.find((item) => item.label.toLowerCase().startsWith(normalized.toLowerCase()));
1017
+ return next !== current ? next : void 0;
1018
+ }
1019
+ var _tmpl$$1 = /* @__PURE__ */ template(`<div role=menu aria-orientation=vertical data-radix-menu-content>`);
1020
+ let usingKeyboard = false;
1021
+ let keyboardListeners = 0;
1022
+ function useKeyboardTracking() {
1023
+ const key = () => usingKeyboard = true;
1024
+ const pointer = () => usingKeyboard = false;
1025
+ if (keyboardListeners++ === 0) {
1026
+ document.addEventListener(`keydown`, key, {
1027
+ capture: true
1028
+ });
1029
+ document.addEventListener(`pointerdown`, pointer, {
1030
+ capture: true
1031
+ });
1032
+ document.addEventListener(`pointermove`, pointer, {
1033
+ capture: true
1034
+ });
1035
+ }
1036
+ onCleanup(() => {
1037
+ if (--keyboardListeners === 0) {
1038
+ document.removeEventListener(`keydown`, key, {
1039
+ capture: true
1040
+ });
1041
+ document.removeEventListener(`pointerdown`, pointer, {
1042
+ capture: true
1043
+ });
1044
+ document.removeEventListener(`pointermove`, pointer, {
1045
+ capture: true
1046
+ });
1047
+ }
1048
+ });
1049
+ }
1050
+ const MenuLevelContext = createContext();
1051
+ const FIRST_KEYS = [`ArrowDown`, `PageUp`, `Home`];
1052
+ const LAST_KEYS = [`ArrowUp`, `PageDown`, `End`];
1053
+ const itemsOf = (content) => content ? Array.from(content.querySelectorAll(`:scope [data-radix-collection-item]`)).filter((el) => el.closest(`[data-radix-menu-content]`) === content) : [];
1054
+ function MenuContent(props) {
1055
+ const layer = createLayer({
1056
+ disableOutsidePointerEvents: () => props.root,
1057
+ onEscapeKeyDown: (e) => props.onEscapeKeyDown?.(e),
1058
+ onFocusOutside: (e) => {
1059
+ if (props.root) e.preventDefault();
1060
+ props.onFocusOutside?.(e);
1061
+ },
1062
+ onInteractOutside: (e) => props.onInteractOutside?.(e),
1063
+ onDismiss: () => props.onDismiss()
1064
+ });
1065
+ const scope = createFocusScope({
1066
+ trapped: () => props.root,
1067
+ loop: false,
1068
+ onMountAutoFocus: (e) => {
1069
+ e.preventDefault();
1070
+ if (props.root || usingKeyboard) contentEl?.focus({
1071
+ preventScroll: true
1072
+ });
1073
+ },
1074
+ onUnmountAutoFocus: (e) => props.onCloseAutoFocus(e)
1075
+ });
1076
+ const [registered, setRegistered] = createSignal(false);
1077
+ const [highlighted, setHighlighted] = createSignal();
1078
+ const [tabStop, setTabStop] = createSignal();
1079
+ let contentEl;
1080
+ let search = ``;
1081
+ let searchTimer;
1082
+ let grace = null;
1083
+ let pointerDir = `right`;
1084
+ let lastPointerX = 0;
1085
+ const movingToSubmenu = (e) => Boolean(grace && pointerDir === grace.side && inPolygon({
1086
+ x: e.clientX,
1087
+ y: e.clientY
1088
+ }, grace.area));
1089
+ const level = {
1090
+ content: () => contentEl,
1091
+ highlighted,
1092
+ setHighlighted,
1093
+ tabStop,
1094
+ setTabStop,
1095
+ search: () => search,
1096
+ onItemEnter: (e) => movingToSubmenu(e),
1097
+ onItemLeave: (e) => {
1098
+ if (movingToSubmenu(e)) return;
1099
+ contentEl?.focus({
1100
+ preventScroll: true
1101
+ });
1102
+ setTabStop(void 0);
1103
+ },
1104
+ onTriggerLeave: (e) => movingToSubmenu(e),
1105
+ setGrace: (g) => grace = g
1106
+ };
1107
+ onCleanup(() => clearTimeout(searchTimer));
1108
+ const typeahead = (key) => {
1109
+ const next = search + key;
1110
+ const items = itemsOf(contentEl).filter((el) => !el.hasAttribute(`data-disabled`));
1111
+ const current = document.activeElement;
1112
+ const currentMatch = items.find((el) => el === current)?.textContent ?? void 0;
1113
+ const values = items.map((el) => el.textContent ?? ``);
1114
+ const match = getNextMatch(values, next, currentMatch);
1115
+ const target = items.find((el) => (el.textContent ?? ``) === match);
1116
+ const update = (value) => {
1117
+ search = value;
1118
+ clearTimeout(searchTimer);
1119
+ if (value !== ``) searchTimer = setTimeout(() => update(``), 1e3);
1120
+ };
1121
+ update(next);
1122
+ if (target) setTimeout(() => target.focus());
1123
+ };
1124
+ return createComponent(Popper, {
1125
+ get anchor() {
1126
+ return props.anchor;
1127
+ },
1128
+ get side() {
1129
+ return props.side;
1130
+ },
1131
+ get align() {
1132
+ return props.align;
1133
+ },
1134
+ get sideOffset() {
1135
+ return props.sideOffset;
1136
+ },
1137
+ get alignOffset() {
1138
+ return props.alignOffset;
1139
+ },
1140
+ get collisionPadding() {
1141
+ return props.collisionPadding ?? OVERLAY_PADDING;
1142
+ },
1143
+ get dir() {
1144
+ return props.dir;
1145
+ },
1146
+ children: (popper) => {
1147
+ const el = (() => {
1148
+ var _el$ = _tmpl$$1();
1149
+ spread(_el$, mergeProps({
1150
+ get ["data-side"]() {
1151
+ return popper.placedSide();
1152
+ },
1153
+ get ["data-align"]() {
1154
+ return popper.placedAlign();
1155
+ },
1156
+ get ["data-state"]() {
1157
+ return props.state();
1158
+ },
1159
+ get dir() {
1160
+ return props.dir;
1161
+ },
1162
+ get id() {
1163
+ return props.id;
1164
+ },
1165
+ get ["aria-labelledby"]() {
1166
+ return props.labelledBy;
1167
+ }
1168
+ }, () => props.attrs(), {
1169
+ "tabindex": "-1",
1170
+ "data-orientation": "vertical",
1171
+ "onKeyDown": (e) => {
1172
+ scope.onKeyDown(e);
1173
+ const target = e.target;
1174
+ const inside = target.closest(`[data-radix-menu-content]`) === el;
1175
+ const modifier = e.ctrlKey || e.altKey || e.metaKey;
1176
+ if (inside) {
1177
+ if (e.key === `Tab`) e.preventDefault();
1178
+ if (!modifier && e.key.length === 1) typeahead(e.key);
1179
+ }
1180
+ props.onKeyDown?.(e);
1181
+ if (e.target !== el) return;
1182
+ if (!FIRST_KEYS.includes(e.key) && !LAST_KEYS.includes(e.key)) return;
1183
+ e.preventDefault();
1184
+ const nodes = itemsOf(el).filter((n) => !n.hasAttribute(`data-disabled`));
1185
+ if (LAST_KEYS.includes(e.key)) nodes.reverse();
1186
+ focusFirst(nodes);
1187
+ },
1188
+ "onFocus": (e) => {
1189
+ if (e.target !== el || !usingKeyboard) return;
1190
+ const nodes = itemsOf(el).filter((n) => !n.hasAttribute(`data-disabled`));
1191
+ const current = untrack(tabStop);
1192
+ focusFirst([current, ...nodes].filter(Boolean));
1193
+ },
1194
+ "onPointerMove": (e) => {
1195
+ if (e.pointerType !== `mouse`) return;
1196
+ if (el.contains(e.target) && lastPointerX !== e.clientX) {
1197
+ pointerDir = e.clientX > lastPointerX ? `right` : `left`;
1198
+ lastPointerX = e.clientX;
1199
+ }
1200
+ }
1201
+ }), false, true);
1202
+ insert(_el$, createComponent(LayerContext.Provider, {
1203
+ get value() {
1204
+ return layer.layer;
1205
+ },
1206
+ get children() {
1207
+ return createComponent(MenuLevelContext.Provider, {
1208
+ value: level,
1209
+ get children() {
1210
+ return props.children;
1211
+ }
1212
+ });
1213
+ }
1214
+ }));
1215
+ return _el$;
1216
+ })();
1217
+ contentEl = el;
1218
+ props.setContent?.(el);
1219
+ onCleanup(() => props.setContent?.(void 0));
1220
+ popper.setContent(el);
1221
+ bindStyle(el, () => popperContentStyle(props.kind, `trigger`, props.lagParentLayer && !registered() ? void 0 : layer.pointerEvents(registered()), popper.isPositioned(), {
1222
+ outline: `none`
1223
+ }));
1224
+ onMount(() => {
1225
+ layer.attach(el);
1226
+ setRegistered(true);
1227
+ scope.attach(el);
1228
+ useFocusGuards();
1229
+ if (props.root) useModalEffects(el, true);
1230
+ });
1231
+ return el;
1232
+ }
1233
+ });
1234
+ }
1235
+ function createMenuRow(disabled) {
1236
+ const level = useContext(MenuLevelContext);
1237
+ let el;
1238
+ const attrs = () => ({
1239
+ tabindex: level.tabStop() === el && el !== void 0 ? `0` : `-1`,
1240
+ "data-orientation": `vertical`,
1241
+ "data-radix-collection-item": ``,
1242
+ "data-highlighted": level.highlighted() === el && el !== void 0 ? `` : void 0,
1243
+ "aria-disabled": disabled() ? `true` : void 0,
1244
+ "data-disabled": disabled() ? `` : void 0
1245
+ });
1246
+ const handlers = {
1247
+ onFocus: () => {
1248
+ level.setHighlighted(el);
1249
+ if (!untrack(disabled)) level.setTabStop(el);
1250
+ },
1251
+ onBlur: () => {
1252
+ if (untrack(level.highlighted) === el) level.setHighlighted(void 0);
1253
+ },
1254
+ onPointerMove: (e) => {
1255
+ if (e.pointerType !== `mouse`) return;
1256
+ if (untrack(disabled)) level.onItemLeave(e);
1257
+ else if (!level.onItemEnter(e)) el?.focus({
1258
+ preventScroll: true
1259
+ });
1260
+ },
1261
+ onPointerLeave: (e) => {
1262
+ if (e.pointerType !== `mouse`) return;
1263
+ level.onItemLeave(e);
1264
+ },
1265
+ onKeyDown: (e) => {
1266
+ if (e.target !== e.currentTarget) return;
1267
+ const intent = e.key === `ArrowUp` ? `prev` : e.key === `ArrowDown` ? `next` : e.key === `Home` || e.key === `PageUp` ? `first` : e.key === `End` || e.key === `PageDown` ? `last` : void 0;
1268
+ if (!intent || e.metaKey || e.ctrlKey || e.altKey || e.shiftKey) return;
1269
+ e.preventDefault();
1270
+ let candidates = itemsOf(level.content()).filter((n) => !n.hasAttribute(`data-disabled`));
1271
+ if (intent === `last`) candidates.reverse();
1272
+ else if (intent === `prev` || intent === `next`) {
1273
+ if (intent === `prev`) candidates.reverse();
1274
+ const at = candidates.indexOf(e.currentTarget);
1275
+ candidates = candidates.slice(at + 1);
1276
+ }
1277
+ focusFirst(candidates);
1278
+ }
1279
+ };
1280
+ return {
1281
+ attrs,
1282
+ handlers,
1283
+ ref: (node) => el = node,
1284
+ level
1285
+ };
1286
+ }
1287
+ function createSelectable(disabled, onSelect, close) {
1288
+ const row = createMenuRow(disabled);
1289
+ let pointerDownHere = false;
1290
+ const select = () => {
1291
+ if (untrack(disabled)) return;
1292
+ const e = new CustomEvent(`menu.itemSelect`, {
1293
+ bubbles: true,
1294
+ cancelable: true
1295
+ });
1296
+ onSelect(e);
1297
+ if (e.defaultPrevented) pointerDownHere = false;
1298
+ else close();
1299
+ };
1300
+ const handlers = {
1301
+ ...row.handlers,
1302
+ onClick: select,
1303
+ onPointerDown: () => pointerDownHere = true,
1304
+ onPointerUp: (e) => {
1305
+ if (!pointerDownHere) e.currentTarget?.click();
1306
+ },
1307
+ onKeyDown: (e) => {
1308
+ row.handlers.onKeyDown(e);
1309
+ if (e.defaultPrevented) return;
1310
+ const typingAhead = row.level.search() !== ``;
1311
+ if (untrack(disabled) || typingAhead && e.key === ` `) return;
1312
+ if (e.key === `Enter` || e.key === ` `) {
1313
+ e.currentTarget.click();
1314
+ e.preventDefault();
1315
+ }
1316
+ }
1317
+ };
1318
+ return {
1319
+ ...row,
1320
+ handlers
1321
+ };
1322
+ }
1323
+ const KEY_INTENT = { ArrowLeft: `prev`, ArrowUp: `prev`, ArrowRight: `next`, ArrowDown: `next`, PageUp: `first`, Home: `first`, PageDown: `last`, End: `last` };
1324
+ function focusIntent(e, orientation, dir) {
1325
+ let key = e.key;
1326
+ if (dir === `rtl`) key = key === `ArrowLeft` ? `ArrowRight` : key === `ArrowRight` ? `ArrowLeft` : key;
1327
+ if (orientation === `vertical` && (key === `ArrowLeft` || key === `ArrowRight`)) return void 0;
1328
+ if (orientation === `horizontal` && (key === `ArrowUp` || key === `ArrowDown`)) return void 0;
1329
+ return KEY_INTENT[key];
1330
+ }
1331
+ function rovingFocusFirst(candidates) {
1332
+ const previous = document.activeElement;
1333
+ for (const candidate of candidates) {
1334
+ if (!candidate) continue;
1335
+ if (candidate === previous) return;
1336
+ candidate.focus();
1337
+ if (document.activeElement !== previous) return;
1338
+ }
1339
+ }
1340
+ function createRovingGroup(opts) {
1341
+ const [stop, setStop] = createSignal(null);
1342
+ const [tabbingBackOut, setTabbingBackOut] = createSignal(false);
1343
+ let clickFocus = false;
1344
+ const group = () => ({ tabindex: tabbingBackOut() ? -1 : 0, "data-orientation": opts.orientation });
1345
+ const groupHandlers = {
1346
+ onMouseDown: () => void (clickFocus = true),
1347
+ onFocusIn: (e) => {
1348
+ const keyboard = !clickFocus;
1349
+ if (e.target === e.currentTarget && keyboard && !tabbingBackOut()) {
1350
+ const items = opts.items().filter(opts.focusable);
1351
+ const activeItem = items.find(opts.active);
1352
+ const current = items.find((el) => el === stop());
1353
+ rovingFocusFirst([activeItem, current, ...items].filter((el) => Boolean(el)));
1354
+ }
1355
+ clickFocus = false;
1356
+ },
1357
+ onFocusOut: () => setTabbingBackOut(false)
1358
+ };
1359
+ const item = (el, focusable) => ({
1360
+ tabindex: () => stop() !== null && stop() === el() ? 0 : -1,
1361
+ onMouseDown: (e) => {
1362
+ if (!focusable()) e.preventDefault();
1363
+ else setStop(el() ?? null);
1364
+ },
1365
+ onFocus: () => setStop(el() ?? null),
1366
+ onKeyDown: (e) => {
1367
+ if (e.key === `Tab` && e.shiftKey) {
1368
+ setTabbingBackOut(true);
1369
+ return;
1370
+ }
1371
+ if (e.target !== e.currentTarget) return;
1372
+ const intent = focusIntent(e, opts.orientation, opts.dir());
1373
+ if (intent === void 0) return;
1374
+ if (e.metaKey || e.ctrlKey || e.altKey || e.shiftKey) return;
1375
+ e.preventDefault();
1376
+ let candidates = opts.items().filter(opts.focusable);
1377
+ if (intent === `last`) candidates.reverse();
1378
+ else if (intent === `prev` || intent === `next`) {
1379
+ if (intent === `prev`) candidates.reverse();
1380
+ const at = candidates.indexOf(e.currentTarget);
1381
+ candidates = opts.loop ? wrapArray(candidates, at + 1) : candidates.slice(at + 1);
1382
+ }
1383
+ setTimeout(() => rovingFocusFirst(candidates));
1384
+ }
1385
+ });
1386
+ return { group, groupHandlers, item };
1387
+ }
1388
+ function createListNavigation(o) {
1389
+ const isDisabled = o.isDisabled ?? (() => false);
1390
+ const labelOf = o.labelOf ?? (() => ``);
1391
+ const typeahead = o.typeahead ?? (() => false);
1392
+ const [active, setActive] = createSignal(o.initial ?? -1);
1393
+ let buffer = { text: ``, at: 0 };
1394
+ createEffect(() => {
1395
+ const count = o.count();
1396
+ if (active() >= count) setActive(count - 1);
1397
+ });
1398
+ const move = (from, delta) => nextEnabledIndex(o.count(), from, delta, isDisabled);
1399
+ const onKeyDown = (e) => {
1400
+ const count = o.count();
1401
+ const a = active();
1402
+ if (e.key === `ArrowDown`) {
1403
+ e.preventDefault();
1404
+ setActive(move(a < 0 ? -1 : a, 1));
1405
+ } else if (e.key === `ArrowUp`) {
1406
+ e.preventDefault();
1407
+ setActive(move(a < 0 ? 0 : a, -1));
1408
+ } else if (e.key === `Home`) {
1409
+ e.preventDefault();
1410
+ setActive(move(-1, 1));
1411
+ } else if (e.key === `End`) {
1412
+ e.preventDefault();
1413
+ setActive(move(0, -1));
1414
+ } else if (e.key === `Enter` || e.key === ` ` && typeahead() && buffer.text === ``) {
1415
+ if (a >= 0 && a < count && !isDisabled(a)) {
1416
+ e.preventDefault();
1417
+ o.onPick(a);
1418
+ }
1419
+ } else if (typeahead() && e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {
1420
+ const step = typeaheadStep(buffer, e.key, Date.now(), a, count, isDisabled, labelOf);
1421
+ buffer = step.buffer;
1422
+ if (step.index >= 0) setActive(step.index);
1423
+ }
1424
+ };
1425
+ return { active, setActive, onKeyDown };
1426
+ }
1427
+ function createListNavigationSync(o) {
1428
+ const isDisabled = o.isDisabled ?? (() => false);
1429
+ const labelOf = o.labelOf ?? (() => ``);
1430
+ const [active, setActive] = createSignal(o.initial ?? -1);
1431
+ let buffer = { text: ``, at: 0 };
1432
+ createComputed(() => {
1433
+ const c = o.count();
1434
+ if (untrack(active) >= c) setActive(c - 1);
1435
+ });
1436
+ const move = (from, delta) => nextEnabledIndex(o.count(), from, delta, isDisabled);
1437
+ const onKeyDown = (e) => {
1438
+ const count = o.count();
1439
+ const a = active();
1440
+ if (e.key === `ArrowDown`) {
1441
+ e.preventDefault();
1442
+ setActive(move(a < 0 ? -1 : a, 1));
1443
+ } else if (e.key === `ArrowUp`) {
1444
+ e.preventDefault();
1445
+ setActive(move(a < 0 ? 0 : a, -1));
1446
+ } else if (e.key === `Home`) {
1447
+ e.preventDefault();
1448
+ setActive(move(-1, 1));
1449
+ } else if (e.key === `End`) {
1450
+ e.preventDefault();
1451
+ setActive(move(0, -1));
1452
+ } else if (e.key === `Enter` || e.key === ` ` && o.typeahead && buffer.text === ``) {
1453
+ if (a >= 0 && a < count && !isDisabled(a)) {
1454
+ e.preventDefault();
1455
+ o.onPick(a);
1456
+ }
1457
+ } else if (o.typeahead && e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {
1458
+ const step = typeaheadStep(buffer, e.key, Date.now(), a, count, isDisabled, labelOf);
1459
+ buffer = step.buffer;
1460
+ if (step.index >= 0) setActive(step.index);
1461
+ }
1462
+ };
1463
+ return { active, setActive: (i) => setActive(i), onKeyDown };
1464
+ }
1465
+ const OPEN_KEYS = [` `, `Enter`, `ArrowUp`, `ArrowDown`];
1466
+ const SELECTION_KEYS = [` `, `Enter`];
1467
+ function createElementSize(el) {
1468
+ const [size2, setSize] = createSignal(void 0, { equals: (a, b) => a?.width === b?.width && a?.height === b?.height });
1469
+ createEffect(() => {
1470
+ const node = el();
1471
+ if (!node) return setSize(void 0);
1472
+ setSize({ width: node.offsetWidth, height: node.offsetHeight });
1473
+ if (typeof ResizeObserver === `undefined`) return;
1474
+ const ro = new ResizeObserver((entries) => {
1475
+ const entry = entries[0];
1476
+ if (!entry) return;
1477
+ let width;
1478
+ let height;
1479
+ if (`borderBoxSize` in entry && entry.borderBoxSize) {
1480
+ const box = Array.isArray(entry.borderBoxSize) ? entry.borderBoxSize[0] : entry.borderBoxSize;
1481
+ width = box.inlineSize;
1482
+ height = box.blockSize;
1483
+ } else {
1484
+ width = node.offsetWidth;
1485
+ height = node.offsetHeight;
1486
+ }
1487
+ setSize({ width, height });
1488
+ });
1489
+ ro.observe(node, { box: `border-box` });
1490
+ onCleanup(() => ro.unobserve(node));
1491
+ });
1492
+ return size2;
1493
+ }
1494
+ var _tmpl$ = /* @__PURE__ */ template(`<input aria-hidden=true tabindex=-1>`), _tmpl$2 = /* @__PURE__ */ template(`<input>`), _tmpl$3 = /* @__PURE__ */ template(`<select aria-hidden=true tabindex=-1>`), _tmpl$4 = /* @__PURE__ */ template(`<option value>`), _tmpl$5 = /* @__PURE__ */ template(`<option>`);
1495
+ function createInForm(el) {
1496
+ const [inForm, setInForm] = createSignal(false);
1497
+ onMount(() => setInForm(Boolean(el()?.closest(`form`))));
1498
+ return inForm;
1499
+ }
1500
+ function bubbleOnChange(input, value, apply, event, bubbles = () => true) {
1501
+ createEffect(on(value, (v) => {
1502
+ const el = input();
1503
+ if (!el) return;
1504
+ apply(el, v);
1505
+ el.dispatchEvent(new Event(event, {
1506
+ bubbles: bubbles()
1507
+ }));
1508
+ }, {
1509
+ defer: true
1510
+ }));
1511
+ }
1512
+ const setChecked = (el, v) => Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, `checked`)?.set?.call(el, v);
1513
+ function BubbleCheck(props) {
1514
+ let input;
1515
+ const size2 = createElementSize(() => props.control);
1516
+ const initial = untrack(() => props.checked);
1517
+ bubbleOnChange(() => input, () => props.checked, setChecked, `click`, props.bubbles);
1518
+ const style$1 = () => {
1519
+ const s = size2();
1520
+ const box = s ? {
1521
+ width: s.width,
1522
+ height: s.height
1523
+ } : {};
1524
+ const fixed = {
1525
+ position: `absolute`,
1526
+ pointerEvents: `none`,
1527
+ opacity: 0,
1528
+ margin: 0
1529
+ };
1530
+ return css(props.transformFirst ? {
1531
+ transform: `translateX(-100%)`,
1532
+ ...box,
1533
+ ...fixed
1534
+ } : {
1535
+ ...box,
1536
+ ...fixed,
1537
+ transform: `translateX(-100%)`
1538
+ });
1539
+ };
1540
+ return (() => {
1541
+ var _el$ = _tmpl$();
1542
+ var _ref$ = input;
1543
+ typeof _ref$ === "function" ? use(_ref$, _el$) : input = _el$;
1544
+ setAttribute(_el$, "checked", initial ? `` : void 0);
1545
+ effect((_p$) => {
1546
+ var _v$ = props.type, _v$2 = props.name, _v$3 = props.disabled, _v$4 = style$1();
1547
+ _v$ !== _p$.e && setAttribute(_el$, "type", _p$.e = _v$);
1548
+ _v$2 !== _p$.t && setAttribute(_el$, "name", _p$.t = _v$2);
1549
+ _v$3 !== _p$.a && (_el$.disabled = _p$.a = _v$3);
1550
+ _p$.o = style(_el$, _v$4, _p$.o);
1551
+ return _p$;
1552
+ }, {
1553
+ e: void 0,
1554
+ t: void 0,
1555
+ a: void 0,
1556
+ o: void 0
1557
+ });
1558
+ effect(() => _el$.value = props.value);
1559
+ return _el$;
1560
+ })();
1561
+ }
1562
+ function SliderBubble(props) {
1563
+ let input;
1564
+ const initial = untrack(() => String(props.value));
1565
+ bubbleOnChange(() => input, () => props.value, (el, v) => Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, `value`)?.set?.call(el, v), `input`);
1566
+ return (() => {
1567
+ var _el$2 = _tmpl$2();
1568
+ var _ref$2 = input;
1569
+ typeof _ref$2 === "function" ? use(_ref$2, _el$2) : input = _el$2;
1570
+ setAttribute(_el$2, "value", initial);
1571
+ effect((_p$) => {
1572
+ var _v$5 = css({
1573
+ display: `none`
1574
+ }), _v$6 = props.name;
1575
+ _p$.e = style(_el$2, _v$5, _p$.e);
1576
+ _v$6 !== _p$.t && setAttribute(_el$2, "name", _p$.t = _v$6);
1577
+ return _p$;
1578
+ }, {
1579
+ e: void 0,
1580
+ t: void 0
1581
+ });
1582
+ return _el$2;
1583
+ })();
1584
+ }
1585
+ function NativeSelect(props) {
1586
+ let el;
1587
+ const initial = untrack(() => props.value);
1588
+ createEffect(on(() => props.value, (v) => {
1589
+ if (!el) return;
1590
+ Object.getOwnPropertyDescriptor(window.HTMLSelectElement.prototype, `value`)?.set?.call(el, v);
1591
+ el.dispatchEvent(new Event(`change`, {
1592
+ bubbles: true
1593
+ }));
1594
+ }, {
1595
+ defer: true
1596
+ }));
1597
+ const hidden = css({
1598
+ position: `absolute`,
1599
+ border: 0,
1600
+ width: 1,
1601
+ height: 1,
1602
+ padding: 0,
1603
+ margin: -1,
1604
+ overflow: `hidden`,
1605
+ clip: `rect(0, 0, 0, 0)`,
1606
+ whiteSpace: `nowrap`,
1607
+ wordWrap: `normal`
1608
+ });
1609
+ return (() => {
1610
+ var _el$3 = _tmpl$3();
1611
+ _el$3.addEventListener("change", (e) => props.onChange(e.currentTarget.value));
1612
+ var _ref$3 = el;
1613
+ typeof _ref$3 === "function" ? use(_ref$3, _el$3) : el = _el$3;
1614
+ insert(_el$3, initial === void 0 ? _tmpl$4() : null, null);
1615
+ insert(_el$3, createComponent(For, {
1616
+ get each() {
1617
+ return props.options;
1618
+ },
1619
+ children: (o) => (() => {
1620
+ var _el$5 = _tmpl$5();
1621
+ insert(_el$5, () => str(o.label));
1622
+ effect((_p$) => {
1623
+ var _v$0 = bool(o.disabled), _v$1 = initial !== void 0 && o.value === initial ? `` : void 0;
1624
+ _v$0 !== _p$.e && (_el$5.disabled = _p$.e = _v$0);
1625
+ _v$1 !== _p$.t && setAttribute(_el$5, "selected", _p$.t = _v$1);
1626
+ return _p$;
1627
+ }, {
1628
+ e: void 0,
1629
+ t: void 0
1630
+ });
1631
+ effect(() => _el$5.value = o.value);
1632
+ return _el$5;
1633
+ })()
1634
+ }), null);
1635
+ effect((_p$) => {
1636
+ var _v$7 = props.name, _v$8 = props.disabled, _v$9 = hidden;
1637
+ _v$7 !== _p$.e && setAttribute(_el$3, "name", _p$.e = _v$7);
1638
+ _v$8 !== _p$.t && (_el$3.disabled = _p$.t = _v$8);
1639
+ _p$.a = style(_el$3, _v$9, _p$.a);
1640
+ return _p$;
1641
+ }, {
1642
+ e: void 0,
1643
+ t: void 0,
1644
+ a: void 0
1645
+ });
1646
+ return _el$3;
1647
+ })();
1648
+ }
1649
+ function createImageLoadingStatus(src) {
1650
+ const [status, setStatus] = createSignal(`idle`);
1651
+ const image = typeof window === `undefined` ? null : new window.Image();
1652
+ const resolve = (s) => {
1653
+ if (!image) return `idle`;
1654
+ if (!s) return `error`;
1655
+ if (image.src !== s) image.src = s;
1656
+ return image.complete && image.naturalWidth > 0 ? `loaded` : `loading`;
1657
+ };
1658
+ createComputed(() => setStatus(resolve(src())));
1659
+ if (image) {
1660
+ const loaded = () => setStatus(`loaded`);
1661
+ const errored = () => setStatus(`error`);
1662
+ image.addEventListener(`load`, loaded);
1663
+ image.addEventListener(`error`, errored);
1664
+ onCleanup(() => {
1665
+ image.removeEventListener(`load`, loaded);
1666
+ image.removeEventListener(`error`, errored);
1667
+ });
1668
+ }
1669
+ return status;
1670
+ }
1671
+ export {
1672
+ findNextItem as A,
1673
+ BubbleCheck as B,
1674
+ CHROME as C,
1675
+ dismissable as D,
1676
+ popperWrapper as E,
1677
+ mountIn as F,
1678
+ SELECTION_KEYS as G,
1679
+ createMediaQuery as H,
1680
+ IconGlyph as I,
1681
+ px as J,
1682
+ KEY_INTENT as K,
1683
+ LayerPortal as L,
1684
+ MenuContent as M,
1685
+ NativeSelect as N,
1686
+ OPEN_KEYS as O,
1687
+ PaintIcon as P,
1688
+ FALLBACK_ICONS as Q,
1689
+ resolveIcon as R,
1690
+ SliderBubble as S,
1691
+ bubbleOnChange as T,
1692
+ focusIntent as U,
1693
+ VisuallyHidden as V,
1694
+ wrapArray as W,
1695
+ styleWriter as X,
1696
+ setChecked as Y,
1697
+ createElementSize$1 as a,
1698
+ createListNavigation as b,
1699
+ css as c,
1700
+ createListNavigationSync as d,
1701
+ createElementSize as e,
1702
+ createInForm as f,
1703
+ createImageLoadingStatus as g,
1704
+ createRovingGroup as h,
1705
+ createPresence as i,
1706
+ createLayer as j,
1707
+ Popper as k,
1708
+ bindStyle as l,
1709
+ LayerContext as m,
1710
+ useKeyboardTracking as n,
1711
+ graceArea as o,
1712
+ createFocusScope as p,
1713
+ useScrollLock as q,
1714
+ rovingFocusFirst as r,
1715
+ useModalEffects as s,
1716
+ transformOrigin as t,
1717
+ useFocusGuards as u,
1718
+ createMenuRow as v,
1719
+ createSelectable as w,
1720
+ popperContentStyle as x,
1721
+ inPolygon as y,
1722
+ radixTypeahead as z
1723
+ };
1724
+ //# sourceMappingURL=image-loading-status-DZOoj4RQ.js.map