@fabio.caffarello/react-design-system 3.8.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 +2 -1
- 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/index.cjs +37 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1052 -1053
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +23 -23
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +858 -1193
- package/dist/server/index.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var b = Object.defineProperty, j = Object.defineProperties;
|
|
3
|
+
var w = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var r = Object.getOwnPropertySymbols;
|
|
5
|
+
var d = Object.prototype.hasOwnProperty, o = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var c = (e, a, t) => a in e ? b(e, a, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[a] = t, x = (e, a) => {
|
|
7
|
+
for (var t in a || (a = {}))
|
|
8
|
+
d.call(a, t) && c(e, t, a[t]);
|
|
9
|
+
if (r)
|
|
10
|
+
for (var t of r(a))
|
|
11
|
+
o.call(a, t) && c(e, t, a[t]);
|
|
12
|
+
return e;
|
|
13
|
+
}, p = (e, a) => j(e, w(a));
|
|
14
|
+
var g = (e, a) => {
|
|
15
|
+
var t = {};
|
|
16
|
+
for (var s in e)
|
|
17
|
+
d.call(e, s) && a.indexOf(s) < 0 && (t[s] = e[s]);
|
|
18
|
+
if (e != null && r)
|
|
19
|
+
for (var s of r(e))
|
|
20
|
+
a.indexOf(s) < 0 && o.call(e, s) && (t[s] = e[s]);
|
|
21
|
+
return t;
|
|
22
|
+
};
|
|
23
|
+
import { jsxs as n, jsx as i } from "react/jsx-runtime";
|
|
24
|
+
import y from "../Breadcrumb/Breadcrumb.js";
|
|
25
|
+
import h from "../../primitives/Text/Text.js";
|
|
26
|
+
import { getSpacingClass as l } from "../../tokens/spacing.js";
|
|
27
|
+
import { cn as m } from "../../utils/cn.js";
|
|
28
|
+
import { cva as $ } from "../../utils/cva.js";
|
|
29
|
+
const H = $(
|
|
30
|
+
// Base classes
|
|
31
|
+
m("w-full", "flex", "flex-col", l("sm", "gap")),
|
|
32
|
+
{
|
|
33
|
+
variants: {
|
|
34
|
+
variant: {
|
|
35
|
+
default: m(l("base", "mb")),
|
|
36
|
+
compact: m(l("sm", "mb"))
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
defaultVariants: {
|
|
40
|
+
variant: "default"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
function z(V) {
|
|
45
|
+
var f = V, {
|
|
46
|
+
title: e,
|
|
47
|
+
description: a,
|
|
48
|
+
breadcrumb: t,
|
|
49
|
+
actions: s,
|
|
50
|
+
variant: v = "default",
|
|
51
|
+
className: u
|
|
52
|
+
} = f, N = g(f, [
|
|
53
|
+
"title",
|
|
54
|
+
"description",
|
|
55
|
+
"breadcrumb",
|
|
56
|
+
"actions",
|
|
57
|
+
"variant",
|
|
58
|
+
"className"
|
|
59
|
+
]);
|
|
60
|
+
return /* @__PURE__ */ n("div", p(x({ className: m(H({ variant: v }), u) }, N), { children: [
|
|
61
|
+
t && t.length > 0 && /* @__PURE__ */ i(y, { items: t }),
|
|
62
|
+
/* @__PURE__ */ n(
|
|
63
|
+
"div",
|
|
64
|
+
{
|
|
65
|
+
className: `flex items-start justify-between ${l("base", "gap")}`,
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ n("div", { className: "flex-1 min-w-0", children: [
|
|
68
|
+
/* @__PURE__ */ i(
|
|
69
|
+
h,
|
|
70
|
+
{
|
|
71
|
+
variant: "heading",
|
|
72
|
+
as: "h1",
|
|
73
|
+
className: `${l("sm", "mb")} text-2xl font-bold`,
|
|
74
|
+
children: e
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
a && /* @__PURE__ */ i(h, { variant: "body", className: "text-fg-secondary", children: a })
|
|
78
|
+
] }),
|
|
79
|
+
s && /* @__PURE__ */ i(
|
|
80
|
+
"div",
|
|
81
|
+
{
|
|
82
|
+
className: `flex items-center ${l("sm", "gap")} flex-shrink-0`,
|
|
83
|
+
children: s
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
] }));
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
z as PageHeader,
|
|
93
|
+
z as default
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=PageHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader.js","sources":["../../../../../src/ui/components/PageHeader/PageHeader.tsx"],"sourcesContent":["/**\n * PageHeader Component\n *\n * Page header component with title, description, breadcrumb, and actions.\n *\n * @see EPIC-004: PageHeader Component (Molecule)\n */\n\nimport Breadcrumb from \"../Breadcrumb/Breadcrumb\";\nimport Text from \"../../primitives/Text/Text\";\nimport type { PageHeaderProps } from \"./types\";\nimport { cn, cva } from \"../../utils\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\n/**\n * PageHeader Variants using CVA\n * Type-safe variant system for PageHeader component\n */\nconst pageHeaderVariants = cva(\n // Base classes\n cn(\"w-full\", \"flex\", \"flex-col\", getSpacingClass(\"sm\", \"gap\")),\n {\n variants: {\n variant: {\n default: cn(getSpacingClass(\"base\", \"mb\")),\n compact: cn(getSpacingClass(\"sm\", \"mb\")),\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n/**\n * PageHeader Component\n *\n * Page header with title, description, breadcrumb, and actions.\n *\n * @example\n * ```tsx\n * <PageHeader\n * title=\"Page Title\"\n * description=\"Page description\"\n * breadcrumb={[\n * { label: 'Home', href: '/' },\n * { label: 'Page', href: '/page' },\n * ]}\n * actions={<Button>Action</Button>}\n * />\n * ```\n */\nexport function PageHeader({\n title,\n description,\n breadcrumb,\n actions,\n variant = \"default\",\n className,\n ...props\n}: PageHeaderProps) {\n return (\n <div className={cn(pageHeaderVariants({ variant }), className)} {...props}>\n {/* Breadcrumb */}\n {breadcrumb && breadcrumb.length > 0 && <Breadcrumb items={breadcrumb} />}\n\n {/* Title and Actions Row */}\n <div\n className={`flex items-start justify-between ${getSpacingClass(\"base\", \"gap\")}`}\n >\n {/* Title and Description */}\n <div className=\"flex-1 min-w-0\">\n <Text\n variant=\"heading\"\n as=\"h1\"\n className={`${getSpacingClass(\"sm\", \"mb\")} text-2xl font-bold`}\n >\n {title}\n </Text>\n {description && (\n <Text variant=\"body\" className=\"text-fg-secondary\">\n {description}\n </Text>\n )}\n </div>\n\n {/* Actions */}\n {actions && (\n <div\n className={`flex items-center ${getSpacingClass(\"sm\", \"gap\")} flex-shrink-0`}\n >\n {actions}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default PageHeader;\n"],"names":["pageHeaderVariants","cva","cn","getSpacingClass","PageHeader","_a","_b","title","description","breadcrumb","actions","variant","className","props","__objRest","jsxs","__spreadProps","__spreadValues","jsx","Breadcrumb","Text"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAMA,IAAqBC;AAAA;AAAA,EAEzBC,EAAG,UAAU,QAAQ,YAAYC,EAAgB,MAAM,KAAK,CAAC;AAAA,EAC7D;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAASD,EAAGC,EAAgB,QAAQ,IAAI,CAAC;AAAA,QACzC,SAASD,EAAGC,EAAgB,MAAM,IAAI,CAAC;AAAA,MAAA;AAAA,IACzC;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ;AAoBO,SAASC,EAAWC,GAQP;AARO,MAAAC,IAAAD,GACzB;AAAA,WAAAE;AAAA,IACA,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,WAAAC;AAAA,MANyBN,GAOtBO,IAAAC,EAPsBR,GAOtB;AAAA,IANH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,SACE,gBAAAS,EAAC,OAAAC,EAAAC,EAAA,EAAI,WAAWf,EAAGF,EAAmB,EAAE,SAAAW,EAAA,CAAS,GAAGC,CAAS,KAAOC,IAAnE,EAEE,UAAA;AAAA,IAAAJ,KAAcA,EAAW,SAAS,KAAK,gBAAAS,EAACC,GAAA,EAAW,OAAOV,GAAY;AAAA,IAGvE,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,oCAAoCZ,EAAgB,QAAQ,KAAK,CAAC;AAAA,QAG7E,UAAA;AAAA,UAAA,gBAAAY,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAG;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAG;AAAA,gBACH,WAAW,GAAGjB,EAAgB,MAAM,IAAI,CAAC;AAAA,gBAExC,UAAAI;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFC,KACC,gBAAAU,EAACE,GAAA,EAAK,SAAQ,QAAO,WAAU,qBAC5B,UAAAZ,EAAA,CACH;AAAA,UAAA,GAEJ;AAAA,UAGCE,KACC,gBAAAQ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,qBAAqBf,EAAgB,MAAM,KAAK,CAAC;AAAA,cAE3D,UAAAO;AAAA,YAAA;AAAA,UAAA;AAAA,QACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ,IACF;AAEJ;"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var G = Object.defineProperty, M = Object.defineProperties;
|
|
3
|
+
var T = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var d = Object.getOwnPropertySymbols;
|
|
5
|
+
var v = Object.prototype.hasOwnProperty, b = Object.prototype.propertyIsEnumerable;
|
|
6
|
+
var a = (i, s, p) => s in i ? G(i, s, { enumerable: !0, configurable: !0, writable: !0, value: p }) : i[s] = p, y = (i, s) => {
|
|
7
|
+
for (var p in s || (s = {}))
|
|
8
|
+
v.call(s, p) && a(i, p, s[p]);
|
|
9
|
+
if (d)
|
|
10
|
+
for (var p of d(s))
|
|
11
|
+
b.call(s, p) && a(i, p, s[p]);
|
|
12
|
+
return i;
|
|
13
|
+
}, N = (i, s) => M(i, T(s));
|
|
14
|
+
var z = (i, s) => {
|
|
15
|
+
var p = {};
|
|
16
|
+
for (var e in i)
|
|
17
|
+
v.call(i, e) && s.indexOf(e) < 0 && (p[e] = i[e]);
|
|
18
|
+
if (i != null && d)
|
|
19
|
+
for (var e of d(i))
|
|
20
|
+
s.indexOf(e) < 0 && b.call(i, e) && (p[e] = i[e]);
|
|
21
|
+
return p;
|
|
22
|
+
};
|
|
23
|
+
import { jsxs as f, jsx as m } from "react/jsx-runtime";
|
|
24
|
+
import { cn as r } from "../../utils/cn.js";
|
|
25
|
+
import { getSpacingClass as c } from "../../tokens/spacing.js";
|
|
26
|
+
import { Button as h } from "../../primitives/Button/Button.js";
|
|
27
|
+
import { getTypographySizeFromFontSize as q } from "../../tokens/typography.js";
|
|
28
|
+
function Q(D) {
|
|
29
|
+
var t = D, {
|
|
30
|
+
currentPage: i,
|
|
31
|
+
totalPages: s,
|
|
32
|
+
onPageChange: p,
|
|
33
|
+
totalItems: e,
|
|
34
|
+
itemsPerPage: o,
|
|
35
|
+
showPageInfo: k = !0,
|
|
36
|
+
className: S = ""
|
|
37
|
+
} = t, j = z(t, [
|
|
38
|
+
"currentPage",
|
|
39
|
+
"totalPages",
|
|
40
|
+
"onPageChange",
|
|
41
|
+
"totalItems",
|
|
42
|
+
"itemsPerPage",
|
|
43
|
+
"showPageInfo",
|
|
44
|
+
"className"
|
|
45
|
+
]);
|
|
46
|
+
const C = () => {
|
|
47
|
+
i > 1 && p(i - 1);
|
|
48
|
+
}, w = () => {
|
|
49
|
+
i < s && p(i + 1);
|
|
50
|
+
}, F = (l) => {
|
|
51
|
+
l >= 1 && l <= s && l !== i && p(l);
|
|
52
|
+
}, V = () => {
|
|
53
|
+
const l = [];
|
|
54
|
+
if (s <= 5)
|
|
55
|
+
for (let n = 1; n <= s; n++)
|
|
56
|
+
l.push(n);
|
|
57
|
+
else if (i <= 3) {
|
|
58
|
+
for (let n = 1; n <= 4; n++)
|
|
59
|
+
l.push(n);
|
|
60
|
+
l.push("ellipsis"), l.push(s);
|
|
61
|
+
} else if (i >= s - 2) {
|
|
62
|
+
l.push(1), l.push("ellipsis");
|
|
63
|
+
for (let n = s - 3; n <= s; n++)
|
|
64
|
+
l.push(n);
|
|
65
|
+
} else {
|
|
66
|
+
l.push(1), l.push("ellipsis");
|
|
67
|
+
for (let n = i - 1; n <= i + 1; n++)
|
|
68
|
+
l.push(n);
|
|
69
|
+
l.push("ellipsis"), l.push(s);
|
|
70
|
+
}
|
|
71
|
+
return l;
|
|
72
|
+
}, $ = e && o ? (i - 1) * o + 1 : void 0, A = e && o ? Math.min(i * o, e) : void 0, B = r(
|
|
73
|
+
"flex",
|
|
74
|
+
"items-center",
|
|
75
|
+
"justify-between",
|
|
76
|
+
c("base", "px"),
|
|
77
|
+
c("md", "py"),
|
|
78
|
+
S
|
|
79
|
+
);
|
|
80
|
+
return /* @__PURE__ */ f("nav", N(y({ className: B, "aria-label": "Pagination" }, j), { children: [
|
|
81
|
+
/* @__PURE__ */ f("div", { className: r("flex", "items-center", c("sm", "gap")), children: [
|
|
82
|
+
/* @__PURE__ */ m(
|
|
83
|
+
h,
|
|
84
|
+
{
|
|
85
|
+
variant: "secondary",
|
|
86
|
+
onClick: C,
|
|
87
|
+
disabled: i === 1,
|
|
88
|
+
size: "sm",
|
|
89
|
+
children: "Previous"
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ m(
|
|
93
|
+
"div",
|
|
94
|
+
{
|
|
95
|
+
className: r("flex", "items-center", c("xs", "gap")),
|
|
96
|
+
children: V().map((l, u) => {
|
|
97
|
+
if (l === "ellipsis")
|
|
98
|
+
return /* @__PURE__ */ m(
|
|
99
|
+
"span",
|
|
100
|
+
{
|
|
101
|
+
className: r(
|
|
102
|
+
c("sm", "px"),
|
|
103
|
+
"text-fg-tertiary"
|
|
104
|
+
),
|
|
105
|
+
children: "..."
|
|
106
|
+
},
|
|
107
|
+
`ellipsis-${u}`
|
|
108
|
+
);
|
|
109
|
+
const n = l, x = n === i;
|
|
110
|
+
return /* @__PURE__ */ m(
|
|
111
|
+
h,
|
|
112
|
+
{
|
|
113
|
+
variant: x ? "primary" : "ghost",
|
|
114
|
+
onClick: () => F(n),
|
|
115
|
+
size: "sm",
|
|
116
|
+
"aria-current": x ? "page" : void 0,
|
|
117
|
+
"aria-label": `Go to page ${n}`,
|
|
118
|
+
children: n
|
|
119
|
+
},
|
|
120
|
+
n
|
|
121
|
+
);
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
/* @__PURE__ */ m(
|
|
126
|
+
h,
|
|
127
|
+
{
|
|
128
|
+
variant: "secondary",
|
|
129
|
+
onClick: w,
|
|
130
|
+
disabled: i === s,
|
|
131
|
+
size: "sm",
|
|
132
|
+
children: "Next"
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
] }),
|
|
136
|
+
k && e && o && /* @__PURE__ */ f(
|
|
137
|
+
"div",
|
|
138
|
+
{
|
|
139
|
+
className: r(q("sm"), "text-fg-primary"),
|
|
140
|
+
children: [
|
|
141
|
+
"Showing ",
|
|
142
|
+
$,
|
|
143
|
+
" to ",
|
|
144
|
+
A,
|
|
145
|
+
" of ",
|
|
146
|
+
e,
|
|
147
|
+
" results"
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
] }));
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
Q as default
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../../../src/ui/components/Pagination/Pagination.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\nimport { Button } from \"../../primitives\";\nimport { cn } from \"../../utils\";\nimport { getSpacingClass, getTypographySizeFromFontSize } from \"../../tokens\";\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n totalItems?: number;\n itemsPerPage?: number;\n showPageInfo?: boolean;\n}\n\n/**\n * Pagination Component\n *\n * A pagination component for navigating through pages of data.\n * Follows Atomic Design principles as a Molecule component.\n *\n * @example\n * ```tsx\n * <Pagination\n * currentPage={1}\n * totalPages={10}\n * onPageChange={(page) => setPage(page)}\n * totalItems={100}\n * itemsPerPage={10}\n * />\n * ```\n */\nexport default function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n totalItems,\n itemsPerPage,\n showPageInfo = true,\n className = \"\",\n ...props\n}: Props) {\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handlePageClick = (page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = 5;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n if (currentPage <= 3) {\n for (let i = 1; i <= 4; i++) {\n pages.push(i);\n }\n pages.push(\"ellipsis\");\n pages.push(totalPages);\n } else if (currentPage >= totalPages - 2) {\n pages.push(1);\n pages.push(\"ellipsis\");\n for (let i = totalPages - 3; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"ellipsis\");\n for (let i = currentPage - 1; i <= currentPage + 1; i++) {\n pages.push(i);\n }\n pages.push(\"ellipsis\");\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const startItem =\n totalItems && itemsPerPage\n ? (currentPage - 1) * itemsPerPage + 1\n : undefined;\n const endItem =\n totalItems && itemsPerPage\n ? Math.min(currentPage * itemsPerPage, totalItems)\n : undefined;\n\n const classes = cn(\n \"flex\",\n \"items-center\",\n \"justify-between\",\n getSpacingClass(\"base\", \"px\"),\n getSpacingClass(\"md\", \"py\"),\n className,\n );\n\n return (\n <nav className={classes} aria-label=\"Pagination\" {...props}>\n <div className={cn(\"flex\", \"items-center\", getSpacingClass(\"sm\", \"gap\"))}>\n <Button\n variant=\"secondary\"\n onClick={handlePrevious}\n disabled={currentPage === 1}\n size=\"sm\"\n >\n Previous\n </Button>\n <div\n className={cn(\"flex\", \"items-center\", getSpacingClass(\"xs\", \"gap\"))}\n >\n {getPageNumbers().map((page, index) => {\n if (page === \"ellipsis\") {\n return (\n <span\n key={`ellipsis-${index}`}\n className={cn(\n getSpacingClass(\"sm\", \"px\"),\n \"text-fg-tertiary\",\n )}\n >\n ...\n </span>\n );\n }\n\n const pageNum = page as number;\n const isActive = pageNum === currentPage;\n\n return (\n <Button\n key={pageNum}\n variant={isActive ? \"primary\" : \"ghost\"}\n onClick={() => handlePageClick(pageNum)}\n size=\"sm\"\n aria-current={isActive ? \"page\" : undefined}\n aria-label={`Go to page ${pageNum}`}\n >\n {pageNum}\n </Button>\n );\n })}\n </div>\n <Button\n variant=\"secondary\"\n onClick={handleNext}\n disabled={currentPage === totalPages}\n size=\"sm\"\n >\n Next\n </Button>\n </div>\n {showPageInfo && totalItems && itemsPerPage && (\n <div\n className={cn(getTypographySizeFromFontSize(\"sm\"), \"text-fg-primary\")}\n >\n Showing {startItem} to {endItem} of {totalItems} results\n </div>\n )}\n </nav>\n );\n}\n"],"names":["Pagination","_a","_b","currentPage","totalPages","onPageChange","totalItems","itemsPerPage","showPageInfo","className","props","__objRest","handlePrevious","handleNext","handlePageClick","page","getPageNumbers","pages","i","startItem","endItem","classes","cn","getSpacingClass","__spreadProps","__spreadValues","jsxs","jsx","Button","index","pageNum","isActive","getTypographySizeFromFontSize"],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as $, jsx as m } from "react/jsx-runtime";
|
|
3
|
+
import { useState as k, useRef as S, useId as B, useCallback as x, useEffect as w } from "react";
|
|
4
|
+
import { createPortal as F } from "react-dom";
|
|
5
|
+
import { X as H } from "lucide-react";
|
|
6
|
+
import { getSpacingClass as u } from "../../tokens/spacing.js";
|
|
7
|
+
import { getRadiusClass as Z } from "../../tokens/radius.js";
|
|
8
|
+
import { getShadowClass as q } from "../../tokens/shadows.js";
|
|
9
|
+
import { getZIndexClass as D } from "../../tokens/z-index.js";
|
|
10
|
+
import { getAnimationClass as G } from "../../tokens/animations.js";
|
|
11
|
+
import { getTypographySize as J, getTypographyWeight as K } from "../../tokens/typography.js";
|
|
12
|
+
import { useFocusRestore as Q } from "../../hooks/useFocusRestore.js";
|
|
13
|
+
import { Button as U } from "../../primitives/Button/Button.js";
|
|
14
|
+
function at({
|
|
15
|
+
trigger: W,
|
|
16
|
+
children: z,
|
|
17
|
+
open: E,
|
|
18
|
+
defaultOpen: I = !1,
|
|
19
|
+
onOpenChange: g,
|
|
20
|
+
placement: o = "bottom",
|
|
21
|
+
showCloseButton: v = !1,
|
|
22
|
+
title: f,
|
|
23
|
+
closeOnClickOutside: R = !0,
|
|
24
|
+
closeOnEscape: C = !0,
|
|
25
|
+
className: M = "",
|
|
26
|
+
triggerClassName: P = "",
|
|
27
|
+
contentClassName: j = ""
|
|
28
|
+
}) {
|
|
29
|
+
const [T, X] = k(I), c = S(null), d = S(null), [L, Y] = k({ top: 0, left: 0 }), N = B(), b = E !== void 0, i = b ? E : T;
|
|
30
|
+
Q(i);
|
|
31
|
+
const a = x(() => {
|
|
32
|
+
if (!c.current || !d.current) return;
|
|
33
|
+
const t = c.current.getBoundingClientRect(), e = d.current.getBoundingClientRect(), n = window.scrollY, l = window.scrollX;
|
|
34
|
+
let r = 0, s = 0;
|
|
35
|
+
o.startsWith("top") ? (r = t.top + n - e.height - 8, o === "top-start" ? s = t.left + l : o === "top-end" ? s = t.right + l - e.width : s = t.left + l + (t.width - e.width) / 2) : o.startsWith("bottom") ? (r = t.bottom + n + 8, o === "bottom-start" ? s = t.left + l : o === "bottom-end" ? s = t.right + l - e.width : s = t.left + l + (t.width - e.width) / 2) : o.startsWith("left") ? (s = t.left + l - e.width - 8, o === "left-start" ? r = t.top + n : o === "left-end" ? r = t.bottom + n - e.height : r = t.top + n + (t.height - e.height) / 2) : o.startsWith("right") && (s = t.right + l + 8, o === "right-start" ? r = t.top + n : o === "right-end" ? r = t.bottom + n - e.height : r = t.top + n + (t.height - e.height) / 2);
|
|
36
|
+
const p = 8;
|
|
37
|
+
r = Math.max(
|
|
38
|
+
p,
|
|
39
|
+
Math.min(
|
|
40
|
+
r,
|
|
41
|
+
window.innerHeight + n - e.height - p
|
|
42
|
+
)
|
|
43
|
+
), s = Math.max(
|
|
44
|
+
p,
|
|
45
|
+
Math.min(s, window.innerWidth + l - e.width - p)
|
|
46
|
+
), Y({ top: r, left: s });
|
|
47
|
+
}, [o]);
|
|
48
|
+
w(() => {
|
|
49
|
+
if (i) {
|
|
50
|
+
a();
|
|
51
|
+
const t = () => a(), e = () => a();
|
|
52
|
+
return window.addEventListener("resize", t), window.addEventListener("scroll", e, !0), () => {
|
|
53
|
+
window.removeEventListener("resize", t), window.removeEventListener("scroll", e, !0);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}, [i, o, a]), w(() => {
|
|
57
|
+
i && d.current && setTimeout(a, 0);
|
|
58
|
+
}, [i, a]);
|
|
59
|
+
const y = x(
|
|
60
|
+
(t) => {
|
|
61
|
+
b || X(t), g == null || g(t);
|
|
62
|
+
},
|
|
63
|
+
[b, g]
|
|
64
|
+
), h = x(() => {
|
|
65
|
+
y(!1);
|
|
66
|
+
}, [y]);
|
|
67
|
+
w(() => {
|
|
68
|
+
if (i && C) {
|
|
69
|
+
const t = (e) => {
|
|
70
|
+
e.key === "Escape" && h();
|
|
71
|
+
};
|
|
72
|
+
return document.addEventListener("keydown", t), () => document.removeEventListener("keydown", t);
|
|
73
|
+
}
|
|
74
|
+
}, [i, C, h]), w(() => {
|
|
75
|
+
if (i && R) {
|
|
76
|
+
const t = (e) => {
|
|
77
|
+
d.current && c.current && !d.current.contains(e.target) && !c.current.contains(e.target) && h();
|
|
78
|
+
};
|
|
79
|
+
return document.addEventListener("mousedown", t), () => document.removeEventListener("mousedown", t);
|
|
80
|
+
}
|
|
81
|
+
}, [i, R, h]);
|
|
82
|
+
const A = i ? /* @__PURE__ */ $(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
ref: d,
|
|
86
|
+
className: `
|
|
87
|
+
absolute
|
|
88
|
+
${D("popover")}
|
|
89
|
+
bg-surface-overlay
|
|
90
|
+
${Z("lg")}
|
|
91
|
+
${q("lg")}
|
|
92
|
+
border
|
|
93
|
+
border-line-default
|
|
94
|
+
min-w-48
|
|
95
|
+
max-w-96
|
|
96
|
+
${G("base")}
|
|
97
|
+
${j}
|
|
98
|
+
`,
|
|
99
|
+
style: {
|
|
100
|
+
top: `${L.top}px`,
|
|
101
|
+
left: `${L.left}px`
|
|
102
|
+
},
|
|
103
|
+
role: "dialog",
|
|
104
|
+
"aria-modal": "false",
|
|
105
|
+
"aria-labelledby": f ? N : void 0,
|
|
106
|
+
children: [
|
|
107
|
+
(f || v) && /* @__PURE__ */ $(
|
|
108
|
+
"div",
|
|
109
|
+
{
|
|
110
|
+
className: `
|
|
111
|
+
flex
|
|
112
|
+
items-center
|
|
113
|
+
justify-between
|
|
114
|
+
${u("base", "px")}
|
|
115
|
+
${u("md", "py")}
|
|
116
|
+
border-b
|
|
117
|
+
border-line-default
|
|
118
|
+
`,
|
|
119
|
+
children: [
|
|
120
|
+
f && /* @__PURE__ */ m(
|
|
121
|
+
"h3",
|
|
122
|
+
{
|
|
123
|
+
id: N,
|
|
124
|
+
className: `${J("bodySmall")} ${K("h5")} text-fg-primary`,
|
|
125
|
+
children: f
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
v && /* @__PURE__ */ m(
|
|
129
|
+
U,
|
|
130
|
+
{
|
|
131
|
+
variant: "ghost",
|
|
132
|
+
size: "sm",
|
|
133
|
+
onClick: h,
|
|
134
|
+
className: `h-auto ${u("xs", "p")}`,
|
|
135
|
+
"aria-label": "Close popover",
|
|
136
|
+
children: /* @__PURE__ */ m(H, { className: "h-4 w-4" })
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
),
|
|
142
|
+
/* @__PURE__ */ m(
|
|
143
|
+
"div",
|
|
144
|
+
{
|
|
145
|
+
className: `
|
|
146
|
+
${u("base", "p")}
|
|
147
|
+
${f || v ? "" : u("md", "p")}
|
|
148
|
+
`,
|
|
149
|
+
children: z
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
) : null;
|
|
155
|
+
return /* @__PURE__ */ $("div", { className: `inline-block ${M}`, children: [
|
|
156
|
+
/* @__PURE__ */ m(
|
|
157
|
+
"div",
|
|
158
|
+
{
|
|
159
|
+
ref: c,
|
|
160
|
+
className: P,
|
|
161
|
+
onClick: () => y(!i),
|
|
162
|
+
children: W
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
typeof window != "undefined" && F(A, document.body)
|
|
166
|
+
] });
|
|
167
|
+
}
|
|
168
|
+
export {
|
|
169
|
+
at as default
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=Popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.js","sources":["../../../../../src/ui/components/Popover/Popover.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useState,\n useRef,\n useEffect,\n useCallback,\n useId,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\nimport { getRadiusClass } from \"../../tokens/radius\";\nimport { getShadowClass } from \"../../tokens/shadows\";\nimport { getZIndexClass } from \"../../tokens/z-index\";\nimport { getAnimationClass } from \"../../tokens/animations\";\nimport {\n getTypographySize,\n getTypographyWeight,\n} from \"../../tokens/typography\";\nimport { useFocusRestore } from \"../../hooks/useFocusRestore\";\nimport Button from \"../../primitives/Button/Button\";\n\nexport type PopoverPlacement =\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport interface PopoverProps {\n trigger: ReactNode;\n children: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: PopoverPlacement;\n showCloseButton?: boolean;\n title?: string;\n closeOnClickOutside?: boolean;\n closeOnEscape?: boolean;\n className?: string;\n triggerClassName?: string;\n contentClassName?: string;\n}\n\n/**\n * Popover Component\n *\n * A popover component that displays content in a floating panel.\n * Supports positioning, portal rendering, and keyboard navigation.\n * Follows Atomic Design principles as an Atom component.\n *\n * @example\n * ```tsx\n * <Popover\n * trigger={<Button>Open Popover</Button>}\n * title=\"Popover Title\"\n * >\n * <p>Popover content goes here</p>\n * </Popover>\n * ```\n */\nexport default function Popover({\n trigger,\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement = \"bottom\",\n showCloseButton = false,\n title,\n closeOnClickOutside = true,\n closeOnEscape = true,\n className = \"\",\n triggerClassName = \"\",\n contentClassName = \"\",\n}: PopoverProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const titleId = useId();\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n // Non-modal focus contract: restore only. Popover is explicitly\n // non-modal (aria-modal=\"false\" below), so per the WAI-ARIA disclosure\n // pattern it does NOT trap focus and does NOT auto-focus on open.\n // Users tab THROUGH the trigger / panel naturally. The single\n // obligation it does carry: when the panel closes (Escape,\n // click-outside, programmatic), focus should return to whatever had\n // it before the panel opened — typically the trigger button — so the\n // keyboard user is not stranded.\n //\n // Trigger-ref-free by design: `useFocusRestore` snapshots\n // `document.activeElement` at open time, which captures the trigger\n // wrapper or any other element that opened the popover. Avoids\n // coupling restore to a specific `triggerRef`, leaves room for\n // programmatic opens (notifications, kebab menus that reopen on\n // focus event, etc.).\n useFocusRestore(isOpen);\n\n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !popoverRef.current) return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const scrollY = window.scrollY;\n const scrollX = window.scrollX;\n\n let top = 0;\n let left = 0;\n\n // Calculate position based on placement\n if (placement.startsWith(\"top\")) {\n top = triggerRect.top + scrollY - popoverRect.height - 8;\n if (placement === \"top-start\") left = triggerRect.left + scrollX;\n else if (placement === \"top-end\")\n left = triggerRect.right + scrollX - popoverRect.width;\n else\n left =\n triggerRect.left +\n scrollX +\n (triggerRect.width - popoverRect.width) / 2;\n } else if (placement.startsWith(\"bottom\")) {\n top = triggerRect.bottom + scrollY + 8;\n if (placement === \"bottom-start\") left = triggerRect.left + scrollX;\n else if (placement === \"bottom-end\")\n left = triggerRect.right + scrollX - popoverRect.width;\n else\n left =\n triggerRect.left +\n scrollX +\n (triggerRect.width - popoverRect.width) / 2;\n } else if (placement.startsWith(\"left\")) {\n left = triggerRect.left + scrollX - popoverRect.width - 8;\n if (placement === \"left-start\") top = triggerRect.top + scrollY;\n else if (placement === \"left-end\")\n top = triggerRect.bottom + scrollY - popoverRect.height;\n else\n top =\n triggerRect.top +\n scrollY +\n (triggerRect.height - popoverRect.height) / 2;\n } else if (placement.startsWith(\"right\")) {\n left = triggerRect.right + scrollX + 8;\n if (placement === \"right-start\") top = triggerRect.top + scrollY;\n else if (placement === \"right-end\")\n top = triggerRect.bottom + scrollY - popoverRect.height;\n else\n top =\n triggerRect.top +\n scrollY +\n (triggerRect.height - popoverRect.height) / 2;\n }\n\n // Keep within viewport\n const padding = 8;\n top = Math.max(\n padding,\n Math.min(\n top,\n window.innerHeight + scrollY - popoverRect.height - padding,\n ),\n );\n left = Math.max(\n padding,\n Math.min(left, window.innerWidth + scrollX - popoverRect.width - padding),\n );\n\n setPosition({ top, left });\n }, [placement]);\n\n useEffect(() => {\n if (isOpen) {\n updatePosition();\n const handleResize = () => updatePosition();\n const handleScroll = () => updatePosition();\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleScroll, true);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleScroll, true);\n };\n }\n }, [isOpen, placement, updatePosition]);\n\n useEffect(() => {\n if (isOpen && popoverRef.current) {\n // Small delay to ensure DOM is ready\n setTimeout(updatePosition, 0);\n }\n }, [isOpen, updatePosition]);\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n },\n [isControlled, onOpenChange],\n );\n\n const handleClose = useCallback(() => {\n handleOpenChange(false);\n }, [handleOpenChange]);\n\n useEffect(() => {\n if (isOpen && closeOnEscape) {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n handleClose();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }\n }, [isOpen, closeOnEscape, handleClose]);\n\n useEffect(() => {\n if (isOpen && closeOnClickOutside) {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n triggerRef.current &&\n !popoverRef.current.contains(e.target as Node) &&\n !triggerRef.current.contains(e.target as Node)\n ) {\n handleClose();\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }, [isOpen, closeOnClickOutside, handleClose]);\n\n const popoverContent = isOpen ? (\n <div\n ref={popoverRef}\n className={`\n absolute\n ${getZIndexClass(\"popover\")}\n bg-surface-overlay\n ${getRadiusClass(\"lg\")}\n ${getShadowClass(\"lg\")}\n border\n border-line-default\n min-w-48\n max-w-96\n ${getAnimationClass(\"base\")}\n ${contentClassName}\n `}\n style={{\n top: `${position.top}px`,\n left: `${position.left}px`,\n }}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? titleId : undefined}\n >\n {(title || showCloseButton) && (\n <div\n className={`\n flex\n items-center\n justify-between\n ${getSpacingClass(\"base\", \"px\")}\n ${getSpacingClass(\"md\", \"py\")}\n border-b\n border-line-default\n `}\n >\n {title && (\n <h3\n id={titleId}\n className={`${getTypographySize(\"bodySmall\")} ${getTypographyWeight(\"h5\")} text-fg-primary`}\n >\n {title}\n </h3>\n )}\n {showCloseButton && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClose}\n className={`h-auto ${getSpacingClass(\"xs\", \"p\")}`}\n aria-label=\"Close popover\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n )}\n <div\n className={`\n ${getSpacingClass(\"base\", \"p\")}\n ${title || showCloseButton ? \"\" : getSpacingClass(\"md\", \"p\")}\n `}\n >\n {children}\n </div>\n </div>\n ) : null;\n\n return (\n <div className={`inline-block ${className}`}>\n <div\n ref={triggerRef}\n className={triggerClassName}\n onClick={() => handleOpenChange(!isOpen)}\n >\n {trigger}\n </div>\n {typeof window !== \"undefined\" &&\n createPortal(popoverContent, document.body)}\n </div>\n );\n}\n"],"names":["Popover","trigger","children","controlledOpen","defaultOpen","onOpenChange","placement","showCloseButton","title","closeOnClickOutside","closeOnEscape","className","triggerClassName","contentClassName","internalOpen","setInternalOpen","useState","triggerRef","useRef","popoverRef","position","setPosition","titleId","useId","isControlled","isOpen","useFocusRestore","updatePosition","useCallback","triggerRect","popoverRect","scrollY","scrollX","top","left","padding","useEffect","handleResize","handleScroll","handleOpenChange","newOpen","handleClose","handleEscape","handleClickOutside","popoverContent","jsxs","getZIndexClass","getRadiusClass","getShadowClass","getAnimationClass","getSpacingClass","jsx","getTypographySize","getTypographyWeight","Button","X","createPortal"],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as g, jsx as l } from "react/jsx-runtime";
|
|
3
|
+
import { useState as w } from "react";
|
|
4
|
+
import { Star as o } from "lucide-react";
|
|
5
|
+
import { cn as c } from "../../utils/cn.js";
|
|
6
|
+
import { getTypographySizeFromFontSize as T } from "../../tokens/typography.js";
|
|
7
|
+
import { getSpacingClass as E } from "../../tokens/spacing.js";
|
|
8
|
+
import { getAnimationClass as V } from "../../tokens/animations.js";
|
|
9
|
+
function U({
|
|
10
|
+
value: N,
|
|
11
|
+
defaultValue: F = 0,
|
|
12
|
+
max: r = 5,
|
|
13
|
+
size: I = "md",
|
|
14
|
+
variant: a = "filled",
|
|
15
|
+
readOnly: e = !1,
|
|
16
|
+
allowHalf: h = !1,
|
|
17
|
+
showValue: M = !1,
|
|
18
|
+
onChange: f,
|
|
19
|
+
onHover: m,
|
|
20
|
+
className: $ = "",
|
|
21
|
+
icon: z,
|
|
22
|
+
emptyIcon: R
|
|
23
|
+
}) {
|
|
24
|
+
const [j, A] = w(F), [u, b] = w(null), v = N !== void 0, n = u != null ? u : v ? N : j, D = {
|
|
25
|
+
sm: "h-4 w-4",
|
|
26
|
+
md: "h-5 w-5",
|
|
27
|
+
lg: "h-6 w-6"
|
|
28
|
+
}, C = (s) => {
|
|
29
|
+
e || (v || A(s), f == null || f(s));
|
|
30
|
+
}, L = (s) => {
|
|
31
|
+
e || (b(s), m == null || m(s));
|
|
32
|
+
}, y = () => {
|
|
33
|
+
e || b(null);
|
|
34
|
+
}, K = (s) => {
|
|
35
|
+
const t = s + 1, x = h && n >= t - 0.5 && n < t, d = n >= t, i = c(
|
|
36
|
+
D[I],
|
|
37
|
+
V("base"),
|
|
38
|
+
!e && "cursor-pointer",
|
|
39
|
+
d || x ? "text-fg-warning" : "text-fg-disabled"
|
|
40
|
+
), k = z || /* @__PURE__ */ l(o, { className: i, fill: d ? "currentColor" : "none" }), S = R || /* @__PURE__ */ l(o, { className: i, fill: "none" });
|
|
41
|
+
return /* @__PURE__ */ l(
|
|
42
|
+
"span",
|
|
43
|
+
{
|
|
44
|
+
className: "relative inline-block",
|
|
45
|
+
onClick: () => C(t),
|
|
46
|
+
onMouseEnter: () => L(t),
|
|
47
|
+
onMouseLeave: y,
|
|
48
|
+
role: e ? void 0 : "button",
|
|
49
|
+
tabIndex: e ? void 0 : 0,
|
|
50
|
+
"aria-label": e ? void 0 : `Rate ${t} out of ${r}`,
|
|
51
|
+
onKeyDown: (p) => {
|
|
52
|
+
!e && (p.key === "Enter" || p.key === " ") && (p.preventDefault(), C(t));
|
|
53
|
+
},
|
|
54
|
+
children: x ? /* @__PURE__ */ g("span", { className: "relative inline-block", children: [
|
|
55
|
+
/* @__PURE__ */ l(
|
|
56
|
+
"span",
|
|
57
|
+
{
|
|
58
|
+
className: "absolute inset-0 overflow-hidden",
|
|
59
|
+
style: { width: "50%" },
|
|
60
|
+
children: a === "filled" ? /* @__PURE__ */ l(o, { className: i, fill: "currentColor" }) : k
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
a === "filled" ? /* @__PURE__ */ l(o, { className: i, fill: "none" }) : S
|
|
64
|
+
] }) : d ? a === "filled" ? /* @__PURE__ */ l(o, { className: i, fill: "currentColor" }) : k : a === "filled" ? /* @__PURE__ */ l(o, { className: i, fill: "none" }) : S
|
|
65
|
+
},
|
|
66
|
+
s
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
|
+
return /* @__PURE__ */ g(
|
|
70
|
+
"div",
|
|
71
|
+
{
|
|
72
|
+
className: c(
|
|
73
|
+
"inline-flex",
|
|
74
|
+
"items-center",
|
|
75
|
+
E("xs", "gap"),
|
|
76
|
+
$
|
|
77
|
+
),
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ l(
|
|
80
|
+
"div",
|
|
81
|
+
{
|
|
82
|
+
className: c("flex", "items-center"),
|
|
83
|
+
role: e ? "img" : void 0,
|
|
84
|
+
"aria-label": e ? `Rating: ${n} out of ${r}` : void 0,
|
|
85
|
+
children: Array.from({ length: r }, (s, t) => K(t))
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
M && /* @__PURE__ */ g(
|
|
89
|
+
"span",
|
|
90
|
+
{
|
|
91
|
+
className: c(
|
|
92
|
+
E("sm", "ml"),
|
|
93
|
+
T("sm"),
|
|
94
|
+
"text-fg-secondary"
|
|
95
|
+
),
|
|
96
|
+
children: [
|
|
97
|
+
n.toFixed(h ? 1 : 0),
|
|
98
|
+
"/",
|
|
99
|
+
r
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
U as default
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=Rating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rating.js","sources":["../../../../../src/ui/components/Rating/Rating.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { Star } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport {\n getSpacingClass,\n getAnimationClass,\n getTypographySizeFromFontSize,\n} from \"../../tokens\";\n\nexport type RatingSize = \"sm\" | \"md\" | \"lg\";\nexport type RatingVariant = \"filled\" | \"outlined\";\n\nexport interface RatingProps {\n value?: number;\n defaultValue?: number;\n max?: number;\n size?: RatingSize;\n variant?: RatingVariant;\n readOnly?: boolean;\n allowHalf?: boolean;\n showValue?: boolean;\n onChange?: (value: number) => void;\n onHover?: (value: number) => void;\n className?: string;\n icon?: ReactNode;\n emptyIcon?: ReactNode;\n}\n\n/**\n * Rating Component\n *\n * A rating component for displaying and selecting ratings.\n * Supports filled and outlined variants, half ratings, and read-only mode.\n * Follows Atomic Design principles as a Molecule component.\n *\n * @example\n * ```tsx\n * <Rating value={4} max={5} onChange={(value) => console.log(value)} />\n *\n * <Rating value={3.5} readOnly showValue />\n * ```\n */\nexport default function Rating({\n value: controlledValue,\n defaultValue = 0,\n max = 5,\n size = \"md\",\n variant = \"filled\",\n readOnly = false,\n allowHalf = false,\n showValue = false,\n onChange,\n onHover,\n className = \"\",\n icon,\n emptyIcon,\n}: RatingProps) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [hoverValue, setHoverValue] = useState<number | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const displayValue =\n hoverValue ?? (isControlled ? controlledValue : internalValue);\n\n const sizeConfig = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n };\n\n const handleClick = (newValue: number) => {\n if (readOnly) return;\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleMouseEnter = (newValue: number) => {\n if (readOnly) return;\n setHoverValue(newValue);\n onHover?.(newValue);\n };\n\n const handleMouseLeave = () => {\n if (readOnly) return;\n setHoverValue(null);\n };\n\n const renderStar = (index: number) => {\n const starValue = index + 1;\n const isHalf =\n allowHalf && displayValue >= starValue - 0.5 && displayValue < starValue;\n const isFilled = displayValue >= starValue;\n\n const starClasses = cn(\n sizeConfig[size],\n getAnimationClass(\"base\"),\n !readOnly && \"cursor-pointer\",\n isFilled || isHalf ? \"text-fg-warning\" : \"text-fg-disabled\",\n );\n\n const CustomIcon = icon || (\n <Star className={starClasses} fill={isFilled ? \"currentColor\" : \"none\"} />\n );\n const CustomEmptyIcon = emptyIcon || (\n <Star className={starClasses} fill=\"none\" />\n );\n\n return (\n <span\n key={index}\n className=\"relative inline-block\"\n onClick={() => handleClick(starValue)}\n onMouseEnter={() => handleMouseEnter(starValue)}\n onMouseLeave={handleMouseLeave}\n role={readOnly ? undefined : \"button\"}\n tabIndex={readOnly ? undefined : 0}\n aria-label={readOnly ? undefined : `Rate ${starValue} out of ${max}`}\n onKeyDown={(e) => {\n if (!readOnly && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleClick(starValue);\n }\n }}\n >\n {isHalf ? (\n <span className=\"relative inline-block\">\n <span\n className=\"absolute inset-0 overflow-hidden\"\n style={{ width: \"50%\" }}\n >\n {variant === \"filled\" ? (\n <Star className={starClasses} fill=\"currentColor\" />\n ) : (\n CustomIcon\n )}\n </span>\n {variant === \"filled\" ? (\n <Star className={starClasses} fill=\"none\" />\n ) : (\n CustomEmptyIcon\n )}\n </span>\n ) : isFilled ? (\n variant === \"filled\" ? (\n <Star className={starClasses} fill=\"currentColor\" />\n ) : (\n CustomIcon\n )\n ) : variant === \"filled\" ? (\n <Star className={starClasses} fill=\"none\" />\n ) : (\n CustomEmptyIcon\n )}\n </span>\n );\n };\n\n return (\n <div\n className={cn(\n \"inline-flex\",\n \"items-center\",\n getSpacingClass(\"xs\", \"gap\"),\n className,\n )}\n >\n <div\n className={cn(\"flex\", \"items-center\")}\n role={readOnly ? \"img\" : undefined}\n aria-label={\n readOnly ? `Rating: ${displayValue} out of ${max}` : undefined\n }\n >\n {Array.from({ length: max }, (_, i) => renderStar(i))}\n </div>\n {showValue && (\n <span\n className={cn(\n getSpacingClass(\"sm\", \"ml\"),\n getTypographySizeFromFontSize(\"sm\"),\n \"text-fg-secondary\",\n )}\n >\n {displayValue.toFixed(allowHalf ? 1 : 0)}/{max}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Rating","controlledValue","defaultValue","max","size","variant","readOnly","allowHalf","showValue","onChange","onHover","className","icon","emptyIcon","internalValue","setInternalValue","useState","hoverValue","setHoverValue","isControlled","displayValue","sizeConfig","handleClick","newValue","handleMouseEnter","handleMouseLeave","renderStar","index","starValue","isHalf","isFilled","starClasses","cn","getAnimationClass","CustomIcon","jsx","Star","CustomEmptyIcon","e","jsxs","getSpacingClass","_","i","getTypographySizeFromFontSize"],"mappings":"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"}
|