@expcat/tigercat-vue 2.0.4 → 2.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 (114) hide show
  1. package/README.md +20 -10
  2. package/dist/chunk-26QCTL2E.mjs +180 -0
  3. package/dist/{chunk-GS4SV2HK.mjs → chunk-32X54QKW.mjs} +1 -1
  4. package/dist/chunk-3ONCXHE5.mjs +184 -0
  5. package/dist/{chunk-KOG3HKOF.mjs → chunk-6AMWX5K4.mjs} +1 -4
  6. package/dist/chunk-6GR3XC5V.mjs +281 -0
  7. package/dist/chunk-6GR5U4UB.mjs +225 -0
  8. package/dist/chunk-7DWWNFRP.mjs +302 -0
  9. package/dist/chunk-AECXFT7D.mjs +121 -0
  10. package/dist/chunk-AOLRZG4E.mjs +347 -0
  11. package/dist/chunk-AY7CGLMO.mjs +368 -0
  12. package/dist/chunk-BBNCP55O.mjs +156 -0
  13. package/dist/chunk-F3ZVVVYD.mjs +257 -0
  14. package/dist/{chunk-OTGGPXDT.mjs → chunk-IEAEB4TX.mjs} +255 -44
  15. package/dist/chunk-P6FMU4AT.mjs +54 -0
  16. package/dist/chunk-PFIV5MXD.mjs +48 -0
  17. package/dist/chunk-TBOXTAIA.mjs +94 -0
  18. package/dist/{chunk-H6FZBFRT.mjs → chunk-TPESRDUG.mjs} +6 -1
  19. package/dist/{chunk-2XCXK3NQ.mjs → chunk-U4B5QT72.mjs} +1 -1
  20. package/dist/chunk-UUWPSRNV.mjs +337 -0
  21. package/dist/chunk-UXJRH72H.mjs +834 -0
  22. package/dist/chunk-VFS5XAZ3.mjs +602 -0
  23. package/dist/{chunk-WC5MKASU.mjs → chunk-VN2TWPRC.mjs} +169 -55
  24. package/dist/components/ActivityFeed.d.mts +1 -1
  25. package/dist/components/ActivityFeed.mjs +1 -1
  26. package/dist/components/Alert.d.mts +2 -2
  27. package/dist/components/AreaChart.mjs +2 -2
  28. package/dist/components/AspectRatio.d.mts +44 -0
  29. package/dist/components/AspectRatio.mjs +8 -0
  30. package/dist/components/BarChart.mjs +2 -2
  31. package/dist/components/Carousel.d.mts +1 -1
  32. package/dist/components/Cascader.d.mts +34 -0
  33. package/dist/components/Cascader.mjs +1 -1
  34. package/dist/components/ChartLegend.d.mts +1 -1
  35. package/dist/components/ChatWindow.mjs +1 -1
  36. package/dist/components/CodeEditor.mjs +1 -1
  37. package/dist/components/ColorSwatch.d.mts +1 -1
  38. package/dist/components/ContextMenu.d.mts +234 -0
  39. package/dist/components/ContextMenu.mjs +17 -0
  40. package/dist/components/DataTableWithToolbar.d.mts +1 -1
  41. package/dist/components/DataTableWithToolbar.mjs +2 -2
  42. package/dist/components/DonutChart.mjs +3 -3
  43. package/dist/components/Dropdown.d.mts +1 -1
  44. package/dist/components/FloatButton.d.mts +2 -2
  45. package/dist/components/FunnelChart.d.mts +1 -1
  46. package/dist/components/FunnelChart.mjs +2 -2
  47. package/dist/components/Highlight.d.mts +146 -0
  48. package/dist/components/Highlight.mjs +8 -0
  49. package/dist/components/ImageCompare.d.mts +284 -0
  50. package/dist/components/ImageCompare.mjs +8 -0
  51. package/dist/components/Input.d.mts +1 -1
  52. package/dist/components/InputOTP.d.mts +261 -0
  53. package/dist/components/InputOTP.mjs +11 -0
  54. package/dist/components/Kbd.d.mts +118 -0
  55. package/dist/components/Kbd.mjs +8 -0
  56. package/dist/components/LineChart.mjs +2 -2
  57. package/dist/components/List.d.mts +1 -1
  58. package/dist/components/List.mjs +1 -1
  59. package/dist/components/LoadingBar.d.mts +8 -0
  60. package/dist/components/LoadingBar.mjs +114 -0
  61. package/dist/components/LoadingBarContainer.d.mts +78 -0
  62. package/dist/components/LoadingBarContainer.mjs +8 -0
  63. package/dist/components/LoadingBarRoot.d.mts +6 -0
  64. package/dist/components/LoadingBarRoot.mjs +6 -0
  65. package/dist/components/Marquee.d.mts +158 -0
  66. package/dist/components/Marquee.mjs +8 -0
  67. package/dist/components/MaskInput.d.mts +201 -0
  68. package/dist/components/MaskInput.mjs +11 -0
  69. package/dist/components/Masonry.d.mts +66 -0
  70. package/dist/components/Masonry.mjs +8 -0
  71. package/dist/components/Menu.d.mts +2 -2
  72. package/dist/components/Modal.d.mts +1 -1
  73. package/dist/components/NavigationMenu.d.mts +411 -0
  74. package/dist/components/NavigationMenu.mjs +25 -0
  75. package/dist/components/NotificationCenter.d.mts +1 -1
  76. package/dist/components/NotificationCenter.mjs +2 -2
  77. package/dist/components/PageHeader.d.mts +140 -0
  78. package/dist/components/PageHeader.mjs +11 -0
  79. package/dist/components/PieChart.mjs +2 -2
  80. package/dist/components/Popconfirm.d.mts +3 -3
  81. package/dist/components/Popover.d.mts +2 -2
  82. package/dist/components/RadarChart.mjs +2 -2
  83. package/dist/components/ScatterChart.mjs +2 -2
  84. package/dist/components/ScrollArea.d.mts +136 -0
  85. package/dist/components/ScrollArea.mjs +8 -0
  86. package/dist/components/SplitButton.d.mts +286 -0
  87. package/dist/components/SplitButton.mjs +12 -0
  88. package/dist/components/Spotlight.d.mts +1 -1
  89. package/dist/components/SunburstChart.mjs +2 -2
  90. package/dist/components/TagsInput.d.mts +214 -0
  91. package/dist/components/TagsInput.mjs +12 -0
  92. package/dist/components/Timeline.d.mts +1 -1
  93. package/dist/components/Tooltip.d.mts +2 -2
  94. package/dist/components/Tour.d.mts +3 -3
  95. package/dist/components/Tree.d.mts +1 -1
  96. package/dist/components/TreeMapChart.d.mts +1 -1
  97. package/dist/components/TreeMapChart.mjs +2 -2
  98. package/dist/components/TreeSelect.d.mts +51 -0
  99. package/dist/components/TreeSelect.mjs +2 -1
  100. package/dist/components/Upload.d.mts +1 -1
  101. package/dist/components/VirtualTable.d.mts +1 -1
  102. package/dist/components/Watermark.d.mts +1 -1
  103. package/dist/index.d.mts +17 -1
  104. package/dist/index.mjs +356 -0
  105. package/package.json +117 -2
  106. package/dist/{chunk-MAKOSWR6.mjs → chunk-37W7XTA6.mjs} +3 -3
  107. package/dist/{chunk-WUQMFKQ6.mjs → chunk-66OS5A4D.mjs} +3 -3
  108. package/dist/{chunk-NNC75I7F.mjs → chunk-CHEXI7MO.mjs} +3 -3
  109. package/dist/{chunk-KFJIZED5.mjs → chunk-EHGFW5GX.mjs} +3 -3
  110. package/dist/{chunk-ZGA66PSG.mjs → chunk-EZYOCPMM.mjs} +3 -3
  111. package/dist/{chunk-XGXZF27U.mjs → chunk-JHMT5Q6P.mjs} +3 -3
  112. package/dist/{chunk-NGAA73CV.mjs → chunk-VLW3UBIR.mjs} +3 -3
  113. package/dist/{chunk-OTHJIFDV.mjs → chunk-W5XFWVNV.mjs} +3 -3
  114. package/dist/{chunk-3KITFMBJ.mjs → chunk-ZOYHZF4N.mjs} +3 -3
@@ -0,0 +1,834 @@
1
+ import {
2
+ renderVueOverlayTeleport,
3
+ useVueAnchoredOverlay
4
+ } from "./chunk-Q7Y22OFX.mjs";
5
+
6
+ // src/components/NavigationMenu.ts
7
+ import {
8
+ defineComponent,
9
+ computed,
10
+ ref,
11
+ provide,
12
+ inject,
13
+ h,
14
+ onBeforeUnmount,
15
+ onMounted,
16
+ onUpdated,
17
+ nextTick
18
+ } from "vue";
19
+ import {
20
+ classNames,
21
+ coerceClassValue,
22
+ mergeStyleValues,
23
+ getNavigationMenuClasses,
24
+ getNavigationMenuListClasses,
25
+ getNavigationMenuItemClasses,
26
+ getNavigationMenuTriggerClasses,
27
+ getNavigationMenuChevronClasses,
28
+ getNavigationMenuContentClasses,
29
+ getNavigationMenuLinkClasses,
30
+ injectNavigationMenuStyles,
31
+ NAVIGATION_MENU_ENTER_CLASS,
32
+ NAVIGATION_MENU_CHEVRON_PATH,
33
+ NAVIGATION_MENU_BAR_ITEM_ATTR,
34
+ NAVIGATION_MENU_DEFAULT_DELAY_DURATION,
35
+ NAVIGATION_MENU_DEFAULT_SKIP_DELAY_DURATION,
36
+ NAVIGATION_MENU_DEFAULT_OFFSET,
37
+ isNavigationMenuValueOpen,
38
+ isNavigationMenuOpen,
39
+ resolveNavigationMenuOpenValue,
40
+ shouldSkipNavigationMenuOpenDelay,
41
+ isNavigationMenuTriggerOpenKey,
42
+ handleMenubarNavigation,
43
+ handleMenuNavigation,
44
+ initNavigationMenuRovingTabIndex,
45
+ focusFirstMenuItem,
46
+ captureActiveElement,
47
+ restoreFocus,
48
+ getSecureRel
49
+ } from "@expcat/tigercat-core";
50
+ var navigationMenuItemIdCounter = 0;
51
+ var createNavigationMenuItemId = () => `tiger-navigation-menu-item-${++navigationMenuItemIdCounter}`;
52
+ var NavigationMenuContextKey = /* @__PURE__ */ Symbol("NavigationMenuContext");
53
+ var NavigationMenuItemContextKey = /* @__PURE__ */ Symbol("NavigationMenuItemContext");
54
+ var NavigationMenuContentContextKey = /* @__PURE__ */ Symbol("NavigationMenuContentContext");
55
+ function containsFocusTarget(container, target) {
56
+ return Boolean(container && target instanceof Node && container.contains(target));
57
+ }
58
+ function getOpenPanelFromMenubar(menubar) {
59
+ if (!menubar) return null;
60
+ const trigger = menubar.querySelector('[aria-expanded="true"][aria-controls]');
61
+ const contentId = trigger?.getAttribute("aria-controls");
62
+ if (!contentId) return null;
63
+ return menubar.ownerDocument.getElementById(contentId);
64
+ }
65
+ function splitClassStyleAttrs(attrs) {
66
+ const {
67
+ class: attrsClass,
68
+ style: attrsStyle,
69
+ ...restAttrs
70
+ } = attrs;
71
+ return { restAttrs, attrsClass, attrsStyle };
72
+ }
73
+ var NavigationMenuLink = defineComponent({
74
+ name: "TigerNavigationMenuLink",
75
+ inheritAttrs: false,
76
+ props: {
77
+ href: {
78
+ type: String,
79
+ default: void 0
80
+ },
81
+ target: {
82
+ type: String,
83
+ default: void 0
84
+ },
85
+ rel: {
86
+ type: String,
87
+ default: void 0
88
+ },
89
+ disabled: {
90
+ type: Boolean,
91
+ default: false
92
+ },
93
+ active: {
94
+ type: Boolean,
95
+ default: false
96
+ },
97
+ className: {
98
+ type: String,
99
+ default: void 0
100
+ },
101
+ style: {
102
+ type: Object,
103
+ default: void 0
104
+ }
105
+ },
106
+ emits: ["click"],
107
+ setup(props, { slots, emit, attrs }) {
108
+ const attrsRecord = attrs;
109
+ const root = inject(NavigationMenuContextKey, null);
110
+ const item = inject(NavigationMenuItemContextKey, null);
111
+ const content = inject(
112
+ NavigationMenuContentContextKey,
113
+ null
114
+ );
115
+ const inPanel = Boolean(content);
116
+ const disabled = computed(() => props.disabled || Boolean(item?.disabled));
117
+ const handleClick = (event) => {
118
+ if (disabled.value) {
119
+ event.preventDefault();
120
+ event.stopPropagation();
121
+ return;
122
+ }
123
+ emit("click", event);
124
+ root?.handleItemClick();
125
+ };
126
+ const handleFocus = () => {
127
+ if (inPanel) return;
128
+ if (!item || !item.hasPanel.value) {
129
+ root?.setValue(null, { restoreFocus: false });
130
+ }
131
+ };
132
+ const handleKeyDown = (event) => {
133
+ if (inPanel) return;
134
+ if (root?.menubarRef.value) {
135
+ handleMenubarNavigation(root.menubarRef.value, event);
136
+ }
137
+ };
138
+ const linkClasses = computed(
139
+ () => classNames(
140
+ getNavigationMenuLinkClasses(disabled.value, inPanel, props.active),
141
+ props.className,
142
+ coerceClassValue(attrsRecord.class)
143
+ )
144
+ );
145
+ const mergedStyle = computed(
146
+ () => mergeStyleValues(attrsRecord.style, props.style)
147
+ );
148
+ return () => {
149
+ const { restAttrs } = splitClassStyleAttrs(attrsRecord);
150
+ const isAnchor = Boolean(props.href);
151
+ const rel = isAnchor ? getSecureRel(
152
+ props.target,
153
+ props.rel
154
+ ) : void 0;
155
+ return h(
156
+ isAnchor ? "a" : "button",
157
+ {
158
+ ...restAttrs,
159
+ href: isAnchor ? props.href : void 0,
160
+ target: isAnchor ? props.target : void 0,
161
+ rel,
162
+ type: isAnchor ? void 0 : "button",
163
+ class: linkClasses.value,
164
+ style: mergedStyle.value,
165
+ role: "menuitem",
166
+ tabindex: inPanel ? -1 : -1,
167
+ [NAVIGATION_MENU_BAR_ITEM_ATTR]: inPanel ? void 0 : "",
168
+ "aria-disabled": disabled.value || void 0,
169
+ "aria-current": props.active ? "page" : void 0,
170
+ disabled: isAnchor ? void 0 : disabled.value,
171
+ "data-tiger-navigation-menu-link": "",
172
+ "data-active": props.active ? "true" : void 0,
173
+ onClick: handleClick,
174
+ onFocus: handleFocus,
175
+ onKeydown: handleKeyDown
176
+ },
177
+ slots.default?.()
178
+ );
179
+ };
180
+ }
181
+ });
182
+ var NavigationMenuTrigger = defineComponent({
183
+ name: "TigerNavigationMenuTrigger",
184
+ inheritAttrs: false,
185
+ props: {
186
+ disabled: {
187
+ type: Boolean,
188
+ default: false
189
+ },
190
+ showArrow: {
191
+ type: Boolean,
192
+ default: void 0
193
+ },
194
+ className: {
195
+ type: String,
196
+ default: void 0
197
+ },
198
+ style: {
199
+ type: Object,
200
+ default: void 0
201
+ }
202
+ },
203
+ setup(props, { slots, attrs }) {
204
+ const attrsRecord = attrs;
205
+ const root = inject(NavigationMenuContextKey, null);
206
+ const item = inject(NavigationMenuItemContextKey, null);
207
+ const disabled = computed(
208
+ () => props.disabled || Boolean(item?.disabled) || Boolean(root?.disabled)
209
+ );
210
+ const showArrow = computed(
211
+ () => props.showArrow !== void 0 ? props.showArrow : item?.showArrow ?? true
212
+ );
213
+ const handleMouseEnter = () => {
214
+ if (disabled.value) return;
215
+ item?.scheduleOpen();
216
+ };
217
+ const handleMouseLeave = () => {
218
+ item?.scheduleClose();
219
+ };
220
+ const handleFocus = () => {
221
+ if (disabled.value || root?.suppressFocusOpen.value) return;
222
+ item?.open();
223
+ };
224
+ const handleClick = (event) => {
225
+ if (disabled.value) {
226
+ event.preventDefault();
227
+ return;
228
+ }
229
+ item?.open();
230
+ };
231
+ const handleKeyDown = (event) => {
232
+ if (disabled.value || !item) return;
233
+ if (root?.menubarRef.value && handleMenubarNavigation(root.menubarRef.value, event)) {
234
+ return;
235
+ }
236
+ if (isNavigationMenuTriggerOpenKey(event.key) && item.hasPanel.value) {
237
+ event.preventDefault();
238
+ item.open(true);
239
+ return;
240
+ }
241
+ if (event.key === "Escape" && item.isOpen.value) {
242
+ event.preventDefault();
243
+ item.close();
244
+ item.triggerRef.value?.focus();
245
+ }
246
+ };
247
+ const triggerClasses = computed(
248
+ () => classNames(
249
+ getNavigationMenuTriggerClasses(disabled.value, Boolean(item?.isOpen.value)),
250
+ props.className,
251
+ coerceClassValue(attrsRecord.class)
252
+ )
253
+ );
254
+ const mergedStyle = computed(
255
+ () => mergeStyleValues(attrsRecord.style, props.style)
256
+ );
257
+ return () => {
258
+ if (!item) return null;
259
+ const { restAttrs } = splitClassStyleAttrs(attrsRecord);
260
+ const chevron = showArrow.value ? h(
261
+ "svg",
262
+ {
263
+ class: getNavigationMenuChevronClasses(item.isOpen.value),
264
+ viewBox: "0 0 24 24",
265
+ fill: "none",
266
+ stroke: "currentColor",
267
+ "stroke-width": "2",
268
+ "stroke-linecap": "round",
269
+ "stroke-linejoin": "round",
270
+ "aria-hidden": "true"
271
+ },
272
+ [h("path", { d: NAVIGATION_MENU_CHEVRON_PATH })]
273
+ ) : null;
274
+ return h(
275
+ "button",
276
+ {
277
+ ...restAttrs,
278
+ ref: item.triggerRef,
279
+ type: "button",
280
+ class: triggerClasses.value,
281
+ style: mergedStyle.value,
282
+ role: "menuitem",
283
+ tabindex: -1,
284
+ [NAVIGATION_MENU_BAR_ITEM_ATTR]: "",
285
+ "aria-haspopup": "menu",
286
+ "aria-expanded": item.isOpen.value,
287
+ "aria-controls": item.isOpen.value ? item.contentId : void 0,
288
+ "aria-disabled": disabled.value || void 0,
289
+ disabled: disabled.value,
290
+ "data-state": item.isOpen.value ? "open" : "closed",
291
+ "data-tiger-navigation-menu-trigger": "",
292
+ onMouseenter: handleMouseEnter,
293
+ onMouseleave: handleMouseLeave,
294
+ onFocus: handleFocus,
295
+ onClick: handleClick,
296
+ onKeydown: handleKeyDown
297
+ },
298
+ [slots.default?.(), chevron]
299
+ );
300
+ };
301
+ }
302
+ });
303
+ var NavigationMenuContent = defineComponent({
304
+ name: "TigerNavigationMenuContent",
305
+ inheritAttrs: false,
306
+ props: {
307
+ mega: {
308
+ type: Boolean,
309
+ default: false
310
+ },
311
+ className: {
312
+ type: String,
313
+ default: void 0
314
+ },
315
+ style: {
316
+ type: Object,
317
+ default: void 0
318
+ }
319
+ },
320
+ setup(props, { slots, attrs }) {
321
+ const attrsRecord = attrs;
322
+ const root = inject(NavigationMenuContextKey, null);
323
+ const item = inject(NavigationMenuItemContextKey, null);
324
+ const panelContext = { inPanel: true };
325
+ provide(NavigationMenuContentContextKey, panelContext);
326
+ const portalEnabled = computed(() => Boolean(root?.portal.value));
327
+ const overlayEnabled = computed(
328
+ () => Boolean(item) && Boolean(item?.isOpen.value) && !item?.disabled
329
+ );
330
+ const overlay = useVueAnchoredOverlay({
331
+ referenceRef: item?.triggerRef ?? ref(null),
332
+ floatingRef: item?.contentRef ?? ref(null),
333
+ enabled: overlayEnabled,
334
+ placement: root?.placement ?? "bottom-start",
335
+ offset: root?.offset ?? NAVIGATION_MENU_DEFAULT_OFFSET,
336
+ portal: portalEnabled,
337
+ dismissOnOutside: true,
338
+ dismissOnEscape: true,
339
+ onDismiss: () => item?.close()
340
+ });
341
+ if (item) item.hasPanel.value = true;
342
+ onBeforeUnmount(() => {
343
+ if (item) item.hasPanel.value = false;
344
+ });
345
+ const handleMouseEnter = () => {
346
+ item?.cancelClose();
347
+ };
348
+ const handleMouseLeave = () => {
349
+ item?.scheduleClose();
350
+ };
351
+ const handleFocusOut = (event) => {
352
+ root?.handleFocusLeave(event);
353
+ };
354
+ const handleKeyDown = (event) => {
355
+ if (item?.contentRef.value) {
356
+ handleMenuNavigation(item.contentRef.value, event);
357
+ }
358
+ if (event.key === "Escape" || event.key === "ArrowLeft") {
359
+ event.preventDefault();
360
+ event.stopPropagation();
361
+ item?.close();
362
+ item?.triggerRef.value?.focus();
363
+ return;
364
+ }
365
+ if ((event.key === "ArrowRight" || event.key === "ArrowLeft") && root?.menubarRef.value && item?.triggerRef.value) {
366
+ item.triggerRef.value.focus();
367
+ handleMenubarNavigation(root.menubarRef.value, event);
368
+ }
369
+ };
370
+ const panelClasses = computed(
371
+ () => classNames(overlay.floatingClasses.value, NAVIGATION_MENU_ENTER_CLASS)
372
+ );
373
+ const innerClasses = computed(
374
+ () => classNames(
375
+ getNavigationMenuContentClasses(props.mega),
376
+ props.className,
377
+ coerceClassValue(attrsRecord.class)
378
+ )
379
+ );
380
+ const mergedStyle = computed(
381
+ () => mergeStyleValues(attrsRecord.style, props.style)
382
+ );
383
+ return () => {
384
+ if (!item || !root) return null;
385
+ const { restAttrs } = splitClassStyleAttrs(attrsRecord);
386
+ const isOpen = item.isOpen.value;
387
+ const popup = h(
388
+ "div",
389
+ {
390
+ ref: item.contentRef,
391
+ class: panelClasses.value,
392
+ style: overlay.floatingStyles.value,
393
+ "data-positioned": overlay.positioned.value,
394
+ "data-tiger-navigation-menu-content": "",
395
+ hidden: !isOpen,
396
+ onMouseenter: handleMouseEnter,
397
+ onMouseleave: handleMouseLeave,
398
+ onFocusout: handleFocusOut,
399
+ onKeydown: handleKeyDown
400
+ },
401
+ [
402
+ h(
403
+ "div",
404
+ {
405
+ ...restAttrs,
406
+ id: item.contentId,
407
+ class: innerClasses.value,
408
+ style: mergedStyle.value,
409
+ role: props.mega ? "group" : "menu"
410
+ },
411
+ slots.default?.()
412
+ )
413
+ ]
414
+ );
415
+ return renderVueOverlayTeleport(popup, overlay.target.value, !portalEnabled.value);
416
+ };
417
+ }
418
+ });
419
+ var NavigationMenuItem = defineComponent({
420
+ name: "TigerNavigationMenuItem",
421
+ inheritAttrs: false,
422
+ props: {
423
+ value: {
424
+ type: [String, Number],
425
+ default: void 0
426
+ },
427
+ disabled: {
428
+ type: Boolean,
429
+ default: false
430
+ },
431
+ className: {
432
+ type: String,
433
+ default: void 0
434
+ },
435
+ style: {
436
+ type: Object,
437
+ default: void 0
438
+ }
439
+ },
440
+ setup(props, { slots, attrs }) {
441
+ const attrsRecord = attrs;
442
+ const root = inject(NavigationMenuContextKey, null);
443
+ const autoValue = createNavigationMenuItemId();
444
+ const itemValue = computed(() => props.value ?? autoValue);
445
+ const triggerRef = ref(null);
446
+ const contentRef = ref(null);
447
+ const hasPanel = ref(false);
448
+ const isOpen = computed(
449
+ () => Boolean(root) && !props.disabled && isNavigationMenuValueOpen(itemValue.value, root?.value.value)
450
+ );
451
+ const contentId = `${autoValue}-content`;
452
+ const open = (focusPanel = false) => {
453
+ if (props.disabled || !root) return;
454
+ root.cancelClose();
455
+ root.setValue(itemValue.value);
456
+ if (!focusPanel) return;
457
+ nextTick(() => {
458
+ requestAnimationFrame(() => {
459
+ const panel = contentRef.value ?? document.getElementById(contentId);
460
+ if (panel) focusFirstMenuItem(panel);
461
+ });
462
+ });
463
+ };
464
+ const close = () => {
465
+ if (!root) return;
466
+ if (isOpen.value) root.setValue(null);
467
+ };
468
+ const scheduleOpen = () => {
469
+ if (props.disabled || !root) return;
470
+ root.scheduleOpen(itemValue.value);
471
+ };
472
+ const scheduleClose = () => {
473
+ if (!root) return;
474
+ root.scheduleClose(itemValue.value);
475
+ };
476
+ const cancelClose = () => {
477
+ root?.cancelClose();
478
+ };
479
+ const itemContext = {
480
+ get value() {
481
+ return itemValue.value;
482
+ },
483
+ isOpen,
484
+ get disabled() {
485
+ return props.disabled;
486
+ },
487
+ hasPanel,
488
+ triggerRef,
489
+ contentRef,
490
+ contentId,
491
+ open,
492
+ close,
493
+ scheduleOpen,
494
+ scheduleClose,
495
+ cancelClose,
496
+ get showArrow() {
497
+ return root?.showArrow ?? true;
498
+ }
499
+ };
500
+ provide(NavigationMenuItemContextKey, itemContext);
501
+ const itemClasses = computed(
502
+ () => classNames(
503
+ getNavigationMenuItemClasses(),
504
+ props.className,
505
+ coerceClassValue(attrsRecord.class)
506
+ )
507
+ );
508
+ const mergedStyle = computed(
509
+ () => mergeStyleValues(attrsRecord.style, props.style)
510
+ );
511
+ return () => {
512
+ const { restAttrs } = splitClassStyleAttrs(attrsRecord);
513
+ return h(
514
+ "li",
515
+ {
516
+ ...restAttrs,
517
+ class: itemClasses.value,
518
+ style: mergedStyle.value,
519
+ role: "none",
520
+ "data-tiger-navigation-menu-item": "",
521
+ "data-state": isOpen.value ? "open" : "closed"
522
+ },
523
+ slots.default?.()
524
+ );
525
+ };
526
+ }
527
+ });
528
+ var NavigationMenuList = defineComponent({
529
+ name: "TigerNavigationMenuList",
530
+ inheritAttrs: false,
531
+ props: {
532
+ className: {
533
+ type: String,
534
+ default: void 0
535
+ },
536
+ style: {
537
+ type: Object,
538
+ default: void 0
539
+ }
540
+ },
541
+ setup(props, { slots, attrs }) {
542
+ const attrsRecord = attrs;
543
+ const root = inject(NavigationMenuContextKey, null);
544
+ const listRef = ref(null);
545
+ const syncRoving = () => {
546
+ if (root) root.menubarRef.value = listRef.value;
547
+ if (listRef.value) initNavigationMenuRovingTabIndex(listRef.value);
548
+ };
549
+ onMounted(syncRoving);
550
+ onUpdated(syncRoving);
551
+ const listClasses = computed(
552
+ () => classNames(
553
+ getNavigationMenuListClasses(),
554
+ props.className,
555
+ coerceClassValue(attrsRecord.class)
556
+ )
557
+ );
558
+ const mergedStyle = computed(
559
+ () => mergeStyleValues(attrsRecord.style, props.style)
560
+ );
561
+ return () => {
562
+ const { restAttrs } = splitClassStyleAttrs(attrsRecord);
563
+ return h(
564
+ "ul",
565
+ {
566
+ ...restAttrs,
567
+ ref: listRef,
568
+ class: listClasses.value,
569
+ style: mergedStyle.value,
570
+ role: "menubar",
571
+ "data-tiger-navigation-menu-list": ""
572
+ },
573
+ slots.default?.()
574
+ );
575
+ };
576
+ }
577
+ });
578
+ var NavigationMenu = defineComponent({
579
+ name: "TigerNavigationMenu",
580
+ inheritAttrs: false,
581
+ props: {
582
+ value: {
583
+ type: [String, Number],
584
+ default: void 0
585
+ },
586
+ defaultValue: {
587
+ type: [String, Number],
588
+ default: void 0
589
+ },
590
+ open: {
591
+ type: Boolean,
592
+ default: void 0
593
+ },
594
+ defaultOpen: {
595
+ type: Boolean,
596
+ default: false
597
+ },
598
+ disabled: {
599
+ type: Boolean,
600
+ default: false
601
+ },
602
+ closeOnClick: {
603
+ type: Boolean,
604
+ default: true
605
+ },
606
+ delayDuration: {
607
+ type: Number,
608
+ default: NAVIGATION_MENU_DEFAULT_DELAY_DURATION
609
+ },
610
+ skipDelayDuration: {
611
+ type: Number,
612
+ default: NAVIGATION_MENU_DEFAULT_SKIP_DELAY_DURATION
613
+ },
614
+ showArrow: {
615
+ type: Boolean,
616
+ default: true
617
+ },
618
+ portal: {
619
+ type: Boolean,
620
+ default: true
621
+ },
622
+ offset: {
623
+ type: Number,
624
+ default: NAVIGATION_MENU_DEFAULT_OFFSET
625
+ },
626
+ placement: {
627
+ type: String,
628
+ default: "bottom-start"
629
+ },
630
+ className: {
631
+ type: String,
632
+ default: void 0
633
+ },
634
+ style: {
635
+ type: Object,
636
+ default: void 0
637
+ }
638
+ },
639
+ emits: ["update:value", "value-change", "update:open", "open-change"],
640
+ setup(props, { slots, emit, attrs }) {
641
+ const attrsRecord = attrs;
642
+ onMounted(() => injectNavigationMenuStyles());
643
+ const previousActiveElement = ref(null);
644
+ const rootRef = ref(null);
645
+ const menubarRef = ref(null);
646
+ const suppressFocusOpen = ref(false);
647
+ const initialValue = props.defaultValue ?? (props.defaultOpen ? props.value ?? null : null);
648
+ const internalValue = ref(
649
+ isNavigationMenuOpen(initialValue) ? initialValue : null
650
+ );
651
+ const currentValue = computed(
652
+ () => resolveNavigationMenuOpenValue({
653
+ value: props.value,
654
+ internalValue: internalValue.value,
655
+ open: props.open
656
+ })
657
+ );
658
+ const currentOpen = computed(() => isNavigationMenuOpen(currentValue.value));
659
+ let openTimer = null;
660
+ let closeTimer = null;
661
+ let lastOpenAt = 0;
662
+ const clearTimers = () => {
663
+ if (openTimer) {
664
+ clearTimeout(openTimer);
665
+ openTimer = null;
666
+ }
667
+ if (closeTimer) {
668
+ clearTimeout(closeTimer);
669
+ closeTimer = null;
670
+ }
671
+ };
672
+ const setValue = (next, options) => {
673
+ if (props.disabled && next != null) return;
674
+ clearTimers();
675
+ const resolvedNext = isNavigationMenuOpen(next) ? next : null;
676
+ const wasOpen = isNavigationMenuOpen(currentValue.value);
677
+ const willOpen = resolvedNext != null;
678
+ if (willOpen && !wasOpen) {
679
+ const active = captureActiveElement();
680
+ if (active && menubarRef.value?.contains(active)) {
681
+ previousActiveElement.value = active;
682
+ }
683
+ }
684
+ if (props.value === void 0) {
685
+ internalValue.value = resolvedNext;
686
+ }
687
+ emit("update:value", resolvedNext);
688
+ emit("value-change", resolvedNext);
689
+ const open = willOpen;
690
+ emit("update:open", open);
691
+ emit("open-change", open);
692
+ if (!willOpen) {
693
+ suppressFocusOpen.value = true;
694
+ if (options?.restoreFocus !== false) {
695
+ restoreFocus(previousActiveElement.value);
696
+ }
697
+ previousActiveElement.value = null;
698
+ nextTick(() => {
699
+ suppressFocusOpen.value = false;
700
+ });
701
+ }
702
+ };
703
+ const scheduleOpen = (itemValue) => {
704
+ if (props.disabled) return;
705
+ if (closeTimer) {
706
+ clearTimeout(closeTimer);
707
+ closeTimer = null;
708
+ }
709
+ const skip = shouldSkipNavigationMenuOpenDelay(
710
+ lastOpenAt,
711
+ Date.now(),
712
+ props.skipDelayDuration
713
+ );
714
+ const delay = skip ? 0 : props.delayDuration;
715
+ const apply = () => {
716
+ lastOpenAt = Date.now();
717
+ setValue(itemValue);
718
+ openTimer = null;
719
+ };
720
+ if (delay <= 0) {
721
+ apply();
722
+ return;
723
+ }
724
+ if (openTimer) clearTimeout(openTimer);
725
+ openTimer = setTimeout(apply, delay);
726
+ };
727
+ const scheduleClose = (itemValue) => {
728
+ if (openTimer) {
729
+ clearTimeout(openTimer);
730
+ openTimer = null;
731
+ }
732
+ const close = () => {
733
+ if (currentValue.value === itemValue) setValue(null);
734
+ closeTimer = null;
735
+ };
736
+ if (props.skipDelayDuration <= 0) {
737
+ close();
738
+ return;
739
+ }
740
+ if (closeTimer) clearTimeout(closeTimer);
741
+ closeTimer = setTimeout(close, props.skipDelayDuration);
742
+ };
743
+ const cancelClose = () => {
744
+ if (closeTimer) {
745
+ clearTimeout(closeTimer);
746
+ closeTimer = null;
747
+ }
748
+ };
749
+ const handleItemClick = () => {
750
+ if (props.closeOnClick) setValue(null);
751
+ };
752
+ const handleFocusLeave = (event) => {
753
+ const next = event.relatedTarget;
754
+ if (containsFocusTarget(rootRef.value, next)) return;
755
+ if (containsFocusTarget(getOpenPanelFromMenubar(menubarRef.value), next)) return;
756
+ if (!isNavigationMenuOpen(currentValue.value)) return;
757
+ setValue(null, { restoreFocus: false });
758
+ };
759
+ onBeforeUnmount(clearTimers);
760
+ const portalEnabled = computed(() => props.portal);
761
+ const navigationMenuContext = {
762
+ value: currentValue,
763
+ setValue,
764
+ scheduleOpen,
765
+ scheduleClose,
766
+ cancelClose,
767
+ get closeOnClick() {
768
+ return props.closeOnClick;
769
+ },
770
+ handleItemClick,
771
+ handleFocusLeave,
772
+ portal: portalEnabled,
773
+ get disabled() {
774
+ return props.disabled;
775
+ },
776
+ get offset() {
777
+ return props.offset;
778
+ },
779
+ get placement() {
780
+ return props.placement;
781
+ },
782
+ get showArrow() {
783
+ return props.showArrow;
784
+ },
785
+ menubarRef,
786
+ suppressFocusOpen
787
+ };
788
+ provide(NavigationMenuContextKey, navigationMenuContext);
789
+ const containerClasses = computed(
790
+ () => classNames(
791
+ getNavigationMenuClasses(),
792
+ props.className,
793
+ coerceClassValue(attrsRecord.class)
794
+ )
795
+ );
796
+ const mergedStyle = computed(
797
+ () => mergeStyleValues(attrsRecord.style, props.style)
798
+ );
799
+ return () => {
800
+ const defaultSlot = slots.default?.() ?? [];
801
+ const hasList = defaultSlot.some((node) => node.type === NavigationMenuList);
802
+ const children = hasList ? defaultSlot : [h(NavigationMenuList, null, { default: () => defaultSlot })];
803
+ const { restAttrs } = splitClassStyleAttrs(attrsRecord);
804
+ return h(
805
+ "nav",
806
+ {
807
+ ...restAttrs,
808
+ ref: rootRef,
809
+ class: containerClasses.value,
810
+ style: mergedStyle.value,
811
+ "aria-label": restAttrs["aria-label"] ?? "Main",
812
+ "data-tiger-navigation-menu": "",
813
+ "data-state": currentOpen.value ? "open" : "closed",
814
+ onFocusout: handleFocusLeave
815
+ },
816
+ children
817
+ );
818
+ };
819
+ }
820
+ });
821
+ var NavigationMenu_default = NavigationMenu;
822
+
823
+ export {
824
+ NavigationMenuContextKey,
825
+ NavigationMenuItemContextKey,
826
+ NavigationMenuContentContextKey,
827
+ NavigationMenuLink,
828
+ NavigationMenuTrigger,
829
+ NavigationMenuContent,
830
+ NavigationMenuItem,
831
+ NavigationMenuList,
832
+ NavigationMenu,
833
+ NavigationMenu_default
834
+ };