@fabio.caffarello/react-design-system 3.7.0 → 3.9.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 (419) hide show
  1. package/README.md +4 -2
  2. package/dist/granular/index.js +445 -0
  3. package/dist/granular/index.js.map +1 -0
  4. package/dist/granular/ui/components/Accordion/Accordion.js +105 -0
  5. package/dist/granular/ui/components/Accordion/Accordion.js.map +1 -0
  6. package/dist/granular/ui/components/Autocomplete/Autocomplete.js +133 -0
  7. package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -0
  8. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +119 -0
  9. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -0
  10. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +42 -0
  11. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -0
  12. package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js +100 -0
  13. package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -0
  14. package/dist/granular/ui/components/Card/Card.js +113 -0
  15. package/dist/granular/ui/components/Card/Card.js.map +1 -0
  16. package/dist/granular/ui/components/Card/CardActions.js +51 -0
  17. package/dist/granular/ui/components/Card/CardActions.js.map +1 -0
  18. package/dist/granular/ui/components/Card/CardBody.js +32 -0
  19. package/dist/granular/ui/components/Card/CardBody.js.map +1 -0
  20. package/dist/granular/ui/components/Card/CardHeader.js +47 -0
  21. package/dist/granular/ui/components/Card/CardHeader.js.map +1 -0
  22. package/dist/granular/ui/components/Card/CardSubtitle.js +38 -0
  23. package/dist/granular/ui/components/Card/CardSubtitle.js.map +1 -0
  24. package/dist/granular/ui/components/Card/CardTitle.js +61 -0
  25. package/dist/granular/ui/components/Card/CardTitle.js.map +1 -0
  26. package/dist/granular/ui/components/ColorPicker/ColorPicker.js +250 -0
  27. package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -0
  28. package/dist/granular/ui/components/CommandPalette/CommandPalette.js +274 -0
  29. package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -0
  30. package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js +37 -0
  31. package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js.map +1 -0
  32. package/dist/granular/ui/components/DataGrid/DataGrid.js +155 -0
  33. package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -0
  34. package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js +113 -0
  35. package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js.map +1 -0
  36. package/dist/granular/ui/components/DatePicker/DatePicker.js +126 -0
  37. package/dist/granular/ui/components/DatePicker/DatePicker.js.map +1 -0
  38. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +294 -0
  39. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -0
  40. package/dist/granular/ui/components/DatePicker/DatePickerContext.js +16 -0
  41. package/dist/granular/ui/components/DatePicker/DatePickerContext.js.map +1 -0
  42. package/dist/granular/ui/components/DatePicker/DatePickerInput.js +119 -0
  43. package/dist/granular/ui/components/DatePicker/DatePickerInput.js.map +1 -0
  44. package/dist/granular/ui/components/DatePicker/DatePickerProvider.js +47 -0
  45. package/dist/granular/ui/components/DatePicker/DatePickerProvider.js.map +1 -0
  46. package/dist/granular/ui/components/Dialog/AlertDialog.js +48 -0
  47. package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -0
  48. package/dist/granular/ui/components/Dialog/Dialog.js +36 -0
  49. package/dist/granular/ui/components/Dialog/Dialog.js.map +1 -0
  50. package/dist/granular/ui/components/Dialog/DialogClose.js +34 -0
  51. package/dist/granular/ui/components/Dialog/DialogClose.js.map +1 -0
  52. package/dist/granular/ui/components/Dialog/DialogContent.js +114 -0
  53. package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -0
  54. package/dist/granular/ui/components/Dialog/DialogDescription.js +51 -0
  55. package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -0
  56. package/dist/granular/ui/components/Dialog/DialogFooter.js +45 -0
  57. package/dist/granular/ui/components/Dialog/DialogFooter.js.map +1 -0
  58. package/dist/granular/ui/components/Dialog/DialogHeader.js +45 -0
  59. package/dist/granular/ui/components/Dialog/DialogHeader.js.map +1 -0
  60. package/dist/granular/ui/components/Dialog/DialogTitle.js +53 -0
  61. package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -0
  62. package/dist/granular/ui/components/Dialog/DialogTrigger.js +28 -0
  63. package/dist/granular/ui/components/Dialog/DialogTrigger.js.map +1 -0
  64. package/dist/granular/ui/components/Drawer/Drawer.js +47 -0
  65. package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -0
  66. package/dist/granular/ui/components/Drawer/DrawerContent.js +140 -0
  67. package/dist/granular/ui/components/Drawer/DrawerContent.js.map +1 -0
  68. package/dist/granular/ui/components/Drawer/DrawerContext.js +21 -0
  69. package/dist/granular/ui/components/Drawer/DrawerContext.js.map +1 -0
  70. package/dist/granular/ui/components/Drawer/DrawerFooter.js +53 -0
  71. package/dist/granular/ui/components/Drawer/DrawerFooter.js.map +1 -0
  72. package/dist/granular/ui/components/Drawer/DrawerHeader.js +50 -0
  73. package/dist/granular/ui/components/Drawer/DrawerHeader.js.map +1 -0
  74. package/dist/granular/ui/components/Dropdown/Dropdown.js +243 -0
  75. package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -0
  76. package/dist/granular/ui/components/EmptyState/EmptyState.js +102 -0
  77. package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -0
  78. package/dist/granular/ui/components/FileUpload/FileUpload.js +342 -0
  79. package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -0
  80. package/dist/granular/ui/components/Form/Form.js +184 -0
  81. package/dist/granular/ui/components/Form/Form.js.map +1 -0
  82. package/dist/granular/ui/components/Form/FormContext.js +19 -0
  83. package/dist/granular/ui/components/Form/FormContext.js.map +1 -0
  84. package/dist/granular/ui/components/Form/FormField.js +66 -0
  85. package/dist/granular/ui/components/Form/FormField.js.map +1 -0
  86. package/dist/granular/ui/components/Form/FormProvider.js +17 -0
  87. package/dist/granular/ui/components/Form/FormProvider.js.map +1 -0
  88. package/dist/granular/ui/components/Form/useFormFieldArray.js +29 -0
  89. package/dist/granular/ui/components/Form/useFormFieldArray.js.map +1 -0
  90. package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js +121 -0
  91. package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js.map +1 -0
  92. package/dist/granular/ui/components/Header/Header.js +98 -0
  93. package/dist/granular/ui/components/Header/Header.js.map +1 -0
  94. package/dist/granular/ui/components/Header/components/HeaderActions.js +21 -0
  95. package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -0
  96. package/dist/granular/ui/components/Header/components/HeaderHamburger.js +31 -0
  97. package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -0
  98. package/dist/granular/ui/components/Header/components/HeaderLogo.js +50 -0
  99. package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -0
  100. package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js +38 -0
  101. package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -0
  102. package/dist/granular/ui/components/Header/components/HeaderNavigation.js +27 -0
  103. package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -0
  104. package/dist/granular/ui/components/Header/contexts/HeaderContext.js +49 -0
  105. package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -0
  106. package/dist/granular/ui/components/LoginBox/LoginBox.js +84 -0
  107. package/dist/granular/ui/components/LoginBox/LoginBox.js.map +1 -0
  108. package/dist/granular/ui/components/Menu/Menu.js +45 -0
  109. package/dist/granular/ui/components/Menu/Menu.js.map +1 -0
  110. package/dist/granular/ui/components/Menu/MenuContent.js +94 -0
  111. package/dist/granular/ui/components/Menu/MenuContent.js.map +1 -0
  112. package/dist/granular/ui/components/Menu/MenuContext.js +21 -0
  113. package/dist/granular/ui/components/Menu/MenuContext.js.map +1 -0
  114. package/dist/granular/ui/components/Menu/MenuItem.js +93 -0
  115. package/dist/granular/ui/components/Menu/MenuItem.js.map +1 -0
  116. package/dist/granular/ui/components/Menu/MenuSeparator.js +46 -0
  117. package/dist/granular/ui/components/Menu/MenuSeparator.js.map +1 -0
  118. package/dist/granular/ui/components/Menu/MenuTrigger.js +71 -0
  119. package/dist/granular/ui/components/Menu/MenuTrigger.js.map +1 -0
  120. package/dist/granular/ui/components/Modal/Modal.js +171 -0
  121. package/dist/granular/ui/components/Modal/Modal.js.map +1 -0
  122. package/dist/granular/ui/components/MultiSelect/MultiSelect.js +193 -0
  123. package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -0
  124. package/dist/granular/ui/components/Navigation/Navigation.js +141 -0
  125. package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -0
  126. package/dist/granular/ui/components/PageHeader/PageHeader.js +95 -0
  127. package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -0
  128. package/dist/granular/ui/components/Pagination/Pagination.js +156 -0
  129. package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -0
  130. package/dist/granular/ui/components/Popover/Popover.js +171 -0
  131. package/dist/granular/ui/components/Popover/Popover.js.map +1 -0
  132. package/dist/granular/ui/components/Rating/Rating.js +110 -0
  133. package/dist/granular/ui/components/Rating/Rating.js.map +1 -0
  134. package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js +120 -0
  135. package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js.map +1 -0
  136. package/dist/granular/ui/components/SearchInput/SearchInput.js +103 -0
  137. package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -0
  138. package/dist/granular/ui/components/SideNavbar/SideNavbar.js +143 -0
  139. package/dist/granular/ui/components/SideNavbar/SideNavbar.js.map +1 -0
  140. package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js +173 -0
  141. package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js.map +1 -0
  142. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +87 -0
  143. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -0
  144. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +242 -0
  145. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -0
  146. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js +66 -0
  147. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js.map +1 -0
  148. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js +108 -0
  149. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js.map +1 -0
  150. package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js +63 -0
  151. package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js.map +1 -0
  152. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +113 -0
  153. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -0
  154. package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js +150 -0
  155. package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js.map +1 -0
  156. package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js +197 -0
  157. package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js.map +1 -0
  158. package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js +108 -0
  159. package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js.map +1 -0
  160. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js +71 -0
  161. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js.map +1 -0
  162. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js +64 -0
  163. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js.map +1 -0
  164. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js +141 -0
  165. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js.map +1 -0
  166. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js +90 -0
  167. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js.map +1 -0
  168. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js +12 -0
  169. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js.map +1 -0
  170. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js +13 -0
  171. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js.map +1 -0
  172. package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js +20 -0
  173. package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js.map +1 -0
  174. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js +37 -0
  175. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js.map +1 -0
  176. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js +20 -0
  177. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js.map +1 -0
  178. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js +28 -0
  179. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js.map +1 -0
  180. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js +19 -0
  181. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js.map +1 -0
  182. package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js +20 -0
  183. package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js.map +1 -0
  184. package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js +22 -0
  185. package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js.map +1 -0
  186. package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js +43 -0
  187. package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js.map +1 -0
  188. package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js +59 -0
  189. package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js.map +1 -0
  190. package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js +34 -0
  191. package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js.map +1 -0
  192. package/dist/granular/ui/components/SideNavbar/hooks/useResize.js +58 -0
  193. package/dist/granular/ui/components/SideNavbar/hooks/useResize.js.map +1 -0
  194. package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js +35 -0
  195. package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js.map +1 -0
  196. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js +21 -0
  197. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js.map +1 -0
  198. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js +19 -0
  199. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js.map +1 -0
  200. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js +21 -0
  201. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js.map +1 -0
  202. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js +61 -0
  203. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js.map +1 -0
  204. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js +82 -0
  205. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js.map +1 -0
  206. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +165 -0
  207. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -0
  208. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js +34 -0
  209. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js.map +1 -0
  210. package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js +28 -0
  211. package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js.map +1 -0
  212. package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js +60 -0
  213. package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js.map +1 -0
  214. package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js +19 -0
  215. package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js.map +1 -0
  216. package/dist/granular/ui/components/Stat/Stat.js +84 -0
  217. package/dist/granular/ui/components/Stat/Stat.js.map +1 -0
  218. package/dist/granular/ui/components/Stat/StatGroup.js +61 -0
  219. package/dist/granular/ui/components/Stat/StatGroup.js.map +1 -0
  220. package/dist/granular/ui/components/Stepper/Stepper.js +248 -0
  221. package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -0
  222. package/dist/granular/ui/components/Table/Table.js +162 -0
  223. package/dist/granular/ui/components/Table/Table.js.map +1 -0
  224. package/dist/granular/ui/components/Table/TableActions/TableActions.js +67 -0
  225. package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -0
  226. package/dist/granular/ui/components/Table/TableActions.js +44 -0
  227. package/dist/granular/ui/components/Table/TableActions.js.map +1 -0
  228. package/dist/granular/ui/components/Table/TableBody.js +134 -0
  229. package/dist/granular/ui/components/Table/TableBody.js.map +1 -0
  230. package/dist/granular/ui/components/Table/TableCell.js +40 -0
  231. package/dist/granular/ui/components/Table/TableCell.js.map +1 -0
  232. package/dist/granular/ui/components/Table/TableContext.js +19 -0
  233. package/dist/granular/ui/components/Table/TableContext.js.map +1 -0
  234. package/dist/granular/ui/components/Table/TableEmptyState.js +62 -0
  235. package/dist/granular/ui/components/Table/TableEmptyState.js.map +1 -0
  236. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +189 -0
  237. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -0
  238. package/dist/granular/ui/components/Table/TableFilters.js +48 -0
  239. package/dist/granular/ui/components/Table/TableFilters.js.map +1 -0
  240. package/dist/granular/ui/components/Table/TableHeader.js +45 -0
  241. package/dist/granular/ui/components/Table/TableHeader.js.map +1 -0
  242. package/dist/granular/ui/components/Table/TableHeaderCell.js +117 -0
  243. package/dist/granular/ui/components/Table/TableHeaderCell.js.map +1 -0
  244. package/dist/granular/ui/components/Table/TableHeaderRow.js +89 -0
  245. package/dist/granular/ui/components/Table/TableHeaderRow.js.map +1 -0
  246. package/dist/granular/ui/components/Table/TablePagination/TablePagination.js +216 -0
  247. package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -0
  248. package/dist/granular/ui/components/Table/TablePagination.js +56 -0
  249. package/dist/granular/ui/components/Table/TablePagination.js.map +1 -0
  250. package/dist/granular/ui/components/Table/TableProvider.js +244 -0
  251. package/dist/granular/ui/components/Table/TableProvider.js.map +1 -0
  252. package/dist/granular/ui/components/Table/TableRow.js +95 -0
  253. package/dist/granular/ui/components/Table/TableRow.js.map +1 -0
  254. package/dist/granular/ui/components/Table/useColumnResizing.js +71 -0
  255. package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -0
  256. package/dist/granular/ui/components/Table/useVirtualScrolling.js +50 -0
  257. package/dist/granular/ui/components/Table/useVirtualScrolling.js.map +1 -0
  258. package/dist/granular/ui/components/Tabs/Tabs.js +39 -0
  259. package/dist/granular/ui/components/Tabs/Tabs.js.map +1 -0
  260. package/dist/granular/ui/components/Tabs/TabsContent.js +59 -0
  261. package/dist/granular/ui/components/Tabs/TabsContent.js.map +1 -0
  262. package/dist/granular/ui/components/Tabs/TabsContext.js +18 -0
  263. package/dist/granular/ui/components/Tabs/TabsContext.js.map +1 -0
  264. package/dist/granular/ui/components/Tabs/TabsList.js +84 -0
  265. package/dist/granular/ui/components/Tabs/TabsList.js.map +1 -0
  266. package/dist/granular/ui/components/Tabs/TabsProvider.js +31 -0
  267. package/dist/granular/ui/components/Tabs/TabsProvider.js.map +1 -0
  268. package/dist/granular/ui/components/Tabs/TabsTrigger.js +103 -0
  269. package/dist/granular/ui/components/Tabs/TabsTrigger.js.map +1 -0
  270. package/dist/granular/ui/components/TimePicker/TimePicker.js +216 -0
  271. package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -0
  272. package/dist/granular/ui/components/Timeline/Timeline.js +152 -0
  273. package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -0
  274. package/dist/granular/ui/components/Toast/Toast.js +159 -0
  275. package/dist/granular/ui/components/Toast/Toast.js.map +1 -0
  276. package/dist/granular/ui/components/Toast/ToastContainer.js +41 -0
  277. package/dist/granular/ui/components/Toast/ToastContainer.js.map +1 -0
  278. package/dist/granular/ui/components/Toast/useToast.js +64 -0
  279. package/dist/granular/ui/components/Toast/useToast.js.map +1 -0
  280. package/dist/granular/ui/hooks/createGenericContext.js +27 -0
  281. package/dist/granular/ui/hooks/createGenericContext.js.map +1 -0
  282. package/dist/granular/ui/hooks/focusable.js +14 -0
  283. package/dist/granular/ui/hooks/focusable.js.map +1 -0
  284. package/dist/granular/ui/hooks/useAutoFocus.js +23 -0
  285. package/dist/granular/ui/hooks/useAutoFocus.js.map +1 -0
  286. package/dist/granular/ui/hooks/useCollapsible.js +37 -0
  287. package/dist/granular/ui/hooks/useCollapsible.js.map +1 -0
  288. package/dist/granular/ui/hooks/useFocusRestore.js +20 -0
  289. package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -0
  290. package/dist/granular/ui/hooks/useFocusTrap.js +31 -0
  291. package/dist/granular/ui/hooks/useFocusTrap.js.map +1 -0
  292. package/dist/granular/ui/hooks/useScrollSpy.js +23 -0
  293. package/dist/granular/ui/hooks/useScrollSpy.js.map +1 -0
  294. package/dist/granular/ui/layouts/Container/Container.js +73 -0
  295. package/dist/granular/ui/layouts/Container/Container.js.map +1 -0
  296. package/dist/granular/ui/layouts/Stack/Stack.js +79 -0
  297. package/dist/granular/ui/layouts/Stack/Stack.js.map +1 -0
  298. package/dist/granular/ui/primitives/Avatar/Avatar.js +122 -0
  299. package/dist/granular/ui/primitives/Avatar/Avatar.js.map +1 -0
  300. package/dist/granular/ui/primitives/Avatar/AvatarGroup.js +97 -0
  301. package/dist/granular/ui/primitives/Avatar/AvatarGroup.js.map +1 -0
  302. package/dist/granular/ui/primitives/Badge/Badge.js +212 -0
  303. package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -0
  304. package/dist/granular/ui/primitives/Button/Button.js +288 -0
  305. package/dist/granular/ui/primitives/Button/Button.js.map +1 -0
  306. package/dist/granular/ui/primitives/Checkbox/Checkbox.js +129 -0
  307. package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -0
  308. package/dist/granular/ui/primitives/Chip/Chip.js +206 -0
  309. package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -0
  310. package/dist/granular/ui/primitives/Collapsible/Collapsible.js +115 -0
  311. package/dist/granular/ui/primitives/Collapsible/Collapsible.js.map +1 -0
  312. package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js +54 -0
  313. package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -0
  314. package/dist/granular/ui/primitives/Info/Info.js +57 -0
  315. package/dist/granular/ui/primitives/Info/Info.js.map +1 -0
  316. package/dist/granular/ui/primitives/Input/Input.js +351 -0
  317. package/dist/granular/ui/primitives/Input/Input.js.map +1 -0
  318. package/dist/granular/ui/primitives/Label/Label.js +61 -0
  319. package/dist/granular/ui/primitives/Label/Label.js.map +1 -0
  320. package/dist/granular/ui/primitives/NavLink/NavLink.js +229 -0
  321. package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -0
  322. package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js +15 -0
  323. package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js.map +1 -0
  324. package/dist/granular/ui/primitives/Progress/Progress.js +182 -0
  325. package/dist/granular/ui/primitives/Progress/Progress.js.map +1 -0
  326. package/dist/granular/ui/primitives/Radio/Radio.js +118 -0
  327. package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -0
  328. package/dist/granular/ui/primitives/Select/Select.js +210 -0
  329. package/dist/granular/ui/primitives/Select/Select.js.map +1 -0
  330. package/dist/granular/ui/primitives/Separator/Separator.js +69 -0
  331. package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -0
  332. package/dist/granular/ui/primitives/Skeleton/Skeleton.js +87 -0
  333. package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -0
  334. package/dist/granular/ui/primitives/Slider/Slider.js +291 -0
  335. package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -0
  336. package/dist/granular/ui/primitives/Spinner/Spinner.js +95 -0
  337. package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -0
  338. package/dist/granular/ui/primitives/Switch/Switch.js +212 -0
  339. package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -0
  340. package/dist/granular/ui/primitives/Text/Text.js +118 -0
  341. package/dist/granular/ui/primitives/Text/Text.js.map +1 -0
  342. package/dist/granular/ui/primitives/Textarea/Textarea.js +129 -0
  343. package/dist/granular/ui/primitives/Textarea/Textarea.js.map +1 -0
  344. package/dist/granular/ui/primitives/Tooltip/Tooltip.js +227 -0
  345. package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -0
  346. package/dist/granular/ui/providers/AppProvider.js +50 -0
  347. package/dist/granular/ui/providers/AppProvider.js.map +1 -0
  348. package/dist/granular/ui/providers/ConfigProvider.js +95 -0
  349. package/dist/granular/ui/providers/ConfigProvider.js.map +1 -0
  350. package/dist/granular/ui/providers/DialogContext.js +20 -0
  351. package/dist/granular/ui/providers/DialogContext.js.map +1 -0
  352. package/dist/granular/ui/providers/DialogProvider.js +32 -0
  353. package/dist/granular/ui/providers/DialogProvider.js.map +1 -0
  354. package/dist/granular/ui/providers/ThemeProvider.js +56 -0
  355. package/dist/granular/ui/providers/ThemeProvider.js.map +1 -0
  356. package/dist/granular/ui/providers/ToastContext.js +20 -0
  357. package/dist/granular/ui/providers/ToastContext.js.map +1 -0
  358. package/dist/granular/ui/providers/ToastProvider.js +47 -0
  359. package/dist/granular/ui/providers/ToastProvider.js.map +1 -0
  360. package/dist/granular/ui/providers/providers-bundle.js +23 -0
  361. package/dist/granular/ui/providers/providers-bundle.js.map +1 -0
  362. package/dist/granular/ui/tokens/animations.js +106 -0
  363. package/dist/granular/ui/tokens/animations.js.map +1 -0
  364. package/dist/granular/ui/tokens/borders.js +54 -0
  365. package/dist/granular/ui/tokens/borders.js.map +1 -0
  366. package/dist/granular/ui/tokens/breakpoints.js +43 -0
  367. package/dist/granular/ui/tokens/breakpoints.js.map +1 -0
  368. package/dist/granular/ui/tokens/colors/brand.js +67 -0
  369. package/dist/granular/ui/tokens/colors/brand.js.map +1 -0
  370. package/dist/granular/ui/tokens/colors/index.js +25 -0
  371. package/dist/granular/ui/tokens/colors/index.js.map +1 -0
  372. package/dist/granular/ui/tokens/colors/primitives.js +320 -0
  373. package/dist/granular/ui/tokens/colors/primitives.js.map +1 -0
  374. package/dist/granular/ui/tokens/colors/semantic.js +212 -0
  375. package/dist/granular/ui/tokens/colors/semantic.js.map +1 -0
  376. package/dist/granular/ui/tokens/colors/types.js +18 -0
  377. package/dist/granular/ui/tokens/colors/types.js.map +1 -0
  378. package/dist/granular/ui/tokens/colors/utils.js +131 -0
  379. package/dist/granular/ui/tokens/colors/utils.js.map +1 -0
  380. package/dist/granular/ui/tokens/opacity.js +59 -0
  381. package/dist/granular/ui/tokens/opacity.js.map +1 -0
  382. package/dist/granular/ui/tokens/radius.js +76 -0
  383. package/dist/granular/ui/tokens/radius.js.map +1 -0
  384. package/dist/granular/ui/tokens/shadows.js +63 -0
  385. package/dist/granular/ui/tokens/shadows.js.map +1 -0
  386. package/dist/granular/ui/tokens/sidebar.js +92 -0
  387. package/dist/granular/ui/tokens/sidebar.js.map +1 -0
  388. package/dist/granular/ui/tokens/spacing.js +143 -0
  389. package/dist/granular/ui/tokens/spacing.js.map +1 -0
  390. package/dist/granular/ui/tokens/switch.js +51 -0
  391. package/dist/granular/ui/tokens/switch.js.map +1 -0
  392. package/dist/granular/ui/tokens/typography.js +146 -0
  393. package/dist/granular/ui/tokens/typography.js.map +1 -0
  394. package/dist/granular/ui/tokens/z-index.js +79 -0
  395. package/dist/granular/ui/tokens/z-index.js.map +1 -0
  396. package/dist/granular/ui/utils/cn.js +10 -0
  397. package/dist/granular/ui/utils/cn.js.map +1 -0
  398. package/dist/granular/ui/utils/cva.js +14 -0
  399. package/dist/granular/ui/utils/cva.js.map +1 -0
  400. package/dist/granular/ui/utils/mergeRefs.js +11 -0
  401. package/dist/granular/ui/utils/mergeRefs.js.map +1 -0
  402. package/dist/granular/vite.svg +1 -0
  403. package/dist/hooks/index.cjs +2 -0
  404. package/dist/hooks/index.cjs.map +1 -0
  405. package/dist/hooks/index.js +23 -0
  406. package/dist/hooks/index.js.map +1 -0
  407. package/dist/index.cjs +44 -70
  408. package/dist/index.cjs.map +1 -1
  409. package/dist/index.js +1900 -1885
  410. package/dist/index.js.map +1 -1
  411. package/dist/react-design-system.css +1 -1
  412. package/dist/server/index.cjs +23 -23
  413. package/dist/server/index.cjs.map +1 -1
  414. package/dist/server/index.js +863 -1180
  415. package/dist/server/index.js.map +1 -1
  416. package/dist/ui/components/Accordion/Accordion.d.ts +9 -1
  417. package/dist/ui/hooks-entry.d.ts +2 -0
  418. package/dist/ui/utils/tailwind-safelist.d.ts +3 -1
  419. package/package.json +24 -13
@@ -0,0 +1,212 @@
1
+ "use client";
2
+ var z = Object.defineProperty, B = Object.defineProperties;
3
+ var S = Object.getOwnPropertyDescriptors;
4
+ var d = Object.getOwnPropertySymbols;
5
+ var f = Object.prototype.hasOwnProperty, y = Object.prototype.propertyIsEnumerable;
6
+ var p = (e, a, s) => a in e ? z(e, a, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[a] = s, u = (e, a) => {
7
+ for (var s in a || (a = {}))
8
+ f.call(a, s) && p(e, s, a[s]);
9
+ if (d)
10
+ for (var s of d(a))
11
+ y.call(a, s) && p(e, s, a[s]);
12
+ return e;
13
+ }, m = (e, a) => B(e, S(a));
14
+ var x = (e, a) => {
15
+ var s = {};
16
+ for (var t in e)
17
+ f.call(e, t) && a.indexOf(t) < 0 && (s[t] = e[t]);
18
+ if (e != null && d)
19
+ for (var t of d(e))
20
+ a.indexOf(t) < 0 && y.call(e, t) && (s[t] = e[t]);
21
+ return s;
22
+ };
23
+ import { jsx as V } from "react/jsx-runtime";
24
+ import { memo as C, forwardRef as N } from "react";
25
+ import { getRadiusClass as R } from "../../tokens/radius.js";
26
+ import { getSpacingClass as i } from "../../tokens/spacing.js";
27
+ import { getTypographySize as c, getTypographyWeight as T } from "../../tokens/typography.js";
28
+ import { cn as r } from "../../utils/cn.js";
29
+ import { cva as h } from "../../utils/cva.js";
30
+ const W = h(
31
+ // Base classes
32
+ r(
33
+ "inline-flex",
34
+ "items-center",
35
+ "justify-center",
36
+ T("label"),
37
+ R("md"),
38
+ "border"
39
+ ),
40
+ {
41
+ variants: {
42
+ variant: {
43
+ success: "",
44
+ warning: "",
45
+ error: "",
46
+ info: "",
47
+ neutral: "",
48
+ primary: "",
49
+ secondary: ""
50
+ },
51
+ size: {
52
+ sm: r(
53
+ i("1.5", "px"),
54
+ i("0.5", "py"),
55
+ c("caption")
56
+ ),
57
+ md: r(
58
+ i("sm", "px"),
59
+ i("xs", "py"),
60
+ c("caption")
61
+ ),
62
+ lg: r(
63
+ i("sm", "px"),
64
+ i("xs", "py"),
65
+ c("bodySmall")
66
+ )
67
+ },
68
+ style: {
69
+ solid: "",
70
+ outline: ""
71
+ }
72
+ },
73
+ compoundVariants: [
74
+ // Solid style variants
75
+ {
76
+ variant: "success",
77
+ style: "solid",
78
+ class: r("bg-success-bg", "text-success-dark", "border-success")
79
+ },
80
+ {
81
+ variant: "warning",
82
+ style: "solid",
83
+ class: r("bg-warning-bg", "text-warning-dark", "border-warning")
84
+ },
85
+ {
86
+ variant: "error",
87
+ style: "solid",
88
+ class: r("bg-error-bg", "text-error-dark", "border-error")
89
+ },
90
+ {
91
+ variant: "info",
92
+ style: "solid",
93
+ class: r("bg-info-bg", "text-info-dark", "border-info")
94
+ },
95
+ {
96
+ variant: "neutral",
97
+ style: "solid",
98
+ class: r("bg-surface-muted", "text-fg-primary", "border-line-default")
99
+ },
100
+ {
101
+ variant: "primary",
102
+ style: "solid",
103
+ class: r(
104
+ "bg-surface-brand-subtle",
105
+ "text-fg-brand-emphasis",
106
+ "border-line-brand"
107
+ )
108
+ },
109
+ {
110
+ variant: "secondary",
111
+ style: "solid",
112
+ // bg-pink-300: secondary solid badge — no semantic equivalent
113
+ // (would shift 2 shades to bg-surface-secondary). Kept literal until
114
+ // secondary brand surface palette expands beyond DEFAULT.
115
+ class: r(
116
+ "bg-pink-300",
117
+ "text-fg-brand-secondary-emphasis",
118
+ "border-line-secondary"
119
+ )
120
+ },
121
+ // Outline style variants
122
+ {
123
+ variant: "success",
124
+ style: "outline",
125
+ class: r("bg-transparent", "border-success", "text-fg-success")
126
+ },
127
+ {
128
+ variant: "warning",
129
+ style: "outline",
130
+ class: r("bg-transparent", "border-warning", "text-fg-warning")
131
+ },
132
+ {
133
+ variant: "error",
134
+ style: "outline",
135
+ class: r("bg-transparent", "border-error", "text-fg-error")
136
+ },
137
+ {
138
+ variant: "info",
139
+ style: "outline",
140
+ class: r("bg-transparent", "border-info", "text-fg-info")
141
+ },
142
+ {
143
+ variant: "neutral",
144
+ style: "outline",
145
+ class: r("bg-transparent", "border-line-default", "text-fg-secondary")
146
+ },
147
+ {
148
+ variant: "primary",
149
+ style: "outline",
150
+ class: r("bg-transparent", "border-line-brand", "text-fg-brand")
151
+ },
152
+ {
153
+ variant: "secondary",
154
+ style: "outline",
155
+ class: r(
156
+ "bg-transparent",
157
+ "border-line-secondary",
158
+ "text-fg-brand-secondary"
159
+ )
160
+ }
161
+ ],
162
+ defaultVariants: {
163
+ variant: "neutral",
164
+ size: "md",
165
+ style: "solid"
166
+ }
167
+ }
168
+ ), q = C(
169
+ N(function(A, k) {
170
+ var b = A, {
171
+ variant: a = "neutral",
172
+ size: s = "md",
173
+ style: t = "solid",
174
+ className: v = "",
175
+ children: n,
176
+ "aria-label": g
177
+ } = b, w = x(b, [
178
+ "variant",
179
+ "size",
180
+ "style",
181
+ "className",
182
+ "children",
183
+ "aria-label"
184
+ ]);
185
+ const j = r(W({ variant: a, size: s, style: t }), v);
186
+ let l;
187
+ if (g)
188
+ l = g;
189
+ else if (typeof n == "string")
190
+ l = n;
191
+ else if (typeof n == "object" && n !== null && "props" in n) {
192
+ const o = n.props;
193
+ o != null && o.children && typeof o.children == "string" && (l = o.children);
194
+ }
195
+ return /* @__PURE__ */ V(
196
+ "span",
197
+ m(u({
198
+ ref: k,
199
+ role: "status",
200
+ "aria-label": l,
201
+ className: j
202
+ }, w), {
203
+ children: n
204
+ })
205
+ );
206
+ })
207
+ );
208
+ q.displayName = "Badge";
209
+ export {
210
+ q as default
211
+ };
212
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sources":["../../../../../src/ui/primitives/Badge/Badge.tsx"],"sourcesContent":["import { memo, forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { getRadiusClass } from \"../../tokens/radius\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\nimport {\n getTypographySize,\n getTypographyWeight,\n} from \"../../tokens/typography\";\nimport { cn, cva } from \"../../utils\";\n\nexport type BadgeVariant =\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"info\"\n | \"neutral\"\n | \"primary\"\n | \"secondary\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeStyle = \"solid\" | \"outline\";\n\nexport interface BadgeProps extends Omit<\n HTMLAttributes<HTMLSpanElement>,\n \"style\"\n> {\n variant?: BadgeVariant;\n size?: BadgeSize;\n style?: BadgeStyle;\n children: ReactNode;\n \"aria-label\"?: string;\n}\n\n/**\n * Badge Component\n *\n * A versatile badge component for displaying status, priority, and other labels.\n * Follows Atomic Design principles as an Atom component.\n * Uses tokens for consistent theming.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"error\" size=\"lg\">Critical</Badge>\n * <Badge variant=\"info\" style=\"outline\">New</Badge>\n * ```\n */\n// Badge variants using CVA\nconst badgeVariants = cva(\n // Base classes\n cn(\n \"inline-flex\",\n \"items-center\",\n \"justify-center\",\n getTypographyWeight(\"label\"),\n getRadiusClass(\"md\"),\n \"border\",\n ),\n {\n variants: {\n variant: {\n success: \"\",\n warning: \"\",\n error: \"\",\n info: \"\",\n neutral: \"\",\n primary: \"\",\n secondary: \"\",\n },\n size: {\n sm: cn(\n getSpacingClass(\"1.5\", \"px\"),\n getSpacingClass(\"0.5\", \"py\"),\n getTypographySize(\"caption\"),\n ),\n md: cn(\n getSpacingClass(\"sm\", \"px\"),\n getSpacingClass(\"xs\", \"py\"),\n getTypographySize(\"caption\"),\n ),\n lg: cn(\n getSpacingClass(\"sm\", \"px\"),\n getSpacingClass(\"xs\", \"py\"),\n getTypographySize(\"bodySmall\"),\n ),\n },\n style: {\n solid: \"\",\n outline: \"\",\n },\n },\n compoundVariants: [\n // Solid style variants\n {\n variant: \"success\",\n style: \"solid\",\n class: cn(\"bg-success-bg\", \"text-success-dark\", \"border-success\"),\n },\n {\n variant: \"warning\",\n style: \"solid\",\n class: cn(\"bg-warning-bg\", \"text-warning-dark\", \"border-warning\"),\n },\n {\n variant: \"error\",\n style: \"solid\",\n class: cn(\"bg-error-bg\", \"text-error-dark\", \"border-error\"),\n },\n {\n variant: \"info\",\n style: \"solid\",\n class: cn(\"bg-info-bg\", \"text-info-dark\", \"border-info\"),\n },\n {\n variant: \"neutral\",\n style: \"solid\",\n class: cn(\"bg-surface-muted\", \"text-fg-primary\", \"border-line-default\"),\n },\n {\n variant: \"primary\",\n style: \"solid\",\n class: cn(\n \"bg-surface-brand-subtle\",\n \"text-fg-brand-emphasis\",\n \"border-line-brand\",\n ),\n },\n {\n variant: \"secondary\",\n style: \"solid\",\n // bg-pink-300: secondary solid badge — no semantic equivalent\n // (would shift 2 shades to bg-surface-secondary). Kept literal until\n // secondary brand surface palette expands beyond DEFAULT.\n class: cn(\n \"bg-pink-300\",\n \"text-fg-brand-secondary-emphasis\",\n \"border-line-secondary\",\n ),\n },\n // Outline style variants\n {\n variant: \"success\",\n style: \"outline\",\n class: cn(\"bg-transparent\", \"border-success\", \"text-fg-success\"),\n },\n {\n variant: \"warning\",\n style: \"outline\",\n class: cn(\"bg-transparent\", \"border-warning\", \"text-fg-warning\"),\n },\n {\n variant: \"error\",\n style: \"outline\",\n class: cn(\"bg-transparent\", \"border-error\", \"text-fg-error\"),\n },\n {\n variant: \"info\",\n style: \"outline\",\n class: cn(\"bg-transparent\", \"border-info\", \"text-fg-info\"),\n },\n {\n variant: \"neutral\",\n style: \"outline\",\n class: cn(\"bg-transparent\", \"border-line-default\", \"text-fg-secondary\"),\n },\n {\n variant: \"primary\",\n style: \"outline\",\n class: cn(\"bg-transparent\", \"border-line-brand\", \"text-fg-brand\"),\n },\n {\n variant: \"secondary\",\n style: \"outline\",\n class: cn(\n \"bg-transparent\",\n \"border-line-secondary\",\n \"text-fg-brand-secondary\",\n ),\n },\n ],\n defaultVariants: {\n variant: \"neutral\",\n size: \"md\",\n style: \"solid\",\n },\n },\n);\n\nconst Badge = memo(\n forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n {\n variant = \"neutral\",\n size = \"md\",\n style = \"solid\",\n className = \"\",\n children,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref,\n ) {\n const classes = cn(badgeVariants({ variant, size, style }), className);\n\n // Best-effort accessible name resolution: explicit aria-label wins;\n // string children become the label; single-wrapped string children\n // (e.g. <Badge><span>Active</span></Badge>) are unwrapped one level.\n // Otherwise undefined and the consumer is responsible for naming\n // the badge externally.\n let accessibleLabel: string | undefined;\n if (ariaLabel) {\n accessibleLabel = ariaLabel;\n } else if (typeof children === \"string\") {\n accessibleLabel = children;\n } else if (\n typeof children === \"object\" &&\n children !== null &&\n \"props\" in children\n ) {\n const childProps = (children as { props?: { children?: unknown } }).props;\n if (childProps?.children && typeof childProps.children === \"string\") {\n accessibleLabel = childProps.children;\n }\n }\n\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={accessibleLabel}\n className={classes}\n {...props}\n >\n {children}\n </span>\n );\n }),\n);\n\nBadge.displayName = \"Badge\";\n\nexport default Badge;\n"],"names":["badgeVariants","cva","cn","getTypographyWeight","getRadiusClass","getSpacingClass","getTypographySize","Badge","memo","forwardRef","_a","ref","_b","variant","size","style","className","children","ariaLabel","props","__objRest","classes","accessibleLabel","childProps","jsx","__spreadProps","__spreadValues"],"mappings":"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"}
@@ -0,0 +1,288 @@
1
+ "use client";
2
+ var G = Object.defineProperty, H = Object.defineProperties;
3
+ var J = Object.getOwnPropertyDescriptors;
4
+ var y = Object.getOwnPropertySymbols;
5
+ var A = Object.prototype.hasOwnProperty, F = Object.prototype.propertyIsEnumerable;
6
+ var $ = (r, n, o) => n in r ? G(r, n, { enumerable: !0, configurable: !0, writable: !0, value: o }) : r[n] = o, u = (r, n) => {
7
+ for (var o in n || (n = {}))
8
+ A.call(n, o) && $(r, o, n[o]);
9
+ if (y)
10
+ for (var o of y(n))
11
+ F.call(n, o) && $(r, o, n[o]);
12
+ return r;
13
+ }, v = (r, n) => H(r, J(n));
14
+ var M = (r, n) => {
15
+ var o = {};
16
+ for (var s in r)
17
+ A.call(r, s) && n.indexOf(s) < 0 && (o[s] = r[s]);
18
+ if (r != null && y)
19
+ for (var s of y(r))
20
+ n.indexOf(s) < 0 && F.call(r, s) && (o[s] = r[s]);
21
+ return o;
22
+ };
23
+ import { jsx as i, jsxs as h, Fragment as P } from "react/jsx-runtime";
24
+ import { memo as K, forwardRef as Q, useMemo as m } from "react";
25
+ import { Slot as U, Slottable as W } from "@radix-ui/react-slot";
26
+ import { getRadiusClass as X } from "../../tokens/radius.js";
27
+ import { getSpacingClass as e } from "../../tokens/spacing.js";
28
+ import { getTypographySize as x, getTypographyClasses as Y } from "../../tokens/typography.js";
29
+ import Z from "../Spinner/Spinner.js";
30
+ import { cn as t } from "../../utils/cn.js";
31
+ import { cva as L } from "../../utils/cva.js";
32
+ const I = L(
33
+ // Base classes
34
+ t(
35
+ "inline-flex",
36
+ "items-center",
37
+ "justify-center",
38
+ Y("button").split(" ")[2] || "font-medium",
39
+ // Extract font-medium
40
+ X("md"),
41
+ "transition-colors",
42
+ "focus:outline-none",
43
+ "focus:ring-2",
44
+ "focus:ring-offset-2",
45
+ "disabled:opacity-50",
46
+ "disabled:cursor-not-allowed"
47
+ ),
48
+ {
49
+ variants: {
50
+ variant: {
51
+ primary: t(
52
+ "bg-surface-brand-strong",
53
+ "text-fg-inverse",
54
+ "hover:opacity-90",
55
+ "focus:ring-line-brand"
56
+ ),
57
+ secondary: t(
58
+ "bg-surface-secondary",
59
+ "text-fg-inverse",
60
+ "hover:opacity-90",
61
+ "focus:ring-line-secondary"
62
+ ),
63
+ error: t(
64
+ "bg-error",
65
+ "text-fg-inverse",
66
+ "hover:opacity-90",
67
+ "focus:ring-error"
68
+ ),
69
+ outline: t(
70
+ "border-2",
71
+ "border-line-default",
72
+ "bg-transparent",
73
+ "text-fg-primary",
74
+ "hover:bg-surface-hover",
75
+ "focus:ring-line-focus"
76
+ ),
77
+ ghost: t(
78
+ "bg-transparent",
79
+ "text-fg-primary",
80
+ "hover:bg-surface-hover",
81
+ "focus:ring-line-focus"
82
+ ),
83
+ iconOnly: t(
84
+ "bg-transparent",
85
+ "text-fg-primary",
86
+ "hover:bg-surface-hover",
87
+ "focus:ring-line-focus",
88
+ e("none", "p")
89
+ ),
90
+ // Textual call-to-action — brand-coloured text, underline on
91
+ // hover, no chrome (no surface, no border). Padding is zeroed
92
+ // out per size in compoundVariants so the bounding box hugs
93
+ // the text (height intrinsic). Issue #156.
94
+ //
95
+ // Focus ring: `focus:ring-line-focus` keeps the same focus
96
+ // family the other no-chrome variants use (ghost, outline,
97
+ // iconOnly). The base's `focus:ring-2` + `focus:ring-offset-2`
98
+ // produce a 2px ring 2px away from the text bounding box; the
99
+ // 2px offset is rendered in surface-base so the ring contrasts
100
+ // against surface (≥3:1 for WCAG 2.4.11, verified) rather than
101
+ // colliding with the brand-coloured text. The element keeps
102
+ // `getRadiusClass("md")` from the base, which is invisible
103
+ // without chrome but rounds the focus ring corners.
104
+ //
105
+ // hover:underline pairs with `underline-offset-4` so the
106
+ // underline that appears on hover sits clear of the descenders
107
+ // (WCAG-aligned with link best practice). At rest the link
108
+ // carries no underline — the brand colour alone signals
109
+ // affordance, matching the shadcn convention this variant is
110
+ // modelled on (see issue body).
111
+ //
112
+ // disabled: inherits opacity-50 + cursor-not-allowed from the
113
+ // base. We do NOT special-case `disabled:no-underline` because
114
+ // a disabled link should still receive the same visual
115
+ // treatment as a disabled chrome variant — the opacity and
116
+ // cursor signal the disabled state.
117
+ link: t(
118
+ "bg-transparent",
119
+ "text-fg-brand",
120
+ "underline-offset-4",
121
+ "hover:underline",
122
+ "focus:ring-line-focus"
123
+ )
124
+ },
125
+ size: {
126
+ sm: t(
127
+ e("md", "px"),
128
+ e("1.5", "py"),
129
+ x("bodySmall"),
130
+ e("1.5", "gap")
131
+ ),
132
+ md: t(
133
+ e("base", "px"),
134
+ e("sm", "py"),
135
+ x("body"),
136
+ e("sm", "gap")
137
+ ),
138
+ lg: t(
139
+ e("lg", "px"),
140
+ e("md", "py"),
141
+ x("bodyLarge"),
142
+ e("2.5", "gap")
143
+ )
144
+ }
145
+ },
146
+ compoundVariants: [
147
+ // IconOnly variant has different sizing
148
+ {
149
+ variant: "iconOnly",
150
+ size: "sm",
151
+ class: t("h-8", "w-8", e("none", "p"))
152
+ },
153
+ {
154
+ variant: "iconOnly",
155
+ size: "md",
156
+ class: t("h-10", "w-10", e("none", "p"))
157
+ },
158
+ {
159
+ variant: "iconOnly",
160
+ size: "lg",
161
+ class: t("h-12", "w-12", e("none", "p"))
162
+ },
163
+ // Link variant zeroes the size's padding via compoundVariants so
164
+ // the override runs AFTER the size block's `px-N`/`py-N` and
165
+ // twMerge picks the zero value (`cn` joins variant before
166
+ // compound). The size's typography and gap survive — the link's
167
+ // text scales with size and icons still get gap-N when present.
168
+ // Issue #156.
169
+ {
170
+ variant: "link",
171
+ size: "sm",
172
+ class: t(e("none", "px"), e("none", "py"))
173
+ },
174
+ {
175
+ variant: "link",
176
+ size: "md",
177
+ class: t(e("none", "px"), e("none", "py"))
178
+ },
179
+ {
180
+ variant: "link",
181
+ size: "lg",
182
+ class: t(e("none", "px"), e("none", "py"))
183
+ }
184
+ ],
185
+ defaultVariants: {
186
+ variant: "primary",
187
+ size: "md"
188
+ }
189
+ }
190
+ );
191
+ function d({
192
+ children: r,
193
+ position: n
194
+ }) {
195
+ return r ? /* @__PURE__ */ i(
196
+ "span",
197
+ {
198
+ className: `inline-flex items-center ${n === "left" ? e("none", "mr") : e("none", "ml")}`,
199
+ children: r
200
+ }
201
+ ) : null;
202
+ }
203
+ const nn = K(
204
+ Q(function(en, B) {
205
+ var V = en, {
206
+ variant: n = "primary",
207
+ size: o = "md",
208
+ isLoading: s = !1,
209
+ loadingText: g,
210
+ loadingIcon: w,
211
+ leftIcon: l,
212
+ rightIcon: c,
213
+ fullWidth: z = !1,
214
+ asChild: f = !1,
215
+ as: p,
216
+ className: O = "",
217
+ disabled: S = !1,
218
+ children: a,
219
+ "aria-label": b
220
+ } = V, N = M(V, [
221
+ "variant",
222
+ "size",
223
+ "isLoading",
224
+ "loadingText",
225
+ "loadingIcon",
226
+ "leftIcon",
227
+ "rightIcon",
228
+ "fullWidth",
229
+ "asChild",
230
+ "as",
231
+ "className",
232
+ "disabled",
233
+ "children",
234
+ "aria-label"
235
+ ]);
236
+ typeof process != "undefined" && process.env.NODE_ENV !== "production" && f && p !== void 0 && p !== "button" && console.warn(
237
+ "[Button] `as` is ignored when `asChild` is true; the child element is used as the root. Drop one of the two props to silence this warning."
238
+ );
239
+ const k = f ? U : p != null ? p : "button", T = m(
240
+ () => t(
241
+ I({
242
+ variant: n,
243
+ size: o
244
+ }),
245
+ z && "w-full",
246
+ O
247
+ ),
248
+ [n, o, z, O]
249
+ ), j = m(
250
+ () => n === "iconOnly" || !a && (l || c),
251
+ [n, a, l, c]
252
+ ), _ = m(
253
+ () => j && !b && !a ? "Button" : b,
254
+ [j, b, a]
255
+ ), C = m(() => n === "error" ? "primary" : n === "primary" || n === "secondary" ? "neutral" : "primary", [n]), D = m(
256
+ () => o === "sm" ? "sm" : o === "lg" ? "lg" : "md",
257
+ [o]
258
+ ), q = m(
259
+ () => w || /* @__PURE__ */ i(Z, { size: D, variant: C }),
260
+ [w, D, C]
261
+ ), E = !f && (p === void 0 || p === "button") && !N.type ? "button" : void 0, R = u(u({
262
+ className: T,
263
+ disabled: S || s,
264
+ "aria-busy": s,
265
+ "aria-label": _,
266
+ "aria-disabled": S || s
267
+ }, E ? { type: E } : {}), N);
268
+ return f ? /* @__PURE__ */ h(k, v(u({ ref: B }, R), { children: [
269
+ l && /* @__PURE__ */ i(d, { position: "left", children: l }),
270
+ /* @__PURE__ */ i(W, { children: a }),
271
+ c && /* @__PURE__ */ i(d, { position: "right", children: c })
272
+ ] })) : /* @__PURE__ */ i(k, v(u({ ref: B }, R), { children: s ? /* @__PURE__ */ h(P, { children: [
273
+ q,
274
+ g && /* @__PURE__ */ i("span", { className: e("sm", "ml"), children: g }),
275
+ !g && a && /* @__PURE__ */ i("span", { className: `${e("sm", "ml")} opacity-0`, children: a })
276
+ ] }) : /* @__PURE__ */ h(P, { children: [
277
+ l && /* @__PURE__ */ i(d, { position: "left", children: l }),
278
+ a,
279
+ c && /* @__PURE__ */ i(d, { position: "right", children: c })
280
+ ] }) }));
281
+ })
282
+ );
283
+ nn.displayName = "Button";
284
+ export {
285
+ nn as Button,
286
+ nn as default
287
+ };
288
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sources":["../../../../../src/ui/primitives/Button/Button.tsx"],"sourcesContent":["import { forwardRef, memo, useMemo } from \"react\";\nimport type { ButtonHTMLAttributes, ReactNode, ElementType } from \"react\";\nimport { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport { getRadiusClass } from \"../../tokens/radius\";\n\n// Ambient declaration so the dev-only warn below typechecks without\n// pulling @types/node into the app tsconfig. At runtime the consumer's\n// bundler (webpack/turbopack/etc.) replaces `process.env.NODE_ENV` with\n// a literal; the `typeof process` guard keeps the branch safe in\n// browser/edge runtimes where `process` doesn't exist.\ndeclare const process: { env: { NODE_ENV?: string } };\nimport { getSpacingClass } from \"../../tokens/spacing\";\nimport {\n getTypographyClasses,\n getTypographySize,\n} from \"../../tokens/typography\";\nimport { cn, cva } from \"../../utils\";\nimport Spinner from \"../Spinner/Spinner\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"error\"\n | \"outline\"\n | \"ghost\"\n | \"iconOnly\"\n | \"link\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"as\"\n> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n isLoading?: boolean;\n loadingText?: string;\n loadingIcon?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n fullWidth?: boolean;\n as?: ElementType;\n href?: string;\n target?: string;\n /**\n * When true, render via Radix `Slot`: classes, ARIA, ref and remaining\n * props are projected onto the single child element instead of an\n * intrinsic `<button>`. The child keeps its own element type and props\n * intact — including framework-native props like `<Link href prefetch>`.\n *\n * `asChild` takes precedence over `as`: if both are supplied, `as` is\n * ignored and a dev-only warning is logged.\n *\n * @example\n * ```tsx\n * <Button asChild variant=\"primary\">\n * <Link href=\"/profile\" prefetch>Open profile</Link>\n * </Button>\n * // → <a class=\"…button classes\" href=\"/profile\" data-prefetch>Open profile</a>\n * ```\n */\n asChild?: boolean;\n}\n\n/**\n * Button Variants using CVA\n * Type-safe variant system for Button component\n */\nconst buttonVariants = cva(\n // Base classes\n cn(\n \"inline-flex\",\n \"items-center\",\n \"justify-center\",\n getTypographyClasses(\"button\").split(\" \")[2] || \"font-medium\", // Extract font-medium\n getRadiusClass(\"md\"),\n \"transition-colors\",\n \"focus:outline-none\",\n \"focus:ring-2\",\n \"focus:ring-offset-2\",\n \"disabled:opacity-50\",\n \"disabled:cursor-not-allowed\",\n ),\n {\n variants: {\n variant: {\n primary: cn(\n \"bg-surface-brand-strong\",\n \"text-fg-inverse\",\n \"hover:opacity-90\",\n \"focus:ring-line-brand\",\n ),\n secondary: cn(\n \"bg-surface-secondary\",\n \"text-fg-inverse\",\n \"hover:opacity-90\",\n \"focus:ring-line-secondary\",\n ),\n error: cn(\n \"bg-error\",\n \"text-fg-inverse\",\n \"hover:opacity-90\",\n \"focus:ring-error\",\n ),\n outline: cn(\n \"border-2\",\n \"border-line-default\",\n \"bg-transparent\",\n \"text-fg-primary\",\n \"hover:bg-surface-hover\",\n \"focus:ring-line-focus\",\n ),\n ghost: cn(\n \"bg-transparent\",\n \"text-fg-primary\",\n \"hover:bg-surface-hover\",\n \"focus:ring-line-focus\",\n ),\n iconOnly: cn(\n \"bg-transparent\",\n \"text-fg-primary\",\n \"hover:bg-surface-hover\",\n \"focus:ring-line-focus\",\n getSpacingClass(\"none\", \"p\"),\n ),\n // Textual call-to-action — brand-coloured text, underline on\n // hover, no chrome (no surface, no border). Padding is zeroed\n // out per size in compoundVariants so the bounding box hugs\n // the text (height intrinsic). Issue #156.\n //\n // Focus ring: `focus:ring-line-focus` keeps the same focus\n // family the other no-chrome variants use (ghost, outline,\n // iconOnly). The base's `focus:ring-2` + `focus:ring-offset-2`\n // produce a 2px ring 2px away from the text bounding box; the\n // 2px offset is rendered in surface-base so the ring contrasts\n // against surface (≥3:1 for WCAG 2.4.11, verified) rather than\n // colliding with the brand-coloured text. The element keeps\n // `getRadiusClass(\"md\")` from the base, which is invisible\n // without chrome but rounds the focus ring corners.\n //\n // hover:underline pairs with `underline-offset-4` so the\n // underline that appears on hover sits clear of the descenders\n // (WCAG-aligned with link best practice). At rest the link\n // carries no underline — the brand colour alone signals\n // affordance, matching the shadcn convention this variant is\n // modelled on (see issue body).\n //\n // disabled: inherits opacity-50 + cursor-not-allowed from the\n // base. We do NOT special-case `disabled:no-underline` because\n // a disabled link should still receive the same visual\n // treatment as a disabled chrome variant — the opacity and\n // cursor signal the disabled state.\n link: cn(\n \"bg-transparent\",\n \"text-fg-brand\",\n \"underline-offset-4\",\n \"hover:underline\",\n \"focus:ring-line-focus\",\n ),\n },\n size: {\n sm: cn(\n getSpacingClass(\"md\", \"px\"),\n getSpacingClass(\"1.5\", \"py\"),\n getTypographySize(\"bodySmall\"),\n getSpacingClass(\"1.5\", \"gap\"),\n ),\n md: cn(\n getSpacingClass(\"base\", \"px\"),\n getSpacingClass(\"sm\", \"py\"),\n getTypographySize(\"body\"),\n getSpacingClass(\"sm\", \"gap\"),\n ),\n lg: cn(\n getSpacingClass(\"lg\", \"px\"),\n getSpacingClass(\"md\", \"py\"),\n getTypographySize(\"bodyLarge\"),\n getSpacingClass(\"2.5\", \"gap\"),\n ),\n },\n },\n compoundVariants: [\n // IconOnly variant has different sizing\n {\n variant: \"iconOnly\",\n size: \"sm\",\n class: cn(\"h-8\", \"w-8\", getSpacingClass(\"none\", \"p\")),\n },\n {\n variant: \"iconOnly\",\n size: \"md\",\n class: cn(\"h-10\", \"w-10\", getSpacingClass(\"none\", \"p\")),\n },\n {\n variant: \"iconOnly\",\n size: \"lg\",\n class: cn(\"h-12\", \"w-12\", getSpacingClass(\"none\", \"p\")),\n },\n // Link variant zeroes the size's padding via compoundVariants so\n // the override runs AFTER the size block's `px-N`/`py-N` and\n // twMerge picks the zero value (`cn` joins variant before\n // compound). The size's typography and gap survive — the link's\n // text scales with size and icons still get gap-N when present.\n // Issue #156.\n {\n variant: \"link\",\n size: \"sm\",\n class: cn(getSpacingClass(\"none\", \"px\"), getSpacingClass(\"none\", \"py\")),\n },\n {\n variant: \"link\",\n size: \"md\",\n class: cn(getSpacingClass(\"none\", \"px\"), getSpacingClass(\"none\", \"py\")),\n },\n {\n variant: \"link\",\n size: \"lg\",\n class: cn(getSpacingClass(\"none\", \"px\"), getSpacingClass(\"none\", \"py\")),\n },\n ],\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n },\n);\n\n/**\n * Icon Wrapper Component\n * Handles icon spacing and alignment consistently\n */\nfunction IconWrapper({\n children,\n position,\n}: {\n children: ReactNode;\n position: \"left\" | \"right\";\n}) {\n if (!children) return null;\n\n return (\n <span\n className={`inline-flex items-center ${position === \"left\" ? getSpacingClass(\"none\", \"mr\") : getSpacingClass(\"none\", \"ml\")}`}\n >\n {children}\n </span>\n );\n}\n\n/**\n * Button Component\n *\n * A styled button with variants, sizes, and loading states.\n *\n * Polymorphism — two APIs:\n * - `as` (legacy): swap the root element type. `<Button as={Link} href=\"…\">`.\n * - `asChild` (recommended): project Button's styling onto the single\n * child element. Idiomatic Radix Slot pattern, preserves the child's\n * own props and TS type (e.g. `<Link href prefetch>`). When `asChild`\n * is true, `as` is ignored.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Button variant=\"primary\" size=\"md\" onClick={handleClick}>Click me</Button>\n *\n * // With icons\n * <Button leftIcon={<Icon />} rightIcon={<Icon />}>Action</Button>\n *\n * // Loading state\n * <Button isLoading loadingText=\"Saving...\">Save</Button>\n *\n * // Polymorphic via asChild (preserves Next Link's TS type and native props)\n * <Button asChild variant=\"primary\">\n * <Link href=\"/page\" prefetch>Open</Link>\n * </Button>\n *\n * // Polymorphic via legacy `as`\n * <Button as=\"a\" href=\"/page\">Navigate</Button>\n * ```\n */\nconst Button = memo(\n forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n loadingText,\n loadingIcon,\n leftIcon,\n rightIcon,\n fullWidth = false,\n asChild = false,\n as,\n className = \"\",\n disabled = false,\n children,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref,\n ) {\n // asChild wins over `as`. Warn in dev so the precedence is observable\n // instead of being a silent override. Production builds strip this branch.\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\" &&\n asChild &&\n as !== undefined &&\n as !== \"button\"\n ) {\n console.warn(\n \"[Button] `as` is ignored when `asChild` is true; the child element is used as the root. Drop one of the two props to silence this warning.\",\n );\n }\n\n const Component: ElementType = asChild ? Slot : (as ?? \"button\");\n\n // Memoize classes computation\n const classes = useMemo(\n () =>\n cn(\n buttonVariants({\n variant,\n size,\n }),\n fullWidth && \"w-full\",\n className,\n ),\n [variant, size, fullWidth, className],\n );\n\n // Memoize icon-only check\n const isIconOnly = useMemo(\n () => variant === \"iconOnly\" || (!children && (leftIcon || rightIcon)),\n [variant, children, leftIcon, rightIcon],\n );\n\n // Memoize aria label\n const finalAriaLabel = useMemo(\n () =>\n isIconOnly && !ariaLabel && !children\n ? \"Button\" // Fallback, but should be provided\n : ariaLabel,\n [isIconOnly, ariaLabel, children],\n );\n\n // Memoize spinner variant computation\n const spinnerVariant = useMemo((): \"primary\" | \"secondary\" | \"neutral\" => {\n if (variant === \"error\") return \"primary\"; // Red buttons use primary spinner (white)\n if (variant === \"primary\" || variant === \"secondary\") return \"neutral\"; // Colored buttons use neutral spinner\n return \"primary\"; // Default\n }, [variant]);\n\n // Memoize spinner size\n const spinnerSize = useMemo(\n () => (size === \"sm\" ? \"sm\" : size === \"lg\" ? \"lg\" : \"md\"),\n [size],\n );\n\n // Memoize loading icon\n const displayLoadingIcon = useMemo(\n () =>\n loadingIcon || <Spinner size={spinnerSize} variant={spinnerVariant} />,\n [loadingIcon, spinnerSize, spinnerVariant],\n );\n\n // Build button props (spread props at the end to allow overrides).\n // `type=\"button\"` default applies only when rendering an intrinsic\n // <button>. asChild and `as` (custom) projections leave it off so we\n // don't paint a meaningless `type` attribute onto <a> / <Link>.\n const defaultType =\n !asChild && (as === undefined || as === \"button\") && !props.type\n ? \"button\"\n : undefined;\n const buttonProps = {\n className: classes,\n disabled: disabled || isLoading,\n \"aria-busy\": isLoading,\n \"aria-label\": finalAriaLabel,\n \"aria-disabled\": disabled || isLoading,\n ...(defaultType ? { type: defaultType } : {}),\n ...props,\n };\n\n // asChild path: render Slot with the icons and Slottable as direct\n // sibling children (NOT wrapped in a React.Fragment). Slot's\n // children-processing inspects each direct child for Slottable; if\n // the children are wrapped in a Fragment, Slot's SlotClone merges\n // the projected props into the Fragment itself (a silent no-op for\n // className / aria / ref), and nothing reaches the consumer's\n // element. Hence the two distinct branches below: same content\n // shape, different host element, different child layout.\n if (asChild) {\n return (\n <Component ref={ref} {...buttonProps}>\n {leftIcon && <IconWrapper position=\"left\">{leftIcon}</IconWrapper>}\n <Slottable>{children}</Slottable>\n {rightIcon && <IconWrapper position=\"right\">{rightIcon}</IconWrapper>}\n </Component>\n );\n }\n\n return (\n <Component ref={ref} {...buttonProps}>\n {isLoading ? (\n <>\n {displayLoadingIcon}\n {loadingText && (\n <span className={getSpacingClass(\"sm\", \"ml\")}>{loadingText}</span>\n )}\n {!loadingText && children && (\n <span className={`${getSpacingClass(\"sm\", \"ml\")} opacity-0`}>\n {children}\n </span>\n )}\n </>\n ) : (\n <>\n {leftIcon && <IconWrapper position=\"left\">{leftIcon}</IconWrapper>}\n {children}\n {rightIcon && (\n <IconWrapper position=\"right\">{rightIcon}</IconWrapper>\n )}\n </>\n )}\n </Component>\n );\n }),\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\nexport { Button };\n"],"names":["buttonVariants","cva","cn","getTypographyClasses","getRadiusClass","getSpacingClass","getTypographySize","IconWrapper","children","position","jsx","Button","memo","forwardRef","_a","ref","_b","variant","size","isLoading","loadingText","loadingIcon","leftIcon","rightIcon","fullWidth","asChild","as","className","disabled","ariaLabel","props","__objRest","Component","Slot","classes","useMemo","isIconOnly","finalAriaLabel","spinnerVariant","spinnerSize","displayLoadingIcon","Spinner","defaultType","buttonProps","__spreadValues","jsxs","__spreadProps","Slottable","Fragment"],"mappings":"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"}