@expcat/tigercat-react 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 (84) hide show
  1. package/README.md +25 -16
  2. package/dist/chunk-2YOP55OF.mjs +639 -0
  3. package/dist/{chunk-V6P7ZK6O.mjs → chunk-7EMCZVJ2.mjs} +1 -1
  4. package/dist/chunk-EW43YBPV.mjs +457 -0
  5. package/dist/{chunk-QJE3MZBO.mjs → chunk-FSMJLJFL.mjs} +1 -1
  6. package/dist/{chunk-BOGOQ44C.mjs → chunk-GCY55TBC.mjs} +1 -1
  7. package/dist/chunk-GR3Y3XWP.mjs +47 -0
  8. package/dist/chunk-IGBQGR6G.mjs +234 -0
  9. package/dist/{chunk-D33BIMGK.mjs → chunk-IR7VA6AO.mjs} +11 -1
  10. package/dist/chunk-J76R2S62.mjs +161 -0
  11. package/dist/{chunk-2WGEHH5A.mjs → chunk-JQJM65RJ.mjs} +1 -1
  12. package/dist/{chunk-7AFRHC7P.mjs → chunk-KC55B62J.mjs} +127 -42
  13. package/dist/chunk-KRDHM5KB.mjs +259 -0
  14. package/dist/chunk-M5MZWOHF.mjs +180 -0
  15. package/dist/chunk-MFPVVGNA.mjs +248 -0
  16. package/dist/chunk-NLGLBTSM.mjs +138 -0
  17. package/dist/chunk-NT7GW2FD.mjs +40 -0
  18. package/dist/chunk-OKYMTHFQ.mjs +279 -0
  19. package/dist/{chunk-LBXNMCXN.mjs → chunk-OZ5XLR22.mjs} +6 -1
  20. package/dist/{chunk-HHIW7V7B.mjs → chunk-PFL4HNWM.mjs} +1 -8
  21. package/dist/chunk-RUAPTIQ7.mjs +181 -0
  22. package/dist/chunk-SEOG5AGS.mjs +72 -0
  23. package/dist/chunk-TQ6RIFWR.mjs +135 -0
  24. package/dist/chunk-U4M3DC2P.mjs +48 -0
  25. package/dist/{chunk-YIB6ZXZF.mjs → chunk-UETARXIK.mjs} +239 -52
  26. package/dist/chunk-XT43B7ZI.mjs +58 -0
  27. package/dist/components/ActivityFeed.mjs +1 -1
  28. package/dist/components/AreaChart.mjs +2 -2
  29. package/dist/components/AspectRatio.d.mts +10 -0
  30. package/dist/components/AspectRatio.mjs +8 -0
  31. package/dist/components/BarChart.mjs +2 -2
  32. package/dist/components/Cascader.mjs +1 -1
  33. package/dist/components/ChatWindow.mjs +1 -1
  34. package/dist/components/CodeEditor.mjs +1 -1
  35. package/dist/components/ContextMenu.d.mts +36 -0
  36. package/dist/components/ContextMenu.mjs +17 -0
  37. package/dist/components/DataExport.mjs +1 -1
  38. package/dist/components/DataTableWithToolbar.mjs +5 -5
  39. package/dist/components/Highlight.d.mts +11 -0
  40. package/dist/components/Highlight.mjs +8 -0
  41. package/dist/components/ImageCompare.d.mts +15 -0
  42. package/dist/components/ImageCompare.mjs +8 -0
  43. package/dist/components/InputOTP.d.mts +33 -0
  44. package/dist/components/InputOTP.mjs +12 -0
  45. package/dist/components/Kbd.d.mts +10 -0
  46. package/dist/components/Kbd.mjs +8 -0
  47. package/dist/components/LineChart.mjs +2 -2
  48. package/dist/components/List.mjs +2 -2
  49. package/dist/components/LoadingBar.d.mts +8 -0
  50. package/dist/components/LoadingBar.mjs +138 -0
  51. package/dist/components/LoadingBarContainer.d.mts +8 -0
  52. package/dist/components/LoadingBarContainer.mjs +8 -0
  53. package/dist/components/LoadingBarRoot.d.mts +6 -0
  54. package/dist/components/LoadingBarRoot.mjs +6 -0
  55. package/dist/components/Marquee.d.mts +10 -0
  56. package/dist/components/Marquee.mjs +8 -0
  57. package/dist/components/MaskInput.d.mts +37 -0
  58. package/dist/components/MaskInput.mjs +10 -0
  59. package/dist/components/Masonry.d.mts +10 -0
  60. package/dist/components/Masonry.mjs +8 -0
  61. package/dist/components/NavigationMenu.d.mts +84 -0
  62. package/dist/components/NavigationMenu.mjs +23 -0
  63. package/dist/components/NotificationCenter.mjs +3 -3
  64. package/dist/components/PageHeader.d.mts +34 -0
  65. package/dist/components/PageHeader.mjs +11 -0
  66. package/dist/components/Pagination.mjs +1 -1
  67. package/dist/components/RadarChart.mjs +2 -2
  68. package/dist/components/ScatterChart.mjs +2 -2
  69. package/dist/components/ScrollArea.d.mts +10 -0
  70. package/dist/components/ScrollArea.mjs +8 -0
  71. package/dist/components/SplitButton.d.mts +38 -0
  72. package/dist/components/SplitButton.mjs +12 -0
  73. package/dist/components/Table.mjs +2 -2
  74. package/dist/components/TagsInput.d.mts +41 -0
  75. package/dist/components/TagsInput.mjs +13 -0
  76. package/dist/components/TreeSelect.mjs +2 -1
  77. package/dist/index.d.mts +17 -1
  78. package/dist/index.mjs +356 -0
  79. package/package.json +117 -2
  80. package/dist/{chunk-NCHUEGUW.mjs → chunk-H6MVW5YD.mjs} +3 -3
  81. package/dist/{chunk-UT5BV2VO.mjs → chunk-I4MWOYJS.mjs} +3 -3
  82. package/dist/{chunk-E7OTDBI6.mjs → chunk-NWVNTZOP.mjs} +3 -3
  83. package/dist/{chunk-FYINJRYN.mjs → chunk-RQ4PUK6G.mjs} +3 -3
  84. package/dist/{chunk-KMP5CVNK.mjs → chunk-UKY2EPS3.mjs} +3 -3
@@ -0,0 +1,457 @@
1
+ import {
2
+ renderOverlayPortal,
3
+ useAnchoredOverlay
4
+ } from "./chunk-HKAZXG74.mjs";
5
+
6
+ // src/components/ContextMenu.tsx
7
+ import React, {
8
+ createContext,
9
+ useContext,
10
+ useState,
11
+ useEffect,
12
+ useLayoutEffect,
13
+ useRef,
14
+ useCallback,
15
+ useMemo,
16
+ useId
17
+ } from "react";
18
+ import {
19
+ classNames,
20
+ getContextMenuContainerClasses,
21
+ getContextMenuTriggerClasses,
22
+ getContextMenuMenuClasses,
23
+ getContextMenuItemClasses,
24
+ getContextMenuSubTriggerClasses,
25
+ getContextMenuSubChevronClasses,
26
+ getContextMenuPointStyle,
27
+ getContextMenuOpenPoint,
28
+ injectContextMenuStyles,
29
+ CONTEXT_MENU_ENTER_CLASS,
30
+ CONTEXT_MENU_SUB_CHEVRON_PATH,
31
+ isContextMenuKeyboardEvent,
32
+ handleMenuNavigation,
33
+ focusFirstMenuItem,
34
+ captureActiveElement,
35
+ restoreFocus
36
+ } from "@expcat/tigercat-core";
37
+ import { jsx, jsxs } from "react/jsx-runtime";
38
+ var ContextMenuContext = createContext(null);
39
+ var ContextMenuMenu = ({
40
+ className,
41
+ style,
42
+ children,
43
+ role,
44
+ ...divProps
45
+ }) => {
46
+ const menuClasses = classNames(getContextMenuMenuClasses(), className);
47
+ return /* @__PURE__ */ jsx("div", { className: menuClasses, style, role: role ?? "menu", ...divProps, children });
48
+ };
49
+ var ContextMenuItem = ({
50
+ disabled = false,
51
+ divided = false,
52
+ className,
53
+ onClick,
54
+ children,
55
+ ...buttonProps
56
+ }) => {
57
+ const context = useContext(ContextMenuContext);
58
+ const handleClick = (event) => {
59
+ if (disabled) {
60
+ event.preventDefault();
61
+ return;
62
+ }
63
+ onClick?.(event);
64
+ if (context?.closeOnClick) {
65
+ context.handleItemClick();
66
+ }
67
+ };
68
+ const itemClasses = classNames(getContextMenuItemClasses(disabled, divided), className);
69
+ return /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ type: "button",
73
+ className: itemClasses,
74
+ role: "menuitem",
75
+ tabIndex: -1,
76
+ "aria-disabled": disabled,
77
+ disabled,
78
+ onClick: handleClick,
79
+ ...buttonProps,
80
+ children
81
+ }
82
+ );
83
+ };
84
+ var ContextMenuSub = ({
85
+ title = "",
86
+ disabled = false,
87
+ className,
88
+ style,
89
+ children
90
+ }) => {
91
+ const context = useContext(ContextMenuContext);
92
+ const [isHovered, setIsHovered] = useState(false);
93
+ const [isOpenByKeyboard, setIsOpenByKeyboard] = useState(false);
94
+ const popupCloseTimerRef = useRef(null);
95
+ const titleRef = useRef(null);
96
+ const popupRef = useRef(null);
97
+ const isExpanded = isHovered || isOpenByKeyboard;
98
+ const portalEnabled = Boolean(context?.portal);
99
+ const overlay = useAnchoredOverlay({
100
+ referenceRef: titleRef,
101
+ floatingRef: popupRef,
102
+ enabled: Boolean(context) && isExpanded && !disabled,
103
+ placement: "right-start",
104
+ offset: 4,
105
+ portal: portalEnabled,
106
+ dismissOnEscape: true,
107
+ onDismiss: () => {
108
+ setIsOpenByKeyboard(false);
109
+ setIsHovered(false);
110
+ }
111
+ });
112
+ useEffect(() => {
113
+ if (!context?.open) {
114
+ setIsHovered(false);
115
+ setIsOpenByKeyboard(false);
116
+ }
117
+ }, [context?.open]);
118
+ useEffect(() => {
119
+ return () => {
120
+ if (popupCloseTimerRef.current) {
121
+ clearTimeout(popupCloseTimerRef.current);
122
+ }
123
+ };
124
+ }, []);
125
+ const clearCloseTimer = useCallback(() => {
126
+ if (popupCloseTimerRef.current) {
127
+ clearTimeout(popupCloseTimerRef.current);
128
+ popupCloseTimerRef.current = null;
129
+ }
130
+ }, []);
131
+ const handleMouseEnter = useCallback(() => {
132
+ if (disabled) return;
133
+ clearCloseTimer();
134
+ setIsHovered(true);
135
+ }, [clearCloseTimer, disabled]);
136
+ const handleMouseLeave = useCallback(() => {
137
+ const close = () => {
138
+ setIsHovered(false);
139
+ setIsOpenByKeyboard(false);
140
+ };
141
+ if (portalEnabled) {
142
+ popupCloseTimerRef.current = setTimeout(close, 120);
143
+ return;
144
+ }
145
+ close();
146
+ }, [portalEnabled]);
147
+ const focusPopupFirstItem = useCallback(() => {
148
+ requestAnimationFrame(() => {
149
+ if (popupRef.current) focusFirstMenuItem(popupRef.current);
150
+ });
151
+ }, []);
152
+ const handleTitleKeyDown = useCallback(
153
+ (event) => {
154
+ if (disabled) return;
155
+ if (event.key === "ArrowRight" || event.key === "Enter" || event.key === " ") {
156
+ event.preventDefault();
157
+ event.stopPropagation();
158
+ setIsOpenByKeyboard(true);
159
+ setIsHovered(true);
160
+ focusPopupFirstItem();
161
+ return;
162
+ }
163
+ if (event.key === "ArrowLeft" || event.key === "Escape") {
164
+ if (isExpanded) {
165
+ event.preventDefault();
166
+ event.stopPropagation();
167
+ setIsOpenByKeyboard(false);
168
+ setIsHovered(false);
169
+ titleRef.current?.focus();
170
+ }
171
+ }
172
+ },
173
+ [disabled, focusPopupFirstItem, isExpanded]
174
+ );
175
+ const handlePopupKeyDown = useCallback((event) => {
176
+ if (popupRef.current) {
177
+ handleMenuNavigation(popupRef.current, event.nativeEvent);
178
+ }
179
+ if (event.key === "ArrowLeft" || event.key === "Escape") {
180
+ event.preventDefault();
181
+ event.stopPropagation();
182
+ setIsOpenByKeyboard(false);
183
+ setIsHovered(false);
184
+ titleRef.current?.focus();
185
+ }
186
+ }, []);
187
+ const handlePopupContextMenu = useCallback((event) => {
188
+ event.preventDefault();
189
+ }, []);
190
+ if (!context) return null;
191
+ const triggerClasses = classNames(getContextMenuSubTriggerClasses(disabled), className);
192
+ const popupClasses = classNames(overlay.floatingClasses, CONTEXT_MENU_ENTER_CLASS);
193
+ const popup = /* @__PURE__ */ jsx(
194
+ "div",
195
+ {
196
+ ref: popupRef,
197
+ className: popupClasses,
198
+ style: overlay.floatingStyles,
199
+ "data-positioned": overlay.positioned,
200
+ "data-tiger-context-menu-sub": "",
201
+ hidden: !isExpanded,
202
+ onMouseEnter: handleMouseEnter,
203
+ onMouseLeave: handleMouseLeave,
204
+ onKeyDown: handlePopupKeyDown,
205
+ onContextMenu: handlePopupContextMenu,
206
+ children: /* @__PURE__ */ jsx("div", { className: getContextMenuMenuClasses(), role: "menu", children })
207
+ }
208
+ );
209
+ return /* @__PURE__ */ jsxs(
210
+ "div",
211
+ {
212
+ className: portalEnabled ? void 0 : "relative",
213
+ onMouseEnter: handleMouseEnter,
214
+ onMouseLeave: handleMouseLeave,
215
+ role: "none",
216
+ children: [
217
+ /* @__PURE__ */ jsxs(
218
+ "button",
219
+ {
220
+ ref: titleRef,
221
+ type: "button",
222
+ className: triggerClasses,
223
+ style,
224
+ role: "menuitem",
225
+ tabIndex: -1,
226
+ "aria-haspopup": "menu",
227
+ "aria-expanded": isExpanded,
228
+ "aria-disabled": disabled || void 0,
229
+ "data-state": isExpanded ? "open" : "closed",
230
+ "data-tiger-context-menu-sub-trigger": "",
231
+ disabled,
232
+ onClick: (event) => {
233
+ event.preventDefault();
234
+ event.stopPropagation();
235
+ },
236
+ onKeyDown: handleTitleKeyDown,
237
+ children: [
238
+ /* @__PURE__ */ jsx("span", { className: "flex-1 text-left", children: title }),
239
+ /* @__PURE__ */ jsx(
240
+ "svg",
241
+ {
242
+ className: getContextMenuSubChevronClasses(),
243
+ viewBox: "0 0 24 24",
244
+ fill: "none",
245
+ stroke: "currentColor",
246
+ strokeWidth: "2",
247
+ strokeLinecap: "round",
248
+ strokeLinejoin: "round",
249
+ "aria-hidden": "true",
250
+ children: /* @__PURE__ */ jsx("path", { d: CONTEXT_MENU_SUB_CHEVRON_PATH })
251
+ }
252
+ )
253
+ ]
254
+ }
255
+ ),
256
+ renderOverlayPortal(popup, overlay.target, !portalEnabled)
257
+ ]
258
+ }
259
+ );
260
+ };
261
+ var ContextMenu = ({
262
+ disabled = false,
263
+ open: controlledOpen,
264
+ defaultOpen = false,
265
+ closeOnClick = true,
266
+ portal = true,
267
+ offset = 0,
268
+ placement = "bottom-start",
269
+ className,
270
+ style,
271
+ onOpenChange,
272
+ children,
273
+ ...divProps
274
+ }) => {
275
+ const [internalVisible, setInternalVisible] = useState(defaultOpen);
276
+ const visible = controlledOpen !== void 0 ? controlledOpen : internalVisible;
277
+ const containerRef = useRef(null);
278
+ const triggerRef = useRef(null);
279
+ const pointNodeRef = useRef(null);
280
+ const floatingRef = useRef(null);
281
+ const previousActiveElementRef = useRef(null);
282
+ const explicitPointRef = useRef(false);
283
+ const [point, setPoint] = useState({ x: 0, y: 0 });
284
+ const reactId = useId();
285
+ const menuId = useMemo(() => `tiger-context-menu-${reactId}`, [reactId]);
286
+ const pointReferenceRef = useMemo(
287
+ () => ({
288
+ get current() {
289
+ return pointNodeRef.current;
290
+ },
291
+ set current(node) {
292
+ pointNodeRef.current = node;
293
+ }
294
+ }),
295
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- point is an invalidation key, not a value
296
+ [point.x, point.y]
297
+ );
298
+ useEffect(() => {
299
+ injectContextMenuStyles();
300
+ }, []);
301
+ const setVisible = useCallback(
302
+ (newVisible) => {
303
+ if (disabled && newVisible) return;
304
+ if (newVisible && !visible) {
305
+ previousActiveElementRef.current = captureActiveElement();
306
+ }
307
+ if (controlledOpen === void 0) {
308
+ setInternalVisible(newVisible);
309
+ }
310
+ onOpenChange?.(newVisible);
311
+ if (newVisible) {
312
+ requestAnimationFrame(() => {
313
+ if (floatingRef.current) {
314
+ focusFirstMenuItem(floatingRef.current);
315
+ }
316
+ });
317
+ } else {
318
+ restoreFocus(previousActiveElementRef.current);
319
+ previousActiveElementRef.current = null;
320
+ }
321
+ },
322
+ [disabled, visible, controlledOpen, onOpenChange]
323
+ );
324
+ useLayoutEffect(() => {
325
+ if (!visible || explicitPointRef.current) return;
326
+ if (!triggerRef.current) return;
327
+ setPoint(getContextMenuOpenPoint(null, triggerRef.current));
328
+ }, [visible]);
329
+ const handleItemClick = useCallback(() => {
330
+ if (closeOnClick) {
331
+ setVisible(false);
332
+ }
333
+ }, [closeOnClick, setVisible]);
334
+ const openAt = useCallback(
335
+ (next) => {
336
+ explicitPointRef.current = true;
337
+ setPoint(next);
338
+ setVisible(true);
339
+ },
340
+ [setVisible]
341
+ );
342
+ const handleContextMenu = useCallback(
343
+ (event) => {
344
+ if (disabled) return;
345
+ event.preventDefault();
346
+ event.stopPropagation();
347
+ openAt(getContextMenuOpenPoint(event.nativeEvent, triggerRef.current));
348
+ },
349
+ [disabled, openAt]
350
+ );
351
+ const handleTriggerKeyDown = useCallback(
352
+ (event) => {
353
+ if (disabled || !isContextMenuKeyboardEvent(event)) return;
354
+ event.preventDefault();
355
+ openAt(getContextMenuOpenPoint(null, triggerRef.current));
356
+ },
357
+ [disabled, openAt]
358
+ );
359
+ const handleMenuKeyDown = useCallback((event) => {
360
+ if (floatingRef.current) {
361
+ handleMenuNavigation(floatingRef.current, event.nativeEvent);
362
+ }
363
+ }, []);
364
+ const handleMenuContextMenu = useCallback((event) => {
365
+ event.preventDefault();
366
+ }, []);
367
+ const overlay = useAnchoredOverlay({
368
+ referenceRef: pointReferenceRef,
369
+ floatingRef,
370
+ enabled: visible,
371
+ placement,
372
+ offset,
373
+ portal,
374
+ dismissOnOutside: true,
375
+ dismissOnEscape: true,
376
+ onDismiss: () => setVisible(false)
377
+ });
378
+ const containerClasses = useMemo(
379
+ () => classNames(getContextMenuContainerClasses(), className),
380
+ [className]
381
+ );
382
+ const triggerClasses = useMemo(() => getContextMenuTriggerClasses(disabled), [disabled]);
383
+ const menuWrapperClasses = classNames(overlay.floatingClasses, CONTEXT_MENU_ENTER_CLASS);
384
+ const pointStyle = useMemo(() => getContextMenuPointStyle(point), [point]);
385
+ const contextValue = useMemo(
386
+ () => ({ closeOnClick, handleItemClick, portal, open: visible }),
387
+ [closeOnClick, handleItemClick, portal, visible]
388
+ );
389
+ const childrenArray = React.Children.toArray(children);
390
+ const triggerChildren = [];
391
+ let menuElement = null;
392
+ childrenArray.forEach((child) => {
393
+ if (React.isValidElement(child) && child.type === ContextMenuMenu) {
394
+ menuElement = child;
395
+ return;
396
+ }
397
+ triggerChildren.push(child);
398
+ });
399
+ const menuWrapperNode = menuElement ? /* @__PURE__ */ jsx(
400
+ "div",
401
+ {
402
+ ref: floatingRef,
403
+ className: menuWrapperClasses,
404
+ style: overlay.floatingStyles,
405
+ "data-positioned": overlay.positioned,
406
+ hidden: !visible,
407
+ "data-tiger-context-menu": "",
408
+ onKeyDown: handleMenuKeyDown,
409
+ onContextMenu: handleMenuContextMenu,
410
+ children: React.isValidElement(menuElement) ? React.cloneElement(menuElement, {
411
+ id: menuId
412
+ }) : menuElement
413
+ },
414
+ `${point.x},${point.y}`
415
+ ) : null;
416
+ return /* @__PURE__ */ jsx(ContextMenuContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: containerClasses, style, ...divProps, children: [
417
+ /* @__PURE__ */ jsx(
418
+ "div",
419
+ {
420
+ ref: triggerRef,
421
+ className: triggerClasses,
422
+ onContextMenu: handleContextMenu,
423
+ onKeyDown: handleTriggerKeyDown,
424
+ "aria-haspopup": "menu",
425
+ "aria-expanded": visible,
426
+ "aria-controls": visible ? menuId : void 0,
427
+ "data-state": visible ? "open" : "closed",
428
+ "data-tiger-context-menu-trigger": "",
429
+ children: triggerChildren
430
+ }
431
+ ),
432
+ /* @__PURE__ */ jsx(
433
+ "div",
434
+ {
435
+ ref: pointNodeRef,
436
+ style: pointStyle,
437
+ "aria-hidden": "true",
438
+ "data-tiger-context-menu-point": ""
439
+ }
440
+ ),
441
+ menuWrapperNode && renderOverlayPortal(menuWrapperNode, overlay.target, !portal)
442
+ ] }) });
443
+ };
444
+ ContextMenu.displayName = "ContextMenu";
445
+ ContextMenuMenu.displayName = "ContextMenuMenu";
446
+ ContextMenuItem.displayName = "ContextMenuItem";
447
+ ContextMenuSub.displayName = "ContextMenuSub";
448
+ var ContextMenu_default = ContextMenu;
449
+
450
+ export {
451
+ ContextMenuContext,
452
+ ContextMenuMenu,
453
+ ContextMenuItem,
454
+ ContextMenuSub,
455
+ ContextMenu,
456
+ ContextMenu_default
457
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Pagination
3
- } from "./chunk-HHIW7V7B.mjs";
3
+ } from "./chunk-PFL4HNWM.mjs";
4
4
  import {
5
5
  VirtualList
6
6
  } from "./chunk-Y5X3G2LD.mjs";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-IIWUQK2P.mjs";
7
7
  import {
8
8
  Pagination
9
- } from "./chunk-HHIW7V7B.mjs";
9
+ } from "./chunk-PFL4HNWM.mjs";
10
10
  import {
11
11
  Empty
12
12
  } from "./chunk-W7BC4I2Y.mjs";
@@ -0,0 +1,47 @@
1
+ // src/components/Kbd.tsx
2
+ import { forwardRef } from "react";
3
+ import {
4
+ formatKbdSeparatorText,
5
+ getKbdParts,
6
+ getKbdRootClasses,
7
+ kbdKeyClasses,
8
+ kbdSeparatorClasses
9
+ } from "@expcat/tigercat-core";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function hasRenderableChildren(children) {
12
+ if (children == null || typeof children === "boolean") return false;
13
+ if (typeof children === "string" && children.length === 0) return false;
14
+ return true;
15
+ }
16
+ var Kbd = forwardRef(
17
+ ({ keys, separator, size = "md", variant = "default", className, style, children, ...rest }, ref) => {
18
+ const parts = getKbdParts(keys, separator);
19
+ const hasChildren = hasRenderableChildren(children);
20
+ return /* @__PURE__ */ jsxs(
21
+ "kbd",
22
+ {
23
+ ref,
24
+ "data-kbd": "",
25
+ "data-kbd-size": size,
26
+ "data-kbd-variant": variant,
27
+ className: getKbdRootClasses({ size, variant, className }),
28
+ style,
29
+ ...rest,
30
+ children: [
31
+ parts.map(
32
+ (part, index) => part.type === "separator" ? /* @__PURE__ */ jsx("span", { className: kbdSeparatorClasses, "data-kbd-separator": "", children: ` ${part.value} ` }, `sep-${index}`) : /* @__PURE__ */ jsx("kbd", { className: kbdKeyClasses, "data-kbd-key": "", children: part.value }, `key-${index}`)
33
+ ),
34
+ hasChildren && parts.length > 0 ? /* @__PURE__ */ jsx("span", { className: kbdSeparatorClasses, "data-kbd-separator": "", children: formatKbdSeparatorText(separator) }) : null,
35
+ hasChildren ? children : null
36
+ ]
37
+ }
38
+ );
39
+ }
40
+ );
41
+ Kbd.displayName = "Kbd";
42
+ var Kbd_default = Kbd;
43
+
44
+ export {
45
+ Kbd,
46
+ Kbd_default
47
+ };