@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.
- package/README.md +4 -2
- package/dist/granular/index.js +445 -0
- package/dist/granular/index.js.map +1 -0
- package/dist/granular/ui/components/Accordion/Accordion.js +105 -0
- package/dist/granular/ui/components/Accordion/Accordion.js.map +1 -0
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js +133 -0
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +119 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +42 -0
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -0
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js +100 -0
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/granular/ui/components/Card/Card.js +113 -0
- package/dist/granular/ui/components/Card/Card.js.map +1 -0
- package/dist/granular/ui/components/Card/CardActions.js +51 -0
- package/dist/granular/ui/components/Card/CardActions.js.map +1 -0
- package/dist/granular/ui/components/Card/CardBody.js +32 -0
- package/dist/granular/ui/components/Card/CardBody.js.map +1 -0
- package/dist/granular/ui/components/Card/CardHeader.js +47 -0
- package/dist/granular/ui/components/Card/CardHeader.js.map +1 -0
- package/dist/granular/ui/components/Card/CardSubtitle.js +38 -0
- package/dist/granular/ui/components/Card/CardSubtitle.js.map +1 -0
- package/dist/granular/ui/components/Card/CardTitle.js +61 -0
- package/dist/granular/ui/components/Card/CardTitle.js.map +1 -0
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js +250 -0
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js +274 -0
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -0
- package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js +37 -0
- package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js.map +1 -0
- package/dist/granular/ui/components/DataGrid/DataGrid.js +155 -0
- package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -0
- package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js +113 -0
- package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePicker.js +126 -0
- package/dist/granular/ui/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +294 -0
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerContext.js +16 -0
- package/dist/granular/ui/components/DatePicker/DatePickerContext.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerInput.js +119 -0
- package/dist/granular/ui/components/DatePicker/DatePickerInput.js.map +1 -0
- package/dist/granular/ui/components/DatePicker/DatePickerProvider.js +47 -0
- package/dist/granular/ui/components/DatePicker/DatePickerProvider.js.map +1 -0
- package/dist/granular/ui/components/Dialog/AlertDialog.js +48 -0
- package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -0
- package/dist/granular/ui/components/Dialog/Dialog.js +36 -0
- package/dist/granular/ui/components/Dialog/Dialog.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogClose.js +34 -0
- package/dist/granular/ui/components/Dialog/DialogClose.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogContent.js +114 -0
- package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogDescription.js +51 -0
- package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogFooter.js +45 -0
- package/dist/granular/ui/components/Dialog/DialogFooter.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogHeader.js +45 -0
- package/dist/granular/ui/components/Dialog/DialogHeader.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogTitle.js +53 -0
- package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -0
- package/dist/granular/ui/components/Dialog/DialogTrigger.js +28 -0
- package/dist/granular/ui/components/Dialog/DialogTrigger.js.map +1 -0
- package/dist/granular/ui/components/Drawer/Drawer.js +47 -0
- package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerContent.js +140 -0
- package/dist/granular/ui/components/Drawer/DrawerContent.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerContext.js +21 -0
- package/dist/granular/ui/components/Drawer/DrawerContext.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerFooter.js +53 -0
- package/dist/granular/ui/components/Drawer/DrawerFooter.js.map +1 -0
- package/dist/granular/ui/components/Drawer/DrawerHeader.js +50 -0
- package/dist/granular/ui/components/Drawer/DrawerHeader.js.map +1 -0
- package/dist/granular/ui/components/Dropdown/Dropdown.js +243 -0
- package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/granular/ui/components/EmptyState/EmptyState.js +102 -0
- package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -0
- package/dist/granular/ui/components/FileUpload/FileUpload.js +342 -0
- package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -0
- package/dist/granular/ui/components/Form/Form.js +184 -0
- package/dist/granular/ui/components/Form/Form.js.map +1 -0
- package/dist/granular/ui/components/Form/FormContext.js +19 -0
- package/dist/granular/ui/components/Form/FormContext.js.map +1 -0
- package/dist/granular/ui/components/Form/FormField.js +66 -0
- package/dist/granular/ui/components/Form/FormField.js.map +1 -0
- package/dist/granular/ui/components/Form/FormProvider.js +17 -0
- package/dist/granular/ui/components/Form/FormProvider.js.map +1 -0
- package/dist/granular/ui/components/Form/useFormFieldArray.js +29 -0
- package/dist/granular/ui/components/Form/useFormFieldArray.js.map +1 -0
- package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js +121 -0
- package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js.map +1 -0
- package/dist/granular/ui/components/Header/Header.js +98 -0
- package/dist/granular/ui/components/Header/Header.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderActions.js +21 -0
- package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js +31 -0
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderLogo.js +50 -0
- package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js +38 -0
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -0
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js +27 -0
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -0
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js +49 -0
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -0
- package/dist/granular/ui/components/LoginBox/LoginBox.js +84 -0
- package/dist/granular/ui/components/LoginBox/LoginBox.js.map +1 -0
- package/dist/granular/ui/components/Menu/Menu.js +45 -0
- package/dist/granular/ui/components/Menu/Menu.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuContent.js +94 -0
- package/dist/granular/ui/components/Menu/MenuContent.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuContext.js +21 -0
- package/dist/granular/ui/components/Menu/MenuContext.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuItem.js +93 -0
- package/dist/granular/ui/components/Menu/MenuItem.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuSeparator.js +46 -0
- package/dist/granular/ui/components/Menu/MenuSeparator.js.map +1 -0
- package/dist/granular/ui/components/Menu/MenuTrigger.js +71 -0
- package/dist/granular/ui/components/Menu/MenuTrigger.js.map +1 -0
- package/dist/granular/ui/components/Modal/Modal.js +171 -0
- package/dist/granular/ui/components/Modal/Modal.js.map +1 -0
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js +193 -0
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -0
- package/dist/granular/ui/components/Navigation/Navigation.js +141 -0
- package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -0
- package/dist/granular/ui/components/PageHeader/PageHeader.js +95 -0
- package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -0
- package/dist/granular/ui/components/Pagination/Pagination.js +156 -0
- package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -0
- package/dist/granular/ui/components/Popover/Popover.js +171 -0
- package/dist/granular/ui/components/Popover/Popover.js.map +1 -0
- package/dist/granular/ui/components/Rating/Rating.js +110 -0
- package/dist/granular/ui/components/Rating/Rating.js.map +1 -0
- package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js +120 -0
- package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js.map +1 -0
- package/dist/granular/ui/components/SearchInput/SearchInput.js +103 -0
- package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/SideNavbar.js +143 -0
- package/dist/granular/ui/components/SideNavbar/SideNavbar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js +173 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +87 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +242 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js +66 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js +108 -0
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js +63 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +113 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js +150 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js +197 -0
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js +108 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js +71 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js +64 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js +141 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js +90 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js +12 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js +13 -0
- package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js +20 -0
- package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js +37 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js +20 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js +28 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js +19 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js +20 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js +22 -0
- package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js +43 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js +59 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js +34 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResize.js +58 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResize.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js +35 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js +21 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js +19 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js +21 -0
- package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js +61 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js +82 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +165 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js +34 -0
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js +28 -0
- package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js +60 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js.map +1 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js +19 -0
- package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js.map +1 -0
- package/dist/granular/ui/components/Stat/Stat.js +84 -0
- package/dist/granular/ui/components/Stat/Stat.js.map +1 -0
- package/dist/granular/ui/components/Stat/StatGroup.js +61 -0
- package/dist/granular/ui/components/Stat/StatGroup.js.map +1 -0
- package/dist/granular/ui/components/Stepper/Stepper.js +248 -0
- package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -0
- package/dist/granular/ui/components/Table/Table.js +162 -0
- package/dist/granular/ui/components/Table/Table.js.map +1 -0
- package/dist/granular/ui/components/Table/TableActions/TableActions.js +67 -0
- package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -0
- package/dist/granular/ui/components/Table/TableActions.js +44 -0
- package/dist/granular/ui/components/Table/TableActions.js.map +1 -0
- package/dist/granular/ui/components/Table/TableBody.js +134 -0
- package/dist/granular/ui/components/Table/TableBody.js.map +1 -0
- package/dist/granular/ui/components/Table/TableCell.js +40 -0
- package/dist/granular/ui/components/Table/TableCell.js.map +1 -0
- package/dist/granular/ui/components/Table/TableContext.js +19 -0
- package/dist/granular/ui/components/Table/TableContext.js.map +1 -0
- package/dist/granular/ui/components/Table/TableEmptyState.js +62 -0
- package/dist/granular/ui/components/Table/TableEmptyState.js.map +1 -0
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +189 -0
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -0
- package/dist/granular/ui/components/Table/TableFilters.js +48 -0
- package/dist/granular/ui/components/Table/TableFilters.js.map +1 -0
- package/dist/granular/ui/components/Table/TableHeader.js +45 -0
- package/dist/granular/ui/components/Table/TableHeader.js.map +1 -0
- package/dist/granular/ui/components/Table/TableHeaderCell.js +117 -0
- package/dist/granular/ui/components/Table/TableHeaderCell.js.map +1 -0
- package/dist/granular/ui/components/Table/TableHeaderRow.js +89 -0
- package/dist/granular/ui/components/Table/TableHeaderRow.js.map +1 -0
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js +216 -0
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -0
- package/dist/granular/ui/components/Table/TablePagination.js +56 -0
- package/dist/granular/ui/components/Table/TablePagination.js.map +1 -0
- package/dist/granular/ui/components/Table/TableProvider.js +244 -0
- package/dist/granular/ui/components/Table/TableProvider.js.map +1 -0
- package/dist/granular/ui/components/Table/TableRow.js +95 -0
- package/dist/granular/ui/components/Table/TableRow.js.map +1 -0
- package/dist/granular/ui/components/Table/useColumnResizing.js +71 -0
- package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -0
- package/dist/granular/ui/components/Table/useVirtualScrolling.js +50 -0
- package/dist/granular/ui/components/Table/useVirtualScrolling.js.map +1 -0
- package/dist/granular/ui/components/Tabs/Tabs.js +39 -0
- package/dist/granular/ui/components/Tabs/Tabs.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsContent.js +59 -0
- package/dist/granular/ui/components/Tabs/TabsContent.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsContext.js +18 -0
- package/dist/granular/ui/components/Tabs/TabsContext.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsList.js +84 -0
- package/dist/granular/ui/components/Tabs/TabsList.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsProvider.js +31 -0
- package/dist/granular/ui/components/Tabs/TabsProvider.js.map +1 -0
- package/dist/granular/ui/components/Tabs/TabsTrigger.js +103 -0
- package/dist/granular/ui/components/Tabs/TabsTrigger.js.map +1 -0
- package/dist/granular/ui/components/TimePicker/TimePicker.js +216 -0
- package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -0
- package/dist/granular/ui/components/Timeline/Timeline.js +152 -0
- package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -0
- package/dist/granular/ui/components/Toast/Toast.js +159 -0
- package/dist/granular/ui/components/Toast/Toast.js.map +1 -0
- package/dist/granular/ui/components/Toast/ToastContainer.js +41 -0
- package/dist/granular/ui/components/Toast/ToastContainer.js.map +1 -0
- package/dist/granular/ui/components/Toast/useToast.js +64 -0
- package/dist/granular/ui/components/Toast/useToast.js.map +1 -0
- package/dist/granular/ui/hooks/createGenericContext.js +27 -0
- package/dist/granular/ui/hooks/createGenericContext.js.map +1 -0
- package/dist/granular/ui/hooks/focusable.js +14 -0
- package/dist/granular/ui/hooks/focusable.js.map +1 -0
- package/dist/granular/ui/hooks/useAutoFocus.js +23 -0
- package/dist/granular/ui/hooks/useAutoFocus.js.map +1 -0
- package/dist/granular/ui/hooks/useCollapsible.js +37 -0
- package/dist/granular/ui/hooks/useCollapsible.js.map +1 -0
- package/dist/granular/ui/hooks/useFocusRestore.js +20 -0
- package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -0
- package/dist/granular/ui/hooks/useFocusTrap.js +31 -0
- package/dist/granular/ui/hooks/useFocusTrap.js.map +1 -0
- package/dist/granular/ui/hooks/useScrollSpy.js +23 -0
- package/dist/granular/ui/hooks/useScrollSpy.js.map +1 -0
- package/dist/granular/ui/layouts/Container/Container.js +73 -0
- package/dist/granular/ui/layouts/Container/Container.js.map +1 -0
- package/dist/granular/ui/layouts/Stack/Stack.js +79 -0
- package/dist/granular/ui/layouts/Stack/Stack.js.map +1 -0
- package/dist/granular/ui/primitives/Avatar/Avatar.js +122 -0
- package/dist/granular/ui/primitives/Avatar/Avatar.js.map +1 -0
- package/dist/granular/ui/primitives/Avatar/AvatarGroup.js +97 -0
- package/dist/granular/ui/primitives/Avatar/AvatarGroup.js.map +1 -0
- package/dist/granular/ui/primitives/Badge/Badge.js +212 -0
- package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -0
- package/dist/granular/ui/primitives/Button/Button.js +288 -0
- package/dist/granular/ui/primitives/Button/Button.js.map +1 -0
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js +129 -0
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -0
- package/dist/granular/ui/primitives/Chip/Chip.js +206 -0
- package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -0
- package/dist/granular/ui/primitives/Collapsible/Collapsible.js +115 -0
- package/dist/granular/ui/primitives/Collapsible/Collapsible.js.map +1 -0
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js +54 -0
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -0
- package/dist/granular/ui/primitives/Info/Info.js +57 -0
- package/dist/granular/ui/primitives/Info/Info.js.map +1 -0
- package/dist/granular/ui/primitives/Input/Input.js +351 -0
- package/dist/granular/ui/primitives/Input/Input.js.map +1 -0
- package/dist/granular/ui/primitives/Label/Label.js +61 -0
- package/dist/granular/ui/primitives/Label/Label.js.map +1 -0
- package/dist/granular/ui/primitives/NavLink/NavLink.js +229 -0
- package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -0
- package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js +15 -0
- package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js.map +1 -0
- package/dist/granular/ui/primitives/Progress/Progress.js +182 -0
- package/dist/granular/ui/primitives/Progress/Progress.js.map +1 -0
- package/dist/granular/ui/primitives/Radio/Radio.js +118 -0
- package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -0
- package/dist/granular/ui/primitives/Select/Select.js +210 -0
- package/dist/granular/ui/primitives/Select/Select.js.map +1 -0
- package/dist/granular/ui/primitives/Separator/Separator.js +69 -0
- package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -0
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js +87 -0
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -0
- package/dist/granular/ui/primitives/Slider/Slider.js +291 -0
- package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -0
- package/dist/granular/ui/primitives/Spinner/Spinner.js +95 -0
- package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -0
- package/dist/granular/ui/primitives/Switch/Switch.js +212 -0
- package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -0
- package/dist/granular/ui/primitives/Text/Text.js +118 -0
- package/dist/granular/ui/primitives/Text/Text.js.map +1 -0
- package/dist/granular/ui/primitives/Textarea/Textarea.js +129 -0
- package/dist/granular/ui/primitives/Textarea/Textarea.js.map +1 -0
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js +227 -0
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -0
- package/dist/granular/ui/providers/AppProvider.js +50 -0
- package/dist/granular/ui/providers/AppProvider.js.map +1 -0
- package/dist/granular/ui/providers/ConfigProvider.js +95 -0
- package/dist/granular/ui/providers/ConfigProvider.js.map +1 -0
- package/dist/granular/ui/providers/DialogContext.js +20 -0
- package/dist/granular/ui/providers/DialogContext.js.map +1 -0
- package/dist/granular/ui/providers/DialogProvider.js +32 -0
- package/dist/granular/ui/providers/DialogProvider.js.map +1 -0
- package/dist/granular/ui/providers/ThemeProvider.js +56 -0
- package/dist/granular/ui/providers/ThemeProvider.js.map +1 -0
- package/dist/granular/ui/providers/ToastContext.js +20 -0
- package/dist/granular/ui/providers/ToastContext.js.map +1 -0
- package/dist/granular/ui/providers/ToastProvider.js +47 -0
- package/dist/granular/ui/providers/ToastProvider.js.map +1 -0
- package/dist/granular/ui/providers/providers-bundle.js +23 -0
- package/dist/granular/ui/providers/providers-bundle.js.map +1 -0
- package/dist/granular/ui/tokens/animations.js +106 -0
- package/dist/granular/ui/tokens/animations.js.map +1 -0
- package/dist/granular/ui/tokens/borders.js +54 -0
- package/dist/granular/ui/tokens/borders.js.map +1 -0
- package/dist/granular/ui/tokens/breakpoints.js +43 -0
- package/dist/granular/ui/tokens/breakpoints.js.map +1 -0
- package/dist/granular/ui/tokens/colors/brand.js +67 -0
- package/dist/granular/ui/tokens/colors/brand.js.map +1 -0
- package/dist/granular/ui/tokens/colors/index.js +25 -0
- package/dist/granular/ui/tokens/colors/index.js.map +1 -0
- package/dist/granular/ui/tokens/colors/primitives.js +320 -0
- package/dist/granular/ui/tokens/colors/primitives.js.map +1 -0
- package/dist/granular/ui/tokens/colors/semantic.js +212 -0
- package/dist/granular/ui/tokens/colors/semantic.js.map +1 -0
- package/dist/granular/ui/tokens/colors/types.js +18 -0
- package/dist/granular/ui/tokens/colors/types.js.map +1 -0
- package/dist/granular/ui/tokens/colors/utils.js +131 -0
- package/dist/granular/ui/tokens/colors/utils.js.map +1 -0
- package/dist/granular/ui/tokens/opacity.js +59 -0
- package/dist/granular/ui/tokens/opacity.js.map +1 -0
- package/dist/granular/ui/tokens/radius.js +76 -0
- package/dist/granular/ui/tokens/radius.js.map +1 -0
- package/dist/granular/ui/tokens/shadows.js +63 -0
- package/dist/granular/ui/tokens/shadows.js.map +1 -0
- package/dist/granular/ui/tokens/sidebar.js +92 -0
- package/dist/granular/ui/tokens/sidebar.js.map +1 -0
- package/dist/granular/ui/tokens/spacing.js +143 -0
- package/dist/granular/ui/tokens/spacing.js.map +1 -0
- package/dist/granular/ui/tokens/switch.js +51 -0
- package/dist/granular/ui/tokens/switch.js.map +1 -0
- package/dist/granular/ui/tokens/typography.js +146 -0
- package/dist/granular/ui/tokens/typography.js.map +1 -0
- package/dist/granular/ui/tokens/z-index.js +79 -0
- package/dist/granular/ui/tokens/z-index.js.map +1 -0
- package/dist/granular/ui/utils/cn.js +10 -0
- package/dist/granular/ui/utils/cn.js.map +1 -0
- package/dist/granular/ui/utils/cva.js +14 -0
- package/dist/granular/ui/utils/cva.js.map +1 -0
- package/dist/granular/ui/utils/mergeRefs.js +11 -0
- package/dist/granular/ui/utils/mergeRefs.js.map +1 -0
- package/dist/granular/vite.svg +1 -0
- package/dist/hooks/index.cjs +2 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.js +23 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +44 -70
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1900 -1885
- package/dist/index.js.map +1 -1
- package/dist/react-design-system.css +1 -1
- package/dist/server/index.cjs +23 -23
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +863 -1180
- package/dist/server/index.js.map +1 -1
- package/dist/ui/components/Accordion/Accordion.d.ts +9 -1
- package/dist/ui/hooks-entry.d.ts +2 -0
- package/dist/ui/utils/tailwind-safelist.d.ts +3 -1
- package/package.json +24 -13
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var J = Object.defineProperty, L = Object.defineProperties;
|
|
3
|
+
var M = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var j = Object.getOwnPropertySymbols;
|
|
5
|
+
var Q = Object.prototype.hasOwnProperty, U = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var q = (i, s, r) => s in i ? J(i, s, { enumerable: !0, configurable: !0, writable: !0, value: r }) : i[s] = r, K = (i, s) => {
|
|
7
|
+
for (var r in s || (s = {}))
|
|
8
|
+
Q.call(s, r) && q(i, r, s[r]);
|
|
9
|
+
if (j)
|
|
10
|
+
for (var r of j(s))
|
|
11
|
+
U.call(s, r) && q(i, r, s[r]);
|
|
12
|
+
return i;
|
|
13
|
+
}, W = (i, s) => L(i, M(s));
|
|
14
|
+
import { jsx as X } from "react/jsx-runtime";
|
|
15
|
+
import { useRef as Y, useState as B, useCallback as f, useEffect as F, useMemo as Z } from "react";
|
|
16
|
+
import { SideNavbarStateContext as _ } from "../contexts/SideNavbarStateContext.js";
|
|
17
|
+
import { useSideNavbarThemeRequired as C } from "../contexts/SideNavbarThemeContext.js";
|
|
18
|
+
import { useSideNavbarConfigRequired as tt } from "../contexts/SideNavbarConfigContext.js";
|
|
19
|
+
import { useResize as et } from "../hooks/useResize.js";
|
|
20
|
+
import { useResponsiveSidebar as rt } from "../hooks/useResponsiveSidebar.js";
|
|
21
|
+
import { useFocusManagement as st } from "../hooks/useFocusManagement.js";
|
|
22
|
+
import { useKeyboardShortcut as it } from "../hooks/useKeyboardShortcut.js";
|
|
23
|
+
import { parseKeyboardShortcut as ot } from "../utils/parseKeyboardShortcut.js";
|
|
24
|
+
import { parseWidthToPixels as at } from "../utils/parseWidth.js";
|
|
25
|
+
function ht({
|
|
26
|
+
children: i,
|
|
27
|
+
defaultCollapsed: s = !1,
|
|
28
|
+
collapsed: r,
|
|
29
|
+
onCollapseChange: d,
|
|
30
|
+
onWidthChange: S,
|
|
31
|
+
onMobileChange: y,
|
|
32
|
+
exclusiveGroups: R = !1
|
|
33
|
+
}) {
|
|
34
|
+
const O = C(), t = tt(), v = Y(null), a = r !== void 0, V = () => {
|
|
35
|
+
if (a) return r;
|
|
36
|
+
if (t.storageKey && t.persistState && typeof window != "undefined") {
|
|
37
|
+
const e = localStorage.getItem(`${t.storageKey}-collapsed`);
|
|
38
|
+
if (e !== null)
|
|
39
|
+
return e === "true";
|
|
40
|
+
}
|
|
41
|
+
return s;
|
|
42
|
+
}, A = () => {
|
|
43
|
+
if (t.storageKey && t.persistWidth && typeof window != "undefined") {
|
|
44
|
+
const e = localStorage.getItem(`${t.storageKey}-width`);
|
|
45
|
+
if (e !== null) {
|
|
46
|
+
const o = parseInt(e, 10);
|
|
47
|
+
if (!isNaN(o)) return o;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return at(O.contentWidth);
|
|
51
|
+
}, [n, b] = B(
|
|
52
|
+
V
|
|
53
|
+
), [k, g] = B({}), { isMobile: u } = rt({
|
|
54
|
+
mobileBreakpoint: t.mobileBreakpoint,
|
|
55
|
+
onMobileChange: (e) => {
|
|
56
|
+
y == null || y(e), e && t.mobileVariant === "collapse" && !a && b(!0);
|
|
57
|
+
},
|
|
58
|
+
enabled: t.responsive
|
|
59
|
+
}), {
|
|
60
|
+
width: z,
|
|
61
|
+
isResizing: N,
|
|
62
|
+
startResize: x,
|
|
63
|
+
setWidth: I
|
|
64
|
+
} = et({
|
|
65
|
+
initialWidth: A(),
|
|
66
|
+
minWidth: t.minWidth,
|
|
67
|
+
maxWidth: t.maxWidth,
|
|
68
|
+
snapPoints: t.snapPoints,
|
|
69
|
+
onWidthChange: (e) => {
|
|
70
|
+
S == null || S(e), t.storageKey && t.persistWidth && typeof window != "undefined" && localStorage.setItem(`${t.storageKey}-width`, String(e));
|
|
71
|
+
},
|
|
72
|
+
enabled: t.resizable && !u
|
|
73
|
+
});
|
|
74
|
+
st({
|
|
75
|
+
isActive: u && t.mobileVariant === "overlay" && !n,
|
|
76
|
+
containerRef: v,
|
|
77
|
+
restoreFocus: !0
|
|
78
|
+
});
|
|
79
|
+
const m = a ? r : n, l = f(
|
|
80
|
+
(e) => {
|
|
81
|
+
a || b(e), d == null || d(e);
|
|
82
|
+
},
|
|
83
|
+
[a, d]
|
|
84
|
+
), h = f(() => {
|
|
85
|
+
l(!m);
|
|
86
|
+
}, [m, l]), c = ot(t.keyboardShortcut);
|
|
87
|
+
it({
|
|
88
|
+
key: c.key,
|
|
89
|
+
ctrl: c.ctrl,
|
|
90
|
+
shift: c.shift,
|
|
91
|
+
alt: c.alt,
|
|
92
|
+
meta: c.meta,
|
|
93
|
+
onTrigger: h,
|
|
94
|
+
enabled: t.enableKeyboardShortcut
|
|
95
|
+
});
|
|
96
|
+
const P = f(
|
|
97
|
+
(e) => {
|
|
98
|
+
I(e);
|
|
99
|
+
},
|
|
100
|
+
[I]
|
|
101
|
+
), $ = f(
|
|
102
|
+
(e) => {
|
|
103
|
+
g(R ? (o) => {
|
|
104
|
+
const H = o[e] === !1, w = {}, T = /* @__PURE__ */ new Set([...Object.keys(o), e]);
|
|
105
|
+
return H ? T.forEach((p) => {
|
|
106
|
+
w[p] = !0;
|
|
107
|
+
}) : T.forEach((p) => {
|
|
108
|
+
w[p] = p !== e;
|
|
109
|
+
}), w;
|
|
110
|
+
} : (o) => W(K({}, o), {
|
|
111
|
+
[e]: !o[e]
|
|
112
|
+
}));
|
|
113
|
+
},
|
|
114
|
+
[R]
|
|
115
|
+
), E = f(
|
|
116
|
+
(e, o) => {
|
|
117
|
+
g((G) => W(K({}, G), {
|
|
118
|
+
[e]: o
|
|
119
|
+
}));
|
|
120
|
+
},
|
|
121
|
+
[]
|
|
122
|
+
);
|
|
123
|
+
F(() => {
|
|
124
|
+
a && r !== n && b(r);
|
|
125
|
+
}, [a, r, n]), F(() => {
|
|
126
|
+
t.storageKey && t.persistState && typeof window != "undefined" && !a && localStorage.setItem(
|
|
127
|
+
`${t.storageKey}-collapsed`,
|
|
128
|
+
String(n)
|
|
129
|
+
);
|
|
130
|
+
}, [t.storageKey, t.persistState, n, a]);
|
|
131
|
+
const D = Z(
|
|
132
|
+
() => ({
|
|
133
|
+
collapsed: m,
|
|
134
|
+
toggle: h,
|
|
135
|
+
setCollapsed: l,
|
|
136
|
+
currentWidth: z,
|
|
137
|
+
setWidth: P,
|
|
138
|
+
isMobile: u,
|
|
139
|
+
isResizing: N,
|
|
140
|
+
startResize: x,
|
|
141
|
+
groupStates: k,
|
|
142
|
+
toggleGroup: $,
|
|
143
|
+
setGroupCollapsed: E,
|
|
144
|
+
sidebarRef: v
|
|
145
|
+
}),
|
|
146
|
+
[
|
|
147
|
+
m,
|
|
148
|
+
h,
|
|
149
|
+
l,
|
|
150
|
+
z,
|
|
151
|
+
P,
|
|
152
|
+
u,
|
|
153
|
+
N,
|
|
154
|
+
x,
|
|
155
|
+
k,
|
|
156
|
+
$,
|
|
157
|
+
E
|
|
158
|
+
]
|
|
159
|
+
);
|
|
160
|
+
return /* @__PURE__ */ X(_.Provider, { value: D, children: i });
|
|
161
|
+
}
|
|
162
|
+
export {
|
|
163
|
+
ht as SideNavbarStateProvider
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=SideNavbarStateProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SideNavbarStateProvider.js","sources":["../../../../../../src/ui/components/SideNavbar/providers/SideNavbarStateProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport { SideNavbarStateContext } from \"../contexts/SideNavbarStateContext\";\nimport { useSideNavbarThemeRequired } from \"../contexts/SideNavbarThemeContext\";\nimport { useSideNavbarConfigRequired } from \"../contexts/SideNavbarConfigContext\";\nimport { useResize } from \"../hooks/useResize\";\nimport { useResponsiveSidebar } from \"../hooks/useResponsiveSidebar\";\nimport { useFocusManagement } from \"../hooks/useFocusManagement\";\nimport { useKeyboardShortcut } from \"../hooks/useKeyboardShortcut\";\nimport { parseWidthToPixels, parseKeyboardShortcut } from \"../utils\";\nimport type {\n SideNavbarStateProviderProps,\n SideNavbarStateContextValue,\n} from \"../types\";\n\n/**\n * State Provider for SideNavbar\n *\n * Provides runtime state management for the sidebar.\n * Manages collapse state, resize, responsive behavior, and group states.\n *\n * Must be nested inside SideNavbarThemeProvider and SideNavbarConfigProvider.\n *\n * @example\n * ```tsx\n * <SideNavbarThemeProvider>\n * <SideNavbarConfigProvider>\n * <SideNavbarStateProvider defaultCollapsed onCollapseChange={handleChange}>\n * <SideNavbarRoot>...</SideNavbarRoot>\n * </SideNavbarStateProvider>\n * </SideNavbarConfigProvider>\n * </SideNavbarThemeProvider>\n * ```\n */\nexport function SideNavbarStateProvider({\n children,\n defaultCollapsed = false,\n collapsed: controlledCollapsed,\n onCollapseChange,\n onWidthChange,\n onMobileChange,\n exclusiveGroups = false,\n}: SideNavbarStateProviderProps) {\n const theme = useSideNavbarThemeRequired();\n const config = useSideNavbarConfigRequired();\n const sidebarRef = useRef<HTMLElement | null>(null);\n\n // Determine if component is controlled\n const isControlled = controlledCollapsed !== undefined;\n\n // Initialize collapsed state from storage or default\n const getInitialCollapsedState = (): boolean => {\n if (isControlled) return controlledCollapsed;\n if (\n config.storageKey &&\n config.persistState &&\n typeof window !== \"undefined\"\n ) {\n const stored = localStorage.getItem(`${config.storageKey}-collapsed`);\n if (stored !== null) {\n return stored === \"true\";\n }\n }\n return defaultCollapsed;\n };\n\n // Initialize width state from storage or default\n const getInitialWidth = (): number => {\n if (\n config.storageKey &&\n config.persistWidth &&\n typeof window !== \"undefined\"\n ) {\n const stored = localStorage.getItem(`${config.storageKey}-width`);\n if (stored !== null) {\n const parsedWidth = parseInt(stored, 10);\n if (!isNaN(parsedWidth)) return parsedWidth;\n }\n }\n return parseWidthToPixels(theme.contentWidth);\n };\n\n const [internalCollapsed, setInternalCollapsed] = useState<boolean>(\n getInitialCollapsedState,\n );\n const [groupStates, setGroupStates] = useState<Record<string, boolean>>({});\n\n // Responsive sidebar\n const { isMobile } = useResponsiveSidebar({\n mobileBreakpoint: config.mobileBreakpoint,\n onMobileChange: (mobile) => {\n onMobileChange?.(mobile);\n // Auto-collapse on mobile if using collapse variant\n if (mobile && config.mobileVariant === \"collapse\" && !isControlled) {\n setInternalCollapsed(true);\n }\n },\n enabled: config.responsive,\n });\n\n // Resize functionality\n const {\n width: resizeWidth,\n isResizing,\n startResize,\n setWidth: setResizeWidth,\n } = useResize({\n initialWidth: getInitialWidth(),\n minWidth: config.minWidth,\n maxWidth: config.maxWidth,\n snapPoints: config.snapPoints,\n onWidthChange: (newWidth) => {\n onWidthChange?.(newWidth);\n // Persist width if enabled\n if (\n config.storageKey &&\n config.persistWidth &&\n typeof window !== \"undefined\"\n ) {\n localStorage.setItem(`${config.storageKey}-width`, String(newWidth));\n }\n },\n enabled: config.resizable && !isMobile,\n });\n\n // Focus management for mobile overlay\n useFocusManagement({\n isActive:\n isMobile && config.mobileVariant === \"overlay\" && !internalCollapsed,\n containerRef: sidebarRef,\n restoreFocus: true,\n });\n\n // Derived collapsed state\n const collapsed = isControlled ? controlledCollapsed : internalCollapsed;\n\n // Set collapsed handler\n const setCollapsed = useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalCollapsed(value);\n }\n onCollapseChange?.(value);\n },\n [isControlled, onCollapseChange],\n );\n\n // Toggle handler\n const toggle = useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n // Keyboard shortcut\n const shortcut = parseKeyboardShortcut(config.keyboardShortcut);\n useKeyboardShortcut({\n key: shortcut.key,\n ctrl: shortcut.ctrl,\n shift: shortcut.shift,\n alt: shortcut.alt,\n meta: shortcut.meta,\n onTrigger: toggle,\n enabled: config.enableKeyboardShortcut,\n });\n\n // Set width handler\n const setWidth = useCallback(\n (newWidth: number) => {\n setResizeWidth(newWidth);\n },\n [setResizeWidth],\n );\n\n // Group state handlers\n const toggleGroup = useCallback(\n (groupId: string) => {\n if (exclusiveGroups) {\n // Exclusive behavior: only one group open at a time (like ButtonGroup)\n // When clicking a group:\n // - If it's open (false = expanded), close it (all groups closed)\n // - If it's closed (true = collapsed or undefined), open it and close all others\n // - After closing, user can click any group (including the same one) to open it again\n setGroupStates((prev) => {\n const currentState = prev[groupId];\n const isCurrentlyOpen = currentState === false; // false means expanded (not collapsed)\n const newStates: Record<string, boolean> = {};\n\n // Get all group IDs (from current state and the one being toggled)\n const allGroupIds = new Set([...Object.keys(prev), groupId]);\n\n if (isCurrentlyOpen) {\n // Group is currently open, close it (and all others remain closed)\n allGroupIds.forEach((id) => {\n newStates[id] = true; // true = collapsed\n });\n } else {\n // Group is currently closed, open it and close all others\n allGroupIds.forEach((id) => {\n newStates[id] = id !== groupId; // true = collapsed, false = expanded\n });\n }\n\n return newStates;\n });\n } else {\n // Default behavior: toggle individual group state\n setGroupStates((prev) => ({\n ...prev,\n [groupId]: !prev[groupId],\n }));\n }\n },\n [exclusiveGroups],\n );\n\n const setGroupCollapsed = useCallback(\n (groupId: string, isCollapsed: boolean) => {\n setGroupStates((prev) => ({\n ...prev,\n [groupId]: isCollapsed,\n }));\n },\n [],\n );\n\n // Sync with controlled value\n useEffect(() => {\n if (isControlled && controlledCollapsed !== internalCollapsed) {\n setInternalCollapsed(controlledCollapsed);\n }\n }, [isControlled, controlledCollapsed, internalCollapsed]);\n\n // Persist collapsed state to storage\n useEffect(() => {\n if (\n config.storageKey &&\n config.persistState &&\n typeof window !== \"undefined\" &&\n !isControlled\n ) {\n localStorage.setItem(\n `${config.storageKey}-collapsed`,\n String(internalCollapsed),\n );\n }\n }, [config.storageKey, config.persistState, internalCollapsed, isControlled]);\n\n const value: SideNavbarStateContextValue = useMemo(\n () => ({\n collapsed,\n toggle,\n setCollapsed,\n currentWidth: resizeWidth,\n setWidth,\n isMobile,\n isResizing,\n startResize,\n groupStates,\n toggleGroup,\n setGroupCollapsed,\n sidebarRef,\n }),\n [\n collapsed,\n toggle,\n setCollapsed,\n resizeWidth,\n setWidth,\n isMobile,\n isResizing,\n startResize,\n groupStates,\n toggleGroup,\n setGroupCollapsed,\n ],\n );\n\n return (\n <SideNavbarStateContext.Provider value={value}>\n {children}\n </SideNavbarStateContext.Provider>\n );\n}\n\nexport default SideNavbarStateProvider;\n"],"names":["SideNavbarStateProvider","children","defaultCollapsed","controlledCollapsed","onCollapseChange","onWidthChange","onMobileChange","exclusiveGroups","theme","useSideNavbarThemeRequired","config","useSideNavbarConfigRequired","sidebarRef","useRef","isControlled","getInitialCollapsedState","stored","getInitialWidth","parsedWidth","parseWidthToPixels","internalCollapsed","setInternalCollapsed","useState","groupStates","setGroupStates","isMobile","useResponsiveSidebar","mobile","resizeWidth","isResizing","startResize","setResizeWidth","useResize","newWidth","useFocusManagement","collapsed","setCollapsed","useCallback","value","toggle","shortcut","parseKeyboardShortcut","useKeyboardShortcut","setWidth","toggleGroup","groupId","prev","isCurrentlyOpen","newStates","allGroupIds","id","__spreadProps","__spreadValues","setGroupCollapsed","isCollapsed","useEffect","useMemo","jsx","SideNavbarStateContext"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo as d } from "react";
|
|
4
|
+
import { defaultThemeValues as e, SideNavbarThemeContext as f } from "../contexts/SideNavbarThemeContext.js";
|
|
5
|
+
function p({
|
|
6
|
+
children: a,
|
|
7
|
+
variant: r = e.variant,
|
|
8
|
+
navigationWidth: o = e.navigationWidth,
|
|
9
|
+
contentWidth: t = e.contentWidth,
|
|
10
|
+
animationDuration: m = e.animationDuration,
|
|
11
|
+
animationEasing: i = e.animationEasing
|
|
12
|
+
}) {
|
|
13
|
+
const u = d(
|
|
14
|
+
() => ({
|
|
15
|
+
variant: r,
|
|
16
|
+
navigationWidth: o,
|
|
17
|
+
contentWidth: t,
|
|
18
|
+
animationDuration: m,
|
|
19
|
+
animationEasing: i
|
|
20
|
+
}),
|
|
21
|
+
[
|
|
22
|
+
r,
|
|
23
|
+
o,
|
|
24
|
+
t,
|
|
25
|
+
m,
|
|
26
|
+
i
|
|
27
|
+
]
|
|
28
|
+
);
|
|
29
|
+
return /* @__PURE__ */ n(f.Provider, { value: u, children: a });
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
p as SideNavbarThemeProvider
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=SideNavbarThemeProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SideNavbarThemeProvider.js","sources":["../../../../../../src/ui/components/SideNavbar/providers/SideNavbarThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n SideNavbarThemeContext,\n defaultThemeValues,\n} from \"../contexts/SideNavbarThemeContext\";\nimport type { SideNavbarThemeProviderProps } from \"../types\";\n\n/**\n * Theme Provider for SideNavbar\n *\n * Provides visual customization context for the sidebar.\n * Theme values are typically set once and don't change during runtime.\n *\n * @example\n * ```tsx\n * <SideNavbarThemeProvider variant=\"elevated\" animationDuration={200}>\n * <SideNavbarConfigProvider>\n * <SideNavbarStateProvider>\n * <SideNavbarRoot>...</SideNavbarRoot>\n * </SideNavbarStateProvider>\n * </SideNavbarConfigProvider>\n * </SideNavbarThemeProvider>\n * ```\n */\nexport function SideNavbarThemeProvider({\n children,\n variant = defaultThemeValues.variant,\n navigationWidth = defaultThemeValues.navigationWidth,\n contentWidth = defaultThemeValues.contentWidth,\n animationDuration = defaultThemeValues.animationDuration,\n animationEasing = defaultThemeValues.animationEasing,\n}: SideNavbarThemeProviderProps) {\n const value = useMemo(\n () => ({\n variant,\n navigationWidth,\n contentWidth,\n animationDuration,\n animationEasing,\n }),\n [\n variant,\n navigationWidth,\n contentWidth,\n animationDuration,\n animationEasing,\n ],\n );\n\n return (\n <SideNavbarThemeContext.Provider value={value}>\n {children}\n </SideNavbarThemeContext.Provider>\n );\n}\n\nexport default SideNavbarThemeProvider;\n"],"names":["SideNavbarThemeProvider","children","variant","defaultThemeValues","navigationWidth","contentWidth","animationDuration","animationEasing","value","useMemo","jsx","SideNavbarThemeContext"],"mappings":";;;;AA0BO,SAASA,EAAwB;AAAA,EACtC,UAAAC;AAAA,EACA,SAAAC,IAAUC,EAAmB;AAAA,EAC7B,iBAAAC,IAAkBD,EAAmB;AAAA,EACrC,cAAAE,IAAeF,EAAmB;AAAA,EAClC,mBAAAG,IAAoBH,EAAmB;AAAA,EACvC,iBAAAI,IAAkBJ,EAAmB;AACvC,GAAiC;AAC/B,QAAMK,IAAQC;AAAA,IACZ,OAAO;AAAA,MACL,SAAAP;AAAA,MACA,iBAAAE;AAAA,MACA,cAAAC;AAAA,MACA,mBAAAC;AAAA,MACA,iBAAAC;AAAA,IAAA;AAAA,IAEF;AAAA,MACEL;AAAA,MACAE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,EACF;AAGF,SACE,gBAAAG,EAACC,EAAuB,UAAvB,EAAgC,OAAAH,GAC9B,UAAAP,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as S } from "react/jsx-runtime";
|
|
3
|
+
import { useState as m, useRef as f, useCallback as n, useMemo as d } from "react";
|
|
4
|
+
import { SidebarSlotContext as p } from "../contexts/SidebarSlotContext.js";
|
|
5
|
+
function g({
|
|
6
|
+
children: l,
|
|
7
|
+
defaultSlot: c = null
|
|
8
|
+
}) {
|
|
9
|
+
const [o, u] = m(c), t = f(/* @__PURE__ */ new Map()), r = n((e, a) => {
|
|
10
|
+
t.current.set(e, a);
|
|
11
|
+
}, []), s = n((e) => {
|
|
12
|
+
t.current.delete(e);
|
|
13
|
+
}, []), i = d(
|
|
14
|
+
() => ({
|
|
15
|
+
activeSlot: o,
|
|
16
|
+
setActiveSlot: u,
|
|
17
|
+
slots: t.current,
|
|
18
|
+
registerSlot: r,
|
|
19
|
+
unregisterSlot: s
|
|
20
|
+
}),
|
|
21
|
+
[o, r, s]
|
|
22
|
+
);
|
|
23
|
+
return /* @__PURE__ */ S(p.Provider, { value: i, children: l });
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
g as SidebarSlotProvider
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=SidebarSlotProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidebarSlotProvider.js","sources":["../../../../../../src/ui/components/SideNavbar/providers/SidebarSlotProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useRef, useCallback, useMemo, type ReactNode } from \"react\";\nimport { SidebarSlotContext } from \"../contexts/SidebarSlotContext\";\nimport type {\n SidebarSlotContextValue,\n SidebarSlotProviderProps,\n} from \"../types\";\n\n/**\n * Sidebar Slot Provider\n *\n * **Important: Slots are exclusive to the Sidebar component, not the Navbar.**\n *\n * Manages slot registration and active slot state for dynamic content switching\n * within the Sidebar. This provider should wrap the Sidebar content where slots\n * will be used.\n *\n * @example\n * ```tsx\n * <SideNavbar>\n * <SideNavbar.Navbar>\n * <SideNavbar.Navbar.Item icon={<Home />} label=\"Home\" />\n * </SideNavbar.Navbar>\n *\n * <SidebarSlotProvider defaultSlot=\"dashboard\">\n * <SideNavbar.Sidebar>\n * <SideNavbar.Sidebar.Content>\n * <SidebarSlot id=\"dashboard\">\n * <DashboardContent />\n * </SidebarSlot>\n * <SidebarSlot id=\"settings\">\n * <SettingsContent />\n * </SidebarSlot>\n * <SidebarSlotContent />\n * </SideNavbar.Sidebar.Content>\n * </SideNavbar.Sidebar>\n * </SidebarSlotProvider>\n * </SideNavbar>\n * ```\n */\nexport function SidebarSlotProvider({\n children,\n defaultSlot = null,\n}: SidebarSlotProviderProps) {\n const [activeSlot, setActiveSlot] = useState<string | null>(defaultSlot);\n const slotsRef = useRef(new Map<string, ReactNode>());\n\n const registerSlot = useCallback((id: string, content: ReactNode) => {\n slotsRef.current.set(id, content);\n }, []);\n\n const unregisterSlot = useCallback((id: string) => {\n slotsRef.current.delete(id);\n }, []);\n\n const contextValue: SidebarSlotContextValue = useMemo(\n () => ({\n activeSlot,\n setActiveSlot,\n slots: slotsRef.current,\n registerSlot,\n unregisterSlot,\n }),\n [activeSlot, registerSlot, unregisterSlot],\n );\n\n return (\n <SidebarSlotContext.Provider value={contextValue}>\n {children}\n </SidebarSlotContext.Provider>\n );\n}\n"],"names":["SidebarSlotProvider","children","defaultSlot","activeSlot","setActiveSlot","useState","slotsRef","useRef","registerSlot","useCallback","id","content","unregisterSlot","contextValue","useMemo","SidebarSlotContext"],"mappings":";;;;AAyCO,SAASA,EAAoB;AAAA,EAClC,UAAAC;AAAA,EACA,aAAAC,IAAc;AAChB,GAA6B;AAC3B,QAAM,CAACC,GAAYC,CAAa,IAAIC,EAAwBH,CAAW,GACjEI,IAAWC,EAAO,oBAAI,KAAwB,GAE9CC,IAAeC,EAAY,CAACC,GAAYC,MAAuB;AACnE,IAAAL,EAAS,QAAQ,IAAII,GAAIC,CAAO;AAAA,EAClC,GAAG,CAAA,CAAE,GAECC,IAAiBH,EAAY,CAACC,MAAe;AACjD,IAAAJ,EAAS,QAAQ,OAAOI,CAAE;AAAA,EAC5B,GAAG,CAAA,CAAE,GAECG,IAAwCC;AAAA,IAC5C,OAAO;AAAA,MACL,YAAAX;AAAA,MACA,eAAAC;AAAA,MACA,OAAOE,EAAS;AAAA,MAChB,cAAAE;AAAA,MACA,gBAAAI;AAAA,IAAA;AAAA,IAEF,CAACT,GAAYK,GAAcI,CAAc;AAAA,EAAA;AAG3C,2BACGG,EAAmB,UAAnB,EAA4B,OAAOF,GACjC,UAAAZ,GACH;AAEJ;"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const p = [
|
|
3
|
+
"ctrl",
|
|
4
|
+
"cmd",
|
|
5
|
+
"control",
|
|
6
|
+
"shift",
|
|
7
|
+
"alt",
|
|
8
|
+
"meta",
|
|
9
|
+
"option"
|
|
10
|
+
];
|
|
11
|
+
function h(t) {
|
|
12
|
+
const s = {
|
|
13
|
+
key: "",
|
|
14
|
+
ctrl: !1,
|
|
15
|
+
shift: !1,
|
|
16
|
+
alt: !1,
|
|
17
|
+
meta: !1,
|
|
18
|
+
isValid: !1
|
|
19
|
+
};
|
|
20
|
+
if (!t || typeof t != "string")
|
|
21
|
+
return s;
|
|
22
|
+
const e = t.trim();
|
|
23
|
+
if (!e)
|
|
24
|
+
return s;
|
|
25
|
+
const l = e.split("+").map((a) => a.trim().toLowerCase()).filter((a) => a.length > 0);
|
|
26
|
+
if (l.length === 0)
|
|
27
|
+
return s;
|
|
28
|
+
const i = /* @__PURE__ */ new Set();
|
|
29
|
+
let n = "";
|
|
30
|
+
for (let a = 0; a < l.length; a++) {
|
|
31
|
+
const r = l[a];
|
|
32
|
+
if (p.includes(r))
|
|
33
|
+
i.add(r);
|
|
34
|
+
else if (a === l.length - 1)
|
|
35
|
+
n = r;
|
|
36
|
+
else
|
|
37
|
+
return s;
|
|
38
|
+
}
|
|
39
|
+
if (!n)
|
|
40
|
+
return s;
|
|
41
|
+
const f = i.has("ctrl") || i.has("cmd") || i.has("control"), o = i.has("alt") || i.has("option");
|
|
42
|
+
return {
|
|
43
|
+
key: n,
|
|
44
|
+
ctrl: f,
|
|
45
|
+
shift: i.has("shift"),
|
|
46
|
+
alt: o,
|
|
47
|
+
meta: i.has("meta"),
|
|
48
|
+
isValid: !0
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function m(t, s = "windows") {
|
|
52
|
+
if (!t.isValid) return "";
|
|
53
|
+
const e = [];
|
|
54
|
+
return s === "mac" ? (t.ctrl && e.push("⌘"), t.shift && e.push("⇧"), t.alt && e.push("⌥"), t.meta && e.push("⌃"), e.push(t.key.toUpperCase()), e.join("")) : (t.ctrl && e.push("Ctrl"), t.shift && e.push("Shift"), t.alt && e.push("Alt"), t.meta && e.push("Meta"), e.push(t.key.toUpperCase()), e.join("+"));
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
m as formatKeyboardShortcut,
|
|
58
|
+
h as parseKeyboardShortcut
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=parseKeyboardShortcut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseKeyboardShortcut.js","sources":["../../../../../../src/ui/components/SideNavbar/utils/parseKeyboardShortcut.ts"],"sourcesContent":["/**\n * Parsed keyboard shortcut result\n */\nexport interface ParsedKeyboardShortcut {\n /** The main key (lowercase) */\n key: string;\n /** Whether Ctrl/Cmd is required */\n ctrl: boolean;\n /** Whether Shift is required */\n shift: boolean;\n /** Whether Alt is required */\n alt: boolean;\n /** Whether Meta (Windows/Cmd) is required */\n meta: boolean;\n /** Whether the shortcut is valid */\n isValid: boolean;\n}\n\n/**\n * Known modifier keys\n */\nconst MODIFIER_KEYS = [\n \"ctrl\",\n \"cmd\",\n \"control\",\n \"shift\",\n \"alt\",\n \"meta\",\n \"option\",\n] as const;\n\n/**\n * Parse a keyboard shortcut string into its components\n *\n * Supports various formats:\n * - \"Ctrl+B\" -> { key: 'b', ctrl: true, ... }\n * - \"Cmd+Shift+K\" -> { key: 'k', ctrl: true, shift: true, ... }\n * - \"Alt+Enter\" -> { key: 'enter', alt: true, ... }\n * - \"Ctrl+Shift+Alt+S\" -> { key: 's', ctrl: true, shift: true, alt: true, ... }\n *\n * Modifier aliases:\n * - \"cmd\" and \"control\" are aliases for \"ctrl\"\n * - \"option\" is an alias for \"alt\"\n *\n * @param shortcut - The keyboard shortcut string to parse\n * @returns Parsed shortcut object with key and modifiers\n *\n * @example\n * ```ts\n * parseKeyboardShortcut('Ctrl+B')\n * // { key: 'b', ctrl: true, shift: false, alt: false, meta: false, isValid: true }\n *\n * parseKeyboardShortcut('Cmd+Shift+K')\n * // { key: 'k', ctrl: true, shift: true, alt: false, meta: false, isValid: true }\n *\n * parseKeyboardShortcut('')\n * // { key: '', ctrl: false, shift: false, alt: false, meta: false, isValid: false }\n * ```\n */\nexport function parseKeyboardShortcut(\n shortcut: string,\n): ParsedKeyboardShortcut {\n // Default invalid result\n const invalidResult: ParsedKeyboardShortcut = {\n key: \"\",\n ctrl: false,\n shift: false,\n alt: false,\n meta: false,\n isValid: false,\n };\n\n // Handle empty or invalid input\n if (!shortcut || typeof shortcut !== \"string\") {\n return invalidResult;\n }\n\n // Trim and normalize\n const normalized = shortcut.trim();\n if (!normalized) {\n return invalidResult;\n }\n\n // Split by '+' and filter empty parts\n const parts = normalized\n .split(\"+\")\n .map((part) => part.trim().toLowerCase())\n .filter((part) => part.length > 0);\n\n if (parts.length === 0) {\n return invalidResult;\n }\n\n // The last non-modifier part is the main key\n const modifiers = new Set<string>();\n let mainKey = \"\";\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (MODIFIER_KEYS.includes(part as (typeof MODIFIER_KEYS)[number])) {\n modifiers.add(part);\n } else if (i === parts.length - 1) {\n // Last part should be the main key\n mainKey = part;\n } else {\n // Non-modifier key in the middle is invalid\n return invalidResult;\n }\n }\n\n // Must have a main key\n if (!mainKey) {\n return invalidResult;\n }\n\n // Check for ctrl aliases (cmd, control)\n const hasCtrl =\n modifiers.has(\"ctrl\") || modifiers.has(\"cmd\") || modifiers.has(\"control\");\n\n // Check for alt aliases (option)\n const hasAlt = modifiers.has(\"alt\") || modifiers.has(\"option\");\n\n return {\n key: mainKey,\n ctrl: hasCtrl,\n shift: modifiers.has(\"shift\"),\n alt: hasAlt,\n meta: modifiers.has(\"meta\"),\n isValid: true,\n };\n}\n\n/**\n * Format a parsed shortcut back to a string (for display)\n *\n * @param shortcut - The parsed shortcut object\n * @param platform - The platform (mac uses symbols, others use text)\n * @returns Formatted shortcut string\n *\n * @example\n * ```ts\n * formatKeyboardShortcut({ key: 'b', ctrl: true, ... }, 'mac')\n * // '⌘B'\n *\n * formatKeyboardShortcut({ key: 'b', ctrl: true, ... }, 'windows')\n * // 'Ctrl+B'\n * ```\n */\nexport function formatKeyboardShortcut(\n shortcut: ParsedKeyboardShortcut,\n platform: \"mac\" | \"windows\" | \"linux\" = \"windows\",\n): string {\n if (!shortcut.isValid) return \"\";\n\n const parts: string[] = [];\n\n if (platform === \"mac\") {\n // macOS uses symbols\n if (shortcut.ctrl) parts.push(\"⌘\");\n if (shortcut.shift) parts.push(\"⇧\");\n if (shortcut.alt) parts.push(\"⌥\");\n if (shortcut.meta) parts.push(\"⌃\");\n parts.push(shortcut.key.toUpperCase());\n return parts.join(\"\");\n }\n\n // Windows/Linux use text\n if (shortcut.ctrl) parts.push(\"Ctrl\");\n if (shortcut.shift) parts.push(\"Shift\");\n if (shortcut.alt) parts.push(\"Alt\");\n if (shortcut.meta) parts.push(\"Meta\");\n parts.push(shortcut.key.toUpperCase());\n return parts.join(\"+\");\n}\n"],"names":["MODIFIER_KEYS","parseKeyboardShortcut","shortcut","invalidResult","normalized","parts","part","modifiers","mainKey","i","hasCtrl","hasAlt","formatKeyboardShortcut","platform"],"mappings":";AAqBA,MAAMA,IAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA8BO,SAASC,EACdC,GACwB;AAExB,QAAMC,IAAwC;AAAA,IAC5C,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAIX,MAAI,CAACD,KAAY,OAAOA,KAAa;AACnC,WAAOC;AAIT,QAAMC,IAAaF,EAAS,KAAA;AAC5B,MAAI,CAACE;AACH,WAAOD;AAIT,QAAME,IAAQD,EACX,MAAM,GAAG,EACT,IAAI,CAACE,MAASA,EAAK,OAAO,YAAA,CAAa,EACvC,OAAO,CAACA,MAASA,EAAK,SAAS,CAAC;AAEnC,MAAID,EAAM,WAAW;AACnB,WAAOF;AAIT,QAAMI,wBAAgB,IAAA;AACtB,MAAIC,IAAU;AAEd,WAASC,IAAI,GAAGA,IAAIJ,EAAM,QAAQI,KAAK;AACrC,UAAMH,IAAOD,EAAMI,CAAC;AAEpB,QAAIT,EAAc,SAASM,CAAsC;AAC/D,MAAAC,EAAU,IAAID,CAAI;AAAA,aACTG,MAAMJ,EAAM,SAAS;AAE9B,MAAAG,IAAUF;AAAA;AAGV,aAAOH;AAAA,EAEX;AAGA,MAAI,CAACK;AACH,WAAOL;AAIT,QAAMO,IACJH,EAAU,IAAI,MAAM,KAAKA,EAAU,IAAI,KAAK,KAAKA,EAAU,IAAI,SAAS,GAGpEI,IAASJ,EAAU,IAAI,KAAK,KAAKA,EAAU,IAAI,QAAQ;AAE7D,SAAO;AAAA,IACL,KAAKC;AAAA,IACL,MAAME;AAAA,IACN,OAAOH,EAAU,IAAI,OAAO;AAAA,IAC5B,KAAKI;AAAA,IACL,MAAMJ,EAAU,IAAI,MAAM;AAAA,IAC1B,SAAS;AAAA,EAAA;AAEb;AAkBO,SAASK,EACdV,GACAW,IAAwC,WAChC;AACR,MAAI,CAACX,EAAS,QAAS,QAAO;AAE9B,QAAMG,IAAkB,CAAA;AAExB,SAAIQ,MAAa,SAEXX,EAAS,QAAMG,EAAM,KAAK,GAAG,GAC7BH,EAAS,SAAOG,EAAM,KAAK,GAAG,GAC9BH,EAAS,OAAKG,EAAM,KAAK,GAAG,GAC5BH,EAAS,QAAMG,EAAM,KAAK,GAAG,GACjCA,EAAM,KAAKH,EAAS,IAAI,YAAA,CAAa,GAC9BG,EAAM,KAAK,EAAE,MAIlBH,EAAS,QAAMG,EAAM,KAAK,MAAM,GAChCH,EAAS,SAAOG,EAAM,KAAK,OAAO,GAClCH,EAAS,OAAKG,EAAM,KAAK,KAAK,GAC9BH,EAAS,QAAMG,EAAM,KAAK,MAAM,GACpCA,EAAM,KAAKH,EAAS,IAAI,YAAA,CAAa,GAC9BG,EAAM,KAAK,GAAG;AACvB;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
function u(e) {
|
|
3
|
+
if (typeof e == "number") return e;
|
|
4
|
+
const r = parseFloat(e);
|
|
5
|
+
return isNaN(r) ? 0 : e.endsWith("rem") || e.endsWith("em") ? r * 16 : (e.endsWith("px"), r);
|
|
6
|
+
}
|
|
7
|
+
function i(e, r) {
|
|
8
|
+
return e === void 0 || r === void 0 ? !0 : e < r;
|
|
9
|
+
}
|
|
10
|
+
function o(e, r, t) {
|
|
11
|
+
let n = e;
|
|
12
|
+
return r !== void 0 && (n = Math.max(n, r)), t !== void 0 && (n = Math.min(n, t)), n;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
o as clampWidth,
|
|
16
|
+
u as parseWidthToPixels,
|
|
17
|
+
i as validateWidthBounds
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=parseWidth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseWidth.js","sources":["../../../../../../src/ui/components/SideNavbar/utils/parseWidth.ts"],"sourcesContent":["/**\n * Parse a width value (number or string) to pixels\n *\n * Supports:\n * - Numbers: returned as-is\n * - Pixel strings: \"320px\" -> 320\n * - Rem strings: \"20rem\" -> 320 (assuming 16px base)\n * - Em strings: \"20em\" -> 320 (assuming 16px base)\n * - Plain numbers as strings: \"320\" -> 320\n *\n * @param width - The width value to parse\n * @returns The width in pixels\n */\nexport function parseWidthToPixels(width: number | string): number {\n if (typeof width === \"number\") return width;\n\n const numericValue = parseFloat(width);\n if (isNaN(numericValue)) return 0;\n\n if (width.endsWith(\"rem\")) return numericValue * 16;\n if (width.endsWith(\"em\")) return numericValue * 16;\n if (width.endsWith(\"px\")) return numericValue;\n\n return numericValue;\n}\n\n/**\n * Validate that minWidth is less than maxWidth\n *\n * @param minWidth - Minimum width in pixels\n * @param maxWidth - Maximum width in pixels\n * @returns True if valid, false otherwise\n */\nexport function validateWidthBounds(\n minWidth?: number,\n maxWidth?: number,\n): boolean {\n if (minWidth === undefined || maxWidth === undefined) return true;\n return minWidth < maxWidth;\n}\n\n/**\n * Clamp a width value between min and max bounds\n *\n * @param width - The width to clamp\n * @param minWidth - Minimum allowed width\n * @param maxWidth - Maximum allowed width\n * @returns The clamped width value\n */\nexport function clampWidth(\n width: number,\n minWidth?: number,\n maxWidth?: number,\n): number {\n let result = width;\n if (minWidth !== undefined) result = Math.max(result, minWidth);\n if (maxWidth !== undefined) result = Math.min(result, maxWidth);\n return result;\n}\n"],"names":["parseWidthToPixels","width","numericValue","validateWidthBounds","minWidth","maxWidth","clampWidth","result"],"mappings":";AAaO,SAASA,EAAmBC,GAAgC;AACjE,MAAI,OAAOA,KAAU,SAAU,QAAOA;AAEtC,QAAMC,IAAe,WAAWD,CAAK;AACrC,SAAI,MAAMC,CAAY,IAAU,IAE5BD,EAAM,SAAS,KAAK,KACpBA,EAAM,SAAS,IAAI,IAAUC,IAAe,MAC5CD,EAAM,SAAS,IAAI,GAAUC;AAGnC;AASO,SAASC,EACdC,GACAC,GACS;AACT,SAAID,MAAa,UAAaC,MAAa,SAAkB,KACtDD,IAAWC;AACpB;AAUO,SAASC,EACdL,GACAG,GACAC,GACQ;AACR,MAAIE,IAASN;AACb,SAAIG,MAAa,WAAWG,IAAS,KAAK,IAAIA,GAAQH,CAAQ,IAC1DC,MAAa,WAAWE,IAAS,KAAK,IAAIA,GAAQF,CAAQ,IACvDE;AACT;"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var y = Object.defineProperty, C = Object.defineProperties;
|
|
3
|
+
var j = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var r = Object.getOwnPropertySymbols;
|
|
5
|
+
var c = Object.prototype.hasOwnProperty, x = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var i = (t, e, s) => e in t ? y(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s, o = (t, e) => {
|
|
7
|
+
for (var s in e || (e = {}))
|
|
8
|
+
c.call(e, s) && i(t, s, e[s]);
|
|
9
|
+
if (r)
|
|
10
|
+
for (var s of r(e))
|
|
11
|
+
x.call(e, s) && i(t, s, e[s]);
|
|
12
|
+
return t;
|
|
13
|
+
}, f = (t, e) => C(t, j(e));
|
|
14
|
+
var m = (t, e) => {
|
|
15
|
+
var s = {};
|
|
16
|
+
for (var a in t)
|
|
17
|
+
c.call(t, a) && e.indexOf(a) < 0 && (s[a] = t[a]);
|
|
18
|
+
if (t != null && r)
|
|
19
|
+
for (var a of r(t))
|
|
20
|
+
e.indexOf(a) < 0 && x.call(t, a) && (s[a] = t[a]);
|
|
21
|
+
return s;
|
|
22
|
+
};
|
|
23
|
+
import { jsxs as w, jsx as n } from "react/jsx-runtime";
|
|
24
|
+
import { getSpacingClass as g } from "../../tokens/spacing.js";
|
|
25
|
+
import { cn as d } from "../../utils/cn.js";
|
|
26
|
+
const S = {
|
|
27
|
+
start: "items-start text-left",
|
|
28
|
+
center: "items-center text-center"
|
|
29
|
+
}, E = {
|
|
30
|
+
neutral: "text-fg-tertiary",
|
|
31
|
+
success: "text-fg-success",
|
|
32
|
+
warning: "text-fg-warning",
|
|
33
|
+
error: "text-fg-error"
|
|
34
|
+
};
|
|
35
|
+
function A(H) {
|
|
36
|
+
var l = H, {
|
|
37
|
+
value: t,
|
|
38
|
+
label: e,
|
|
39
|
+
hint: s,
|
|
40
|
+
icon: a,
|
|
41
|
+
align: p = "start",
|
|
42
|
+
tone: u = "neutral",
|
|
43
|
+
className: h
|
|
44
|
+
} = l, N = m(l, [
|
|
45
|
+
"value",
|
|
46
|
+
"label",
|
|
47
|
+
"hint",
|
|
48
|
+
"icon",
|
|
49
|
+
"align",
|
|
50
|
+
"tone",
|
|
51
|
+
"className"
|
|
52
|
+
]);
|
|
53
|
+
const b = t == null;
|
|
54
|
+
return /* @__PURE__ */ w(
|
|
55
|
+
"div",
|
|
56
|
+
f(o({
|
|
57
|
+
className: d(
|
|
58
|
+
"bg-surface-base flex-1 flex flex-col",
|
|
59
|
+
g("base", "p"),
|
|
60
|
+
g("xs", "gap-y"),
|
|
61
|
+
S[p],
|
|
62
|
+
h
|
|
63
|
+
)
|
|
64
|
+
}, N), {
|
|
65
|
+
children: [
|
|
66
|
+
a ? /* @__PURE__ */ n("span", { className: "text-icon-default inline-flex", children: a }) : null,
|
|
67
|
+
b ? /* @__PURE__ */ n(
|
|
68
|
+
"span",
|
|
69
|
+
{
|
|
70
|
+
"aria-label": "No data",
|
|
71
|
+
className: "text-fg-tertiary text-2xl font-semibold leading-tight",
|
|
72
|
+
children: "—"
|
|
73
|
+
}
|
|
74
|
+
) : /* @__PURE__ */ n("span", { className: "text-fg-primary text-2xl font-semibold leading-tight", children: t }),
|
|
75
|
+
/* @__PURE__ */ n("span", { className: "text-fg-secondary text-sm", children: e }),
|
|
76
|
+
s ? /* @__PURE__ */ n("span", { className: d("text-xs", E[u]), children: s }) : null
|
|
77
|
+
]
|
|
78
|
+
})
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
A as Stat
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=Stat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stat.js","sources":["../../../../../src/ui/components/Stat/Stat.tsx"],"sourcesContent":["import { type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport type StatTone = \"neutral\" | \"success\" | \"warning\" | \"error\";\nexport type StatAlign = \"start\" | \"center\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The metric value to display. Strings are rendered verbatim — formatting\n * (number locale, currency, units, relative time, etc.) is the consumer's\n * responsibility, not the design system's. Pass `null` or `undefined` to\n * render the empty-state placeholder (see \"Empty state\" below).\n */\n value: ReactNode;\n /**\n * Short metric label (e.g. \"Votos\", \"Alinhamento\"). Required for screen\n * reader context — the label describes what the value means.\n */\n label: string;\n /**\n * Optional third line of context below the value (e.g. \"no banco\",\n * \"últimos 12 m\", \"+3% no mês\"). The `tone` prop styles THIS line — see\n * `tone` for the contract.\n */\n hint?: ReactNode;\n /**\n * Optional icon rendered above the value (home-style stats use icons;\n * detail-page stats typically don't).\n */\n icon?: ReactNode;\n /**\n * Block alignment. `start` left-aligns label/value/hint (detail-page\n * style); `center` centers them (home-hero style).\n * @default 'start'\n */\n align?: StatAlign;\n /**\n * Semantic tone for the metric — `neutral` for plain stats, the others\n * for classified states (good/warning/bad).\n *\n * **Scope (contract).** Tone affects ONLY the `hint`, not the `value`,\n * `label`, or `icon`. The `value` always renders in `text-fg-primary`\n * regardless of tone; the `label` in `text-fg-secondary`; the `icon` in\n * `text-icon-default`. This is deliberate — a colored value would\n * compete with the label for attention and bias the reader's\n * interpretation of the metric. If a future requirement needs the\n * `value` (or icon) to inherit tone, that becomes a new prop or a\n * semver-bound default change, not a surprise expansion of `tone`.\n *\n * Tone maps directly to the semantic foreground tokens (no new\n * vocabulary): `neutral` → `text-fg-tertiary`, `success` →\n * `text-fg-success`, `warning` → `text-fg-warning`, `error` →\n * `text-fg-error`. See `.claude/rules/colors.md`.\n *\n * @default 'neutral'\n */\n tone?: StatTone;\n}\n\nconst alignClasses: Record<StatAlign, string> = {\n start: \"items-start text-left\",\n center: \"items-center text-center\",\n};\n\nconst toneHintClasses: Record<StatTone, string> = {\n neutral: \"text-fg-tertiary\",\n success: \"text-fg-success\",\n warning: \"text-fg-warning\",\n error: \"text-fg-error\",\n};\n\n/**\n * `Stat` — a single statistic block (icon? + value + label + hint?).\n *\n * Composes with `StatGroup` (1-px-divider strip or grid) but is also\n * valid standalone — a single `Stat` outside a group is a legitimate use\n * case for a hero metric.\n *\n * ### Empty state contract\n *\n * When `value` is `null` OR `undefined`, the component renders the\n * em-dash placeholder `—` (U+2014) with `aria-label=\"No data\"` on its\n * wrapper. The label is intentionally hard-coded in English in this\n * version; a screen reader announcing \"No data\" in an otherwise\n * Portuguese app is a known inconsistency accepted for now — if i18n\n * becomes a requirement, an `emptyLabel?: string` prop will be added in\n * a follow-up PR (semver-safe addition).\n *\n * Other falsy values — `0`, `\"\"`, `false`, an empty fragment — are\n * **legitimate values** and render as-is. The empty trigger is only\n * `null`/`undefined`, because `0` (count = zero) is meaningful data that\n * the consumer would not want masked.\n *\n * ### Server-safe\n *\n * Pure presentation — no hooks, no event handlers on the DOM. Ships in\n * the `./server` entry alongside `StatGroup`. Consumer-supplied `icon`\n * may itself be a client component; React's RSC boundary handles that\n * normally.\n *\n * @example\n * ```tsx\n * // Home-style (centered, with icon)\n * <Stat\n * icon={<Users size={20} aria-hidden=\"true\" />}\n * value=\"9,4 mil\"\n * label=\"Parlamentares\"\n * align=\"center\"\n * />\n *\n * // Detail-page-style (start-aligned, with hint)\n * <Stat\n * value=\"87%\"\n * label=\"Alinhamento\"\n * hint=\"últimos 12 meses\"\n * tone=\"success\"\n * />\n * ```\n */\nexport function Stat({\n value,\n label,\n hint,\n icon,\n align = \"start\",\n tone = \"neutral\",\n className,\n ...props\n}: StatProps) {\n const isEmpty = value === null || value === undefined;\n\n return (\n <div\n className={cn(\n \"bg-surface-base flex-1 flex flex-col\",\n getSpacingClass(\"base\", \"p\"),\n getSpacingClass(\"xs\", \"gap-y\"),\n alignClasses[align],\n className,\n )}\n {...props}\n >\n {icon ? (\n <span className=\"text-icon-default inline-flex\">{icon}</span>\n ) : null}\n {isEmpty ? (\n <span\n aria-label=\"No data\"\n className=\"text-fg-tertiary text-2xl font-semibold leading-tight\"\n >\n —\n </span>\n ) : (\n <span className=\"text-fg-primary text-2xl font-semibold leading-tight\">\n {value}\n </span>\n )}\n <span className=\"text-fg-secondary text-sm\">{label}</span>\n {hint ? (\n <span className={cn(\"text-xs\", toneHintClasses[tone])}>{hint}</span>\n ) : null}\n </div>\n );\n}\n\nexport default Stat;\n"],"names":["alignClasses","toneHintClasses","Stat","_a","_b","value","label","hint","icon","align","tone","className","props","__objRest","isEmpty","jsxs","__spreadProps","__spreadValues","cn","getSpacingClass","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA4DA,MAAMA,IAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,QAAQ;AACV,GAEMC,IAA4C;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAkDO,SAASC,EAAKC,GASP;AATO,MAAAC,IAAAD,GACnB;AAAA,WAAAE;AAAA,IACA,OAAAC;AAAA,IACA,MAAAC;AAAA,IACA,MAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,MAPmBP,GAQhBQ,IAAAC,EARgBT,GAQhB;AAAA,IAPH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAMU,IAAUT,KAAU;AAE1B,SACE,gBAAAU;AAAA,IAAC;AAAA,IAAAC,EAAAC,EAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAC,EAAgB,QAAQ,GAAG;AAAA,QAC3BA,EAAgB,MAAM,OAAO;AAAA,QAC7BnB,EAAaS,CAAK;AAAA,QAClBE;AAAA,MAAA;AAAA,OAEEC,IARL;AAAA,MAUE,UAAA;AAAA,QAAAJ,IACC,gBAAAY,EAAC,QAAA,EAAK,WAAU,iCAAiC,aAAK,IACpD;AAAA,QACHN,IACC,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA,IAID,gBAAAA,EAAC,QAAA,EAAK,WAAU,wDACb,UAAAf,GACH;AAAA,QAEF,gBAAAe,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAd,GAAM;AAAA,QAClDC,IACC,gBAAAa,EAAC,QAAA,EAAK,WAAWF,EAAG,WAAWjB,EAAgBS,CAAI,CAAC,GAAI,UAAAH,EAAA,CAAK,IAC3D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var p = Object.defineProperty, u = Object.defineProperties;
|
|
3
|
+
var x = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var e = Object.getOwnPropertySymbols;
|
|
5
|
+
var t = Object.prototype.hasOwnProperty, g = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var s = (r, d, i) => d in r ? p(r, d, { enumerable: !0, configurable: !0, writable: !0, value: i }) : r[d] = i, c = (r, d) => {
|
|
7
|
+
for (var i in d || (d = {}))
|
|
8
|
+
t.call(d, i) && s(r, i, d[i]);
|
|
9
|
+
if (e)
|
|
10
|
+
for (var i of e(d))
|
|
11
|
+
g.call(d, i) && s(r, i, d[i]);
|
|
12
|
+
return r;
|
|
13
|
+
}, m = (r, d) => u(r, x(d));
|
|
14
|
+
var n = (r, d) => {
|
|
15
|
+
var i = {};
|
|
16
|
+
for (var o in r)
|
|
17
|
+
t.call(r, o) && d.indexOf(o) < 0 && (i[o] = r[o]);
|
|
18
|
+
if (r != null && e)
|
|
19
|
+
for (var o of e(r))
|
|
20
|
+
d.indexOf(o) < 0 && g.call(r, o) && (i[o] = r[o]);
|
|
21
|
+
return i;
|
|
22
|
+
};
|
|
23
|
+
import { jsx as b } from "react/jsx-runtime";
|
|
24
|
+
import { getRadiusClass as v } from "../../tokens/radius.js";
|
|
25
|
+
import { cn as C } from "../../utils/cn.js";
|
|
26
|
+
const G = {
|
|
27
|
+
2: "md:grid-cols-2",
|
|
28
|
+
3: "md:grid-cols-3",
|
|
29
|
+
4: "md:grid-cols-4"
|
|
30
|
+
};
|
|
31
|
+
function R(h) {
|
|
32
|
+
var l = h, {
|
|
33
|
+
layout: r = "grid",
|
|
34
|
+
cols: d = 4,
|
|
35
|
+
className: i,
|
|
36
|
+
children: o
|
|
37
|
+
} = l, a = n(l, [
|
|
38
|
+
"layout",
|
|
39
|
+
"cols",
|
|
40
|
+
"className",
|
|
41
|
+
"children"
|
|
42
|
+
]);
|
|
43
|
+
const f = r === "grid";
|
|
44
|
+
return /* @__PURE__ */ b(
|
|
45
|
+
"div",
|
|
46
|
+
m(c({
|
|
47
|
+
className: C(
|
|
48
|
+
"bg-line-default border border-line-default overflow-hidden gap-px",
|
|
49
|
+
v("lg"),
|
|
50
|
+
f ? `grid grid-cols-2 ${G[d]}` : "flex",
|
|
51
|
+
i
|
|
52
|
+
)
|
|
53
|
+
}, a), {
|
|
54
|
+
children: o
|
|
55
|
+
})
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
R as StatGroup
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=StatGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatGroup.js","sources":["../../../../../src/ui/components/Stat/StatGroup.tsx"],"sourcesContent":["import { type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\nimport { getRadiusClass } from \"../../tokens/radius\";\n\nexport type StatGroupLayout = \"strip\" | \"grid\";\nexport type StatGroupCols = 2 | 3 | 4;\n\nexport interface StatGroupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * `strip` — single horizontal row, no wrap. Each `Stat` shares the row\n * width via `flex-1`. Use when you guarantee the horizontal space\n * (hero areas, wide dashboards). On narrow viewports the row does NOT\n * reflow — choose `grid` if you need responsive collapse.\n *\n * `grid` — multi-column grid that reflows. Always 2-up on mobile,\n * expands to `cols` columns at the `md` breakpoint (768 px) and up.\n * Five or more children spill to a second row with the divider lines\n * preserved.\n *\n * @default 'grid'\n */\n layout?: StatGroupLayout;\n /**\n * Desktop column count (≥ 768 px). Only effective in `layout=\"grid\"`;\n * ignored in `layout=\"strip\"`. Mobile is always 2 columns regardless.\n *\n * @default 4\n */\n cols?: StatGroupCols;\n children: ReactNode;\n}\n\n// Tailwind v4 generates `md:grid-cols-N` for N ∈ {2,3,4} statically from\n// the literal class string. The map below ensures the strings exist\n// verbatim in the source so JIT picks them up.\nconst gridColsMd: Record<StatGroupCols, string> = {\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n};\n\n/**\n * `StatGroup` — container for one or more `Stat` blocks with 1-px\n * dividers between them.\n *\n * ### Divider technique\n *\n * The container has `bg-line-default` and `gap-px` (1 px); each child\n * `Stat` carries its own `bg-surface-base`. The 1 px of gap exposes the\n * container's background as the divider line, while each cell masks its\n * own area with `bg-surface-base`. Works identically for the strip\n * layout (vertical dividers) and the grid layout (vertical AND\n * horizontal dividers, automatically, as the grid reflows). No separate\n * `Divider` component, no per-cell border logic.\n *\n * The outer ring is `border border-line-default` matching the gap color,\n * with `rounded-lg` and `overflow-hidden` clipping the inner cells to\n * the radius.\n *\n * ### Server-safe\n *\n * Pure presentation — no hooks, no event handlers on the DOM. Ships in\n * `./server` alongside `Stat`.\n *\n * @example\n * ```tsx\n * <StatGroup layout=\"strip\">\n * <Stat icon={<Users />} value=\"9,4 mil\" label=\"Parlamentares\" align=\"center\" />\n * <Stat icon={<FileText />} value=\"3,2 mil\" label=\"Proposições\" align=\"center\" />\n * <Stat icon={<Vote />} value=\"1,1 mil\" label=\"Votações\" align=\"center\" />\n * <Stat icon={<Clock />} value=\"há 18 dias\" label=\"Última atualização\" align=\"center\" />\n * </StatGroup>\n *\n * <StatGroup layout=\"grid\" cols={4}>\n * <Stat value=\"87%\" label=\"Alinhamento\" hint=\"últimos 12 m\" tone=\"success\" />\n * <Stat value={null} label=\"Sem orientação\" hint=\"no período\" />\n * <Stat value=\"R$ 187.472,95\" label=\"Gastos\" hint=\"no mandato\" />\n * <Stat value=\"42\" label=\"Votações\" hint=\"no banco\" />\n * </StatGroup>\n * ```\n */\nexport function StatGroup({\n layout = \"grid\",\n cols = 4,\n className,\n children,\n ...props\n}: StatGroupProps) {\n const isGrid = layout === \"grid\";\n\n return (\n <div\n className={cn(\n \"bg-line-default border border-line-default overflow-hidden gap-px\",\n getRadiusClass(\"lg\"),\n isGrid ? `grid grid-cols-2 ${gridColsMd[cols]}` : \"flex\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport default StatGroup;\n"],"names":["gridColsMd","StatGroup","_a","_b","layout","cols","className","children","props","__objRest","isGrid","jsx","__spreadProps","__spreadValues","cn","getRadiusClass"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,MAAMA,IAA4C;AAAA,EAChD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AA0CO,SAASC,EAAUC,GAMP;AANO,MAAAC,IAAAD,GACxB;AAAA,YAAAE,IAAS;AAAA,IACT,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,IACA,UAAAC;AAAA,MAJwBJ,GAKrBK,IAAAC,EALqBN,GAKrB;AAAA,IAJH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAMO,IAASN,MAAW;AAE1B,SACE,gBAAAO;AAAA,IAAC;AAAA,IAAAC,EAAAC,EAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAC,EAAe,IAAI;AAAA,QACnBL,IAAS,oBAAoBV,EAAWK,CAAI,CAAC,KAAK;AAAA,QAClDC;AAAA,MAAA;AAAA,OAEEE,IAPL;AAAA,MASE,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|