@devxcrew/react-ui 0.0.0-stage → 0.1.7

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 (326) hide show
  1. package/README.md +85 -2
  2. package/package.json +105 -4
  3. package/src/blocks/agent-chat-workspace/agent-chat-workspace.tsx +162 -0
  4. package/src/blocks/agent-chat-workspace/index.ts +2 -0
  5. package/src/blocks/agent-provider-settings/agent-provider-settings.tsx +183 -0
  6. package/src/blocks/agent-provider-settings/index.ts +2 -0
  7. package/src/blocks/agent-task-workspace/agent-task-workspace.tsx +48 -0
  8. package/src/blocks/agent-task-workspace/index.ts +2 -0
  9. package/src/blocks/analysis-context/analysis-context.tsx +6 -0
  10. package/src/blocks/analysis-context/index.ts +1 -0
  11. package/src/blocks/app-header/app-header.tsx +159 -0
  12. package/src/blocks/app-header/index.ts +2 -0
  13. package/src/blocks/archived-chat-workspace/archived-chat-workspace.tsx +29 -0
  14. package/src/blocks/archived-chat-workspace/index.ts +2 -0
  15. package/src/blocks/auth/README.md +32 -0
  16. package/src/blocks/auth/admin-login-page.tsx +15 -0
  17. package/src/blocks/auth/admin-password-forgot-page.tsx +5 -0
  18. package/src/blocks/auth/auth-page-layout.tsx +90 -0
  19. package/src/blocks/auth/client-login-page.tsx +20 -0
  20. package/src/blocks/auth/client-password-forgot-page.tsx +5 -0
  21. package/src/blocks/auth/identity-management-desk.tsx +530 -0
  22. package/src/blocks/auth/index.ts +12 -0
  23. package/src/blocks/auth/login-page.tsx +206 -0
  24. package/src/blocks/auth/password-forgot-page.tsx +60 -0
  25. package/src/blocks/auth/portal-pages.tsx +32 -0
  26. package/src/blocks/auth/privileged-desk.tsx +55 -0
  27. package/src/blocks/auth/register-page.tsx +117 -0
  28. package/src/blocks/auth/session-boundary.tsx +296 -0
  29. package/src/blocks/auth/super-admin-login-page.tsx +15 -0
  30. package/src/blocks/auth/super-admin-password-forgot-page.tsx +5 -0
  31. package/src/blocks/blog/blog-card.tsx +156 -0
  32. package/src/blocks/blog/blog-reader.tsx +175 -0
  33. package/src/blocks/blog/blog-types.ts +47 -0
  34. package/src/blocks/blog/index.ts +3 -0
  35. package/src/blocks/chat-composer/chat-composer.tsx +140 -0
  36. package/src/blocks/chat-composer/index.ts +1 -0
  37. package/src/blocks/chat-history/chat-history.tsx +59 -0
  38. package/src/blocks/chat-history/index.ts +1 -0
  39. package/src/blocks/chat-response-progress/chat-response-progress.tsx +34 -0
  40. package/src/blocks/chat-response-progress/index.ts +2 -0
  41. package/src/blocks/chat-runtime-controls/chat-runtime-controls.tsx +56 -0
  42. package/src/blocks/chat-runtime-controls/index.ts +2 -0
  43. package/src/blocks/chat-runtime-trace/chat-runtime-trace.tsx +71 -0
  44. package/src/blocks/chat-runtime-trace/index.ts +2 -0
  45. package/src/blocks/codex-connection-settings/codex-connection-settings.tsx +42 -0
  46. package/src/blocks/codex-connection-settings/index.ts +1 -0
  47. package/src/blocks/dropzone/dropzone-file-item.tsx +113 -0
  48. package/src/blocks/dropzone/dropzone-types.ts +32 -0
  49. package/src/blocks/dropzone/dropzone.tsx +216 -0
  50. package/src/blocks/dropzone/index.ts +3 -0
  51. package/src/blocks/ecommerce/cart/cart-drawer.tsx +228 -0
  52. package/src/blocks/ecommerce/cart/cart-types.ts +27 -0
  53. package/src/blocks/ecommerce/cart/index.ts +2 -0
  54. package/src/blocks/ecommerce/categories/categories-types.ts +23 -0
  55. package/src/blocks/ecommerce/categories/category-showcase.tsx +125 -0
  56. package/src/blocks/ecommerce/categories/index.ts +2 -0
  57. package/src/blocks/ecommerce/checkout/checkout-types.ts +48 -0
  58. package/src/blocks/ecommerce/checkout/checkout-wizard.tsx +468 -0
  59. package/src/blocks/ecommerce/checkout/index.ts +2 -0
  60. package/src/blocks/ecommerce/comparison/comparison-types.ts +28 -0
  61. package/src/blocks/ecommerce/comparison/index.ts +2 -0
  62. package/src/blocks/ecommerce/comparison/product-comparison.tsx +174 -0
  63. package/src/blocks/ecommerce/coupon-wallet/coupon-wallet-types.ts +21 -0
  64. package/src/blocks/ecommerce/coupon-wallet/coupon-wallet.tsx +154 -0
  65. package/src/blocks/ecommerce/coupon-wallet/index.ts +2 -0
  66. package/src/blocks/ecommerce/delivery-tracker/delivery-tracker-types.ts +20 -0
  67. package/src/blocks/ecommerce/delivery-tracker/delivery-tracker.tsx +169 -0
  68. package/src/blocks/ecommerce/delivery-tracker/index.ts +2 -0
  69. package/src/blocks/ecommerce/index.ts +12 -0
  70. package/src/blocks/ecommerce/payment-methods/index.ts +2 -0
  71. package/src/blocks/ecommerce/payment-methods/payment-method-selector.tsx +224 -0
  72. package/src/blocks/ecommerce/payment-methods/payment-methods-types.ts +21 -0
  73. package/src/blocks/ecommerce/price-history/index.ts +2 -0
  74. package/src/blocks/ecommerce/price-history/price-history-chart.tsx +217 -0
  75. package/src/blocks/ecommerce/price-history/price-history-types.ts +16 -0
  76. package/src/blocks/ecommerce/reviews/index.ts +2 -0
  77. package/src/blocks/ecommerce/reviews/reviews-section.tsx +309 -0
  78. package/src/blocks/ecommerce/reviews/reviews-types.ts +26 -0
  79. package/src/blocks/ecommerce/wishlist/index.ts +2 -0
  80. package/src/blocks/ecommerce/wishlist/wishlist-grid.tsx +149 -0
  81. package/src/blocks/ecommerce/wishlist/wishlist-types.ts +19 -0
  82. package/src/blocks/execution-status/README.md +25 -0
  83. package/src/blocks/execution-status/execution-status.tsx +135 -0
  84. package/src/blocks/execution-status/index.ts +2 -0
  85. package/src/blocks/file-tree/file-icons.tsx +84 -0
  86. package/src/blocks/file-tree/file-tree-node.tsx +158 -0
  87. package/src/blocks/file-tree/file-tree-types.ts +33 -0
  88. package/src/blocks/file-tree/file-tree.tsx +163 -0
  89. package/src/blocks/file-tree/index.ts +5 -0
  90. package/src/blocks/filter-builder/filter-builder.tsx +169 -0
  91. package/src/blocks/filter-builder/filter-row.tsx +164 -0
  92. package/src/blocks/filter-builder/filter-types.ts +61 -0
  93. package/src/blocks/filter-builder/index.ts +12 -0
  94. package/src/blocks/footer/footer-types.ts +35 -0
  95. package/src/blocks/footer/index.ts +2 -0
  96. package/src/blocks/footer/site-footer.tsx +212 -0
  97. package/src/blocks/form/form-block.tsx +113 -0
  98. package/src/blocks/form/form-lookup-field.tsx +60 -0
  99. package/src/blocks/form/index.ts +4 -0
  100. package/src/blocks/handover-stack/handover-stack.tsx +41 -0
  101. package/src/blocks/handover-stack/index.ts +1 -0
  102. package/src/blocks/idea-handover/idea-handover-readiness.ts +41 -0
  103. package/src/blocks/idea-handover/idea-handover-workspace.tsx +150 -0
  104. package/src/blocks/idea-handover/index.ts +4 -0
  105. package/src/blocks/kanban/index.ts +11 -0
  106. package/src/blocks/kanban/kanban-board.tsx +146 -0
  107. package/src/blocks/kanban/kanban-card.tsx +149 -0
  108. package/src/blocks/kanban/kanban-column.tsx +102 -0
  109. package/src/blocks/kanban/kanban-types.ts +38 -0
  110. package/src/blocks/loader/global-loader.tsx +90 -0
  111. package/src/blocks/loader/index.ts +1 -0
  112. package/src/blocks/mascot/README.md +21 -0
  113. package/src/blocks/mascot/index.ts +2 -0
  114. package/src/blocks/mascot/mascot.tsx +202 -0
  115. package/src/blocks/master-list/README.md +21 -0
  116. package/src/blocks/master-list/index.ts +12 -0
  117. package/src/blocks/master-list/master-form.tsx +157 -0
  118. package/src/blocks/master-list/master-list-desk.tsx +370 -0
  119. package/src/blocks/master-list/master-list.tsx +189 -0
  120. package/src/blocks/master-list/types.ts +18 -0
  121. package/src/blocks/mermaid-preview/index.ts +1 -0
  122. package/src/blocks/mermaid-preview/mermaid-preview.tsx +164 -0
  123. package/src/blocks/notifications/README.md +7 -0
  124. package/src/blocks/notifications/index.ts +1 -0
  125. package/src/blocks/notifications/notification-center-page.tsx +73 -0
  126. package/src/blocks/pricing/index.ts +7 -0
  127. package/src/blocks/pricing/pricing-table.tsx +173 -0
  128. package/src/blocks/pricing/pricing-types.ts +34 -0
  129. package/src/blocks/product-card/index.ts +2 -0
  130. package/src/blocks/product-card/product-card-types.ts +35 -0
  131. package/src/blocks/product-card/product-card.tsx +183 -0
  132. package/src/blocks/table/data-table-block.tsx +313 -0
  133. package/src/blocks/table/data-table-filter-menu.tsx +48 -0
  134. package/src/blocks/table/data-table-icon-menu-trigger.tsx +44 -0
  135. package/src/blocks/table/data-table-menu-content.tsx +32 -0
  136. package/src/blocks/table/data-table-pagination.tsx +149 -0
  137. package/src/blocks/table/data-table-row-actions.tsx +53 -0
  138. package/src/blocks/table/data-table-status.tsx +42 -0
  139. package/src/blocks/table/data-table-toolbar.tsx +124 -0
  140. package/src/blocks/table/data-table-totals.tsx +31 -0
  141. package/src/blocks/table/index.ts +13 -0
  142. package/src/blocks/workspace/index.ts +19 -0
  143. package/src/blocks/workspace/workspace-action-card.tsx +73 -0
  144. package/src/blocks/workspace/workspace-application-header.tsx +67 -0
  145. package/src/blocks/workspace/workspace-entity-card.tsx +48 -0
  146. package/src/blocks/workspace/workspace-health-summary.tsx +15 -0
  147. package/src/blocks/workspace/workspace-metric-card.tsx +97 -0
  148. package/src/blocks/workspace/workspace-page-header.tsx +43 -0
  149. package/src/blocks/workspace/workspace-publish-status.tsx +15 -0
  150. package/src/blocks/workspace/workspace-route-checklist.tsx +28 -0
  151. package/src/blocks/workspace/workspace-runtime-status.tsx +48 -0
  152. package/src/blocks/workspace/workspace-section-card.tsx +42 -0
  153. package/src/components/accordion.tsx +65 -0
  154. package/src/components/alert-dialog.tsx +160 -0
  155. package/src/components/alert.tsx +68 -0
  156. package/src/components/aspect-ratio.tsx +22 -0
  157. package/src/components/attachment.tsx +195 -0
  158. package/src/components/avatar.tsx +90 -0
  159. package/src/components/badge.tsx +55 -0
  160. package/src/components/breadcrumb.tsx +100 -0
  161. package/src/components/bubble.tsx +123 -0
  162. package/src/components/button-group.tsx +79 -0
  163. package/src/components/button.tsx +71 -0
  164. package/src/components/calendar.tsx +185 -0
  165. package/src/components/card.tsx +100 -0
  166. package/src/components/carousel.tsx +229 -0
  167. package/src/components/chart.tsx +338 -0
  168. package/src/components/checkbox.tsx +27 -0
  169. package/src/components/collapsible.tsx +15 -0
  170. package/src/components/combobox.tsx +269 -0
  171. package/src/components/command.tsx +181 -0
  172. package/src/components/compact-model-switcher.tsx +128 -0
  173. package/src/components/context-menu.tsx +244 -0
  174. package/src/components/dialog.tsx +138 -0
  175. package/src/components/direction.tsx +1 -0
  176. package/src/components/drawer.tsx +208 -0
  177. package/src/components/dropdown-menu.tsx +257 -0
  178. package/src/components/empty.tsx +93 -0
  179. package/src/components/field.tsx +232 -0
  180. package/src/components/hover-card.tsx +45 -0
  181. package/src/components/input-group.tsx +146 -0
  182. package/src/components/input-otp.tsx +83 -0
  183. package/src/components/input.tsx +19 -0
  184. package/src/components/item.tsx +188 -0
  185. package/src/components/kbd.tsx +26 -0
  186. package/src/components/label.tsx +17 -0
  187. package/src/components/markdown-content.tsx +113 -0
  188. package/src/components/marker.tsx +67 -0
  189. package/src/components/menubar.tsx +267 -0
  190. package/src/components/message-scroller.tsx +91 -0
  191. package/src/components/message.tsx +84 -0
  192. package/src/components/native-select.tsx +54 -0
  193. package/src/components/navigation-menu.tsx +160 -0
  194. package/src/components/pagination.tsx +118 -0
  195. package/src/components/popover.tsx +74 -0
  196. package/src/components/progress.tsx +82 -0
  197. package/src/components/questionnaire.tsx +150 -0
  198. package/src/components/radio-group.tsx +35 -0
  199. package/src/components/resizable.tsx +41 -0
  200. package/src/components/rich-text-editor.tsx +604 -0
  201. package/src/components/scroll-area.tsx +47 -0
  202. package/src/components/select.tsx +189 -0
  203. package/src/components/separator.tsx +18 -0
  204. package/src/components/sheet.tsx +125 -0
  205. package/src/components/sidebar.tsx +693 -0
  206. package/src/components/skeleton.tsx +13 -0
  207. package/src/components/slider.tsx +51 -0
  208. package/src/components/sonner.tsx +45 -0
  209. package/src/components/sparkline.tsx +231 -0
  210. package/src/components/spinner.tsx +20 -0
  211. package/src/components/status-badge.tsx +114 -0
  212. package/src/components/switch.tsx +31 -0
  213. package/src/components/table.tsx +91 -0
  214. package/src/components/tabs.tsx +72 -0
  215. package/src/components/textarea.tsx +17 -0
  216. package/src/components/toast.tsx +222 -0
  217. package/src/components/toggle-group.tsx +85 -0
  218. package/src/components/toggle.tsx +42 -0
  219. package/src/components/tooltip.tsx +53 -0
  220. package/src/design-system/README.md +55 -0
  221. package/src/design-system/action-intents.ts +21 -0
  222. package/src/design-system/agent-manifest.ts +83 -0
  223. package/src/design-system/block-registry.ts +272 -0
  224. package/src/design-system/component-registry.ts +142 -0
  225. package/src/design-system/contracts.ts +69 -0
  226. package/src/design-system/defaults.ts +3 -0
  227. package/src/design-system/index.ts +29 -0
  228. package/src/design-system/mcp-server.ts +156 -0
  229. package/src/design-system/page-registry.ts +74 -0
  230. package/src/design-system/selection.ts +67 -0
  231. package/src/design-system/template-registry.ts +33 -0
  232. package/src/features/interface-topology/index.ts +14 -0
  233. package/src/features/interface-topology/interface-topology.types.ts +40 -0
  234. package/src/features/interface-topology/topology-control.tsx +18 -0
  235. package/src/features/interface-topology/topology-inspector.tsx +228 -0
  236. package/src/features/interface-topology/topology-marker.tsx +47 -0
  237. package/src/features/interface-topology/topology-region.tsx +44 -0
  238. package/src/features/interface-topology/use-interface-topology.ts +178 -0
  239. package/src/hooks/use-mobile.ts +19 -0
  240. package/src/hooks/use-scroll-follow.ts +22 -0
  241. package/src/index.ts +11 -0
  242. package/src/layouts/README.md +65 -0
  243. package/src/layouts/agent-workspace/agent-activity-rail.tsx +101 -0
  244. package/src/layouts/agent-workspace/agent-workspace.tsx +27 -0
  245. package/src/layouts/agent-workspace/agent-workspace.types.ts +28 -0
  246. package/src/layouts/agent-workspace/index.ts +7 -0
  247. package/src/layouts/blog-header/blog-header-types.ts +25 -0
  248. package/src/layouts/blog-header/blog-header.tsx +172 -0
  249. package/src/layouts/blog-header/index.ts +2 -0
  250. package/src/layouts/documentation-workspace/README.md +8 -0
  251. package/src/layouts/documentation-workspace/documentation-workspace.tsx +34 -0
  252. package/src/layouts/documentation-workspace/index.ts +1 -0
  253. package/src/layouts/ecommerce-header/ecommerce-actions.tsx +89 -0
  254. package/src/layouts/ecommerce-header/ecommerce-announcement.tsx +43 -0
  255. package/src/layouts/ecommerce-header/ecommerce-drawer.tsx +97 -0
  256. package/src/layouts/ecommerce-header/ecommerce-header-types.ts +59 -0
  257. package/src/layouts/ecommerce-header/ecommerce-header.tsx +47 -0
  258. package/src/layouts/ecommerce-header/ecommerce-navigation.tsx +98 -0
  259. package/src/layouts/ecommerce-header/ecommerce-search.tsx +86 -0
  260. package/src/layouts/ecommerce-header/index.ts +2 -0
  261. package/src/layouts/main-workspace/index.ts +28 -0
  262. package/src/layouts/mdi/index.ts +1 -0
  263. package/src/layouts/mdi/mdi.tsx +20 -0
  264. package/src/layouts/mdi-main/index.ts +27 -0
  265. package/src/layouts/mdi-main/mdi-app-catalog.generated.ts +159 -0
  266. package/src/layouts/mdi-main/mdi-app-catalog.ts +76 -0
  267. package/src/layouts/mdi-main/mdi-app-switcher.tsx +107 -0
  268. package/src/layouts/mdi-main/mdi-feature-settings.tsx +135 -0
  269. package/src/layouts/mdi-main/mdi-global-search.tsx +192 -0
  270. package/src/layouts/mdi-main/mdi-main.tsx +241 -0
  271. package/src/layouts/mdi-main/mdi-notifications-menu.tsx +197 -0
  272. package/src/layouts/mdi-main/mdi-profile-menu.tsx +79 -0
  273. package/src/layouts/mdi-main/mdi-sidebar-navigation.tsx +226 -0
  274. package/src/layouts/mdi-main/mdi-sidebar.tsx +110 -0
  275. package/src/layouts/mdi-main/mdi-status-bar.tsx +26 -0
  276. package/src/layouts/mdi-main/mdi-top-menu-control.ts +4 -0
  277. package/src/layouts/mdi-main/mdi-top-menu.tsx +117 -0
  278. package/src/layouts/mdi-main/mdi-topology.tsx +297 -0
  279. package/src/layouts/mdi-main/mdi-tweak-panel.tsx +104 -0
  280. package/src/layouts/mdi-main/mdi-types.ts +131 -0
  281. package/src/layouts/mdi-main/use-mdi-features.ts +36 -0
  282. package/src/layouts/mdi-main/use-mdi-sidebar-state.ts +59 -0
  283. package/src/layouts/site-header/announcement-bar.tsx +55 -0
  284. package/src/layouts/site-header/category-strip.tsx +41 -0
  285. package/src/layouts/site-header/index.ts +16 -0
  286. package/src/layouts/site-header/main-navbar.tsx +179 -0
  287. package/src/layouts/site-header/mobile-drawer.tsx +140 -0
  288. package/src/layouts/site-header/site-header-types.ts +63 -0
  289. package/src/layouts/site-header/site-header.tsx +58 -0
  290. package/src/lib/random-id.ts +19 -0
  291. package/src/lib/utils.ts +6 -0
  292. package/src/providers/pdf-provider.ts +137 -0
  293. package/src/styles/globals.css +374 -0
  294. package/src/templates/README.md +12 -0
  295. package/src/templates/dashboard-01/components/app-sidebar.tsx +177 -0
  296. package/src/templates/dashboard-01/components/chart-area-interactive.tsx +276 -0
  297. package/src/templates/dashboard-01/components/data-table-cell-viewer.tsx +213 -0
  298. package/src/templates/dashboard-01/components/data-table.tsx +577 -0
  299. package/src/templates/dashboard-01/components/nav-documents.tsx +79 -0
  300. package/src/templates/dashboard-01/components/nav-main.tsx +55 -0
  301. package/src/templates/dashboard-01/components/nav-secondary.tsx +39 -0
  302. package/src/templates/dashboard-01/components/nav-user.tsx +97 -0
  303. package/src/templates/dashboard-01/components/section-cards.tsx +99 -0
  304. package/src/templates/dashboard-01/components/site-header.tsx +14 -0
  305. package/src/templates/dashboard-01/data.json +614 -0
  306. package/src/templates/dashboard-01/index.ts +7 -0
  307. package/src/templates/documentation-sidebar/app-sidebar.tsx +95 -0
  308. package/src/templates/documentation-sidebar/index.ts +2 -0
  309. package/src/templates/sidebar-07/components/app-sidebar.tsx +175 -0
  310. package/src/templates/sidebar-07/components/nav-main.tsx +64 -0
  311. package/src/templates/sidebar-07/components/nav-projects.tsx +79 -0
  312. package/src/templates/sidebar-07/components/nav-user.tsx +105 -0
  313. package/src/templates/sidebar-07/components/team-switcher.tsx +94 -0
  314. package/src/templates/sidebar-07/index.ts +1 -0
  315. package/src/templates/ui-page/index.ts +7 -0
  316. package/src/templates/ui-page/ui-browser-frame.tsx +27 -0
  317. package/src/templates/ui-page/ui-template-code.tsx +48 -0
  318. package/src/templates/ui-page/ui-template-header.tsx +87 -0
  319. package/src/templates/ui-page/ui-template-navigation.tsx +60 -0
  320. package/src/templates/ui-page/ui-template-page.tsx +97 -0
  321. package/src/theme/index.ts +12 -0
  322. package/src/theme/theme-config.ts +30 -0
  323. package/src/theme/theme-provider.tsx +142 -0
  324. package/src/theme/theme-selector.tsx +75 -0
  325. package/src/tokens/index.ts +15 -0
  326. package/src/vite-env.d.ts +3 -0
@@ -0,0 +1,267 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { Menu as MenuPrimitive } from '@base-ui/react/menu'
5
+ import { Menubar as MenubarPrimitive } from '@base-ui/react/menubar'
6
+ import { cn } from '../lib/utils'
7
+
8
+ import {
9
+ DropdownMenu,
10
+ DropdownMenuContent,
11
+ DropdownMenuGroup,
12
+ DropdownMenuItem,
13
+ DropdownMenuLabel,
14
+ DropdownMenuPortal,
15
+ DropdownMenuRadioGroup,
16
+ DropdownMenuSeparator,
17
+ DropdownMenuShortcut,
18
+ DropdownMenuSub,
19
+ DropdownMenuSubContent,
20
+ DropdownMenuSubTrigger,
21
+ DropdownMenuTrigger,
22
+ } from '@devxcrew/react-ui/components/dropdown-menu'
23
+ import { CheckIcon } from 'lucide-react'
24
+
25
+ function Menubar({ className, ...props }: MenubarPrimitive.Props) {
26
+ return (
27
+ <MenubarPrimitive
28
+ data-slot="menubar"
29
+ className={cn('flex h-8 items-center gap-0.5 rounded-lg border p-[3px]', className)}
30
+ {...props}
31
+ />
32
+ )
33
+ }
34
+
35
+ function MenubarMenu({ ...props }: React.ComponentProps<typeof DropdownMenu>) {
36
+ return <DropdownMenu data-slot="menubar-menu" {...props} />
37
+ }
38
+
39
+ function MenubarGroup({ ...props }: React.ComponentProps<typeof DropdownMenuGroup>) {
40
+ return <DropdownMenuGroup data-slot="menubar-group" {...props} />
41
+ }
42
+
43
+ function MenubarPortal({ ...props }: React.ComponentProps<typeof DropdownMenuPortal>) {
44
+ return <DropdownMenuPortal data-slot="menubar-portal" {...props} />
45
+ }
46
+
47
+ function MenubarTrigger({ className, ...props }: React.ComponentProps<typeof DropdownMenuTrigger>) {
48
+ return (
49
+ <DropdownMenuTrigger
50
+ data-slot="menubar-trigger"
51
+ className={cn(
52
+ 'flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted',
53
+ className,
54
+ )}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ function MenubarContent({
61
+ className,
62
+ align = 'start',
63
+ alignOffset = -4,
64
+ sideOffset = 8,
65
+ ...props
66
+ }: React.ComponentProps<typeof DropdownMenuContent>) {
67
+ return (
68
+ <DropdownMenuContent
69
+ data-slot="menubar-content"
70
+ align={align}
71
+ alignOffset={alignOffset}
72
+ sideOffset={sideOffset}
73
+ className={cn(
74
+ 'min-w-36 rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95',
75
+ className,
76
+ )}
77
+ {...props}
78
+ />
79
+ )
80
+ }
81
+
82
+ function MenubarItem({
83
+ className,
84
+ inset,
85
+ variant = 'default',
86
+ ...props
87
+ }: React.ComponentProps<typeof DropdownMenuItem>) {
88
+ return (
89
+ <DropdownMenuItem
90
+ data-slot="menubar-item"
91
+ data-inset={inset}
92
+ data-variant={variant}
93
+ className={cn(
94
+ "group/menubar-item gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!",
95
+ className,
96
+ )}
97
+ {...props}
98
+ />
99
+ )
100
+ }
101
+
102
+ function MenubarCheckboxItem({
103
+ className,
104
+ children,
105
+ checked,
106
+ inset,
107
+ ...props
108
+ }: MenuPrimitive.CheckboxItem.Props & {
109
+ inset?: boolean
110
+ }) {
111
+ return (
112
+ <MenuPrimitive.CheckboxItem
113
+ data-slot="menubar-checkbox-item"
114
+ data-inset={inset}
115
+ className={cn(
116
+ 'relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',
117
+ className,
118
+ )}
119
+ checked={checked}
120
+ {...props}
121
+ >
122
+ <span className="pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
123
+ <MenuPrimitive.CheckboxItemIndicator>
124
+ <CheckIcon />
125
+ </MenuPrimitive.CheckboxItemIndicator>
126
+ </span>
127
+ {children}
128
+ </MenuPrimitive.CheckboxItem>
129
+ )
130
+ }
131
+
132
+ function MenubarRadioGroup({ ...props }: React.ComponentProps<typeof DropdownMenuRadioGroup>) {
133
+ return <DropdownMenuRadioGroup data-slot="menubar-radio-group" {...props} />
134
+ }
135
+
136
+ function MenubarRadioItem({
137
+ className,
138
+ children,
139
+ inset,
140
+ ...props
141
+ }: MenuPrimitive.RadioItem.Props & {
142
+ inset?: boolean
143
+ }) {
144
+ return (
145
+ <MenuPrimitive.RadioItem
146
+ data-slot="menubar-radio-item"
147
+ data-inset={inset}
148
+ className={cn(
149
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
150
+ className,
151
+ )}
152
+ {...props}
153
+ >
154
+ <span className="pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
155
+ <MenuPrimitive.RadioItemIndicator>
156
+ <CheckIcon />
157
+ </MenuPrimitive.RadioItemIndicator>
158
+ </span>
159
+ {children}
160
+ </MenuPrimitive.RadioItem>
161
+ )
162
+ }
163
+
164
+ function MenubarLabel({
165
+ className,
166
+ inset,
167
+ ...props
168
+ }: React.ComponentProps<typeof DropdownMenuLabel> & {
169
+ inset?: boolean
170
+ }) {
171
+ return (
172
+ <DropdownMenuLabel
173
+ data-slot="menubar-label"
174
+ data-inset={inset}
175
+ className={cn('px-1.5 py-1 text-sm font-medium data-inset:pl-7', className)}
176
+ {...props}
177
+ />
178
+ )
179
+ }
180
+
181
+ function MenubarSeparator({
182
+ className,
183
+ ...props
184
+ }: React.ComponentProps<typeof DropdownMenuSeparator>) {
185
+ return (
186
+ <DropdownMenuSeparator
187
+ data-slot="menubar-separator"
188
+ className={cn('-mx-1 my-1 h-px bg-border', className)}
189
+ {...props}
190
+ />
191
+ )
192
+ }
193
+
194
+ function MenubarShortcut({
195
+ className,
196
+ ...props
197
+ }: React.ComponentProps<typeof DropdownMenuShortcut>) {
198
+ return (
199
+ <DropdownMenuShortcut
200
+ data-slot="menubar-shortcut"
201
+ className={cn(
202
+ 'ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground',
203
+ className,
204
+ )}
205
+ {...props}
206
+ />
207
+ )
208
+ }
209
+
210
+ function MenubarSub({ ...props }: React.ComponentProps<typeof DropdownMenuSub>) {
211
+ return <DropdownMenuSub data-slot="menubar-sub" {...props} />
212
+ }
213
+
214
+ function MenubarSubTrigger({
215
+ className,
216
+ inset,
217
+ ...props
218
+ }: React.ComponentProps<typeof DropdownMenuSubTrigger> & {
219
+ inset?: boolean
220
+ }) {
221
+ return (
222
+ <DropdownMenuSubTrigger
223
+ data-slot="menubar-sub-trigger"
224
+ data-inset={inset}
225
+ className={cn(
226
+ "gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
227
+ className,
228
+ )}
229
+ {...props}
230
+ />
231
+ )
232
+ }
233
+
234
+ function MenubarSubContent({
235
+ className,
236
+ ...props
237
+ }: React.ComponentProps<typeof DropdownMenuSubContent>) {
238
+ return (
239
+ <DropdownMenuSubContent
240
+ data-slot="menubar-sub-content"
241
+ className={cn(
242
+ 'min-w-32 rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',
243
+ className,
244
+ )}
245
+ {...props}
246
+ />
247
+ )
248
+ }
249
+
250
+ export {
251
+ Menubar,
252
+ MenubarPortal,
253
+ MenubarMenu,
254
+ MenubarTrigger,
255
+ MenubarContent,
256
+ MenubarGroup,
257
+ MenubarSeparator,
258
+ MenubarLabel,
259
+ MenubarItem,
260
+ MenubarShortcut,
261
+ MenubarCheckboxItem,
262
+ MenubarRadioGroup,
263
+ MenubarRadioItem,
264
+ MenubarSub,
265
+ MenubarSubTrigger,
266
+ MenubarSubContent,
267
+ }
@@ -0,0 +1,91 @@
1
+ import * as React from "react";
2
+ import { ArrowDownIcon } from "lucide-react";
3
+ import { cn } from "../lib/utils";
4
+
5
+ import { Button } from "@devxcrew/react-ui/components/button";
6
+
7
+ function MessageScrollerProvider({ children }: React.PropsWithChildren) {
8
+ return <>{children}</>;
9
+ }
10
+
11
+ function MessageScroller({ className, ...props }: React.ComponentProps<"div">) {
12
+ return (
13
+ <div
14
+ data-slot="message-scroller"
15
+ className={cn("group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden", className)}
16
+ {...props}
17
+ />
18
+ );
19
+ }
20
+
21
+ function MessageScrollerViewport({ className, ...props }: React.ComponentProps<"div">) {
22
+ return (
23
+ <div
24
+ data-slot="message-scroller-viewport"
25
+ className={cn(
26
+ "size-full min-h-0 min-w-0 scroll-fade scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content",
27
+ className,
28
+ )}
29
+ {...props}
30
+ />
31
+ );
32
+ }
33
+
34
+ function MessageScrollerContent({ className, ...props }: React.ComponentProps<"div">) {
35
+ return (
36
+ <div
37
+ data-slot="message-scroller-content"
38
+ className={cn("flex h-max min-h-full flex-col gap-6", className)}
39
+ {...props}
40
+ />
41
+ );
42
+ }
43
+
44
+ function MessageScrollerItem({ className, ...props }: React.ComponentProps<"div">) {
45
+ return (
46
+ <div
47
+ data-slot="message-scroller-item"
48
+ className={cn("min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]", className)}
49
+ {...props}
50
+ />
51
+ );
52
+ }
53
+
54
+ function MessageScrollerButton({
55
+ direction = "end",
56
+ className,
57
+ children,
58
+ ...props
59
+ }: React.ComponentProps<typeof Button> & { direction?: "start" | "end" }) {
60
+ return (
61
+ <Button
62
+ aria-label={direction === "end" ? "Scroll to end" : "Scroll to start"}
63
+ className={cn(
64
+ "absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground data-[direction=end]:bottom-4 data-[direction=start]:top-4 rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180 group-hover/message-scroller:visible group-hover/message-scroller:opacity-100",
65
+ className,
66
+ )}
67
+ data-direction={direction}
68
+ size="icon-sm"
69
+ variant="secondary"
70
+ {...props}
71
+ >
72
+ {children ?? <ArrowDownIcon />}
73
+ </Button>
74
+ );
75
+ }
76
+
77
+ const useMessageScroller = () => undefined;
78
+ const useMessageScrollerScrollable = () => false;
79
+ const useMessageScrollerVisibility = () => false;
80
+
81
+ export {
82
+ MessageScroller,
83
+ MessageScrollerButton,
84
+ MessageScrollerContent,
85
+ MessageScrollerItem,
86
+ MessageScrollerProvider,
87
+ MessageScrollerViewport,
88
+ useMessageScroller,
89
+ useMessageScrollerScrollable,
90
+ useMessageScrollerVisibility,
91
+ };
@@ -0,0 +1,84 @@
1
+ import * as React from 'react'
2
+ import { cn } from '../lib/utils'
3
+
4
+ function MessageGroup({ className, ...props }: React.ComponentProps<'div'>) {
5
+ return (
6
+ <div
7
+ data-slot="message-group"
8
+ className={cn('flex min-w-0 flex-col gap-2', className)}
9
+ {...props}
10
+ />
11
+ )
12
+ }
13
+
14
+ function Message({
15
+ className,
16
+ align = 'start',
17
+ ...props
18
+ }: React.ComponentProps<'div'> & { align?: 'start' | 'end' }) {
19
+ return (
20
+ <div
21
+ data-slot="message"
22
+ data-align={align}
23
+ className={cn(
24
+ 'group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse',
25
+ className,
26
+ )}
27
+ {...props}
28
+ />
29
+ )
30
+ }
31
+
32
+ function MessageAvatar({ className, ...props }: React.ComponentProps<'div'>) {
33
+ return (
34
+ <div
35
+ data-slot="message-avatar"
36
+ className={cn(
37
+ 'flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8',
38
+ className,
39
+ )}
40
+ {...props}
41
+ />
42
+ )
43
+ }
44
+
45
+ function MessageContent({ className, ...props }: React.ComponentProps<'div'>) {
46
+ return (
47
+ <div
48
+ data-slot="message-content"
49
+ className={cn(
50
+ 'flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end',
51
+ className,
52
+ )}
53
+ {...props}
54
+ />
55
+ )
56
+ }
57
+
58
+ function MessageHeader({ className, ...props }: React.ComponentProps<'div'>) {
59
+ return (
60
+ <div
61
+ data-slot="message-header"
62
+ className={cn(
63
+ 'flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0',
64
+ className,
65
+ )}
66
+ {...props}
67
+ />
68
+ )
69
+ }
70
+
71
+ function MessageFooter({ className, ...props }: React.ComponentProps<'div'>) {
72
+ return (
73
+ <div
74
+ data-slot="message-footer"
75
+ className={cn(
76
+ 'flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end',
77
+ className,
78
+ )}
79
+ {...props}
80
+ />
81
+ )
82
+ }
83
+
84
+ export { MessageGroup, Message, MessageAvatar, MessageContent, MessageFooter, MessageHeader }
@@ -0,0 +1,54 @@
1
+ import * as React from 'react'
2
+ import { cn } from '../lib/utils'
3
+ import { ChevronDownIcon } from 'lucide-react'
4
+
5
+ type NativeSelectProps = Omit<React.ComponentProps<'select'>, 'size'> & {
6
+ size?: 'sm' | 'default'
7
+ }
8
+
9
+ function NativeSelect({ className, size = 'default', ...props }: NativeSelectProps) {
10
+ return (
11
+ <div
12
+ className={cn(
13
+ 'group/native-select relative w-fit has-[select:disabled]:opacity-50',
14
+ className,
15
+ )}
16
+ data-slot="native-select-wrapper"
17
+ data-size={size}
18
+ >
19
+ <select
20
+ data-slot="native-select"
21
+ data-size={size}
22
+ className="h-8 w-full min-w-0 appearance-none rounded-lg border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
23
+ {...props}
24
+ />
25
+ <ChevronDownIcon
26
+ className="pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none"
27
+ aria-hidden="true"
28
+ data-slot="native-select-icon"
29
+ />
30
+ </div>
31
+ )
32
+ }
33
+
34
+ function NativeSelectOption({ className, ...props }: React.ComponentProps<'option'>) {
35
+ return (
36
+ <option
37
+ data-slot="native-select-option"
38
+ className={cn('bg-[Canvas] text-[CanvasText]', className)}
39
+ {...props}
40
+ />
41
+ )
42
+ }
43
+
44
+ function NativeSelectOptGroup({ className, ...props }: React.ComponentProps<'optgroup'>) {
45
+ return (
46
+ <optgroup
47
+ data-slot="native-select-optgroup"
48
+ className={cn('bg-[Canvas] text-[CanvasText]', className)}
49
+ {...props}
50
+ />
51
+ )
52
+ }
53
+
54
+ export { NativeSelect, NativeSelectOptGroup, NativeSelectOption }
@@ -0,0 +1,160 @@
1
+ import { NavigationMenu as NavigationMenuPrimitive } from '@base-ui/react/navigation-menu'
2
+ import { cva } from 'class-variance-authority'
3
+ import { cn } from '../lib/utils'
4
+ import { ChevronDownIcon } from 'lucide-react'
5
+
6
+ function NavigationMenu({
7
+ align = 'start',
8
+ className,
9
+ children,
10
+ ...props
11
+ }: NavigationMenuPrimitive.Root.Props & Pick<NavigationMenuPrimitive.Positioner.Props, 'align'>) {
12
+ return (
13
+ <NavigationMenuPrimitive.Root
14
+ data-slot="navigation-menu"
15
+ className={cn(
16
+ 'group/navigation-menu relative flex max-w-max flex-1 items-center justify-center',
17
+ className,
18
+ )}
19
+ {...props}
20
+ >
21
+ {children}
22
+ <NavigationMenuPositioner align={align} />
23
+ </NavigationMenuPrimitive.Root>
24
+ )
25
+ }
26
+
27
+ function NavigationMenuList({
28
+ className,
29
+ ...props
30
+ }: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.List>) {
31
+ return (
32
+ <NavigationMenuPrimitive.List
33
+ data-slot="navigation-menu-list"
34
+ className={cn('group flex flex-1 list-none items-center justify-center gap-0', className)}
35
+ {...props}
36
+ />
37
+ )
38
+ }
39
+
40
+ function NavigationMenuItem({
41
+ className,
42
+ ...props
43
+ }: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Item>) {
44
+ return (
45
+ <NavigationMenuPrimitive.Item
46
+ data-slot="navigation-menu-item"
47
+ className={cn('relative', className)}
48
+ {...props}
49
+ />
50
+ )
51
+ }
52
+
53
+ const navigationMenuTriggerStyle = cva(
54
+ 'group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted',
55
+ )
56
+
57
+ function NavigationMenuTrigger({
58
+ className,
59
+ children,
60
+ ...props
61
+ }: NavigationMenuPrimitive.Trigger.Props) {
62
+ return (
63
+ <NavigationMenuPrimitive.Trigger
64
+ data-slot="navigation-menu-trigger"
65
+ className={cn(navigationMenuTriggerStyle(), 'group', className)}
66
+ {...props}
67
+ >
68
+ {children}{' '}
69
+ <ChevronDownIcon
70
+ className="relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180"
71
+ aria-hidden="true"
72
+ />
73
+ </NavigationMenuPrimitive.Trigger>
74
+ )
75
+ }
76
+
77
+ function NavigationMenuContent({ className, ...props }: NavigationMenuPrimitive.Content.Props) {
78
+ return (
79
+ <NavigationMenuPrimitive.Content
80
+ data-slot="navigation-menu-content"
81
+ className={cn(
82
+ 'data-ending-style:data-activation-direction=left:translate-x-[50%] data-ending-style:data-activation-direction=right:translate-x-[-50%] data-starting-style:data-activation-direction=left:translate-x-[-50%] data-starting-style:data-activation-direction=right:translate-x-[50%] h-full w-auto p-1 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95',
83
+ className,
84
+ )}
85
+ {...props}
86
+ />
87
+ )
88
+ }
89
+
90
+ function NavigationMenuPositioner({
91
+ className,
92
+ side = 'bottom',
93
+ sideOffset = 8,
94
+ align = 'start',
95
+ alignOffset = 0,
96
+ ...props
97
+ }: NavigationMenuPrimitive.Positioner.Props) {
98
+ return (
99
+ <NavigationMenuPrimitive.Portal>
100
+ <NavigationMenuPrimitive.Positioner
101
+ side={side}
102
+ sideOffset={sideOffset}
103
+ align={align}
104
+ alignOffset={alignOffset}
105
+ className={cn(
106
+ 'isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0',
107
+ className,
108
+ )}
109
+ {...props}
110
+ >
111
+ <NavigationMenuPrimitive.Popup className="data-[ending-style]:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0">
112
+ <NavigationMenuPrimitive.Viewport className="relative size-full overflow-hidden" />
113
+ </NavigationMenuPrimitive.Popup>
114
+ </NavigationMenuPrimitive.Positioner>
115
+ </NavigationMenuPrimitive.Portal>
116
+ )
117
+ }
118
+
119
+ function NavigationMenuLink({ className, ...props }: NavigationMenuPrimitive.Link.Props) {
120
+ return (
121
+ <NavigationMenuPrimitive.Link
122
+ data-slot="navigation-menu-link"
123
+ className={cn(
124
+ "flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4",
125
+ className,
126
+ )}
127
+ {...props}
128
+ />
129
+ )
130
+ }
131
+
132
+ function NavigationMenuIndicator({
133
+ className,
134
+ ...props
135
+ }: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Icon>) {
136
+ return (
137
+ <NavigationMenuPrimitive.Icon
138
+ data-slot="navigation-menu-indicator"
139
+ className={cn(
140
+ 'top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in',
141
+ className,
142
+ )}
143
+ {...props}
144
+ >
145
+ <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
146
+ </NavigationMenuPrimitive.Icon>
147
+ )
148
+ }
149
+
150
+ export {
151
+ NavigationMenu,
152
+ NavigationMenuContent,
153
+ NavigationMenuIndicator,
154
+ NavigationMenuItem,
155
+ NavigationMenuLink,
156
+ NavigationMenuList,
157
+ NavigationMenuTrigger,
158
+ navigationMenuTriggerStyle,
159
+ NavigationMenuPositioner,
160
+ }