@expcat/tigercat-vue 2.0.19 → 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 (177) 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-EDBMWZKH.mjs → chunk-TPESRDUG.mjs} +5 -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 +3 -3
  25. package/dist/components/ActivityFeed.mjs +1 -1
  26. package/dist/components/Affix.d.mts +4 -4
  27. package/dist/components/Alert.d.mts +4 -4
  28. package/dist/components/Anchor.d.mts +3 -3
  29. package/dist/components/AreaChart.mjs +2 -2
  30. package/dist/components/AspectRatio.d.mts +44 -0
  31. package/dist/components/AspectRatio.mjs +8 -0
  32. package/dist/components/AutoComplete.d.mts +2 -2
  33. package/dist/components/Avatar.d.mts +1 -1
  34. package/dist/components/AvatarGroup.d.mts +1 -1
  35. package/dist/components/BackTop.d.mts +1 -1
  36. package/dist/components/Badge.d.mts +2 -2
  37. package/dist/components/BarChart.mjs +2 -2
  38. package/dist/components/Breadcrumb.d.mts +2 -2
  39. package/dist/components/Button.d.mts +2 -2
  40. package/dist/components/ButtonGroup.d.mts +1 -1
  41. package/dist/components/Calendar.d.mts +1 -1
  42. package/dist/components/Card.d.mts +2 -2
  43. package/dist/components/Carousel.d.mts +3 -3
  44. package/dist/components/Cascader.d.mts +34 -0
  45. package/dist/components/Cascader.mjs +1 -1
  46. package/dist/components/ChartLegend.d.mts +1 -1
  47. package/dist/components/ChartTooltip.d.mts +1 -1
  48. package/dist/components/ChatWindow.d.mts +1 -1
  49. package/dist/components/ChatWindow.mjs +1 -1
  50. package/dist/components/CodeEditor.d.mts +3 -3
  51. package/dist/components/CodeEditor.mjs +1 -1
  52. package/dist/components/CollapsePanel.d.mts +1 -1
  53. package/dist/components/ColorSwatch.d.mts +1 -1
  54. package/dist/components/CommentThread.d.mts +1 -1
  55. package/dist/components/ContextMenu.d.mts +234 -0
  56. package/dist/components/ContextMenu.mjs +17 -0
  57. package/dist/components/Countdown.d.mts +3 -3
  58. package/dist/components/CropUpload.d.mts +1 -1
  59. package/dist/components/DataExport.d.mts +1 -1
  60. package/dist/components/DataTableWithToolbar.d.mts +4 -4
  61. package/dist/components/DataTableWithToolbar.mjs +2 -2
  62. package/dist/components/DatePicker.d.mts +3 -3
  63. package/dist/components/Descriptions.d.mts +1 -1
  64. package/dist/components/DonutChart.mjs +3 -3
  65. package/dist/components/Drawer.d.mts +5 -5
  66. package/dist/components/Dropdown.d.mts +1 -1
  67. package/dist/components/Empty.d.mts +1 -1
  68. package/dist/components/FileManager.d.mts +1 -1
  69. package/dist/components/FloatButton.d.mts +4 -4
  70. package/dist/components/FormWizard.d.mts +2 -2
  71. package/dist/components/FunnelChart.d.mts +2 -2
  72. package/dist/components/FunnelChart.mjs +2 -2
  73. package/dist/components/Gantt.d.mts +1 -1
  74. package/dist/components/GaugeChart.d.mts +2 -2
  75. package/dist/components/Header.d.mts +1 -1
  76. package/dist/components/HeatmapChart.d.mts +1 -1
  77. package/dist/components/Highlight.d.mts +146 -0
  78. package/dist/components/Highlight.mjs +8 -0
  79. package/dist/components/Icon.d.mts +1 -1
  80. package/dist/components/ImageAnnotation.d.mts +3 -3
  81. package/dist/components/ImageCompare.d.mts +284 -0
  82. package/dist/components/ImageCompare.mjs +8 -0
  83. package/dist/components/ImageCropper.d.mts +1 -1
  84. package/dist/components/ImagePreview.d.mts +1 -1
  85. package/dist/components/ImageViewer.d.mts +1 -1
  86. package/dist/components/InfiniteScroll.d.mts +1 -1
  87. package/dist/components/Input.d.mts +4 -4
  88. package/dist/components/InputGroup.d.mts +1 -1
  89. package/dist/components/InputNumber.d.mts +3 -3
  90. package/dist/components/InputOTP.d.mts +261 -0
  91. package/dist/components/InputOTP.mjs +11 -0
  92. package/dist/components/Kanban.d.mts +1 -1
  93. package/dist/components/Kbd.d.mts +118 -0
  94. package/dist/components/Kbd.mjs +8 -0
  95. package/dist/components/LineChart.mjs +2 -2
  96. package/dist/components/List.d.mts +3 -3
  97. package/dist/components/List.mjs +1 -1
  98. package/dist/components/Loading.d.mts +2 -2
  99. package/dist/components/LoadingBar.d.mts +8 -0
  100. package/dist/components/LoadingBar.mjs +114 -0
  101. package/dist/components/LoadingBarContainer.d.mts +78 -0
  102. package/dist/components/LoadingBarContainer.mjs +8 -0
  103. package/dist/components/LoadingBarRoot.d.mts +6 -0
  104. package/dist/components/LoadingBarRoot.mjs +6 -0
  105. package/dist/components/MarkdownEditor.d.mts +5 -5
  106. package/dist/components/Marquee.d.mts +158 -0
  107. package/dist/components/Marquee.mjs +8 -0
  108. package/dist/components/MaskInput.d.mts +201 -0
  109. package/dist/components/MaskInput.mjs +11 -0
  110. package/dist/components/Masonry.d.mts +66 -0
  111. package/dist/components/Masonry.mjs +8 -0
  112. package/dist/components/Mentions.d.mts +2 -2
  113. package/dist/components/Menu.d.mts +5 -5
  114. package/dist/components/Modal.d.mts +7 -7
  115. package/dist/components/NavigationMenu.d.mts +411 -0
  116. package/dist/components/NavigationMenu.mjs +25 -0
  117. package/dist/components/NotificationCenter.d.mts +3 -3
  118. package/dist/components/NotificationCenter.mjs +2 -2
  119. package/dist/components/NumberKeyboard.d.mts +3 -3
  120. package/dist/components/OrgChart.d.mts +2 -2
  121. package/dist/components/PageHeader.d.mts +140 -0
  122. package/dist/components/PageHeader.mjs +11 -0
  123. package/dist/components/Pagination.d.mts +2 -2
  124. package/dist/components/PieChart.mjs +2 -2
  125. package/dist/components/Popconfirm.d.mts +5 -5
  126. package/dist/components/Popover.d.mts +5 -5
  127. package/dist/components/Progress.d.mts +6 -6
  128. package/dist/components/QRCode.d.mts +1 -1
  129. package/dist/components/RadarChart.mjs +2 -2
  130. package/dist/components/Result.d.mts +1 -1
  131. package/dist/components/RichTextEditor.d.mts +4 -4
  132. package/dist/components/ScatterChart.d.mts +2 -2
  133. package/dist/components/ScatterChart.mjs +2 -2
  134. package/dist/components/ScrollArea.d.mts +136 -0
  135. package/dist/components/ScrollArea.mjs +8 -0
  136. package/dist/components/ScrollSpy.d.mts +3 -3
  137. package/dist/components/Segmented.d.mts +2 -2
  138. package/dist/components/Signature.d.mts +5 -5
  139. package/dist/components/Skeleton.d.mts +1 -1
  140. package/dist/components/Slider.d.mts +1 -1
  141. package/dist/components/SplitButton.d.mts +286 -0
  142. package/dist/components/SplitButton.mjs +12 -0
  143. package/dist/components/Splitter.d.mts +1 -1
  144. package/dist/components/Spotlight.d.mts +5 -5
  145. package/dist/components/Statistic.d.mts +1 -1
  146. package/dist/components/Steps.d.mts +3 -3
  147. package/dist/components/SunburstChart.mjs +2 -2
  148. package/dist/components/Tabs.d.mts +3 -3
  149. package/dist/components/Tag.d.mts +2 -2
  150. package/dist/components/TagsInput.d.mts +214 -0
  151. package/dist/components/TagsInput.mjs +12 -0
  152. package/dist/components/TaskBoard.d.mts +2 -2
  153. package/dist/components/Textarea.d.mts +1 -1
  154. package/dist/components/TimePicker.d.mts +3 -3
  155. package/dist/components/Timeline.d.mts +4 -4
  156. package/dist/components/Tooltip.d.mts +2 -2
  157. package/dist/components/Tour.d.mts +4 -4
  158. package/dist/components/Tree.d.mts +3 -3
  159. package/dist/components/TreeMapChart.d.mts +1 -1
  160. package/dist/components/TreeMapChart.mjs +2 -2
  161. package/dist/components/TreeSelect.d.mts +51 -0
  162. package/dist/components/TreeSelect.mjs +2 -1
  163. package/dist/components/Upload.d.mts +5 -5
  164. package/dist/components/VirtualTable.d.mts +3 -3
  165. package/dist/components/Watermark.d.mts +5 -5
  166. package/dist/index.d.mts +17 -1
  167. package/dist/index.mjs +355 -0
  168. package/package.json +117 -2
  169. package/dist/{chunk-MAKOSWR6.mjs → chunk-37W7XTA6.mjs} +3 -3
  170. package/dist/{chunk-WUQMFKQ6.mjs → chunk-66OS5A4D.mjs} +3 -3
  171. package/dist/{chunk-NNC75I7F.mjs → chunk-CHEXI7MO.mjs} +3 -3
  172. package/dist/{chunk-KFJIZED5.mjs → chunk-EHGFW5GX.mjs} +3 -3
  173. package/dist/{chunk-ZGA66PSG.mjs → chunk-EZYOCPMM.mjs} +3 -3
  174. package/dist/{chunk-XGXZF27U.mjs → chunk-JHMT5Q6P.mjs} +3 -3
  175. package/dist/{chunk-NGAA73CV.mjs → chunk-VLW3UBIR.mjs} +3 -3
  176. package/dist/{chunk-OTHJIFDV.mjs → chunk-W5XFWVNV.mjs} +3 -3
  177. 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
+ };