pixelize-design-library 2.4.2-beta.4 → 2.4.2-beta.41
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 +1102 -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 +17 -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/MenuItemBox.js +15 -11
- package/dist/Components/SideBar/components/MenuPopoverContent.js +13 -10
- 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/MenuItemBox.js +15 -11
- package/dist/esm/Components/SideBar/components/MenuPopoverContent.js +13 -10
- 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
|
@@ -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);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { accentTextOnCanvas
|
|
1
|
+
import { accentTextOnCanvas } from "../../Theme/tokens/builders/accentText.js";
|
|
2
|
+
import { darkerFillRung, labelOnFill, solidFillRung, } from "../../Theme/tokens/builders/filledSurface.js";
|
|
2
3
|
import { resolveGradient, gradientCss } from "../../Theme/tokens/builders/gradientInk.js";
|
|
4
|
+
import { focusVisibleStyles } from "../../Theme/chakra/focusRing.styles.js";
|
|
3
5
|
/**
|
|
4
6
|
* Outline/ghost/link text sits ON the canvas, so it needs a rung that stays readable there —
|
|
5
7
|
* `[500]` is pinned dark enough to carry a white label on the solid variant and measures only
|
|
@@ -17,24 +19,28 @@ const onCanvasHoverBg = (theme, colorScheme, step) => {
|
|
|
17
19
|
const scale = theme.colors[colorScheme];
|
|
18
20
|
return "opacity" in scale ? scale.opacity[step] : scale[50];
|
|
19
21
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
* white label stays legible.
|
|
23
|
-
*
|
|
24
|
-
* Every dark scale runs dark -> light across 50 -> 900 (brand scales are rebuilt that way, utility
|
|
25
|
-
* hues are reversed), the mirror of light mode. So "darker than [500]" is [600]/[700] in light but
|
|
26
|
-
* [400]/[300] in dark. Hardcoding [600] would hand the label a LIGHTER fill in dark and drop it to
|
|
27
|
-
* ~3.2 contrast.
|
|
28
|
-
*/
|
|
29
|
-
const FILL_STEP_RUNGS = { light: [600, 700], dark: [400, 300] };
|
|
22
|
+
const swatch = (theme, colorScheme) => theme.colors[colorScheme];
|
|
23
|
+
const buttonSolidRung = (theme, colorScheme) => solidFillRung(swatch(theme, colorScheme), theme.colors.white);
|
|
30
24
|
const darkerFill = (theme, colorScheme, step) => {
|
|
31
|
-
const
|
|
32
|
-
|
|
25
|
+
const scale = swatch(theme, colorScheme);
|
|
26
|
+
const rung = darkerFillRung(scale, theme.colors.backgroundColor.main, theme.colors.white, step);
|
|
27
|
+
return scale[rung];
|
|
33
28
|
};
|
|
34
29
|
/** Label for the solid variant's filled bg — derived from THAT fill, since hover/active swap it. */
|
|
35
|
-
const labelFor = (theme, fill) =>
|
|
30
|
+
const labelFor = (theme, fill) => labelOnFill(fill, theme.colors.white, theme.colors.black);
|
|
31
|
+
/**
|
|
32
|
+
* The two-tone `:focus-visible` ring, from the palette's derived `focusRing` pair.
|
|
33
|
+
*
|
|
34
|
+
* Every variant spreads this. Before it, none of them defined `_focusVisible` at all, so every
|
|
35
|
+
* button in every consuming app fell through to Chakra's stock `shadows.outline` — one fixed blue
|
|
36
|
+
* that measured 1.83:1 on the canvas and 1.38:1 on a primary fill, failing WCAG 1.4.11 (3:1) on
|
|
37
|
+
* all nine brands. `focusRing.test.ts` is the gate that keeps this true.
|
|
38
|
+
*/
|
|
39
|
+
const focusRing = (theme) => focusVisibleStyles(theme.colors);
|
|
36
40
|
export const Button = {
|
|
37
|
-
|
|
41
|
+
// The ring is repeated on every variant below AND here, so a variant name this file does not
|
|
42
|
+
// define (a consumer's own, or an `IconButton` falling through) still gets an indicator.
|
|
43
|
+
baseStyle: ({ theme }) => ({
|
|
38
44
|
borderRadius: "lg",
|
|
39
45
|
fontWeight: 500,
|
|
40
46
|
fontSize: "1rem",
|
|
@@ -43,10 +49,11 @@ export const Button = {
|
|
|
43
49
|
opacity: 0.6,
|
|
44
50
|
cursor: "not-allowed",
|
|
45
51
|
},
|
|
52
|
+
...focusRing(theme),
|
|
46
53
|
}),
|
|
47
54
|
variants: {
|
|
48
55
|
solid: ({ theme, colorScheme = "primary" }) => {
|
|
49
|
-
const fill = theme.colors[colorScheme][
|
|
56
|
+
const fill = theme.colors[colorScheme][buttonSolidRung(theme, colorScheme)];
|
|
50
57
|
const hoverFill = darkerFill(theme, colorScheme, 0);
|
|
51
58
|
const activeFill = darkerFill(theme, colorScheme, 1);
|
|
52
59
|
const hoverLabel = labelFor(theme, hoverFill);
|
|
@@ -75,25 +82,26 @@ export const Button = {
|
|
|
75
82
|
color: hoverLabel,
|
|
76
83
|
},
|
|
77
84
|
},
|
|
85
|
+
...focusRing(theme),
|
|
78
86
|
};
|
|
79
87
|
},
|
|
80
88
|
outline: ({ theme, colorScheme = "primary" }) => {
|
|
81
|
-
|
|
89
|
+
// Same rung as `solid`'s fill, not raw [500] — keeps hover bg AA-safe for white text.
|
|
90
|
+
const hoverFill = theme.colors[colorScheme][buttonSolidRung(theme, colorScheme)];
|
|
82
91
|
const activeFill = darkerFill(theme, colorScheme, 0);
|
|
92
|
+
const ink = onCanvasText(theme, colorScheme);
|
|
83
93
|
return {
|
|
84
94
|
border: "0.1rem solid",
|
|
85
|
-
borderColor:
|
|
86
|
-
color:
|
|
95
|
+
borderColor: ink,
|
|
96
|
+
color: ink,
|
|
87
97
|
bg: "transparent",
|
|
88
98
|
_hover: {
|
|
89
99
|
bg: hoverFill,
|
|
90
100
|
borderColor: activeFill,
|
|
91
|
-
// Was a hardcoded `theme.colors.white` — fails AA for any colorScheme whose [500]
|
|
92
|
-
// doesn't clear white contrast (e.g. emerald/rosewood primary in dark, 3.38/3.46).
|
|
93
101
|
color: labelFor(theme, hoverFill),
|
|
94
102
|
_disabled: {
|
|
95
103
|
// bg: theme.colors[colorScheme][500],
|
|
96
|
-
color:
|
|
104
|
+
color: ink,
|
|
97
105
|
},
|
|
98
106
|
},
|
|
99
107
|
_active: {
|
|
@@ -102,8 +110,9 @@ export const Button = {
|
|
|
102
110
|
},
|
|
103
111
|
_loading: {
|
|
104
112
|
// bg: theme.colors[colorScheme][500],
|
|
105
|
-
color:
|
|
113
|
+
color: ink,
|
|
106
114
|
},
|
|
115
|
+
...focusRing(theme),
|
|
107
116
|
};
|
|
108
117
|
},
|
|
109
118
|
ghost: ({ theme, colorScheme = "primary" }) => ({
|
|
@@ -116,6 +125,7 @@ export const Button = {
|
|
|
116
125
|
_active: {
|
|
117
126
|
bg: onCanvasHoverBg(theme, colorScheme, 24),
|
|
118
127
|
},
|
|
128
|
+
...focusRing(theme),
|
|
119
129
|
}),
|
|
120
130
|
link: ({ theme, colorScheme = "primary" }) => ({
|
|
121
131
|
color: onCanvasText(theme, colorScheme),
|
|
@@ -128,13 +138,16 @@ export const Button = {
|
|
|
128
138
|
_active: {
|
|
129
139
|
color: onCanvasText(theme, colorScheme),
|
|
130
140
|
},
|
|
141
|
+
...focusRing(theme),
|
|
131
142
|
}),
|
|
132
|
-
unstyled:
|
|
143
|
+
// `unstyled` drops the fill, not the affordance: a focus indicator is not styling.
|
|
144
|
+
unstyled: ({ theme }) => ({
|
|
133
145
|
bg: "transparent",
|
|
134
146
|
color: "inherit",
|
|
135
147
|
_hover: {
|
|
136
148
|
bg: "transparent",
|
|
137
149
|
},
|
|
150
|
+
...focusRing(theme),
|
|
138
151
|
}),
|
|
139
152
|
// Theme-based two-tone gradient: each theme defines its own `gradient` {from,to} pair.
|
|
140
153
|
// Ignores colorScheme; hover/active shift brightness so it works for any pair.
|
|
@@ -161,6 +174,7 @@ export const Button = {
|
|
|
161
174
|
filter: "brightness(0.92)",
|
|
162
175
|
_hover: { bgImage: bg, filter: "brightness(0.92)" },
|
|
163
176
|
},
|
|
177
|
+
...focusRing(theme),
|
|
164
178
|
};
|
|
165
179
|
},
|
|
166
180
|
},
|
|
@@ -69,7 +69,7 @@ rightIconDropdown, menulistStyle, menuItemStyle, isLoading, divider = true, left
|
|
|
69
69
|
// this theme-swap app never triggers) — our `bg` prop above only recolors the list
|
|
70
70
|
// itself, not the inherited var, so items fell back to white until hover/focus (which
|
|
71
71
|
// our own sx already overrides). Setting the var here fixes the rest state too.
|
|
72
|
-
sx: { "--menu-bg": theme.colors.backgroundColor.light },
|
|
72
|
+
sx: { "--menu-bg": theme.colors.backgroundColor.light }, borderRadius: "xl", boxShadow: "lg", py: "0.375rem", minW: "12rem", overflow: "hidden", children: dropdownOptions === null || dropdownOptions === void 0 ? void 0 : dropdownOptions.map((option, index) => (_jsxs(MenuItem, { onClick: (event) => handleMenuClick(event, option), style: menuItemStyle, sx: {
|
|
73
73
|
display: "flex",
|
|
74
74
|
alignItems: "center",
|
|
75
75
|
gap: "0.5rem",
|
|
@@ -79,7 +79,7 @@ rightIconDropdown, menulistStyle, menuItemStyle, isLoading, divider = true, left
|
|
|
79
79
|
borderRadius: "lg",
|
|
80
80
|
fontSize: "13px",
|
|
81
81
|
fontWeight: 500,
|
|
82
|
-
color: theme.colors.
|
|
82
|
+
color: theme.colors.text[700],
|
|
83
83
|
transition: "background 0.12s",
|
|
84
84
|
"& svg": { width: "16px", height: "16px" },
|
|
85
85
|
...(divider
|
|
@@ -90,8 +90,6 @@ rightIconDropdown, menulistStyle, menuItemStyle, isLoading, divider = true, left
|
|
|
90
90
|
borderColor: theme.colors.boxborder[200],
|
|
91
91
|
}
|
|
92
92
|
: {}),
|
|
93
|
-
_hover: { bg: theme.colors.primary[50], color: theme.colors.primary[700] },
|
|
94
|
-
_focus: { bg: theme.colors.primary[50], color: theme.colors.primary[700] },
|
|
95
93
|
"&:last-child": { borderBottom: "none" },
|
|
96
94
|
}, children: [option === null || option === void 0 ? void 0 : option.image, option.label] }, index))) }) })] })) : (rightIcon && (_jsx(IconButton, { "aria-label": "Right icon button", icon: rightIcon, isLoading: RightIconLoading, onClick: onRightIconClick, onBlur: onBlurRightIcon, style: buttonGroupRightIconStyle, sx: gradientItemSx })))] }));
|
|
97
95
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Card as ChakraCard } from "@chakra-ui/react";
|
|
3
|
-
export default function Card({
|
|
4
|
-
return (_jsx(ChakraCard, { maxW: maxW, align: align, variant: variant, direction: direction, justify: justify, size: size, overflow: overflow, colorScheme: color, p: 4, sx: sx, children: children }
|
|
3
|
+
export default function Card({ maxW, align, variant, direction, justify, children, size, color, overflow, sx, }) {
|
|
4
|
+
return (_jsx(ChakraCard, { maxW: maxW, align: align, variant: variant, direction: direction, justify: justify, size: size, overflow: overflow, colorScheme: color, p: 4, sx: sx, children: children }));
|
|
5
5
|
}
|