@thangnqdev/ui 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 (253) hide show
  1. package/README.md +196 -0
  2. package/dist/Label-DWOlgSNW.d.cts +14 -0
  3. package/dist/Label-DWOlgSNW.d.ts +14 -0
  4. package/dist/bento/index.cjs +140 -0
  5. package/dist/bento/index.cjs.map +1 -0
  6. package/dist/bento/index.d.cts +4 -0
  7. package/dist/bento/index.d.ts +4 -0
  8. package/dist/bento/index.js +4 -0
  9. package/dist/bento/index.js.map +1 -0
  10. package/dist/bento/styles.css +46 -0
  11. package/dist/buttons/index.cjs +365 -0
  12. package/dist/buttons/index.cjs.map +1 -0
  13. package/dist/buttons/index.d.cts +4 -0
  14. package/dist/buttons/index.d.ts +4 -0
  15. package/dist/buttons/index.js +5 -0
  16. package/dist/buttons/index.js.map +1 -0
  17. package/dist/buttons/styles.css +6 -0
  18. package/dist/chunk-2OXZK6IP.js +514 -0
  19. package/dist/chunk-2OXZK6IP.js.map +1 -0
  20. package/dist/chunk-4S6L5V7X.js +15 -0
  21. package/dist/chunk-4S6L5V7X.js.map +1 -0
  22. package/dist/chunk-5FZ6ZFII.js +728 -0
  23. package/dist/chunk-5FZ6ZFII.js.map +1 -0
  24. package/dist/chunk-66VWUJEI.js +86 -0
  25. package/dist/chunk-66VWUJEI.js.map +1 -0
  26. package/dist/chunk-A7P3O5Z5.js +163 -0
  27. package/dist/chunk-A7P3O5Z5.js.map +1 -0
  28. package/dist/chunk-ATYGDTMK.js +257 -0
  29. package/dist/chunk-ATYGDTMK.js.map +1 -0
  30. package/dist/chunk-C4SUXMI3.js +138 -0
  31. package/dist/chunk-C4SUXMI3.js.map +1 -0
  32. package/dist/chunk-EU2LPUYP.js +25 -0
  33. package/dist/chunk-EU2LPUYP.js.map +1 -0
  34. package/dist/chunk-F5Q7BTMH.js +1991 -0
  35. package/dist/chunk-F5Q7BTMH.js.map +1 -0
  36. package/dist/chunk-GXI2H5XA.js +46 -0
  37. package/dist/chunk-GXI2H5XA.js.map +1 -0
  38. package/dist/chunk-H3LCNPMC.js +101 -0
  39. package/dist/chunk-H3LCNPMC.js.map +1 -0
  40. package/dist/chunk-IABPUCAQ.js +19 -0
  41. package/dist/chunk-IABPUCAQ.js.map +1 -0
  42. package/dist/chunk-KJRBRTQE.js +101 -0
  43. package/dist/chunk-KJRBRTQE.js.map +1 -0
  44. package/dist/chunk-LBUBXUYQ.js +40 -0
  45. package/dist/chunk-LBUBXUYQ.js.map +1 -0
  46. package/dist/chunk-LWFRUJRU.js +537 -0
  47. package/dist/chunk-LWFRUJRU.js.map +1 -0
  48. package/dist/chunk-NFVONJUK.js +882 -0
  49. package/dist/chunk-NFVONJUK.js.map +1 -0
  50. package/dist/chunk-PF4ZHGVW.js +284 -0
  51. package/dist/chunk-PF4ZHGVW.js.map +1 -0
  52. package/dist/chunk-WAFHC4DQ.js +366 -0
  53. package/dist/chunk-WAFHC4DQ.js.map +1 -0
  54. package/dist/chunk-X76KBH4Y.js +71 -0
  55. package/dist/chunk-X76KBH4Y.js.map +1 -0
  56. package/dist/core/index.cjs +103 -0
  57. package/dist/core/index.cjs.map +1 -0
  58. package/dist/core/index.d.cts +3 -0
  59. package/dist/core/index.d.ts +3 -0
  60. package/dist/core/index.js +4 -0
  61. package/dist/core/index.js.map +1 -0
  62. package/dist/core/styles.css +128 -0
  63. package/dist/data-display/index.cjs +1023 -0
  64. package/dist/data-display/index.cjs.map +1 -0
  65. package/dist/data-display/index.d.cts +4 -0
  66. package/dist/data-display/index.d.ts +4 -0
  67. package/dist/data-display/index.js +6 -0
  68. package/dist/data-display/index.js.map +1 -0
  69. package/dist/data-display/styles.css +4 -0
  70. package/dist/feedback/index.cjs +368 -0
  71. package/dist/feedback/index.cjs.map +1 -0
  72. package/dist/feedback/index.d.cts +4 -0
  73. package/dist/feedback/index.d.ts +4 -0
  74. package/dist/feedback/index.js +4 -0
  75. package/dist/feedback/index.js.map +1 -0
  76. package/dist/feedback/styles.css +4 -0
  77. package/dist/forms/index.cjs +2287 -0
  78. package/dist/forms/index.cjs.map +1 -0
  79. package/dist/forms/index.d.cts +5 -0
  80. package/dist/forms/index.d.ts +5 -0
  81. package/dist/forms/index.js +10 -0
  82. package/dist/forms/index.js.map +1 -0
  83. package/dist/forms/styles.css +6 -0
  84. package/dist/glass/index.cjs +165 -0
  85. package/dist/glass/index.cjs.map +1 -0
  86. package/dist/glass/index.d.cts +4 -0
  87. package/dist/glass/index.d.ts +4 -0
  88. package/dist/glass/index.js +4 -0
  89. package/dist/glass/index.js.map +1 -0
  90. package/dist/glass/styles.css +81 -0
  91. package/dist/index-BTvkbCIj.d.cts +146 -0
  92. package/dist/index-BTvkbCIj.d.ts +146 -0
  93. package/dist/index-BkRqGNG1.d.cts +201 -0
  94. package/dist/index-BkRqGNG1.d.ts +201 -0
  95. package/dist/index-BlPcGeW-.d.cts +45 -0
  96. package/dist/index-BlPcGeW-.d.ts +45 -0
  97. package/dist/index-BzOCqvC6.d.cts +32 -0
  98. package/dist/index-BzOCqvC6.d.ts +32 -0
  99. package/dist/index-CCeWYAvn.d.cts +83 -0
  100. package/dist/index-COQ7uwt9.d.cts +44 -0
  101. package/dist/index-COQ7uwt9.d.ts +44 -0
  102. package/dist/index-CenuF_P2.d.cts +221 -0
  103. package/dist/index-CenuF_P2.d.ts +221 -0
  104. package/dist/index-Cle6QzQl.d.ts +371 -0
  105. package/dist/index-D6fE7w-b.d.cts +90 -0
  106. package/dist/index-D6fE7w-b.d.ts +90 -0
  107. package/dist/index-DR8cfJUG.d.ts +83 -0
  108. package/dist/index-DzcWh1Hs.d.cts +131 -0
  109. package/dist/index-DzcWh1Hs.d.ts +131 -0
  110. package/dist/index-TyK-Ldpy.d.cts +371 -0
  111. package/dist/index-ugj5s6a3.d.cts +95 -0
  112. package/dist/index-ugj5s6a3.d.ts +95 -0
  113. package/dist/index.cjs +6400 -0
  114. package/dist/index.cjs.map +1 -0
  115. package/dist/index.d.cts +16 -0
  116. package/dist/index.d.ts +16 -0
  117. package/dist/index.js +21 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/layout/index.cjs +516 -0
  120. package/dist/layout/index.cjs.map +1 -0
  121. package/dist/layout/index.d.cts +4 -0
  122. package/dist/layout/index.d.ts +4 -0
  123. package/dist/layout/index.js +4 -0
  124. package/dist/layout/index.js.map +1 -0
  125. package/dist/layout/styles.css +8 -0
  126. package/dist/navigation/index.cjs +673 -0
  127. package/dist/navigation/index.cjs.map +1 -0
  128. package/dist/navigation/index.d.cts +2 -0
  129. package/dist/navigation/index.d.ts +2 -0
  130. package/dist/navigation/index.js +8 -0
  131. package/dist/navigation/index.js.map +1 -0
  132. package/dist/navigation/styles.css +4 -0
  133. package/dist/overlays/index.cjs +954 -0
  134. package/dist/overlays/index.cjs.map +1 -0
  135. package/dist/overlays/index.d.cts +4 -0
  136. package/dist/overlays/index.d.ts +4 -0
  137. package/dist/overlays/index.js +9 -0
  138. package/dist/overlays/index.js.map +1 -0
  139. package/dist/overlays/styles.css +8 -0
  140. package/dist/styles.css +333 -0
  141. package/dist/typography/index.cjs +311 -0
  142. package/dist/typography/index.cjs.map +1 -0
  143. package/dist/typography/index.d.cts +5 -0
  144. package/dist/typography/index.d.ts +5 -0
  145. package/dist/typography/index.js +6 -0
  146. package/dist/typography/index.js.map +1 -0
  147. package/dist/typography/styles.css +5 -0
  148. package/llms.txt +113 -0
  149. package/package.json +116 -0
  150. package/src/bento/BentoCard.tsx +140 -0
  151. package/src/bento/BentoGrid.tsx +50 -0
  152. package/src/bento/index.ts +2 -0
  153. package/src/bento/tokens.css +46 -0
  154. package/src/buttons/Button.tsx +104 -0
  155. package/src/buttons/ButtonGroup.tsx +43 -0
  156. package/src/buttons/IconButton.tsx +79 -0
  157. package/src/buttons/SplitButton.tsx +86 -0
  158. package/src/buttons/ToggleButton.tsx +157 -0
  159. package/src/buttons/index.ts +5 -0
  160. package/src/buttons/tokens.css +6 -0
  161. package/src/core/ThemeProvider.tsx +123 -0
  162. package/src/core/index.ts +2 -0
  163. package/src/core/tokens.css +128 -0
  164. package/src/data-display/Accordion.tsx +147 -0
  165. package/src/data-display/Avatar.tsx +134 -0
  166. package/src/data-display/Card.tsx +112 -0
  167. package/src/data-display/Carousel.tsx +130 -0
  168. package/src/data-display/Chip.tsx +74 -0
  169. package/src/data-display/DataTablePro.tsx +356 -0
  170. package/src/data-display/StatCard.tsx +60 -0
  171. package/src/data-display/Table.tsx +74 -0
  172. package/src/data-display/Timeline.tsx +62 -0
  173. package/src/data-display/TreeView.tsx +140 -0
  174. package/src/data-display/index.ts +10 -0
  175. package/src/data-display/tokens.css +4 -0
  176. package/src/feedback/Alert.tsx +80 -0
  177. package/src/feedback/EmptyState.tsx +45 -0
  178. package/src/feedback/ProgressBar.tsx +174 -0
  179. package/src/feedback/Skeleton.tsx +66 -0
  180. package/src/feedback/Spinner.tsx +65 -0
  181. package/src/feedback/index.ts +5 -0
  182. package/src/feedback/tokens.css +4 -0
  183. package/src/forms/Checkbox.tsx +69 -0
  184. package/src/forms/CheckboxGroup.tsx +29 -0
  185. package/src/forms/Combobox.tsx +368 -0
  186. package/src/forms/DatePicker.tsx +480 -0
  187. package/src/forms/FileUpload.tsx +222 -0
  188. package/src/forms/FormField.tsx +115 -0
  189. package/src/forms/Input.tsx +151 -0
  190. package/src/forms/MaskedInput.tsx +97 -0
  191. package/src/forms/NumberInput.tsx +248 -0
  192. package/src/forms/PasswordInput.tsx +35 -0
  193. package/src/forms/PinInput.tsx +125 -0
  194. package/src/forms/Radio.tsx +142 -0
  195. package/src/forms/RangeSlider.tsx +111 -0
  196. package/src/forms/SearchInput.tsx +34 -0
  197. package/src/forms/Select.tsx +103 -0
  198. package/src/forms/Slider.tsx +85 -0
  199. package/src/forms/Switch.tsx +95 -0
  200. package/src/forms/Textarea.tsx +114 -0
  201. package/src/forms/index.ts +18 -0
  202. package/src/forms/tokens.css +6 -0
  203. package/src/glass/GlassBadge.tsx +61 -0
  204. package/src/glass/GlassButton.tsx +59 -0
  205. package/src/glass/GlassCard.tsx +71 -0
  206. package/src/glass/index.ts +3 -0
  207. package/src/glass/tokens.css +81 -0
  208. package/src/index.ts +26 -0
  209. package/src/layout/AspectRatio.tsx +39 -0
  210. package/src/layout/Container.tsx +53 -0
  211. package/src/layout/Divider.tsx +61 -0
  212. package/src/layout/Flex.tsx +79 -0
  213. package/src/layout/Grid.tsx +124 -0
  214. package/src/layout/PageLayout.tsx +59 -0
  215. package/src/layout/ScrollArea.tsx +43 -0
  216. package/src/layout/Section.tsx +47 -0
  217. package/src/layout/Spacer.tsx +30 -0
  218. package/src/layout/Stack.tsx +88 -0
  219. package/src/layout/index.ts +10 -0
  220. package/src/layout/tokens.css +8 -0
  221. package/src/navigation/Breadcrumb.tsx +73 -0
  222. package/src/navigation/CommandPalette.tsx +142 -0
  223. package/src/navigation/DropdownMenu.tsx +160 -0
  224. package/src/navigation/Pagination.tsx +114 -0
  225. package/src/navigation/Stepper.tsx +93 -0
  226. package/src/navigation/Tabs.tsx +133 -0
  227. package/src/navigation/index.ts +6 -0
  228. package/src/navigation/tokens.css +4 -0
  229. package/src/overlays/AlertDialog.tsx +54 -0
  230. package/src/overlays/BottomSheet.tsx +123 -0
  231. package/src/overlays/ContextMenu.tsx +119 -0
  232. package/src/overlays/Drawer.tsx +145 -0
  233. package/src/overlays/FocusTrap.tsx +49 -0
  234. package/src/overlays/HoverCard.tsx +72 -0
  235. package/src/overlays/Modal.tsx +219 -0
  236. package/src/overlays/Popover.tsx +126 -0
  237. package/src/overlays/Portal.tsx +23 -0
  238. package/src/overlays/Toast.tsx +137 -0
  239. package/src/overlays/Tooltip.tsx +100 -0
  240. package/src/overlays/index.ts +11 -0
  241. package/src/overlays/tokens.css +8 -0
  242. package/src/styles/tokens.css +2 -0
  243. package/src/typography/Blockquote.tsx +32 -0
  244. package/src/typography/Code.tsx +89 -0
  245. package/src/typography/Heading.tsx +56 -0
  246. package/src/typography/Kbd.tsx +25 -0
  247. package/src/typography/Label.tsx +47 -0
  248. package/src/typography/Link.tsx +56 -0
  249. package/src/typography/Text.tsx +62 -0
  250. package/src/typography/index.ts +7 -0
  251. package/src/typography/tokens.css +5 -0
  252. package/src/utils/cn.ts +6 -0
  253. package/ui-contract.json +62 -0
@@ -0,0 +1,673 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var clsx = require('clsx');
5
+ var tailwindMerge = require('tailwind-merge');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var lucideReact = require('lucide-react');
8
+ var classVarianceAuthority = require('class-variance-authority');
9
+ var reactDom = require('react-dom');
10
+
11
+ // src/navigation/Tabs.tsx
12
+ function cn(...inputs) {
13
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
14
+ }
15
+ var TabsContext = react.createContext(null);
16
+ function useTabs() {
17
+ const context = react.useContext(TabsContext);
18
+ if (!context) throw new Error("Tabs compound components must be used within <Tabs />");
19
+ return context;
20
+ }
21
+ var Tabs = react.forwardRef(
22
+ ({ defaultValue = "", value: controlledValue, onValueChange, variant = "pills", className, children, ...props }, ref) => {
23
+ const [selectedTab, setSelectedTab] = react.useState(defaultValue);
24
+ const activeTab = controlledValue !== void 0 ? controlledValue : selectedTab;
25
+ const handleTabChange = (val) => {
26
+ setSelectedTab(val);
27
+ onValueChange?.(val);
28
+ };
29
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { activeTab, setActiveTab: handleTabChange, variant }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("w-full flex flex-col space-y-4", className), ...props, children }) });
30
+ }
31
+ );
32
+ Tabs.displayName = "Tabs";
33
+ var TabsList = react.forwardRef(
34
+ ({ className, children, ...props }, ref) => {
35
+ const { variant } = useTabs();
36
+ return /* @__PURE__ */ jsxRuntime.jsx(
37
+ "div",
38
+ {
39
+ ref,
40
+ role: "tablist",
41
+ className: cn(
42
+ "inline-flex items-center",
43
+ variant === "pills" && "p-1 rounded-[var(--ui-radius-lg)] bg-[var(--ui-bg-secondary)] border border-[var(--ui-border-subtle)] gap-1",
44
+ variant === "line" && "border-b border-[var(--ui-border-default)] gap-6",
45
+ variant === "enclosed" && "border-b border-[var(--ui-border-default)] gap-1",
46
+ className
47
+ ),
48
+ ...props,
49
+ children
50
+ }
51
+ );
52
+ }
53
+ );
54
+ TabsList.displayName = "TabsList";
55
+ var TabsTrigger = react.forwardRef(
56
+ ({ className, value, children, ...props }, ref) => {
57
+ const { activeTab, setActiveTab, variant } = useTabs();
58
+ const isActive = activeTab === value;
59
+ return /* @__PURE__ */ jsxRuntime.jsx(
60
+ "button",
61
+ {
62
+ ref,
63
+ role: "tab",
64
+ type: "button",
65
+ "aria-selected": isActive,
66
+ onClick: () => setActiveTab(value),
67
+ className: cn(
68
+ "inline-flex items-center justify-center font-medium text-sm transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] disabled:pointer-events-none disabled:opacity-50 select-none cursor-pointer",
69
+ variant === "pills" && "px-3.5 py-1.5 rounded-[var(--ui-radius-md)] text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)]",
70
+ variant === "pills" && isActive && "bg-[var(--ui-bg-surface)] text-[var(--ui-text-primary)] font-semibold shadow-sm",
71
+ variant === "line" && "pb-3 pt-2 text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] border-b-2 border-transparent -mb-[1px]",
72
+ variant === "line" && isActive && "border-[var(--ui-primary)] text-[var(--ui-primary)] font-semibold",
73
+ variant === "enclosed" && "px-4 py-2 rounded-t-[var(--ui-radius-md)] border border-transparent text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] -mb-[1px]",
74
+ variant === "enclosed" && isActive && "bg-[var(--ui-bg-surface)] border-[var(--ui-border-default)] border-b-transparent text-[var(--ui-text-primary)] font-semibold",
75
+ className
76
+ ),
77
+ ...props,
78
+ children
79
+ }
80
+ );
81
+ }
82
+ );
83
+ TabsTrigger.displayName = "TabsTrigger";
84
+ var TabsContent = react.forwardRef(
85
+ ({ className, value, children, ...props }, ref) => {
86
+ const { activeTab } = useTabs();
87
+ if (activeTab !== value) return null;
88
+ return /* @__PURE__ */ jsxRuntime.jsx(
89
+ "div",
90
+ {
91
+ ref,
92
+ role: "tabpanel",
93
+ tabIndex: 0,
94
+ className: cn("focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-primary)] animate-in fade-in duration-150", className),
95
+ ...props,
96
+ children
97
+ }
98
+ );
99
+ }
100
+ );
101
+ TabsContent.displayName = "TabsContent";
102
+ var Breadcrumb = react.forwardRef(
103
+ ({ className, children, ...props }, ref) => {
104
+ return /* @__PURE__ */ jsxRuntime.jsx("nav", { ref, "aria-label": "Breadcrumb", className: cn("flex items-center text-sm", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "flex items-center gap-1.5 sm:gap-2", children }) });
105
+ }
106
+ );
107
+ Breadcrumb.displayName = "Breadcrumb";
108
+ var BreadcrumbItem = react.forwardRef(
109
+ ({ className, children, ...props }, ref) => {
110
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props, children });
111
+ }
112
+ );
113
+ BreadcrumbItem.displayName = "BreadcrumbItem";
114
+ var BreadcrumbLink = react.forwardRef(
115
+ ({ className, as: Component = "a", children, ...props }, ref) => {
116
+ return /* @__PURE__ */ jsxRuntime.jsx(
117
+ Component,
118
+ {
119
+ ref,
120
+ className: cn("text-[var(--ui-text-muted)] hover:text-[var(--ui-text-primary)] transition-colors font-medium", className),
121
+ ...props,
122
+ children
123
+ }
124
+ );
125
+ }
126
+ );
127
+ BreadcrumbLink.displayName = "BreadcrumbLink";
128
+ var BreadcrumbPage = react.forwardRef(
129
+ ({ className, children, ...props }, ref) => {
130
+ return /* @__PURE__ */ jsxRuntime.jsx(
131
+ "span",
132
+ {
133
+ ref,
134
+ role: "link",
135
+ "aria-disabled": "true",
136
+ "aria-current": "page",
137
+ className: cn("font-semibold text-[var(--ui-text-primary)]", className),
138
+ ...props,
139
+ children
140
+ }
141
+ );
142
+ }
143
+ );
144
+ BreadcrumbPage.displayName = "BreadcrumbPage";
145
+ var BreadcrumbSeparator = react.forwardRef(
146
+ ({ className, children, ...props }, ref) => {
147
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { ref, role: "presentation", "aria-hidden": "true", className: cn("text-[var(--ui-text-muted)] opacity-60", className), ...props, children: children || /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "w-3.5 h-3.5" }) });
148
+ }
149
+ );
150
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
151
+ var buttonVariants = classVarianceAuthority.cva(
152
+ "relative inline-flex items-center justify-center font-medium transition-all duration-200 select-none cursor-pointer disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-[var(--ui-primary)]/30 active:scale-[0.97] overflow-hidden",
153
+ {
154
+ variants: {
155
+ variant: {
156
+ primary: "bg-[var(--ui-primary)] hover:bg-[var(--ui-primary-hover)] text-white shadow-sm hover:shadow-[0_4px_16px_rgba(0,113,227,0.35)] border border-white/20",
157
+ secondary: "bg-[var(--ui-bg-tertiary)] hover:bg-[var(--ui-bg-surface)] text-[var(--ui-text-primary)] border border-[var(--ui-border-subtle)] shadow-sm",
158
+ outline: "border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)]/60 backdrop-blur-xl text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)] hover:border-[var(--ui-border-strong)] shadow-sm",
159
+ ghost: "bg-transparent text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)]/70",
160
+ danger: "bg-[var(--ui-error)] hover:bg-[var(--ui-error)]/90 text-white shadow-sm hover:shadow-[0_4px_16px_rgba(255,59,48,0.35)] border border-white/15",
161
+ link: "bg-transparent text-[var(--ui-primary)] underline-offset-4 hover:underline p-0 h-auto active:scale-100 font-normal",
162
+ glass: "bg-white/10 dark:bg-white/10 backdrop-blur-2xl border border-white/20 dark:border-white/15 text-[var(--ui-text-primary)] hover:bg-white/20 dark:hover:bg-white/15 shadow-[0_8px_32px_rgba(0,0,0,0.12)] hover:shadow-[0_8px_32px_rgba(0,113,227,0.25)]"
163
+ },
164
+ size: {
165
+ xs: "h-7 px-2.5 text-xs rounded-[var(--ui-radius-sm)] gap-1",
166
+ sm: "h-8.5 px-3.5 text-xs rounded-[var(--ui-radius-md)] gap-1.5",
167
+ md: "h-10 px-4.5 text-sm rounded-[var(--ui-radius-md)] gap-2 font-semibold",
168
+ lg: "h-12 px-6 text-base rounded-[var(--ui-radius-lg)] gap-2.5 font-semibold",
169
+ xl: "h-14 px-8 text-lg rounded-[var(--ui-radius-xl)] gap-3 font-bold"
170
+ },
171
+ fullWidth: {
172
+ true: "w-full",
173
+ false: ""
174
+ }
175
+ },
176
+ defaultVariants: {
177
+ variant: "primary",
178
+ size: "md",
179
+ fullWidth: false
180
+ }
181
+ }
182
+ );
183
+ var Button = react.forwardRef(
184
+ ({
185
+ className,
186
+ variant,
187
+ size,
188
+ fullWidth,
189
+ loading = false,
190
+ loadingText,
191
+ leftIcon,
192
+ rightIcon,
193
+ disabled,
194
+ children,
195
+ ...props
196
+ }, ref) => {
197
+ const isDisabled = disabled || loading;
198
+ return /* @__PURE__ */ jsxRuntime.jsxs(
199
+ "button",
200
+ {
201
+ ref,
202
+ disabled: isDisabled,
203
+ className: cn(buttonVariants({ variant, size, fullWidth }), className),
204
+ ...props,
205
+ children: [
206
+ /* @__PURE__ */ jsxRuntime.jsx(
207
+ "span",
208
+ {
209
+ "aria-hidden": "true",
210
+ className: "absolute inset-x-0 top-0 h-[1px] bg-gradient-to-r from-transparent via-white/35 to-transparent pointer-events-none"
211
+ }
212
+ ),
213
+ loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
214
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }),
215
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: loadingText || children })
216
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
217
+ leftIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 inline-flex items-center", children: leftIcon }),
218
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
219
+ rightIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 inline-flex items-center", children: rightIcon })
220
+ ] })
221
+ ]
222
+ }
223
+ );
224
+ }
225
+ );
226
+ Button.displayName = "Button";
227
+ var Pagination = react.forwardRef(
228
+ ({ className, currentPage, totalPages, onPageChange, siblingCount = 1, ...props }, ref) => {
229
+ const generatePages = () => {
230
+ const totalPageNumbers = siblingCount * 2 + 5;
231
+ if (totalPages <= totalPageNumbers) {
232
+ return Array.from({ length: totalPages }, (_, i) => i + 1);
233
+ }
234
+ const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);
235
+ const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);
236
+ const shouldShowLeftDots = leftSiblingIndex > 2;
237
+ const shouldShowRightDots = rightSiblingIndex < totalPages - 2;
238
+ if (!shouldShowLeftDots && shouldShowRightDots) {
239
+ const leftItemCount = 3 + 2 * siblingCount;
240
+ const leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);
241
+ return [...leftRange, "DOTS", totalPages];
242
+ }
243
+ if (shouldShowLeftDots && !shouldShowRightDots) {
244
+ const rightItemCount = 3 + 2 * siblingCount;
245
+ const rightRange = Array.from(
246
+ { length: rightItemCount },
247
+ (_, i) => totalPages - rightItemCount + i + 1
248
+ );
249
+ return [1, "DOTS", ...rightRange];
250
+ }
251
+ if (shouldShowLeftDots && shouldShowRightDots) {
252
+ const middleRange = Array.from(
253
+ { length: rightSiblingIndex - leftSiblingIndex + 1 },
254
+ (_, i) => leftSiblingIndex + i
255
+ );
256
+ return [1, "DOTS", ...middleRange, "DOTS", totalPages];
257
+ }
258
+ return [];
259
+ };
260
+ const pages = generatePages();
261
+ return /* @__PURE__ */ jsxRuntime.jsxs(
262
+ "nav",
263
+ {
264
+ ref,
265
+ role: "navigation",
266
+ "aria-label": "Pagination",
267
+ className: cn("flex items-center justify-center gap-1.5", className),
268
+ ...props,
269
+ children: [
270
+ /* @__PURE__ */ jsxRuntime.jsx(
271
+ Button,
272
+ {
273
+ variant: "outline",
274
+ size: "sm",
275
+ disabled: currentPage <= 1,
276
+ onClick: () => onPageChange(currentPage - 1),
277
+ "aria-label": "Go to previous page",
278
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "w-4 h-4" })
279
+ }
280
+ ),
281
+ pages.map((p, index) => {
282
+ if (p === "DOTS") {
283
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center justify-center w-8 h-8 text-[var(--ui-text-muted)]", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { className: "w-4 h-4" }) }, `dots-${index}`);
284
+ }
285
+ const pageNum = Number(p);
286
+ const isActive = pageNum === currentPage;
287
+ return /* @__PURE__ */ jsxRuntime.jsx(
288
+ Button,
289
+ {
290
+ variant: isActive ? "primary" : "ghost",
291
+ size: "sm",
292
+ "aria-current": isActive ? "page" : void 0,
293
+ onClick: () => onPageChange(pageNum),
294
+ className: "w-8 h-8 p-0 text-xs font-semibold",
295
+ children: pageNum
296
+ },
297
+ pageNum
298
+ );
299
+ }),
300
+ /* @__PURE__ */ jsxRuntime.jsx(
301
+ Button,
302
+ {
303
+ variant: "outline",
304
+ size: "sm",
305
+ disabled: currentPage >= totalPages,
306
+ onClick: () => onPageChange(currentPage + 1),
307
+ "aria-label": "Go to next page",
308
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "w-4 h-4" })
309
+ }
310
+ )
311
+ ]
312
+ }
313
+ );
314
+ }
315
+ );
316
+ Pagination.displayName = "Pagination";
317
+ var Stepper = react.forwardRef(
318
+ ({ className, steps, currentStep, orientation = "horizontal", ...props }, ref) => {
319
+ return /* @__PURE__ */ jsxRuntime.jsx(
320
+ "div",
321
+ {
322
+ ref,
323
+ role: "navigation",
324
+ "aria-label": "Progress Stepper",
325
+ className: cn(
326
+ "flex",
327
+ orientation === "horizontal" ? "flex-row items-center w-full justify-between" : "flex-col space-y-6",
328
+ className
329
+ ),
330
+ ...props,
331
+ children: steps.map((step, index) => {
332
+ const isCompleted = index < currentStep;
333
+ const isActive = index === currentStep;
334
+ const isPending = index > currentStep;
335
+ return /* @__PURE__ */ jsxRuntime.jsxs(
336
+ "div",
337
+ {
338
+ className: cn(
339
+ "flex items-center",
340
+ orientation === "horizontal" ? "flex-1 last:flex-none" : "flex-row items-start"
341
+ ),
342
+ children: [
343
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
344
+ /* @__PURE__ */ jsxRuntime.jsx(
345
+ "div",
346
+ {
347
+ className: cn(
348
+ "flex items-center justify-center w-8 h-8 rounded-full text-xs font-bold transition-colors flex-shrink-0",
349
+ isCompleted && "bg-[var(--ui-primary)] text-[var(--ui-primary-fg)]",
350
+ isActive && "border-2 border-[var(--ui-primary)] text-[var(--ui-primary)] bg-[var(--ui-bg-surface)] ring-4 ring-[var(--ui-primary)]/20",
351
+ isPending && "border border-[var(--ui-border-default)] text-[var(--ui-text-muted)] bg-[var(--ui-bg-tertiary)]"
352
+ ),
353
+ children: isCompleted ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "w-4 h-4 stroke-[3]" }) : index + 1
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
357
+ /* @__PURE__ */ jsxRuntime.jsx(
358
+ "span",
359
+ {
360
+ className: cn(
361
+ "text-xs font-semibold",
362
+ isActive ? "text-[var(--ui-text-primary)]" : "text-[var(--ui-text-muted)]"
363
+ ),
364
+ children: step.title
365
+ }
366
+ ),
367
+ step.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] text-[var(--ui-text-muted)] opacity-80", children: step.description })
368
+ ] })
369
+ ] }),
370
+ orientation === "horizontal" && index < steps.length - 1 && /* @__PURE__ */ jsxRuntime.jsx(
371
+ "div",
372
+ {
373
+ className: cn(
374
+ "flex-1 h-0.5 mx-4 transition-colors",
375
+ isCompleted ? "bg-[var(--ui-primary)]" : "bg-[var(--ui-border-subtle)]"
376
+ )
377
+ }
378
+ )
379
+ ]
380
+ },
381
+ index
382
+ );
383
+ })
384
+ }
385
+ );
386
+ }
387
+ );
388
+ Stepper.displayName = "Stepper";
389
+ function Portal({ children, container }) {
390
+ const [mounted, setMounted] = react.useState(false);
391
+ react.useEffect(() => {
392
+ setMounted(true);
393
+ return () => setMounted(false);
394
+ }, []);
395
+ if (!mounted) return null;
396
+ const target = container || (typeof document !== "undefined" ? document.body : null);
397
+ if (!target) return null;
398
+ return reactDom.createPortal(children, target);
399
+ }
400
+ var DropdownContext = react.createContext(null);
401
+ function useDropdown() {
402
+ const context = react.useContext(DropdownContext);
403
+ if (!context) throw new Error("DropdownMenu components must be used within <DropdownMenu />");
404
+ return context;
405
+ }
406
+ function DropdownMenu({ children }) {
407
+ const [isOpen, setIsOpen] = react.useState(false);
408
+ const [triggerRect, setTriggerRect] = react.useState(null);
409
+ return /* @__PURE__ */ jsxRuntime.jsx(DropdownContext.Provider, { value: { isOpen, setIsOpen, triggerRect, setTriggerRect }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative inline-block text-left", children }) });
410
+ }
411
+ var DropdownMenuTrigger = react.forwardRef(
412
+ ({ children, onClick, ...props }, ref) => {
413
+ const { isOpen, setIsOpen, setTriggerRect } = useDropdown();
414
+ const triggerRef = react.useRef(null);
415
+ const handleClick = (e) => {
416
+ if (triggerRef.current) {
417
+ setTriggerRect(triggerRef.current.getBoundingClientRect());
418
+ }
419
+ setIsOpen(!isOpen);
420
+ onClick?.(e);
421
+ };
422
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: triggerRef, onClick: handleClick, className: "inline-flex cursor-pointer", ...props, children });
423
+ }
424
+ );
425
+ DropdownMenuTrigger.displayName = "DropdownMenuTrigger";
426
+ var DropdownMenuContent = react.forwardRef(
427
+ ({ className, align = "start", children, ...props }, ref) => {
428
+ const { isOpen, setIsOpen, triggerRect } = useDropdown();
429
+ const menuRef = react.useRef(null);
430
+ react.useEffect(() => {
431
+ const handleOutside = (e) => {
432
+ if (menuRef.current && !menuRef.current.contains(e.target)) {
433
+ setIsOpen(false);
434
+ }
435
+ };
436
+ if (isOpen) {
437
+ document.addEventListener("mousedown", handleOutside);
438
+ }
439
+ return () => document.removeEventListener("mousedown", handleOutside);
440
+ }, [isOpen, setIsOpen]);
441
+ if (!isOpen || !triggerRect) return null;
442
+ const top = triggerRect.bottom + window.scrollY + 6;
443
+ const left = align === "end" ? triggerRect.right + window.scrollX : triggerRect.left + window.scrollX;
444
+ return /* @__PURE__ */ jsxRuntime.jsx(Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
445
+ "div",
446
+ {
447
+ ref: menuRef,
448
+ style: {
449
+ position: "absolute",
450
+ top: `${top}px`,
451
+ left: `${left}px`
452
+ },
453
+ className: cn(
454
+ "z-50 min-w-[12rem] overflow-hidden rounded-[var(--ui-radius-lg)] border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)] p-1 text-[var(--ui-text-primary)] shadow-xl animate-in fade-in zoom-in-95",
455
+ align === "end" && "-translate-x-full",
456
+ className
457
+ ),
458
+ ...props,
459
+ children
460
+ }
461
+ ) });
462
+ }
463
+ );
464
+ DropdownMenuContent.displayName = "DropdownMenuContent";
465
+ var DropdownMenuItem = react.forwardRef(
466
+ ({ className, icon, shortcut, destructive = false, children, onClick, ...props }, ref) => {
467
+ const { setIsOpen } = useDropdown();
468
+ return /* @__PURE__ */ jsxRuntime.jsxs(
469
+ "button",
470
+ {
471
+ ref,
472
+ type: "button",
473
+ onClick: (e) => {
474
+ onClick?.(e);
475
+ setIsOpen(false);
476
+ },
477
+ className: cn(
478
+ "relative flex w-full cursor-pointer select-none items-center gap-2 rounded-[var(--ui-radius-sm)] px-2.5 py-1.5 text-xs font-medium outline-none transition-colors hover:bg-[var(--ui-bg-tertiary)] disabled:pointer-events-none disabled:opacity-50 text-left",
479
+ destructive && "text-[var(--ui-error)] hover:bg-[var(--ui-error-subtle)]",
480
+ className
481
+ ),
482
+ ...props,
483
+ children: [
484
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-current", children: icon }),
485
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 truncate", children }),
486
+ shortcut && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto text-[10px] text-[var(--ui-text-muted)] tracking-widest", children: shortcut })
487
+ ]
488
+ }
489
+ );
490
+ }
491
+ );
492
+ DropdownMenuItem.displayName = "DropdownMenuItem";
493
+ var DropdownMenuSeparator = react.forwardRef(
494
+ ({ className, ...props }, ref) => {
495
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("-mx-1 my-1 h-px bg-[var(--ui-border-subtle)]", className), ...props });
496
+ }
497
+ );
498
+ DropdownMenuSeparator.displayName = "DropdownMenuSeparator";
499
+ var DropdownMenuLabel = react.forwardRef(
500
+ ({ className, children, ...props }, ref) => {
501
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("px-2.5 py-1.5 text-[11px] font-semibold text-[var(--ui-text-muted)] uppercase tracking-wider", className), ...props, children });
502
+ }
503
+ );
504
+ DropdownMenuLabel.displayName = "DropdownMenuLabel";
505
+ var FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
506
+ function FocusTrap({ children, active = true }) {
507
+ const rootRef = react.useRef(null);
508
+ react.useEffect(() => {
509
+ if (!active) return;
510
+ const root = rootRef.current;
511
+ if (!root) return;
512
+ const focusable = root.querySelectorAll(FOCUSABLE_SELECTOR);
513
+ const first = focusable[0];
514
+ const last = focusable[focusable.length - 1];
515
+ if (first) {
516
+ first.focus();
517
+ }
518
+ const handleKeyDown = (e) => {
519
+ if (e.key !== "Tab") return;
520
+ if (e.shiftKey) {
521
+ if (document.activeElement === first) {
522
+ e.preventDefault();
523
+ last?.focus();
524
+ }
525
+ } else {
526
+ if (document.activeElement === last) {
527
+ e.preventDefault();
528
+ first?.focus();
529
+ }
530
+ }
531
+ };
532
+ window.addEventListener("keydown", handleKeyDown);
533
+ return () => window.removeEventListener("keydown", handleKeyDown);
534
+ }, [active]);
535
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: rootRef, className: "contents", children });
536
+ }
537
+ var Kbd = react.forwardRef(
538
+ ({ className, children, ...props }, ref) => {
539
+ return /* @__PURE__ */ jsxRuntime.jsx(
540
+ "kbd",
541
+ {
542
+ ref,
543
+ className: cn(
544
+ "pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-[var(--ui-border-default)] bg-[var(--ui-bg-tertiary)] px-1.5 font-mono text-[10px] font-semibold text-[var(--ui-text-muted)] opacity-100 shadow-sm",
545
+ className
546
+ ),
547
+ ...props,
548
+ children
549
+ }
550
+ );
551
+ }
552
+ );
553
+ Kbd.displayName = "Kbd";
554
+ function CommandPalette({
555
+ isOpen,
556
+ onClose,
557
+ items,
558
+ placeholder = "Type a command or search..."
559
+ }) {
560
+ const [query, setQuery] = react.useState("");
561
+ const [selectedIndex, setSelectedIndex] = react.useState(0);
562
+ const filteredItems = items.filter(
563
+ (item) => item.title.toLowerCase().includes(query.toLowerCase()) || item.category?.toLowerCase().includes(query.toLowerCase())
564
+ );
565
+ react.useEffect(() => {
566
+ setSelectedIndex(0);
567
+ }, [query]);
568
+ react.useEffect(() => {
569
+ if (!isOpen) {
570
+ setQuery("");
571
+ setSelectedIndex(0);
572
+ return;
573
+ }
574
+ const handleKeyDown = (e) => {
575
+ if (e.key === "Escape") {
576
+ onClose();
577
+ } else if (e.key === "ArrowDown") {
578
+ e.preventDefault();
579
+ setSelectedIndex((prev) => prev < filteredItems.length - 1 ? prev + 1 : 0);
580
+ } else if (e.key === "ArrowUp") {
581
+ e.preventDefault();
582
+ setSelectedIndex((prev) => prev > 0 ? prev - 1 : filteredItems.length - 1);
583
+ } else if (e.key === "Enter") {
584
+ e.preventDefault();
585
+ if (filteredItems[selectedIndex]) {
586
+ filteredItems[selectedIndex].onSelect();
587
+ onClose();
588
+ }
589
+ }
590
+ };
591
+ window.addEventListener("keydown", handleKeyDown);
592
+ return () => window.removeEventListener("keydown", handleKeyDown);
593
+ }, [isOpen, filteredItems, selectedIndex, onClose]);
594
+ if (!isOpen) return null;
595
+ return /* @__PURE__ */ jsxRuntime.jsx(Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(FocusTrap, { active: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex items-start justify-center pt-20 p-4 sm:p-6", children: [
596
+ /* @__PURE__ */ jsxRuntime.jsx(
597
+ "div",
598
+ {
599
+ "aria-hidden": "true",
600
+ onClick: onClose,
601
+ className: "fixed inset-0 bg-[var(--ui-bg-overlay)] backdrop-blur-sm transition-opacity animate-in fade-in duration-200"
602
+ }
603
+ ),
604
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full max-w-xl rounded-[var(--ui-radius-xl)] bg-[var(--ui-bg-surface)] border border-[var(--ui-border-default)] shadow-2xl overflow-hidden z-10 animate-in zoom-in-95 duration-150", children: [
605
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center px-4 py-3 border-b border-[var(--ui-border-subtle)] gap-3", children: [
606
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "w-5 h-5 text-[var(--ui-text-muted)]" }),
607
+ /* @__PURE__ */ jsxRuntime.jsx(
608
+ "input",
609
+ {
610
+ type: "text",
611
+ autoFocus: true,
612
+ placeholder,
613
+ value: query,
614
+ onChange: (e) => setQuery(e.target.value),
615
+ className: "flex-1 bg-transparent text-sm text-[var(--ui-text-primary)] placeholder:text-[var(--ui-text-muted)] focus:outline-none"
616
+ }
617
+ ),
618
+ /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: "ESC" })
619
+ ] }),
620
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto p-2", children: filteredItems.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "py-8 text-center text-xs text-[var(--ui-text-muted)]", children: [
621
+ 'No commands found matching "',
622
+ query,
623
+ '".'
624
+ ] }) : filteredItems.map((item, idx) => {
625
+ const isSelected = idx === selectedIndex;
626
+ return /* @__PURE__ */ jsxRuntime.jsxs(
627
+ "div",
628
+ {
629
+ onClick: () => {
630
+ item.onSelect();
631
+ onClose();
632
+ },
633
+ onMouseEnter: () => setSelectedIndex(idx),
634
+ className: cn(
635
+ "flex items-center gap-3 px-3 py-2.5 rounded-[var(--ui-radius-md)] cursor-pointer text-xs font-medium transition-colors",
636
+ isSelected ? "bg-[var(--ui-primary)] text-[var(--ui-primary-fg)]" : "text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)]"
637
+ ),
638
+ children: [
639
+ item.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", children: item.icon }),
640
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 truncate", children: item.title }),
641
+ item.category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-[10px] uppercase font-semibold tracking-wider opacity-70", isSelected ? "text-white" : "text-[var(--ui-text-muted)]"), children: item.category }),
642
+ item.shortcut && /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: item.shortcut })
643
+ ]
644
+ },
645
+ item.id
646
+ );
647
+ }) })
648
+ ] })
649
+ ] }) }) });
650
+ }
651
+
652
+ exports.Breadcrumb = Breadcrumb;
653
+ exports.BreadcrumbItem = BreadcrumbItem;
654
+ exports.BreadcrumbLink = BreadcrumbLink;
655
+ exports.BreadcrumbPage = BreadcrumbPage;
656
+ exports.BreadcrumbSeparator = BreadcrumbSeparator;
657
+ exports.CommandPalette = CommandPalette;
658
+ exports.DropdownMenu = DropdownMenu;
659
+ exports.DropdownMenuContent = DropdownMenuContent;
660
+ exports.DropdownMenuItem = DropdownMenuItem;
661
+ exports.DropdownMenuLabel = DropdownMenuLabel;
662
+ exports.DropdownMenuSeparator = DropdownMenuSeparator;
663
+ exports.DropdownMenuTrigger = DropdownMenuTrigger;
664
+ exports.Pagination = Pagination;
665
+ exports.Stepper = Stepper;
666
+ exports.Tabs = Tabs;
667
+ exports.TabsContent = TabsContent;
668
+ exports.TabsList = TabsList;
669
+ exports.TabsTrigger = TabsTrigger;
670
+ exports.useDropdown = useDropdown;
671
+ exports.useTabs = useTabs;
672
+ //# sourceMappingURL=index.cjs.map
673
+ //# sourceMappingURL=index.cjs.map