pixelize-design-library 2.4.2-beta.4 → 2.4.2-beta.40
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/COMPONENT-GOTCHAS.md +1087 -0
- package/README.md +26 -0
- package/dist/Components/Accordion/Accordion.d.ts +1 -0
- package/dist/Components/Accordion/Accordion.js +4 -1
- package/dist/Components/Accordion/AccordionProps.d.ts +2 -0
- package/dist/Components/AlertDialog/AlertDialog.d.ts +1 -0
- package/dist/Components/AlertDialog/AlertDialog.js +1 -0
- package/dist/Components/AlertDialog/AlertDialogProps.d.ts +2 -0
- package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChart.js +1 -0
- package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChartProps.d.ts +4 -0
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.js +1 -0
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChartProps.d.ts +6 -0
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -0
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChartProps.d.ts +8 -0
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +1 -0
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChartProps.d.ts +6 -0
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.js +1 -0
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarChartsProps.d.ts +3 -0
- package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChart.js +1 -0
- package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChartProps.d.ts +3 -0
- package/dist/Components/AppSwitcher/AppMark.d.ts +19 -0
- package/dist/Components/AppSwitcher/AppMark.js +62 -0
- package/dist/Components/AppSwitcher/AppSwitcher.d.ts +4 -0
- package/dist/Components/AppSwitcher/AppSwitcher.js +278 -0
- package/dist/Components/AppSwitcher/AppSwitcherProps.d.ts +70 -0
- package/dist/Components/AppSwitcher/AppSwitcherProps.js +86 -0
- package/dist/Components/AppSwitcher/useAppSwitcherShortcut.d.ts +3 -0
- package/dist/Components/AppSwitcher/useAppSwitcherShortcut.js +31 -0
- package/dist/Components/AppearanceSettings/AppearanceSettings.js +2 -1
- package/dist/Components/AppearanceSettings/AppearanceSettingsProps.d.ts +2 -0
- package/dist/Components/Breadcrumbs/BreadcrumbsProps.d.ts +3 -0
- package/dist/Components/Button/Button.d.ts +2 -2
- package/dist/Components/Button/Button.js +4 -3
- package/dist/Components/Button/Button.styles.js +37 -23
- package/dist/Components/Button/ButtonProps.d.ts +9 -1
- package/dist/Components/ButtonGroupIcon/ButtonGoupIconProps.d.ts +7 -0
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +2 -4
- package/dist/Components/Buttons/ButtonsProps.d.ts +2 -0
- package/dist/Components/Card/Card.d.ts +1 -1
- package/dist/Components/Card/Card.js +2 -2
- package/dist/Components/Card/CardProps.d.ts +3 -1
- package/dist/Components/Card/PaymentCard/PaymentCard.js +21 -12
- package/dist/Components/Card/PaymentCard/PaymentCardProps.d.ts +6 -0
- package/dist/Components/Checkbox/Checkbox.d.ts +1 -0
- package/dist/Components/Checkbox/Checkbox.js +2 -1
- package/dist/Components/Checkbox/Checkbox.styles.js +12 -7
- package/dist/Components/Checkbox/CheckboxProps.d.ts +4 -0
- package/dist/Components/Common/ErrorComponent.d.ts +2 -0
- package/dist/Components/Common/ErrorComponent.js +7 -5
- package/dist/Components/Common/ErrorMessage.js +2 -2
- package/dist/Components/Common/FormLabel.d.ts +4 -0
- package/dist/Components/Common/FormLabel.js +1 -0
- package/dist/Components/Common/FormattedDescription.d.ts +2 -0
- package/dist/Components/Common/FormattedDescription.js +1 -0
- package/dist/Components/Common/HelperText.d.ts +2 -0
- package/dist/Components/Common/HelperText.js +2 -0
- package/dist/Components/Common/Label.d.ts +1 -0
- package/dist/Components/Common/Label.js +1 -0
- package/dist/Components/Common/fieldStyles.js +1 -1
- package/dist/Components/ContactForm/ContactForm.d.ts +1 -0
- package/dist/Components/ContactForm/ContactForm.js +1 -0
- package/dist/Components/ContactForm/ContactFormProps.d.ts +4 -0
- package/dist/Components/CopyButton/CopyButton.d.ts +3 -1
- package/dist/Components/CopyButton/CopyButton.js +9 -3
- package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +8 -0
- package/dist/Components/DatePicker/CalendarPanel.d.ts +6 -0
- package/dist/Components/DatePicker/CalendarPanel.js +37 -15
- package/dist/Components/DatePicker/DatePicker.d.ts +1 -0
- package/dist/Components/DatePicker/DatePicker.js +1 -0
- package/dist/Components/DatePicker/DatePickerProps.d.ts +30 -0
- package/dist/Components/DatePicker/RangeDatePicker.d.ts +1 -0
- package/dist/Components/DatePicker/RangeDatePicker.js +30 -5
- package/dist/Components/DatePicker/SingleDatePicker.d.ts +1 -0
- package/dist/Components/DatePicker/SingleDatePicker.js +49 -14
- package/dist/Components/DatePicker/ThemeDatePicker.d.ts +1 -0
- package/dist/Components/DatePicker/ThemeDatePicker.js +1 -0
- package/dist/Components/DatePicker/TimeOnlyPicker.d.ts +1 -0
- package/dist/Components/DatePicker/TimeOnlyPicker.js +11 -2
- package/dist/Components/DatePicker/TimePicker.d.ts +1 -0
- package/dist/Components/DatePicker/TimePicker.js +4 -3
- package/dist/Components/DatePicker/TimePickerInput.d.ts +1 -0
- package/dist/Components/DatePicker/TimePickerInput.js +2 -1
- package/dist/Components/DatePicker/dayStates.d.ts +56 -0
- package/dist/Components/DatePicker/dayStates.js +87 -0
- package/dist/Components/Divider/Divider.d.ts +1 -0
- package/dist/Components/Divider/Divider.js +1 -0
- package/dist/Components/Drawer/DrawerProps.d.ts +2 -0
- package/dist/Components/Dropdown/DropDown.d.ts +1 -0
- package/dist/Components/Dropdown/DropDown.js +22 -6
- package/dist/Components/Dropdown/DropdownProps.d.ts +3 -0
- package/dist/Components/Editor/Editor.d.ts +1 -0
- package/dist/Components/Editor/Editor.js +1 -0
- package/dist/Components/Editor/EditorProps.d.ts +2 -0
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -0
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -5
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +4 -0
- package/dist/Components/EmptyState/EmptyState.d.ts +1 -0
- package/dist/Components/EmptyState/EmptyState.js +4 -2
- package/dist/Components/EmptyState/EmptyStateProps.d.ts +3 -0
- package/dist/Components/FeedbackForm/FeedbackForm.d.ts +3 -0
- package/dist/Components/FeedbackForm/FeedbackForm.js +1 -0
- package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +3 -2
- package/dist/Components/FieldSelectModal/FieldSelectModal.js +1 -0
- package/dist/Components/FilePreview/FilePreview.d.ts +1 -0
- package/dist/Components/FilePreview/FilePreview.js +3 -1
- package/dist/Components/FilePreview/FilePreviewProps.d.ts +5 -2
- package/dist/Components/FileUpload/FileUpload.d.ts +1 -0
- package/dist/Components/FileUpload/FileUpload.js +7 -5
- package/dist/Components/FileUpload/FileUploadProps.d.ts +7 -1
- package/dist/Components/FileUpload/constants.js +1 -0
- package/dist/Components/FileUploader/FileUploader.d.ts +1 -0
- package/dist/Components/FileUploader/FileUploader.js +1 -0
- package/dist/Components/FileUploader/FileUploaderProps.d.ts +2 -0
- package/dist/Components/FilterSidebar/FilterSidebar.d.ts +3 -0
- package/dist/Components/FilterSidebar/FilterSidebar.js +5 -5
- package/dist/Components/FilterSidebar/filterHoverStyle.d.ts +2 -10
- package/dist/Components/FilterSidebar/filterHoverStyle.js +3 -10
- package/dist/Components/Form/FormWrapper.d.ts +3 -0
- package/dist/Components/Form/FormWrapper.js +2 -1
- package/dist/Components/Header/HeaderProps.d.ts +5 -0
- package/dist/Components/Header/components/mobileMenu.js +12 -3
- package/dist/Components/Input/Input/InputProps.d.ts +2 -0
- package/dist/Components/Input/PhoneNumberInput.d.ts +1 -0
- package/dist/Components/Input/PhoneNumberInput.js +1 -0
- package/dist/Components/Input/PhoneNumberInputProps.d.ts +3 -0
- package/dist/Components/Input/Switch/InputSwitch.d.ts +2 -0
- package/dist/Components/Input/Switch/InputSwitch.js +1 -0
- package/dist/Components/Input/TextInput.js +1 -0
- package/dist/Components/Input/TextInput.styles.js +8 -10
- package/dist/Components/Input/TextInputProps.d.ts +2 -0
- package/dist/Components/InputTextArea/InputTextArea.d.ts +1 -0
- package/dist/Components/InputTextArea/InputTextArea.js +1 -0
- package/dist/Components/InputTextArea/InputTextArea.style.js +7 -6
- package/dist/Components/InputTextArea/InputTextAreaProps.d.ts +1 -0
- package/dist/Components/KanbanBoard/AccountCard.d.ts +3 -0
- package/dist/Components/KanbanBoard/AccountCard.js +1 -0
- package/dist/Components/KanbanBoard/AccountRow.d.ts +1 -0
- package/dist/Components/KanbanBoard/AccountRow.js +1 -0
- package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.d.ts +2 -0
- package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
- package/dist/Components/KanbanBoard/KanbanBoard.d.ts +1 -0
- package/dist/Components/KanbanBoard/KanbanBoard.js +1 -0
- package/dist/Components/KanbanBoard/KanbanBoardProps.d.ts +39 -14
- package/dist/Components/KanbanBoard/MeasuredItem.d.ts +1 -0
- package/dist/Components/KanbanBoard/MeasuredItem.js +1 -0
- package/dist/Components/LazyWrapper/LazyWrapper.d.ts +3 -2
- package/dist/Components/LazyWrapper/LazyWrapper.js +1 -0
- package/dist/Components/LimitReachedModal/LimitReachedModalProps.d.ts +4 -1
- package/dist/Components/LimitReachedModal/limitReachedCopy.d.ts +2 -0
- package/dist/Components/LimitReachedModal/limitReachedCopy.js +2 -0
- package/dist/Components/Loading/Loading.d.ts +1 -0
- package/dist/Components/Loading/Loading.js +16 -14
- package/dist/Components/Loading/LoadingProps.d.ts +2 -0
- package/dist/Components/Modal/ModalProps.d.ts +2 -0
- package/dist/Components/MoreItems/MoreItems.d.ts +1 -0
- package/dist/Components/MoreItems/MoreItems.js +4 -1
- package/dist/Components/MoreItems/MoreItemsProps.d.ts +4 -2
- package/dist/Components/MultiSelect/MultiSelect.js +2 -2
- package/dist/Components/MultiSelect/MultiSelectProps.d.ts +2 -0
- package/dist/Components/NavigationBar/NavigationBar.js +9 -10
- package/dist/Components/NavigationBar/NavigationBarProps.d.ts +3 -0
- package/dist/Components/NoteTextArea/NoteTextArea.d.ts +1 -0
- package/dist/Components/NoteTextArea/NoteTextArea.js +10 -4
- package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +2 -0
- package/dist/Components/Notification/Notification.d.ts +1 -0
- package/dist/Components/Notification/Notification.js +1 -0
- package/dist/Components/Notification/NotificationProps.d.ts +6 -0
- package/dist/Components/NumberInput/NumberInput.d.ts +1 -0
- package/dist/Components/NumberInput/NumberInput.js +4 -1
- package/dist/Components/NumberInput/NumberInput.styles.js +7 -6
- package/dist/Components/NumberInput/NumberInputProps.d.ts +3 -0
- package/dist/Components/OrgSwitcher/OrgSwitcher.js +14 -10
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +6 -1
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.js +1 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.d.ts +1 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.js +4 -2
- package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +16 -4
- package/dist/Components/PdfViewer/PdfViewer.d.ts +2 -1
- package/dist/Components/PdfViewer/PdfViewer.js +7 -1
- package/dist/Components/PinInput/PinInput.d.ts +1 -0
- package/dist/Components/PinInput/PinInput.js +1 -0
- package/dist/Components/PinInput/PinInputProps.d.ts +2 -0
- package/dist/Components/PinInputs/PinInputs.d.ts +1 -0
- package/dist/Components/PinInputs/PinInputs.js +1 -0
- package/dist/Components/PinInputs/PinInputsProps.d.ts +1 -0
- package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +2 -0
- package/dist/Components/PlanPill/PlanPillProps.d.ts +2 -0
- package/dist/Components/Primitives/Primitives.d.ts +6 -0
- package/dist/Components/Primitives/Primitives.js +113 -0
- package/dist/Components/ProductCard/ProductCardProps.d.ts +10 -0
- package/dist/Components/ProductCard/ProductReview.d.ts +1 -0
- package/dist/Components/ProductCard/ProductReview.js +6 -1
- package/dist/Components/ProductCard/ProductTags.js +1 -1
- package/dist/Components/ProductDetails/ProductDetailsProps.d.ts +7 -0
- package/dist/Components/ProfileCard/ProfileCard.js +1 -1
- package/dist/Components/ProfileCard/ProfileCardProps.d.ts +3 -0
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +1 -0
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +5 -3
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewerProps.d.ts +9 -1
- package/dist/Components/ProgressBar/ProgressBar.d.ts +1 -0
- package/dist/Components/ProgressBar/ProgressBar.js +1 -0
- package/dist/Components/ProgressBar/ProgressBarProps.d.ts +2 -0
- package/dist/Components/RadioButton/RadioButton.js +3 -2
- package/dist/Components/RadioButton/RadioButtonProps.d.ts +2 -0
- package/dist/Components/Reorder/Reorder.d.ts +2 -0
- package/dist/Components/Reorder/Reorder.js +1 -0
- package/dist/Components/Reorder/ReorderProps.d.ts +3 -0
- package/dist/Components/RolesPermission/RolesPermission.d.ts +1 -0
- package/dist/Components/RolesPermission/RolesPermission.js +5 -3
- package/dist/Components/RolesPermission/RolesPermissionProps.d.ts +16 -1
- package/dist/Components/ScrollToTop/ScrollToTop.d.ts +3 -2
- package/dist/Components/ScrollToTop/ScrollToTop.js +4 -1
- package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +7 -0
- package/dist/Components/ScrollbarBox/ScrollbarBox.js +1 -0
- package/dist/Components/Search/Search.d.ts +1 -0
- package/dist/Components/Search/Search.js +3 -2
- package/dist/Components/Search/SearchProps.d.ts +2 -0
- package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -0
- package/dist/Components/SearchSelect/SearchSelect.js +48 -37
- package/dist/Components/SearchSelect/SearchSelectProps.d.ts +23 -0
- package/dist/Components/SegmentedControl/SegmentedControl.d.ts +3 -0
- package/dist/Components/SegmentedControl/SegmentedControl.js +89 -0
- package/dist/Components/SegmentedControl/SegmentedControlProps.d.ts +23 -0
- package/dist/Components/SegmentedControl/SegmentedControlProps.js +2 -0
- package/dist/Components/Select/Select.d.ts +1 -1
- package/dist/Components/Select/Select.js +4 -2
- package/dist/Components/Select/Select.styles.js +3 -2
- package/dist/Components/Select/SelectProps.d.ts +6 -0
- package/dist/Components/SelectSearch/SelectSearch.d.ts +1 -0
- package/dist/Components/SelectSearch/SelectSearch.js +37 -15
- package/dist/Components/SelectSearch/SelectSearchProps.d.ts +5 -0
- package/dist/Components/SelectV2/SelectV2.d.ts +1 -0
- package/dist/Components/SelectV2/SelectV2.js +20 -5
- package/dist/Components/SelectV2/SelectV2Props.d.ts +6 -1
- package/dist/Components/SideBar/SecondaryBar.js +1 -1
- package/dist/Components/SideBar/SideBar.js +5 -3
- package/dist/Components/SideBar/SideBarProps.d.ts +38 -24
- package/dist/Components/SideBar/components/MenuPopoverContent.js +2 -2
- package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +3 -0
- package/dist/Components/Skeletons/SkeletonProps.d.ts +2 -0
- package/dist/Components/Skeletons/Skeletons.d.ts +1 -0
- package/dist/Components/Skeletons/Skeletons.js +1 -0
- package/dist/Components/Slider/Slider.d.ts +3 -0
- package/dist/Components/Slider/Slider.js +9 -1
- package/dist/Components/StageProgress/StageItem.d.ts +1 -0
- package/dist/Components/StageProgress/StageItem.js +1 -0
- package/dist/Components/StageProgress/StageProgress.d.ts +1 -0
- package/dist/Components/StageProgress/StageProgress.js +1 -0
- package/dist/Components/StageProgress/StageProgressProps.d.ts +45 -4
- package/dist/Components/StageProgress/StageProgressProps.js +6 -4
- package/dist/Components/StageProgress/StepperStage.js +2 -2
- package/dist/Components/Switch/Switch.d.ts +1 -0
- package/dist/Components/Switch/Switch.js +1 -0
- package/dist/Components/Switch/SwitchProps.d.ts +1 -0
- package/dist/Components/Table/Table.d.ts +2 -1
- package/dist/Components/Table/Table.js +15 -5
- package/dist/Components/Table/TableProps.d.ts +47 -0
- package/dist/Components/Table/components/Pagination.js +1 -1
- package/dist/Components/Table/components/TableActions.js +2 -2
- package/dist/Components/Table/components/TableBody.js +44 -18
- package/dist/Components/Table/components/TableGroupRow.js +1 -1
- package/dist/Components/Table/components/TableHeader.js +21 -8
- package/dist/Components/Table/components/TableSearch.js +1 -1
- package/dist/Components/Table/filters/CompactSelect.d.ts +1 -0
- package/dist/Components/Table/filters/CompactSelect.js +29 -8
- package/dist/Components/Table/filters/LeftFilterPane.d.ts +9 -1
- package/dist/Components/Table/filters/LeftFilterPane.js +1 -1
- package/dist/Components/Table/settings/ManageColumns.js +8 -5
- package/dist/Components/Table/settings/TableSettings.js +6 -4
- package/dist/Components/Table/variants/TableVariantContext.d.ts +4 -0
- package/dist/Components/Table/variants/TableVariantContext.js +17 -0
- package/dist/Components/Table/variants/classic.d.ts +6 -0
- package/dist/Components/Table/variants/classic.js +47 -0
- package/dist/Components/Table/variants/index.d.ts +7 -0
- package/dist/Components/Table/variants/index.js +27 -0
- package/dist/Components/Table/variants/pillInk.d.ts +6 -0
- package/dist/Components/Table/variants/pillInk.js +21 -0
- package/dist/Components/Table/variants/studio.d.ts +6 -0
- package/dist/Components/Table/variants/studio.js +50 -0
- package/dist/Components/Table/variants/tokens.d.ts +49 -0
- package/dist/Components/Table/variants/tokens.js +2 -0
- package/dist/Components/Tag/Tag.d.ts +1 -0
- package/dist/Components/Tag/Tag.js +1 -0
- package/dist/Components/Tag/Tag.styles.js +16 -11
- package/dist/Components/Tag/TagProps.d.ts +7 -0
- package/dist/Components/Timeline/Timeline.d.ts +1 -0
- package/dist/Components/Timeline/Timeline.js +1 -0
- package/dist/Components/Timeline/TimelineProps.d.ts +8 -0
- package/dist/Components/Toaster/Toaster.d.ts +1 -0
- package/dist/Components/Toaster/Toaster.js +1 -0
- package/dist/Components/Toaster/ToasterProps.d.ts +3 -0
- package/dist/Components/Toggle/TableToggle.d.ts +1 -0
- package/dist/Components/Toggle/TableToggle.js +73 -18
- package/dist/Components/Toggle/TableToggleProps.d.ts +6 -0
- package/dist/Components/ToggleSwitch/ToggleSwitch.d.ts +3 -0
- package/dist/Components/ToggleSwitch/ToggleSwitch.js +19 -0
- package/dist/Components/ToggleSwitch/ToggleSwitchProps.d.ts +13 -0
- package/dist/Components/ToggleSwitch/ToggleSwitchProps.js +2 -0
- package/dist/Components/ToolTip/ToolTip.d.ts +1 -0
- package/dist/Components/ToolTip/ToolTip.js +7 -6
- package/dist/Components/ToolTip/ToolTipProps.d.ts +5 -1
- package/dist/Components/Trail/EditableCell.d.ts +2 -0
- package/dist/Components/Trail/EditableCell.js +2 -1
- package/dist/Components/Trail/SelectAllCheckbox.d.ts +1 -0
- package/dist/Components/Trail/SelectAllCheckbox.js +1 -0
- package/dist/Components/Trail/TrailWorks.d.ts +1 -0
- package/dist/Components/Trail/TrailWorks.js +2 -1
- package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +6 -2
- package/dist/Components/UserDetails/DeactivateConfirmModal.js +1 -1
- package/dist/Components/UserDetails/UserDetails.d.ts +1 -0
- package/dist/Components/UserDetails/UserDetails.js +6 -3
- package/dist/Components/UserDetails/UserDetailsProps.d.ts +30 -1
- package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +6 -1
- package/dist/Hooks/exclusiveOverlay.d.ts +4 -0
- package/dist/Hooks/exclusiveOverlay.js +22 -0
- package/dist/Hooks/useExclusiveOverlay.d.ts +5 -0
- package/dist/Hooks/useExclusiveOverlay.js +24 -0
- package/dist/Theme/assertPalette.d.ts +1 -1
- package/dist/Theme/assertPalette.js +3 -2
- package/dist/Theme/chakra/Menu.styles.d.ts +2 -0
- package/dist/Theme/chakra/Menu.styles.js +9 -5
- package/dist/Theme/chakra/Popover.styles.d.ts +3 -0
- package/dist/Theme/chakra/Popover.styles.js +5 -1
- package/dist/Theme/chakra/componentStyles.d.ts +5 -0
- package/dist/Theme/chakra/componentStyles.js +16 -9
- package/dist/Theme/chakra/createBrandTheme.js +22 -9
- package/dist/Theme/chakra/focusRing.styles.d.ts +52 -0
- package/dist/Theme/chakra/focusRing.styles.js +46 -0
- package/dist/Theme/provider/ThemeSwitcher.js +5 -2
- package/dist/Theme/tokens/brands/index.js +6 -1
- package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts +1 -0
- package/dist/Theme/tokens/builders/buildDarkPalette.js +6 -1
- package/dist/Theme/tokens/builders/chartColorsFromTheme.js +1 -1
- package/dist/Theme/tokens/builders/filledSurface.d.ts +29 -0
- package/dist/Theme/tokens/builders/filledSurface.js +74 -0
- package/dist/Theme/tokens/builders/focusRing.d.ts +52 -0
- package/dist/Theme/tokens/builders/focusRing.js +92 -0
- package/dist/Theme/tokens/builders/index.d.ts +2 -0
- package/dist/Theme/tokens/builders/index.js +2 -0
- package/dist/Theme/tokens/builders/outlineRung.d.ts +41 -3
- package/dist/Theme/tokens/builders/outlineRung.js +82 -5
- package/dist/Theme/tokens/builders/placeholderInk.d.ts +19 -0
- package/dist/Theme/tokens/builders/placeholderInk.js +35 -0
- package/dist/Theme/tokens/builders/resolvedRungs.d.ts +5 -1
- package/dist/Theme/tokens/builders/resolvedRungs.js +7 -2
- package/dist/Theme/tokens/builders/rowStates.d.ts +13 -0
- package/dist/Theme/tokens/builders/rowStates.js +19 -0
- package/dist/Theme/tokens/builders/scrollShadow.d.ts +2 -0
- package/dist/Theme/tokens/builders/scrollShadow.js +16 -0
- package/dist/Theme/tokens/builders/surfaceRungs.d.ts +5 -2
- package/dist/Theme/tokens/builders/surfaceRungs.js +19 -9
- package/dist/Theme/tokens/types.d.ts +21 -1
- package/dist/Utils/table.d.ts +3 -0
- package/dist/Utils/table.js +49 -3
- package/dist/esm/Components/Accordion/Accordion.js +4 -1
- package/dist/esm/Components/AlertDialog/AlertDialog.js +1 -0
- package/dist/esm/Components/Apexcharts/ApexAreaChart/ApexAreaChart.js +1 -0
- package/dist/esm/Components/Apexcharts/ApexBarChart/ApexBarChart.js +1 -0
- package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -0
- package/dist/esm/Components/Apexcharts/ApexPieChart/ApexPieChart.js +1 -0
- package/dist/esm/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.js +1 -0
- package/dist/esm/Components/Apexcharts/ApexRadialChart/ApexRadialChart.js +1 -0
- package/dist/esm/Components/AppSwitcher/AppMark.js +56 -0
- package/dist/esm/Components/AppSwitcher/AppSwitcher.js +243 -0
- package/dist/esm/Components/AppSwitcher/AppSwitcherProps.js +78 -0
- package/dist/esm/Components/AppSwitcher/useAppSwitcherShortcut.js +27 -0
- package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +2 -1
- package/dist/esm/Components/Button/Button.js +5 -4
- package/dist/esm/Components/Button/Button.styles.js +38 -24
- package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +2 -4
- package/dist/esm/Components/Card/Card.js +2 -2
- package/dist/esm/Components/Card/PaymentCard/PaymentCard.js +21 -12
- package/dist/esm/Components/Checkbox/Checkbox.js +2 -1
- package/dist/esm/Components/Checkbox/Checkbox.styles.js +13 -8
- package/dist/esm/Components/Common/ErrorComponent.js +7 -5
- package/dist/esm/Components/Common/ErrorMessage.js +2 -2
- package/dist/esm/Components/Common/FormLabel.js +1 -0
- package/dist/esm/Components/Common/FormattedDescription.js +1 -0
- package/dist/esm/Components/Common/HelperText.js +2 -0
- package/dist/esm/Components/Common/Label.js +1 -0
- package/dist/esm/Components/Common/fieldStyles.js +1 -1
- package/dist/esm/Components/ContactForm/ContactForm.js +1 -0
- package/dist/esm/Components/CopyButton/CopyButton.js +10 -4
- package/dist/esm/Components/DatePicker/CalendarPanel.js +38 -16
- package/dist/esm/Components/DatePicker/DatePicker.js +1 -0
- package/dist/esm/Components/DatePicker/RangeDatePicker.js +31 -6
- package/dist/esm/Components/DatePicker/SingleDatePicker.js +50 -15
- package/dist/esm/Components/DatePicker/ThemeDatePicker.js +1 -0
- package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +11 -2
- package/dist/esm/Components/DatePicker/TimePicker.js +4 -3
- package/dist/esm/Components/DatePicker/TimePickerInput.js +2 -1
- package/dist/esm/Components/DatePicker/dayStates.js +79 -0
- package/dist/esm/Components/Divider/Divider.js +1 -0
- package/dist/esm/Components/Dropdown/DropDown.js +23 -7
- package/dist/esm/Components/Editor/Editor.js +1 -0
- package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -5
- package/dist/esm/Components/EmptyState/EmptyState.js +4 -2
- package/dist/esm/Components/FeedbackForm/FeedbackForm.js +1 -0
- package/dist/esm/Components/FieldSelectModal/FieldSelectModal.js +1 -0
- package/dist/esm/Components/FilePreview/FilePreview.js +3 -1
- package/dist/esm/Components/FileUpload/FileUpload.js +8 -6
- package/dist/esm/Components/FileUpload/constants.js +1 -0
- package/dist/esm/Components/FileUploader/FileUploader.js +1 -0
- package/dist/esm/Components/FilterSidebar/FilterSidebar.js +5 -5
- package/dist/esm/Components/FilterSidebar/filterHoverStyle.js +3 -10
- package/dist/esm/Components/Form/FormWrapper.js +2 -1
- package/dist/esm/Components/Header/components/mobileMenu.js +12 -3
- package/dist/esm/Components/Input/PhoneNumberInput.js +1 -0
- package/dist/esm/Components/Input/Switch/InputSwitch.js +1 -0
- package/dist/esm/Components/Input/TextInput.js +1 -0
- package/dist/esm/Components/Input/TextInput.styles.js +8 -10
- package/dist/esm/Components/InputTextArea/InputTextArea.js +1 -0
- package/dist/esm/Components/InputTextArea/InputTextArea.style.js +7 -6
- package/dist/esm/Components/KanbanBoard/AccountCard.js +1 -0
- package/dist/esm/Components/KanbanBoard/AccountRow.js +1 -0
- package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
- package/dist/esm/Components/KanbanBoard/KanbanBoard.js +1 -0
- package/dist/esm/Components/KanbanBoard/MeasuredItem.js +1 -0
- package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -0
- package/dist/esm/Components/LimitReachedModal/limitReachedCopy.js +2 -0
- package/dist/esm/Components/Loading/Loading.js +13 -11
- package/dist/esm/Components/MoreItems/MoreItems.js +4 -1
- package/dist/esm/Components/MultiSelect/MultiSelect.js +2 -2
- package/dist/esm/Components/NavigationBar/NavigationBar.js +9 -10
- package/dist/esm/Components/NoteTextArea/NoteTextArea.js +10 -4
- package/dist/esm/Components/Notification/Notification.js +1 -0
- package/dist/esm/Components/NumberInput/NumberInput.js +5 -2
- package/dist/esm/Components/NumberInput/NumberInput.styles.js +7 -6
- package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +14 -10
- package/dist/esm/Components/OrgSwitcher/OrgSwitcherProps.js +1 -0
- package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +5 -3
- package/dist/esm/Components/PdfViewer/PdfViewer.js +7 -1
- package/dist/esm/Components/PinInput/PinInput.js +1 -0
- package/dist/esm/Components/PinInputs/PinInputs.js +1 -0
- package/dist/esm/Components/Primitives/Primitives.js +6 -0
- package/dist/esm/Components/ProductCard/ProductReview.js +6 -1
- package/dist/esm/Components/ProductCard/ProductTags.js +1 -1
- package/dist/esm/Components/ProfileCard/ProfileCard.js +1 -1
- package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +6 -4
- package/dist/esm/Components/ProgressBar/ProgressBar.js +1 -0
- package/dist/esm/Components/RadioButton/RadioButton.js +3 -2
- package/dist/esm/Components/Reorder/Reorder.js +1 -0
- package/dist/esm/Components/RolesPermission/RolesPermission.js +5 -3
- package/dist/esm/Components/ScrollToTop/ScrollToTop.js +4 -1
- package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +1 -0
- package/dist/esm/Components/Search/Search.js +3 -2
- package/dist/esm/Components/SearchSelect/SearchSelect.js +48 -37
- package/dist/esm/Components/SegmentedControl/SegmentedControl.js +86 -0
- package/dist/esm/Components/SegmentedControl/SegmentedControlProps.js +1 -0
- package/dist/esm/Components/Select/Select.js +5 -3
- package/dist/esm/Components/Select/Select.styles.js +3 -2
- package/dist/esm/Components/SelectSearch/SelectSearch.js +37 -15
- package/dist/esm/Components/SelectV2/SelectV2.js +20 -5
- package/dist/esm/Components/SideBar/SecondaryBar.js +1 -1
- package/dist/esm/Components/SideBar/SideBar.js +5 -3
- package/dist/esm/Components/SideBar/components/MenuPopoverContent.js +2 -2
- package/dist/esm/Components/Skeletons/Skeletons.js +1 -0
- package/dist/esm/Components/Slider/Slider.js +9 -1
- package/dist/esm/Components/StageProgress/StageItem.js +1 -0
- package/dist/esm/Components/StageProgress/StageProgress.js +1 -0
- package/dist/esm/Components/StageProgress/StageProgressProps.js +7 -5
- package/dist/esm/Components/StageProgress/StepperStage.js +2 -2
- package/dist/esm/Components/Switch/Switch.js +1 -0
- package/dist/esm/Components/Table/Table.js +15 -5
- package/dist/esm/Components/Table/components/Pagination.js +1 -1
- package/dist/esm/Components/Table/components/TableActions.js +2 -2
- package/dist/esm/Components/Table/components/TableBody.js +44 -18
- package/dist/esm/Components/Table/components/TableGroupRow.js +1 -1
- package/dist/esm/Components/Table/components/TableHeader.js +21 -8
- package/dist/esm/Components/Table/components/TableSearch.js +1 -1
- package/dist/esm/Components/Table/filters/CompactSelect.js +29 -8
- package/dist/esm/Components/Table/filters/LeftFilterPane.js +1 -1
- package/dist/esm/Components/Table/settings/ManageColumns.js +8 -5
- package/dist/esm/Components/Table/settings/TableSettings.js +7 -5
- package/dist/esm/Components/Table/variants/TableVariantContext.js +13 -0
- package/dist/esm/Components/Table/variants/classic.js +43 -0
- package/dist/esm/Components/Table/variants/index.js +9 -0
- package/dist/esm/Components/Table/variants/pillInk.js +18 -0
- package/dist/esm/Components/Table/variants/studio.js +46 -0
- package/dist/esm/Components/Table/variants/tokens.js +1 -0
- package/dist/esm/Components/Tag/Tag.js +1 -0
- package/dist/esm/Components/Tag/Tag.styles.js +17 -12
- package/dist/esm/Components/Timeline/Timeline.js +1 -0
- package/dist/esm/Components/Toaster/Toaster.js +1 -0
- package/dist/esm/Components/Toggle/TableToggle.js +72 -17
- package/dist/esm/Components/ToggleSwitch/ToggleSwitch.js +16 -0
- package/dist/esm/Components/ToggleSwitch/ToggleSwitchProps.js +1 -0
- package/dist/esm/Components/ToolTip/ToolTip.js +7 -6
- package/dist/esm/Components/Trail/EditableCell.js +2 -1
- package/dist/esm/Components/Trail/SelectAllCheckbox.js +1 -0
- package/dist/esm/Components/Trail/TrailWorks.js +2 -1
- package/dist/esm/Components/UserDetails/DeactivateConfirmModal.js +1 -1
- package/dist/esm/Components/UserDetails/UserDetails.js +6 -3
- package/dist/esm/Hooks/exclusiveOverlay.js +16 -0
- package/dist/esm/Hooks/useExclusiveOverlay.js +20 -0
- package/dist/esm/Theme/assertPalette.js +3 -2
- package/dist/esm/Theme/chakra/Menu.styles.js +9 -5
- package/dist/esm/Theme/chakra/Popover.styles.js +5 -1
- package/dist/esm/Theme/chakra/componentStyles.js +16 -9
- package/dist/esm/Theme/chakra/createBrandTheme.js +22 -9
- package/dist/esm/Theme/chakra/focusRing.styles.js +40 -0
- package/dist/esm/Theme/provider/ThemeSwitcher.js +5 -2
- package/dist/esm/Theme/tokens/brands/index.js +6 -1
- package/dist/esm/Theme/tokens/builders/buildDarkPalette.js +6 -1
- package/dist/esm/Theme/tokens/builders/chartColorsFromTheme.js +1 -1
- package/dist/esm/Theme/tokens/builders/filledSurface.js +67 -0
- package/dist/esm/Theme/tokens/builders/focusRing.js +85 -0
- package/dist/esm/Theme/tokens/builders/index.js +2 -0
- package/dist/esm/Theme/tokens/builders/outlineRung.js +78 -4
- package/dist/esm/Theme/tokens/builders/placeholderInk.js +29 -0
- package/dist/esm/Theme/tokens/builders/resolvedRungs.js +7 -2
- package/dist/esm/Theme/tokens/builders/rowStates.js +15 -0
- package/dist/esm/Theme/tokens/builders/scrollShadow.js +13 -0
- package/dist/esm/Theme/tokens/builders/surfaceRungs.js +20 -10
- package/dist/esm/Utils/table.js +50 -5
- package/dist/esm/index.js +26 -1
- package/dist/index.d.ts +26 -3
- package/dist/index.js +67 -4
- package/package.json +11 -4
package/dist/Utils/table.js
CHANGED
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.TableCellCalculation = exports.pageSizeCalculation = exports.searchAndSortData = exports.calculateLeftOffset = void 0;
|
|
37
37
|
exports.compareValues = compareValues;
|
|
38
38
|
exports.SortMultiColumnData = SortMultiColumnData;
|
|
39
|
+
exports.buildSemanticStatusPalette = buildSemanticStatusPalette;
|
|
39
40
|
exports.buildTablePalette = buildTablePalette;
|
|
40
41
|
exports.pickTableColor = pickTableColor;
|
|
41
42
|
exports.groupRows = groupRows;
|
|
@@ -45,6 +46,9 @@ exports.useDebounce = useDebounce;
|
|
|
45
46
|
exports.globalSearchFilter = globalSearchFilter;
|
|
46
47
|
const react_1 = __importStar(require("react"));
|
|
47
48
|
const accentText_1 = require("../Theme/tokens/builders/accentText");
|
|
49
|
+
const color_1 = require("../Theme/tokens/builders/color");
|
|
50
|
+
const outlineRung_1 = require("../Theme/tokens/builders/outlineRung");
|
|
51
|
+
const filledSurface_1 = require("../Theme/tokens/builders/filledSurface");
|
|
48
52
|
const statusTone_1 = require("../Theme/tokens/builders/statusTone");
|
|
49
53
|
// Built once, not per comparison: sorting 10k rows runs this ~130k times, and constructing a
|
|
50
54
|
// collator is orders of magnitude dearer than using one.
|
|
@@ -98,7 +102,45 @@ function SortMultiColumnData(data, sortConfig) {
|
|
|
98
102
|
return 0;
|
|
99
103
|
});
|
|
100
104
|
}
|
|
105
|
+
/** Theme-aware status palette per value — soft fill + semantic ink from `resolveStatusTone`. */
|
|
106
|
+
function buildSemanticStatusPalette(toneByValue, theme) {
|
|
107
|
+
const c = theme.colors;
|
|
108
|
+
const mode = (0, accentText_1.isDarkCanvas)(c.backgroundColor.main) ? "dark" : "light";
|
|
109
|
+
const scales = {
|
|
110
|
+
info: c.semantic.info,
|
|
111
|
+
warning: c.semantic.warning,
|
|
112
|
+
success: c.semantic.success,
|
|
113
|
+
error: c.semantic.error,
|
|
114
|
+
neutral: c.gray,
|
|
115
|
+
};
|
|
116
|
+
return Object.fromEntries(Object.entries(toneByValue).map(([value, key]) => {
|
|
117
|
+
const scale = scales[key];
|
|
118
|
+
const tone = (0, statusTone_1.resolveStatusTone)(scale, mode);
|
|
119
|
+
const solidRung = (0, filledSurface_1.solidFillRung)(scale, c.white);
|
|
120
|
+
const solid = scale[solidRung];
|
|
121
|
+
return [
|
|
122
|
+
value,
|
|
123
|
+
{
|
|
124
|
+
solid,
|
|
125
|
+
soft: tone.bg,
|
|
126
|
+
text: tone.fg,
|
|
127
|
+
onSolid: (0, filledSurface_1.labelOnFill)(solid, c.white, c.black),
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
101
132
|
const withAlpha = (hex, aa) => /^#([0-9a-fA-F]{6})$/.test(hex) ? `${hex}${aa}` : hex;
|
|
133
|
+
/** Consumer `statusColors` values are fill seeds — derive bleed + pill ink from them. */
|
|
134
|
+
const resolveStatusOverride = (fill, white, black, surface) => {
|
|
135
|
+
const soft = withAlpha(fill, "22");
|
|
136
|
+
const solid = (0, statusTone_1.resolveAvatarFill)(fill);
|
|
137
|
+
return {
|
|
138
|
+
solid,
|
|
139
|
+
soft,
|
|
140
|
+
text: (0, outlineRung_1.liftToContrast)(fill, (0, color_1.compositeOver)(soft, surface), accentText_1.AA_NORMAL_TEXT),
|
|
141
|
+
onSolid: (0, accentText_1.onFilled)(solid, white, black),
|
|
142
|
+
};
|
|
143
|
+
};
|
|
102
144
|
/** Deterministic, theme-aware color palette for groups + status pills. */
|
|
103
145
|
function buildTablePalette(theme) {
|
|
104
146
|
const c = theme.colors;
|
|
@@ -117,11 +159,13 @@ function buildTablePalette(theme) {
|
|
|
117
159
|
];
|
|
118
160
|
return scales.map((scale) => {
|
|
119
161
|
const tone = (0, statusTone_1.resolveStatusTone)(scale, mode);
|
|
162
|
+
const solidRung = (0, filledSurface_1.solidFillRung)(scale, c.white);
|
|
163
|
+
const solid = scale[solidRung];
|
|
120
164
|
return {
|
|
121
|
-
solid
|
|
165
|
+
solid,
|
|
122
166
|
soft: tone.bg,
|
|
123
167
|
text: tone.fg,
|
|
124
|
-
onSolid: (0,
|
|
168
|
+
onSolid: (0, filledSurface_1.labelOnFill)(solid, c.white, c.black),
|
|
125
169
|
};
|
|
126
170
|
});
|
|
127
171
|
}
|
|
@@ -134,10 +178,12 @@ const hashKey = (value) => {
|
|
|
134
178
|
};
|
|
135
179
|
/** Pick a deterministic palette color for a value, with optional consumer override hex. */
|
|
136
180
|
function pickTableColor(value, palette, override, theme) {
|
|
181
|
+
var _a;
|
|
137
182
|
const white = theme ? theme.colors.white : accentText_1.DEFAULT_WHITE;
|
|
138
183
|
const black = theme ? theme.colors.black : accentText_1.DEFAULT_BLACK;
|
|
139
184
|
if (override) {
|
|
140
|
-
|
|
185
|
+
const surface = (_a = theme === null || theme === void 0 ? void 0 : theme.colors.background[50]) !== null && _a !== void 0 ? _a : accentText_1.DEFAULT_WHITE;
|
|
186
|
+
return resolveStatusOverride(override, white, black, surface);
|
|
141
187
|
}
|
|
142
188
|
if (!palette.length) {
|
|
143
189
|
throw new Error("pickTableColor: empty palette — build it with buildTablePalette(theme).");
|
|
@@ -4,7 +4,9 @@ import { Accordion as ChakraAccordian, AccordionItem, AccordionButton, Accordion
|
|
|
4
4
|
import { ChevronDown } from "lucide-react";
|
|
5
5
|
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
6
6
|
import { isDarkCanvas } from "../../Theme/tokens/builders/accentText.js";
|
|
7
|
+
import { liftToContrast, AA_NON_TEXT } from "../../Theme/tokens/builders/outlineRung.js";
|
|
7
8
|
import { getAccordionHoverColors } from "./accordionColors.js";
|
|
9
|
+
/** Chakra Accordion wrapper for header/content pairs; FilterSidebar composes this directly for its collapsible filter sections. */
|
|
8
10
|
const Accordion = ({ allowMultiple, allowToggle, index, onChange, reduceMotion, items, ...rest }) => {
|
|
9
11
|
const { colors } = useCustomTheme();
|
|
10
12
|
const isDark = isDarkCanvas(colors.backgroundColor.main);
|
|
@@ -12,13 +14,14 @@ const Accordion = ({ allowMultiple, allowToggle, index, onChange, reduceMotion,
|
|
|
12
14
|
const headingColor = colors.text[800];
|
|
13
15
|
const bodyColor = colors.text[600];
|
|
14
16
|
const { expandedBg, softHover } = useMemo(() => getAccordionHoverColors(colors, isDark), [colors, isDark]);
|
|
17
|
+
const focusRing = useMemo(() => liftToContrast(colors.primary[300], colors.background[50], AA_NON_TEXT), [colors]);
|
|
15
18
|
return (_jsx(ChakraAccordian, { allowMultiple: allowMultiple, allowToggle: allowToggle, index: index, onChange: onChange, reduceMotion: reduceMotion, ...rest, children: items.map((item, idx) => {
|
|
16
19
|
var _a;
|
|
17
20
|
return (_jsx(AccordionItem, { border: `0.063rem solid ${border}`, borderRadius: "xl", bg: colors.background[50], mb: 3, overflow: "hidden", transition: "border-color 0.15s ease, box-shadow 0.15s ease", _last: { mb: 0 }, _hover: { borderColor: colors.boxborder[200] }, ...item.itemProps, sx: (_a = item.customStyles) === null || _a === void 0 ? void 0 : _a.itemStyle, children: ({ isExpanded }) => {
|
|
18
21
|
var _a, _b, _c;
|
|
19
22
|
return (_jsxs(_Fragment, { children: [_jsx("h2", { children: _jsxs(AccordionButton, { px: 4, py: 3, gap: 3, fontSize: "0.875rem", fontWeight: 600, color: headingColor, bg: isExpanded ? expandedBg : "transparent", transition: "background 0.15s ease", _hover: { bg: isExpanded ? expandedBg : softHover }, _focusVisible: {
|
|
20
23
|
boxShadow: "none",
|
|
21
|
-
outline: `0.125rem solid ${
|
|
24
|
+
outline: `0.125rem solid ${focusRing}`,
|
|
22
25
|
outlineOffset: "-0.125rem",
|
|
23
26
|
}, ...item.buttonProps, sx: {
|
|
24
27
|
...(_a = item.customStyles) === null || _a === void 0 ? void 0 : _a.buttonStyle,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { AlertDialog as ChakraAlertDialog, AlertDialogBody, AlertDialogCloseButton, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, Button, } from "@chakra-ui/react";
|
|
3
3
|
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
4
|
+
/** Renders a fixed Cancel/Confirm AlertDialog from title+content props — not a substitute for Modal when you need custom footer buttons or slots. */
|
|
4
5
|
const AlertDialog = ({ isOpen, onClose, leastDestructiveRef, content, title, confirmButtonText = "Yes", cancelButtonText = "No", isConfirmLoading, onConfirm, ContentStyle, headerStyle, bodyStyle, footerStyle, closeButtonStyle, button1Style, button2Style, isCentered, key, }) => {
|
|
5
6
|
const { colors } = useCustomTheme();
|
|
6
7
|
return (_jsxs(ChakraAlertDialog, { motionPreset: "slideInBottom", leastDestructiveRef: leastDestructiveRef, onClose: onClose, isOpen: isOpen, isCentered: isCentered, children: [_jsx(AlertDialogOverlay, {}), _jsxs(AlertDialogContent, { bg: colors.background[50], sx: ContentStyle, children: [_jsx(AlertDialogHeader, { sx: headerStyle, children: title }), _jsx(AlertDialogCloseButton, { sx: closeButtonStyle }), _jsx(AlertDialogBody, { sx: bodyStyle, children: content }), _jsxs(AlertDialogFooter, { sx: footerStyle, children: [_jsx(Button, { ref: leastDestructiveRef, onClick: onClose, variant: "outline", colorScheme: "red", size: "sm", sx: button1Style, children: cancelButtonText }), _jsx(Button, { colorScheme: "primary", onClick: onConfirm, isLoading: isConfirmLoading, ml: 3, size: "sm", sx: button2Style, children: confirmButtonText })] })] })] }, key));
|
|
@@ -4,6 +4,7 @@ import ReactApexChart from "react-apexcharts";
|
|
|
4
4
|
import { useCustomTheme } from "../../../Theme/useCustomTheme.js";
|
|
5
5
|
import { getDefaultSeriesColors, mergeChartTitleStyle, } from "../../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
6
6
|
import { baseAxisLabels, baseChart, baseGrid, baseLegend, baseTooltip } from "../chartBase.js";
|
|
7
|
+
/** Filled line chart (basic/stacked/gradient/sparkline); unlike `ApexLineChart`, `data`/`series` are read fresh via `useMemo` every render, not frozen at mount. */
|
|
7
8
|
const ApexAreaChart = ({ variant = "basic", data, series, labels, title, titlePosition = "left", height = 320, width = "100%", colors, showLegend = true, legendPosition = "bottom", yAxisFormatter, }) => {
|
|
8
9
|
const { colors: palette } = useCustomTheme();
|
|
9
10
|
const seriesColors = useMemo(() => colors !== null && colors !== void 0 ? colors : getDefaultSeriesColors(palette), [colors, palette]);
|
|
@@ -4,6 +4,7 @@ import ReactApexChart from "react-apexcharts";
|
|
|
4
4
|
import { useTheme } from "@chakra-ui/react";
|
|
5
5
|
import { chartAxisLabelColor, getDefaultSeriesColors, mergeChartTitleStyle, } from "../../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
6
6
|
import { baseAxisLabels, baseChart, baseGrid, baseLegend, baseTooltip } from "../chartBase.js";
|
|
7
|
+
/** Bar chart wrapper around react-apexcharts (horizontal/stacked/distributed via props), themed via chartColorsFromTheme + chartBase. */
|
|
7
8
|
export default function ApexBarChart({ data, labels, title, titlePosition, height = 400, width = 500, barColor, xAxisStyle, yAxisStyle, titleStyle, horizontal = false, distributed = false, seriesName = "Data", series, stacked = false, showLegend, legendPosition = "bottom", }) {
|
|
8
9
|
const theme = useTheme();
|
|
9
10
|
const palette = theme.colors;
|
|
@@ -5,6 +5,7 @@ import { useTheme } from "@chakra-ui/react";
|
|
|
5
5
|
import ToolTip from "../../ToolTip/ToolTip.js";
|
|
6
6
|
import { getDefaultSeriesColors, mergeChartTitleStyle, } from "../../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
7
7
|
import { baseAxisLabels, baseChart, baseGrid, baseTooltip } from "../chartBase.js";
|
|
8
|
+
/** Line chart wrapper around react-apexcharts, themed via chartColorsFromTheme + chartBase. */
|
|
8
9
|
const ApexLineChart = ({ data, labels, title, height, width, lineColors, titlePosition = "center", titleStyle, compact = false, toolbarBreakpointPct = 0.6, titleClampLines, showTitleEllipsis = true, showSeries = true, series: seriesNames, variant = "basic", }) => {
|
|
9
10
|
const theme = useTheme();
|
|
10
11
|
const palette = theme.colors;
|
|
@@ -12,6 +12,7 @@ const getValidLegendPosition = (position) => {
|
|
|
12
12
|
console.warn(`Invalid legend position: ${position}. Defaulting to 'bottom'.`);
|
|
13
13
|
return "bottom";
|
|
14
14
|
};
|
|
15
|
+
/** Pie/donut chart wrapper around react-apexcharts, themed via chartColorsFromTheme + chartBase. */
|
|
15
16
|
const ApexPieChart = ({ data, labels, title, height = 400, width = 500, donutColors, chartColor, titlePosition = "center", titleStyle, legendPosition = "bottom", legendStyle, variant = "pie", showDataLabels = true, minLabelPercent = 8, surfaceColor, donutSize = "68%", totalLabel = "Total", labelPlacement = "auto", }) => {
|
|
16
17
|
var _a;
|
|
17
18
|
const { colors: palette } = useCustomTheme();
|
|
@@ -4,6 +4,7 @@ import ReactApexChart from "react-apexcharts";
|
|
|
4
4
|
import { useTheme } from "@chakra-ui/react";
|
|
5
5
|
import { chartInk, chartMode, getDefaultSeriesColors, mergeChartTitleStyle, } from "../../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
6
6
|
import { baseChart, baseLegend, baseTooltip } from "../chartBase.js";
|
|
7
|
+
/** Polar-area chart wrapper around react-apexcharts, themed via chartColorsFromTheme + chartBase. */
|
|
7
8
|
const ApexPolarChart = ({ data, labels, title, height = 400, width = 500, chartColors, titlePosition = "center", titleStyle, legendStyle, variant = "basic", }) => {
|
|
8
9
|
const theme = useTheme();
|
|
9
10
|
const palette = theme.colors;
|
|
@@ -4,6 +4,7 @@ import ReactApexChart from "react-apexcharts";
|
|
|
4
4
|
import { useCustomTheme } from "../../../Theme/useCustomTheme.js";
|
|
5
5
|
import { chartInk, getDefaultSeriesColors, mergeChartTitleStyle, } from "../../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
6
6
|
import { baseChart, baseLegend } from "../chartBase.js";
|
|
7
|
+
/** Radial/gauge chart (gauge/multi/semi); `hollowSize` is silently overridden to a fixed `"52%"` whenever `variant="multi"`. */
|
|
7
8
|
const ApexRadialChart = ({ variant = "gauge", data, labels, title, titlePosition = "left", height = 320, width = "100%", colors, totalLabel = "Total", trackColor, hollowSize = "62%", }) => {
|
|
8
9
|
const { colors: palette } = useCustomTheme();
|
|
9
10
|
const ink = chartInk(palette);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { isValidElement } from "react";
|
|
3
|
+
import { Box, Flex, Image } from "@chakra-ui/react";
|
|
4
|
+
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
5
|
+
import { mix } from "../../Theme/tokens/builders/color.js";
|
|
6
|
+
import { onFilled } from "../../Theme/tokens/builders/accentText.js";
|
|
7
|
+
import { liftToContrast } from "../../Theme/tokens/builders/outlineRung.js";
|
|
8
|
+
import { AA_NORMAL_TEXT } from "../../Theme/tokens/builders/accentText.js";
|
|
9
|
+
import { CATEGORICAL_SERIES } from "../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
10
|
+
import { resolveAvatarFill } from "../../Theme/tokens/builders/statusTone.js";
|
|
11
|
+
import { avatarColor } from "../OrgSwitcher/OrgSwitcherProps.js";
|
|
12
|
+
import { appInitials } from "./AppSwitcherProps.js";
|
|
13
|
+
// The app's own hue at 85% strength — the solid mark, softened just off full saturation.
|
|
14
|
+
const FILL_STRENGTH = 0.85;
|
|
15
|
+
/**
|
|
16
|
+
* One hue per app. `avatarColor` hashes into an 8-hue series, so six apps collide more often than
|
|
17
|
+
* not — Billing and Account shipped identical marks. Assigned over the WHOLE list, never the
|
|
18
|
+
* filtered one, so searching cannot repaint a mark.
|
|
19
|
+
*/
|
|
20
|
+
export const assignAppHues = (apps, mode) => {
|
|
21
|
+
const ramp = CATEGORICAL_SERIES[mode].map(resolveAvatarFill);
|
|
22
|
+
const taken = new Set(apps.flatMap((a) => (a.color ? [a.color] : [])));
|
|
23
|
+
return apps.map((app) => {
|
|
24
|
+
if (app.color)
|
|
25
|
+
return app.color;
|
|
26
|
+
const seed = avatarColor(app.id || app.name, mode);
|
|
27
|
+
const start = Math.max(0, ramp.indexOf(seed));
|
|
28
|
+
for (let i = 0; i < ramp.length; i += 1) {
|
|
29
|
+
const next = ramp[(start + i) % ramp.length];
|
|
30
|
+
if (!taken.has(next)) {
|
|
31
|
+
taken.add(next);
|
|
32
|
+
return next;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// More apps than the series has hues; past this point a repeat is unavoidable.
|
|
36
|
+
return seed;
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
// Softening costs the fill contrast, so it is walked back until a WHITE glyph clears AA — every
|
|
40
|
+
// mark keeps the same white icon instead of some flipping to black.
|
|
41
|
+
export const appTint = (hue, surface, white) => liftToContrast(mix(hue, surface, 1 - FILL_STRENGTH), white, AA_NORMAL_TEXT);
|
|
42
|
+
export const appTintInk = (fill, white, black) => onFilled(fill, white, black);
|
|
43
|
+
const AppMark = ({ app, hue, boxSize, iconSize, muted = false, }) => {
|
|
44
|
+
const { colors } = useCustomTheme();
|
|
45
|
+
if (app.iconUrl) {
|
|
46
|
+
return (_jsx(Image, { src: app.iconUrl, alt: "", boxSize: boxSize, borderRadius: "lg", objectFit: "cover", flexShrink: 0, opacity: muted ? 0.55 : 1 }));
|
|
47
|
+
}
|
|
48
|
+
const surface = colors.backgroundColor.light;
|
|
49
|
+
const fill = muted ? colors.backgroundColor.quaternary : appTint(hue, surface, colors.white);
|
|
50
|
+
const ink = muted ? colors.textMuted : appTintInk(fill, colors.white, colors.black);
|
|
51
|
+
// lucide icons are forwardRef objects, not functions — a typeof check silently drops them.
|
|
52
|
+
const isElement = isValidElement(app.icon);
|
|
53
|
+
const Icon = !isElement && app.icon ? app.icon : null;
|
|
54
|
+
return (_jsx(Flex, { align: "center", justify: "center", boxSize: boxSize, borderRadius: "lg", flexShrink: 0, bg: fill, color: ink, fontSize: `${Math.round(iconSize * 0.72)}px`, fontWeight: 700, "aria-hidden": true, children: Icon ? (_jsx(Icon, { size: iconSize, color: ink })) : isValidElement(app.icon) ? (_jsx(Box, { display: "flex", color: ink, children: app.icon })) : (appInitials(app.name)) }));
|
|
55
|
+
};
|
|
56
|
+
export default AppMark;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Box, Flex, Input, InputGroup, InputLeftElement, Popover, PopoverBody, PopoverContent, PopoverTrigger, Skeleton, Text, useDisclosure, } from "@chakra-ui/react";
|
|
4
|
+
import { Grip, Lock, Search } from "lucide-react";
|
|
5
|
+
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
6
|
+
import { chartMode } from "../../Theme/tokens/builders/chartColorsFromTheme.js";
|
|
7
|
+
import { AA_NORMAL_TEXT } from "../../Theme/tokens/builders/accentText.js";
|
|
8
|
+
import { liftToContrast, neutralStep, ruleInk, AA_NON_TEXT, CHROME_RULE, MIN_PERCEPTIBLE_STEP, } from "../../Theme/tokens/builders/outlineRung.js";
|
|
9
|
+
import { listRowBackgrounds } from "../../Theme/tokens/builders/rowStates.js";
|
|
10
|
+
import { useExclusiveOverlay } from "../../Hooks/useExclusiveOverlay.js";
|
|
11
|
+
import AppMark, { assignAppHues } from "./AppMark.js";
|
|
12
|
+
import { filterApps, formatShortcut, } from "./AppSwitcherProps.js";
|
|
13
|
+
import { useAppSwitcherShortcut } from "./useAppSwitcherShortcut.js";
|
|
14
|
+
const COLUMNS = 2;
|
|
15
|
+
const HEADING = "Your apps";
|
|
16
|
+
const s = { trigger: "36px", mark: "32px", icon: 17, name: "0.875rem", sub: "0.75rem", row: "52px" };
|
|
17
|
+
const warned = new Set();
|
|
18
|
+
const warnOnce = (key, message) => {
|
|
19
|
+
if (process.env.NODE_ENV === "production" || warned.has(key))
|
|
20
|
+
return;
|
|
21
|
+
warned.add(key);
|
|
22
|
+
console.error(`[AppSwitcher] ${message}`);
|
|
23
|
+
};
|
|
24
|
+
const validate = (apps) => {
|
|
25
|
+
const seen = new Set();
|
|
26
|
+
apps.forEach((app, i) => {
|
|
27
|
+
var _a;
|
|
28
|
+
if (!app.id)
|
|
29
|
+
warnOnce(`id-${i}`, `apps[${i}] ("${(_a = app.name) !== null && _a !== void 0 ? _a : "unnamed"}") has no id.`);
|
|
30
|
+
else if (seen.has(app.id))
|
|
31
|
+
warnOnce(`dup-${app.id}`, `duplicate app id "${app.id}".`);
|
|
32
|
+
else
|
|
33
|
+
seen.add(app.id);
|
|
34
|
+
if (!app.url && !app.locked)
|
|
35
|
+
warnOnce(`url-${app.id || i}`, `app "${app.name}" has no url; it cannot be opened.`);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
// Flip back to true to restore `searchThreshold` opening the field on its own.
|
|
39
|
+
const SEARCH_OPENS_BY_COUNT = false;
|
|
40
|
+
const AppSwitcher = ({ apps, currentAppId, onSelect, onOpenChange, isSearchable, searchThreshold = 8, shortcut = null, showShortcutHint = true, hideWhenAlone = true, emptyMessage = "No app matches that name.", footer, ariaLabel = "Switch app", panelWidth, maxHeight = "24rem", isLoading = false, }) => {
|
|
41
|
+
const theme = useCustomTheme();
|
|
42
|
+
const { isOpen, onOpen, onClose } = useDisclosure();
|
|
43
|
+
const requestExclusiveOpen = useExclusiveOverlay(isOpen, onClose);
|
|
44
|
+
const [query, setQuery] = useState("");
|
|
45
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
46
|
+
const searchRef = useRef(null);
|
|
47
|
+
const triggerRef = useRef(null);
|
|
48
|
+
const itemRefs = useRef([]);
|
|
49
|
+
const typeahead = useRef({ buffer: "", at: 0 });
|
|
50
|
+
useEffect(() => validate(apps), [apps]);
|
|
51
|
+
// Search is off while the panel's design settles: the app count alone no longer opens it. An
|
|
52
|
+
// explicit `isSearchable` still wins, so nothing about the prop changed.
|
|
53
|
+
const showSearch = isSearchable !== null && isSearchable !== void 0 ? isSearchable : (SEARCH_OPENS_BY_COUNT && apps.length >= searchThreshold);
|
|
54
|
+
const hues = useMemo(() => assignAppHues(apps, chartMode(theme.colors)), [apps, theme.colors]);
|
|
55
|
+
const visible = useMemo(() => filterApps(apps, query), [apps, query]);
|
|
56
|
+
const setOpen = useCallback((next) => {
|
|
57
|
+
if (next) {
|
|
58
|
+
requestExclusiveOpen();
|
|
59
|
+
onOpen();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
onClose();
|
|
63
|
+
}
|
|
64
|
+
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(next);
|
|
65
|
+
}, [onOpen, onClose, onOpenChange, requestExclusiveOpen]);
|
|
66
|
+
const closeAndRefocus = useCallback(() => {
|
|
67
|
+
var _a;
|
|
68
|
+
setOpen(false);
|
|
69
|
+
setQuery("");
|
|
70
|
+
(_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
71
|
+
}, [setOpen]);
|
|
72
|
+
useAppSwitcherShortcut(shortcut, () => setOpen(true), !isOpen);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (!isOpen)
|
|
75
|
+
setQuery("");
|
|
76
|
+
setActiveIndex(0);
|
|
77
|
+
}, [isOpen]);
|
|
78
|
+
useEffect(() => setActiveIndex(0), [query]);
|
|
79
|
+
const focusItem = useCallback((next) => {
|
|
80
|
+
var _a;
|
|
81
|
+
setActiveIndex(next);
|
|
82
|
+
(_a = itemRefs.current[next]) === null || _a === void 0 ? void 0 : _a.focus();
|
|
83
|
+
}, []);
|
|
84
|
+
// Read the focused row, not state: two keydowns in one React batch would both compute from a
|
|
85
|
+
// stale activeIndex, so holding an arrow key silently dropped moves.
|
|
86
|
+
const currentIndex = useCallback(() => {
|
|
87
|
+
const focused = itemRefs.current.findIndex((el) => el === document.activeElement);
|
|
88
|
+
return focused === -1 ? activeIndex : focused;
|
|
89
|
+
}, [activeIndex]);
|
|
90
|
+
const step = useCallback((delta) => {
|
|
91
|
+
const count = visible.length;
|
|
92
|
+
if (count === 0)
|
|
93
|
+
return;
|
|
94
|
+
focusItem(((currentIndex() + delta) % count + count) % count);
|
|
95
|
+
}, [currentIndex, visible.length, focusItem]);
|
|
96
|
+
const jumpToLetter = useCallback((char) => {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
const buffer = now - typeahead.current.at < 600 ? typeahead.current.buffer + char : char;
|
|
99
|
+
typeahead.current = { buffer, at: now };
|
|
100
|
+
const at = currentIndex();
|
|
101
|
+
const from = buffer.length > 1 ? at : at + 1;
|
|
102
|
+
const order = visible.map((_, i) => (from + i) % visible.length);
|
|
103
|
+
const hit = order.find((i) => visible[i].name.toLowerCase().startsWith(buffer));
|
|
104
|
+
if (hit !== undefined)
|
|
105
|
+
focusItem(hit);
|
|
106
|
+
}, [visible, currentIndex, focusItem]);
|
|
107
|
+
// Chakra parks focus on the panel itself, where no arrow handler lives; route the first press in.
|
|
108
|
+
const handlePanelKeyDown = useCallback((e) => {
|
|
109
|
+
if (itemRefs.current.includes(document.activeElement))
|
|
110
|
+
return;
|
|
111
|
+
if (visible.length === 0)
|
|
112
|
+
return;
|
|
113
|
+
if (["ArrowDown", "ArrowRight", "Home"].includes(e.key)) {
|
|
114
|
+
e.preventDefault();
|
|
115
|
+
focusItem(0);
|
|
116
|
+
}
|
|
117
|
+
else if (["ArrowUp", "ArrowLeft", "End"].includes(e.key)) {
|
|
118
|
+
e.preventDefault();
|
|
119
|
+
focusItem(visible.length - 1);
|
|
120
|
+
}
|
|
121
|
+
else if (e.key === "Escape") {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
closeAndRefocus();
|
|
124
|
+
}
|
|
125
|
+
}, [visible.length, focusItem, closeAndRefocus]);
|
|
126
|
+
const handleItemKeyDown = useCallback((e, app) => {
|
|
127
|
+
if (e.key === "ArrowDown") {
|
|
128
|
+
e.preventDefault();
|
|
129
|
+
step(COLUMNS);
|
|
130
|
+
}
|
|
131
|
+
else if (e.key === "ArrowUp") {
|
|
132
|
+
e.preventDefault();
|
|
133
|
+
step(-COLUMNS);
|
|
134
|
+
}
|
|
135
|
+
else if (e.key === "ArrowRight") {
|
|
136
|
+
e.preventDefault();
|
|
137
|
+
step(1);
|
|
138
|
+
}
|
|
139
|
+
else if (e.key === "ArrowLeft") {
|
|
140
|
+
e.preventDefault();
|
|
141
|
+
step(-1);
|
|
142
|
+
}
|
|
143
|
+
else if (e.key === "Home") {
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
focusItem(0);
|
|
146
|
+
}
|
|
147
|
+
else if (e.key === "End") {
|
|
148
|
+
e.preventDefault();
|
|
149
|
+
focusItem(visible.length - 1);
|
|
150
|
+
}
|
|
151
|
+
else if (e.key === "Escape") {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
closeAndRefocus();
|
|
154
|
+
}
|
|
155
|
+
else if (e.key === " " && !app.locked) {
|
|
156
|
+
e.preventDefault();
|
|
157
|
+
e.currentTarget.click();
|
|
158
|
+
}
|
|
159
|
+
else if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey)
|
|
160
|
+
jumpToLetter(e.key.toLowerCase());
|
|
161
|
+
}, [step, focusItem, visible.length, closeAndRefocus, jumpToLetter]);
|
|
162
|
+
const handleSelect = (app, e) => {
|
|
163
|
+
if (app.locked) {
|
|
164
|
+
e.preventDefault();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(app, e);
|
|
168
|
+
if (!e.defaultPrevented)
|
|
169
|
+
setOpen(false);
|
|
170
|
+
};
|
|
171
|
+
const nothingToSwitchTo = apps.length === 0 || (hideWhenAlone && apps.every((a) => a.id === currentAppId));
|
|
172
|
+
if (nothingToSwitchTo)
|
|
173
|
+
return null;
|
|
174
|
+
const rowHoverBg = listRowBackgrounds(theme.colors).active;
|
|
175
|
+
const footerRule = ruleInk(theme.colors.boxborder[200], [theme.colors.backgroundColor.subtle], CHROME_RULE);
|
|
176
|
+
// Neutral, not `backgroundColor.tertiary`: that rung is brand-tinted in the hand-authored light
|
|
177
|
+
// palettes, so lifting it painted the row a saturated block. The rail identifies the row, so the
|
|
178
|
+
// fill only has to be perceptible — pushed further it is a mid-grey slab that reads disabled.
|
|
179
|
+
const currentBg = neutralStep(theme.colors.backgroundColor.light, MIN_PERCEPTIBLE_STEP);
|
|
180
|
+
// The brand rail is the whole marker — no ring, no badge. `accentText` already clears AA as ink
|
|
181
|
+
// on the canvas; lifting it to AA_NON_TEXT here guarantees it on the row's own fill too, for a
|
|
182
|
+
// brand whose accent is pale.
|
|
183
|
+
const currentBar = liftToContrast(theme.colors.accentText, currentBg, AA_NON_TEXT);
|
|
184
|
+
// A derived surface is outside what `withSurfaceRungs` settled, so its ink is resolved here.
|
|
185
|
+
const currentName = liftToContrast(theme.colors.text[900], currentBg, AA_NORMAL_TEXT);
|
|
186
|
+
const currentSub = liftToContrast(theme.colors.textMuted, currentBg, AA_NORMAL_TEXT);
|
|
187
|
+
const width = panelWidth !== null && panelWidth !== void 0 ? panelWidth : "28rem";
|
|
188
|
+
const hint = shortcut && showShortcutHint ? formatShortcut(shortcut) : null;
|
|
189
|
+
return (_jsxs(Popover, { isOpen: isOpen, onOpen: () => setOpen(true), onClose: () => { setOpen(false); setQuery(""); }, placement: "bottom-end", initialFocusRef: showSearch ? searchRef : undefined, isLazy: true, children: [_jsx(PopoverTrigger, { children: _jsx(Flex, { ref: triggerRef, as: "button", type: "button", "aria-label": ariaLabel, align: "center", justify: "center", boxSize: s.trigger, borderRadius: "lg", border: "1px solid", borderColor: isOpen ? theme.colors.boxborder[500] : theme.colors.boxborder[200], bg: isOpen ? theme.colors.backgroundColor.tertiary : "transparent", color: isOpen ? theme.colors.text[900] : theme.colors.textMuted, cursor: "pointer", transition: "background 0.15s ease, border-color 0.15s ease", _hover: { bg: rowHoverBg, color: theme.colors.text[900] }, onKeyDown: (e) => {
|
|
190
|
+
if (!isOpen) {
|
|
191
|
+
if (e.key === "ArrowDown") {
|
|
192
|
+
e.preventDefault();
|
|
193
|
+
setOpen(true);
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
handlePanelKeyDown(e);
|
|
198
|
+
}, children: _jsx(Grip, { size: s.icon + 1 }) }) }), _jsx(PopoverContent, { w: width, maxW: "calc(100vw - 1.5rem)", textAlign: "start", onKeyDown: handlePanelKeyDown, bg: theme.colors.backgroundColor.light, borderRadius: "xl", overflow: "hidden", boxShadow: `0 10px 30px ${theme.colors.boxShadow.default}`, _focus: { outline: "none", boxShadow: `0 10px 30px ${theme.colors.boxShadow.default}` }, children: _jsxs(PopoverBody, { p: 0, children: [_jsxs(Flex, { align: "center", gap: 2, px: 3, pt: 3, pb: showSearch ? 2 : 1, children: [_jsx(Text, { fontSize: "0.6875rem", fontWeight: 600, letterSpacing: "0.08em", textTransform: "uppercase", color: theme.colors.textMuted, children: HEADING }), _jsx(Box, { flex: "1" }), hint && (_jsx(Text, { as: "kbd", fontSize: "0.6875rem", fontFamily: "inherit", color: theme.colors.textMuted, border: "1px solid", borderRadius: "base", px: 1.5, py: 0.5, children: hint }))] }), showSearch && (_jsx(Box, { px: 3, pb: 2, children: _jsxs(InputGroup, { size: "sm", children: [_jsx(InputLeftElement, { pointerEvents: "none", children: _jsx(Search, { size: 15, color: theme.colors.textMuted }) }), _jsx(Input, { ref: searchRef, value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search apps", borderRadius: "lg", "aria-label": "Search apps", onKeyDown: (e) => {
|
|
199
|
+
if (e.key === "ArrowDown" && visible.length > 0) {
|
|
200
|
+
e.preventDefault();
|
|
201
|
+
focusItem(0);
|
|
202
|
+
}
|
|
203
|
+
else if (e.key === "Escape") {
|
|
204
|
+
e.preventDefault();
|
|
205
|
+
if (query)
|
|
206
|
+
setQuery("");
|
|
207
|
+
else
|
|
208
|
+
closeAndRefocus();
|
|
209
|
+
}
|
|
210
|
+
} })] }) })), _jsxs(Box, { role: "menu", "aria-label": HEADING, maxH: maxHeight, overflowY: "auto", px: 2, pb: 2, display: "grid", gridTemplateColumns: `repeat(${COLUMNS}, minmax(0, 1fr))`, gap: "2px", children: [isLoading
|
|
211
|
+
? [0, 1, 2, 3].map((i) => (_jsxs(Flex, { align: "center", gap: 3, px: 2, py: 2, minH: s.row, children: [_jsx(Skeleton, { boxSize: s.mark, borderRadius: "lg" }), _jsx(Skeleton, { h: "0.75rem", flex: "1", borderRadius: "base" })] }, i)))
|
|
212
|
+
: visible.map((app, idx) => {
|
|
213
|
+
var _a;
|
|
214
|
+
const isCurrent = app.id === currentAppId;
|
|
215
|
+
const interactive = !isCurrent && !app.locked;
|
|
216
|
+
return (_jsxs(Flex, { as: interactive ? "a" : "div", role: "menuitem", ref: (el) => { itemRefs.current[idx] = el; }, tabIndex: idx === activeIndex ? 0 : -1, "aria-current": isCurrent ? "true" : undefined, "aria-disabled": app.locked ? true : undefined, title: app.locked ? ((_a = app.lockedReason) !== null && _a !== void 0 ? _a : `${app.name} is not available on your plan`) : undefined, ...(interactive
|
|
217
|
+
? {
|
|
218
|
+
href: app.url,
|
|
219
|
+
target: "_blank",
|
|
220
|
+
rel: "noopener noreferrer",
|
|
221
|
+
}
|
|
222
|
+
: {}), align: "center", gap: 3, minH: s.row, px: 2, py: 2, borderRadius: "lg", textDecoration: "none", cursor: interactive ? "pointer" : "default", bg: isCurrent ? currentBg : "transparent", position: "relative",
|
|
223
|
+
// Full height, taking the row's own `lg` radius on its outer corners so the
|
|
224
|
+
// rail follows the row's curve instead of cutting across it.
|
|
225
|
+
_before: isCurrent
|
|
226
|
+
? {
|
|
227
|
+
content: '""',
|
|
228
|
+
position: "absolute",
|
|
229
|
+
insetInlineStart: 0,
|
|
230
|
+
insetBlock: 0,
|
|
231
|
+
width: "3px",
|
|
232
|
+
borderStartStartRadius: "lg",
|
|
233
|
+
borderEndStartRadius: "lg",
|
|
234
|
+
bg: currentBar,
|
|
235
|
+
}
|
|
236
|
+
: undefined, transition: "background 0.12s ease", _hover: interactive ? { bg: rowHoverBg } : undefined, onClick: (e) => handleSelect(app, e), onKeyDown: (e) => handleItemKeyDown(e, app), children: [_jsx(AppMark, { app: app, hue: hues[apps.indexOf(app)], boxSize: s.mark, iconSize: s.icon, muted: app.locked }), _jsxs(Box, { flex: "1", minW: 0, children: [_jsxs(Flex, { align: "center", gap: 1.5, children: [_jsx(Text, { fontSize: s.name, fontWeight: 600, color: app.locked
|
|
237
|
+
? theme.colors.textMuted
|
|
238
|
+
: isCurrent
|
|
239
|
+
? currentName
|
|
240
|
+
: theme.colors.text[900], overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", children: app.name }), app.badge !== undefined && !isCurrent && (_jsx(Text, { fontSize: "0.625rem", fontWeight: 600, color: theme.colors.semanticText.info, flexShrink: 0, children: app.badge }))] }), app.description && (_jsx(Text, { fontSize: s.sub, color: isCurrent ? currentSub : theme.colors.textMuted, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", children: app.description }))] }), app.locked && (_jsx(Box, { as: Lock, size: 14, color: theme.colors.textMuted, flexShrink: 0 }))] }, app.id || app.name));
|
|
241
|
+
}), !isLoading && visible.length === 0 && (_jsx(Box, { gridColumn: `span ${COLUMNS}`, px: 2, py: 6, textAlign: "center", children: _jsx(Text, { fontSize: s.name, color: theme.colors.textMuted, children: emptyMessage }) }))] }), footer && (_jsx(Flex, { align: "center", gap: 1.5, px: 3, py: 2.5, borderTop: "1px solid", borderTopColor: footerRule, bg: theme.colors.backgroundColor.subtle, children: footer }))] }) })] }));
|
|
242
|
+
};
|
|
243
|
+
export default AppSwitcher;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const NON_WORD = /[^\p{L}\p{N}]+/u;
|
|
2
|
+
/** Up to two initials, so a mark stays legible without an icon. */
|
|
3
|
+
export const appInitials = (name) => {
|
|
4
|
+
const words = name.trim().split(NON_WORD).filter(Boolean);
|
|
5
|
+
if (words.length === 0)
|
|
6
|
+
return "?";
|
|
7
|
+
if (words.length === 1)
|
|
8
|
+
return words[0].slice(0, 2).toUpperCase();
|
|
9
|
+
return (words[0][0] + words[1][0]).toUpperCase();
|
|
10
|
+
};
|
|
11
|
+
export const filterApps = (apps, query) => {
|
|
12
|
+
const q = query.trim().toLowerCase();
|
|
13
|
+
if (!q)
|
|
14
|
+
return apps;
|
|
15
|
+
return apps.filter((app) => {
|
|
16
|
+
var _a, _b;
|
|
17
|
+
return [app.name, (_a = app.description) !== null && _a !== void 0 ? _a : "", ...((_b = app.keywords) !== null && _b !== void 0 ? _b : [])]
|
|
18
|
+
.join(" ")
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.includes(q);
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
/** "mod" is Cmd on Apple platforms and Ctrl everywhere else. */
|
|
24
|
+
export const matchesShortcut = (event, shortcut, isApple = typeof navigator !== "undefined" && /Mac|iPhone|iPad/.test(navigator.platform)) => {
|
|
25
|
+
const parts = shortcut.toLowerCase().split("+").map((p) => p.trim()).filter(Boolean);
|
|
26
|
+
if (parts.length === 0)
|
|
27
|
+
return false;
|
|
28
|
+
const key = parts[parts.length - 1];
|
|
29
|
+
const mods = new Set(parts.slice(0, -1));
|
|
30
|
+
const wantsMod = mods.has("mod");
|
|
31
|
+
const wantsCtrl = mods.has("ctrl") || (wantsMod && !isApple);
|
|
32
|
+
const wantsMeta = mods.has("cmd") || mods.has("meta") || (wantsMod && isApple);
|
|
33
|
+
if (event.ctrlKey !== wantsCtrl)
|
|
34
|
+
return false;
|
|
35
|
+
if (event.metaKey !== wantsMeta)
|
|
36
|
+
return false;
|
|
37
|
+
if (event.shiftKey !== mods.has("shift"))
|
|
38
|
+
return false;
|
|
39
|
+
if (event.altKey !== mods.has("alt"))
|
|
40
|
+
return false;
|
|
41
|
+
return event.key.toLowerCase() === key;
|
|
42
|
+
};
|
|
43
|
+
const APPLE_SYMBOLS = { mod: "⌘", cmd: "⌘", meta: "⌘", ctrl: "⌃", shift: "⇧", alt: "⌥" };
|
|
44
|
+
const OTHER_LABELS = { mod: "Ctrl", cmd: "Win", meta: "Win", ctrl: "Ctrl", shift: "Shift", alt: "Alt" };
|
|
45
|
+
export const formatShortcut = (shortcut, isApple = typeof navigator !== "undefined" && /Mac|iPhone|iPad/.test(navigator.platform)) => {
|
|
46
|
+
const parts = shortcut.toLowerCase().split("+").map((p) => p.trim()).filter(Boolean);
|
|
47
|
+
const table = isApple ? APPLE_SYMBOLS : OTHER_LABELS;
|
|
48
|
+
const rendered = parts.map((p, i) => { var _a; return i === parts.length - 1 ? p.toUpperCase() : ((_a = table[p]) !== null && _a !== void 0 ? _a : p.toUpperCase()); });
|
|
49
|
+
return isApple ? rendered.join("") : rendered.join("+");
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Derives every app's origin from the host the consumer is already served on, so one deployment
|
|
53
|
+
* variable keeps dev, test and prod in step. An app may still carry its own `url`, which wins.
|
|
54
|
+
*/
|
|
55
|
+
export const buildSuiteApps = (apps, { baseUrl, baseSubdomain }) => {
|
|
56
|
+
let base;
|
|
57
|
+
try {
|
|
58
|
+
base = new URL(baseUrl.trim());
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new Error(`[AppSwitcher] buildSuiteApps: baseUrl ${JSON.stringify(baseUrl)} is not an absolute URL.`);
|
|
62
|
+
}
|
|
63
|
+
const labels = base.hostname.split(".");
|
|
64
|
+
const at = labels.indexOf(baseSubdomain);
|
|
65
|
+
return apps.map(({ subdomain, url, ...app }) => {
|
|
66
|
+
if (url)
|
|
67
|
+
return { ...app, url: url.trim() };
|
|
68
|
+
// Without the label there is nothing to swap, and every app would silently share one origin.
|
|
69
|
+
if (at === -1) {
|
|
70
|
+
throw new Error(`[AppSwitcher] buildSuiteApps: ${JSON.stringify(baseSubdomain)} is not a label in ` +
|
|
71
|
+
`"${base.hostname}", so ${JSON.stringify(app.name)} has no derivable url. ` +
|
|
72
|
+
`Give that app an explicit url, or pass a baseUrl that contains the label.`);
|
|
73
|
+
}
|
|
74
|
+
const next = new URL(base.toString());
|
|
75
|
+
next.hostname = labels.map((l, i) => (i === at ? subdomain : l)).join(".");
|
|
76
|
+
return { ...app, url: next.origin };
|
|
77
|
+
});
|
|
78
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { matchesShortcut } from "./AppSwitcherProps.js";
|
|
3
|
+
const isTypingTarget = (target) => {
|
|
4
|
+
if (!(target instanceof HTMLElement))
|
|
5
|
+
return false;
|
|
6
|
+
if (target.isContentEditable)
|
|
7
|
+
return true;
|
|
8
|
+
return ["INPUT", "TEXTAREA", "SELECT"].includes(target.tagName);
|
|
9
|
+
};
|
|
10
|
+
/** Fires `onTrigger` on the shortcut. Inert when `shortcut` is null, and never in SSR. */
|
|
11
|
+
export const useAppSwitcherShortcut = (shortcut, onTrigger, enabled = true) => {
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!shortcut || !enabled || typeof window === "undefined")
|
|
14
|
+
return undefined;
|
|
15
|
+
const handler = (event) => {
|
|
16
|
+
if (event.defaultPrevented || isTypingTarget(event.target))
|
|
17
|
+
return;
|
|
18
|
+
if (!matchesShortcut(event, shortcut))
|
|
19
|
+
return;
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
onTrigger();
|
|
22
|
+
};
|
|
23
|
+
window.addEventListener("keydown", handler);
|
|
24
|
+
return () => window.removeEventListener("keydown", handler);
|
|
25
|
+
}, [shortcut, enabled, onTrigger]);
|
|
26
|
+
};
|
|
27
|
+
export default useAppSwitcherShortcut;
|
|
@@ -5,13 +5,14 @@ import { ThemesList } from "../../Theme/index.js";
|
|
|
5
5
|
import { ThemeSwitcher } from "../../Theme/provider/index.js";
|
|
6
6
|
import { FONT_SIZE_OPTIONS } from "../../Theme/provider/fontSize.js";
|
|
7
7
|
import { lightPalettes } from "../../Theme/tokens/brands/index.js";
|
|
8
|
+
import { CHROME_RULE, ruleInk } from "../../Theme/tokens/builders/outlineRung.js";
|
|
8
9
|
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
9
10
|
import SelectV2 from "../SelectV2/SelectV2.js";
|
|
10
11
|
const FieldLabel = ({ children }) => {
|
|
11
12
|
const { colors } = useCustomTheme();
|
|
12
13
|
return (_jsx(Text, { fontSize: "sm", fontWeight: "medium", color: colors.textMuted, mb: 2, children: children }));
|
|
13
14
|
};
|
|
14
|
-
const brandSwatch = (name, colors) => (_jsx(Box, { w: "14px", h: "14px", borderRadius: "full", bg: lightPalettes[name].primary[500], border: "1px solid", borderColor: colors.boxborder[
|
|
15
|
+
const brandSwatch = (name, colors) => (_jsx(Box, { w: "14px", h: "14px", borderRadius: "full", bg: lightPalettes[name].primary[500], border: "1px solid", borderColor: ruleInk(colors.boxborder[200], [colors.backgroundColor.light, colors.backgroundColor.tertiary], CHROME_RULE) }));
|
|
15
16
|
export const AppearanceSettings = ({ brand, fontSize, onBrandChange, onFontSizeChange, showBrand = true, showColorMode = true, showFontSize = true, size = "sm", labels, }) => {
|
|
16
17
|
var _a, _b, _c;
|
|
17
18
|
const { colors } = useCustomTheme();
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo } from "react";
|
|
2
|
+
import { forwardRef, memo } from "react";
|
|
3
3
|
import { Button as ChakraButton } from "@chakra-ui/react";
|
|
4
|
-
function Button({ label, children, onClick, opacity, variant = "solid", leftIcon, rightIcon, size, isDisabled = false, isLoading = false, loadingText = "Loading", type, width, sx, colorScheme,
|
|
5
|
-
|
|
6
|
-
}
|
|
4
|
+
const Button = forwardRef(function Button({ label, children, onClick, opacity, variant = "solid", leftIcon, rightIcon, size, isDisabled = false, isLoading = false, loadingText = "Loading", type, width, w, sx, colorScheme, border, borderRadius, onMouseEnter, onMouseLeave, ...aria }, ref) {
|
|
5
|
+
const isIconOnly = !children && !label && !!(leftIcon || rightIcon);
|
|
6
|
+
return (_jsx(ChakraButton, { ...aria, type: type, onClick: onClick, width: width || w || "fit-content", variant: variant, size: size, isLoading: isLoading, isDisabled: isDisabled, loadingText: loadingText, leftIcon: leftIcon, rightIcon: rightIcon, iconSpacing: isIconOnly ? 0 : undefined, ref: ref, colorScheme: colorScheme, sx: sx, opacity: opacity, border: border, borderRadius: borderRadius, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, children: children !== null && children !== void 0 ? children : label }));
|
|
7
|
+
});
|
|
7
8
|
export default memo(Button);
|