pixelize-design-library 2.4.2-beta.65 → 2.4.2-beta.66
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/CHANGELOG.md +437 -13
- package/COMPONENT-GOTCHAS.md +150 -91
- package/DESIGN-GUIDE.md +47 -7
- package/README.md +37 -3
- package/dist/Components/Accordion/Accordion.js +11 -8
- package/dist/Components/Accordion/AccordionProps.d.ts +4 -0
- package/dist/Components/Accordion/accordionColors.js +1 -2
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -0
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChartProps.d.ts +2 -2
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts +1 -1
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChartProps.d.ts +3 -1
- package/dist/Components/Apexcharts/ApexPieChart/pieImageTexture.d.ts +2 -0
- package/dist/Components/Apexcharts/ApexPieChart/pieImageTexture.js +13 -0
- package/dist/Components/AppSwitcher/AppSwitcher.js +6 -3
- package/dist/Components/AppSwitcher/AppSwitcherProps.d.ts +3 -1
- package/dist/Components/AppSwitcher/AppSwitcherProps.js +18 -11
- package/dist/Components/AppSwitcher/pixelizeSuite.d.ts +24 -0
- package/dist/Components/AppSwitcher/pixelizeSuite.js +71 -0
- package/dist/Components/AppearanceSettings/AppearanceSettings.js +3 -3
- package/dist/Components/AppearanceSettings/AppearanceSettingsProps.d.ts +2 -2
- package/dist/Components/Avatar/avatarColorway.d.ts +2 -2
- package/dist/Components/Avatar/avatarColorway.js +7 -6
- package/dist/Components/Breadcrumbs/BreadcrumbsProps.d.ts +1 -1
- package/dist/Components/Button/Button.styles.js +5 -2
- package/dist/Components/Button/ButtonProps.d.ts +2 -4
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
- package/dist/Components/CalendarGrid/CalendarGrid.js +5 -3
- package/dist/Components/CalendarGrid/CalendarGridProps.d.ts +1 -1
- package/dist/Components/Card/Card.d.ts +1 -0
- package/dist/Components/Card/Card.js +1 -0
- package/dist/Components/Checkbox/Checkbox.styles.js +3 -1
- package/dist/Components/CheckoutKit/selectable.d.ts +3 -1
- package/dist/Components/CheckoutKit/selectable.js +10 -7
- package/dist/Components/CheckoutKit/tonalHover.d.ts +2 -0
- package/dist/Components/CheckoutKit/tonalHover.js +6 -0
- package/dist/Components/ChoiceCard/ChoiceCard.d.ts +1 -1
- package/dist/Components/ChoiceCard/ChoiceCard.js +2 -1
- package/dist/Components/ChoiceCard/ChoiceCardProps.d.ts +6 -0
- package/dist/Components/Common/FieldMessage.d.ts +1 -0
- package/dist/Components/Common/FormLabel.d.ts +1 -1
- package/dist/Components/Common/FormLabel.js +4 -3
- package/dist/Components/Common/HelperText.d.ts +2 -2
- package/dist/Components/Common/HelperText.js +1 -2
- package/dist/Components/Common/activationKey.d.ts +5 -0
- package/dist/Components/Common/activationKey.js +12 -0
- package/dist/Components/Common/dataAttributes.d.ts +4 -0
- package/dist/Components/Common/fieldMessageStyles.js +2 -1
- package/dist/Components/Common/findSlot.d.ts +2 -0
- package/dist/Components/Common/findSlot.js +24 -0
- package/dist/Components/Common/surfaceFocusRing.d.ts +1 -0
- package/dist/Components/Common/surfaceFocusRing.js +7 -0
- package/dist/Components/ConfirmDialog/ConfirmDialog.js +17 -5
- package/dist/Components/ConfirmDialog/ConfirmDialogProps.d.ts +38 -10
- package/dist/Components/CopyButton/CopyButton.d.ts +1 -0
- package/dist/Components/CopyButton/CopyButton.js +3 -6
- package/dist/Components/CouponField/CouponField.js +5 -2
- package/dist/Components/CustomModulesTable/CustomModulesTable.js +3 -1
- package/dist/Components/DatePicker/CalendarPanel.d.ts +1 -0
- package/dist/Components/DatePicker/CalendarPanel.js +3 -1
- package/dist/Components/DatePicker/DatePicker.js +24 -26
- package/dist/Components/DatePicker/DatePickerProps.d.ts +8 -0
- package/dist/Components/DatePicker/PickerPortal.js +1 -1
- package/dist/Components/DatePicker/RangeDatePicker.d.ts +7 -0
- package/dist/Components/DatePicker/RangeDatePicker.js +10 -29
- package/dist/Components/DatePicker/SingleDatePicker.js +5 -21
- package/dist/Components/DatePicker/TimeOnlyPicker.js +2 -20
- package/dist/Components/DescriptionList/DescriptionList.js +1 -1
- package/dist/Components/DetailSections/DetailSections.js +2 -1
- package/dist/Components/Divider/Divider.d.ts +3 -3
- package/dist/Components/Divider/Divider.js +3 -3
- package/dist/Components/Drawer/Drawer.d.ts +2 -0
- package/dist/Components/Drawer/Drawer.js +23 -25
- package/dist/Components/Dropdown/DropDown.js +6 -21
- package/dist/Components/Editor/Editor.js +6 -2
- package/dist/Components/Editor/EditorProps.d.ts +17 -1
- package/dist/Components/Editor/editorLabels.js +1 -0
- package/dist/Components/Editor/editorTokenStyles.d.ts +8 -0
- package/dist/Components/Editor/editorTokenStyles.js +9 -1
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -1
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +9 -2
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +15 -1
- package/dist/Components/EmptyState/EmptyStateProps.d.ts +21 -0
- package/dist/Components/EmptyState/FilteredEmptyState.d.ts +5 -0
- package/dist/Components/EmptyState/FilteredEmptyState.js +23 -0
- package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +1 -0
- package/dist/Components/FilePreview/FilePreview.js +7 -3
- package/dist/Components/FilePreview/FilePreviewProps.d.ts +2 -1
- package/dist/Components/FileUpload/FileUpload.js +8 -9
- package/dist/Components/FileUpload/FileUploadProps.d.ts +2 -2
- package/dist/Components/FileUploader/FileUploader.js +5 -6
- package/dist/Components/FilterSidebar/FilterSidebar.d.ts +7 -9
- package/dist/Components/FilterSidebar/FilterSidebar.js +90 -233
- package/dist/Components/FilterSidebar/OptionsSection.d.ts +14 -0
- package/dist/Components/FilterSidebar/OptionsSection.js +46 -0
- package/dist/Components/FilterSidebar/RangeSection.d.ts +17 -0
- package/dist/Components/FilterSidebar/RangeSection.js +80 -0
- package/dist/Components/FilterSidebar/SectionHeader.d.ts +13 -0
- package/dist/Components/FilterSidebar/SectionHeader.js +29 -0
- package/dist/Components/FilterSidebar/useStableCallback.d.ts +1 -0
- package/dist/Components/FilterSidebar/useStableCallback.js +12 -0
- package/dist/Components/Form/FormWrapper.d.ts +7 -7
- package/dist/Components/Form/FormWrapper.js +5 -3
- package/dist/Components/FormField/FormField.js +1 -1
- package/dist/Components/Header/Header.js +1 -1
- package/dist/Components/Header/HeaderActions.js +4 -2
- package/dist/Components/IconButton/IconButtonProps.d.ts +2 -1
- package/dist/Components/Input/TextInput.js +2 -2
- package/dist/Components/Input/TextInputProps.d.ts +3 -1
- package/dist/Components/KanbanBoard/AccountCard.js +1 -1
- package/dist/Components/KanbanBoard/KanbanBoard.d.ts +1 -1
- package/dist/Components/KanbanBoard/KanbanBoard.js +11 -7
- package/dist/Components/LauncherTrigger/LauncherTrigger.js +1 -1
- package/dist/Components/LazyWrapper/LazyWrapper.d.ts +2 -1
- package/dist/Components/LazyWrapper/LazyWrapper.js +1 -1
- package/dist/Components/MediaViewer/MediaViewer.js +4 -3
- package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
- package/dist/Components/MediaViewer/components/MediaImageViewer.js +19 -8
- package/dist/Components/MediaViewer/components/MediaScrubber.js +7 -2
- package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
- package/dist/Components/MediaViewer/components/ViewerIconButton.js +3 -1
- package/dist/Components/MediaViewer/hooks/useFileViewer.d.ts +1 -0
- package/dist/Components/MediaViewer/mediaItems.d.ts +1 -0
- package/dist/Components/MediaViewer/mediaItems.js +5 -0
- package/dist/Components/Modal/Modal.d.ts +1 -0
- package/dist/Components/Modal/Modal.js +7 -25
- package/dist/Components/Modal/warnDroppedSlotChildren.d.ts +1 -1
- package/dist/Components/Modal/warnDroppedSlotChildren.js +7 -3
- package/dist/Components/NavLauncher/LauncherTabs.js +2 -1
- package/dist/Components/NavLauncher/NavLauncher.js +44 -22
- package/dist/Components/NavLauncher/NavLauncherProps.d.ts +6 -4
- package/dist/Components/NavLauncher/ScopeBar.js +4 -2
- package/dist/Components/NavLauncher/engine/engine.js +2 -1
- package/dist/Components/NavLauncher/engine/fold.js +2 -1
- package/dist/Components/NavLauncher/launcherParts.d.ts +12 -0
- package/dist/Components/NavLauncher/launcherParts.js +45 -11
- package/dist/Components/NavLauncher/searchLayout.d.ts +1 -0
- package/dist/Components/NavLauncher/searchLayout.js +3 -1
- package/dist/Components/NavLauncher/spotlightParts.d.ts +6 -2
- package/dist/Components/NavLauncher/spotlightParts.js +22 -9
- package/dist/Components/NavLauncher/useCopiedFlash.d.ts +6 -0
- package/dist/Components/NavLauncher/useCopiedFlash.js +21 -0
- package/dist/Components/NavigationBar/NavigationBar.js +6 -5
- package/dist/Components/NoteTextArea/NoteTextArea.js +12 -17
- package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +5 -3
- package/dist/Components/Notification/Notification.js +19 -21
- package/dist/Components/Notification/NotificationProps.d.ts +1 -1
- package/dist/Components/NotificationBell/notificationHelpers.d.ts +16 -1
- package/dist/Components/NotificationBell/notificationHelpers.js +13 -7
- package/dist/Components/OffersList/OffersList.js +4 -2
- package/dist/Components/OptionChip/OptionChip.js +3 -2
- package/dist/Components/OptionChip/optionInk.js +4 -2
- package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
- package/dist/Components/OrgSwitcher/OrgSwitcher.js +13 -6
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +1 -1
- package/dist/Components/OrganizationDetails/OrganizationDetails.js +4 -7
- package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +4 -2
- package/dist/Components/PdfViewer/PdfViewer.d.ts +1 -0
- package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +1 -1
- package/dist/Components/PlanPill/PlanPill.js +4 -2
- package/dist/Components/PlanPill/PlanPillProps.d.ts +1 -1
- package/dist/Components/ProductCard/ProductCardAction.js +2 -1
- package/dist/Components/ProductCard/ProductCardSwatches.js +2 -1
- package/dist/Components/ProductDetails/ProductDetails.js +2 -1
- package/dist/Components/ProfileCard/ProfileCard.d.ts +1 -0
- package/dist/Components/ProfileCard/ProfileCard.js +12 -26
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
- package/dist/Components/ProgressBar/ProgressBar.js +2 -1
- package/dist/Components/QuantityStepper/QuantityStepper.js +5 -2
- package/dist/Components/QueryState/QueryStateBoundary.d.ts +1 -1
- package/dist/Components/QueryState/QueryStateBoundary.js +5 -1
- package/dist/Components/QueryState/QueryStateProps.d.ts +6 -2
- package/dist/Components/RadioButton/RadioButton.js +2 -3
- package/dist/Components/RolesPermission/RolesPermission.js +12 -8
- package/dist/Components/ScrollToTop/ScrollToTop.d.ts +1 -0
- package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +4 -1
- package/dist/Components/ScrollbarBox/ScrollbarBox.js +10 -4
- package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -1
- package/dist/Components/SearchSelect/SearchSelect.js +8 -5
- package/dist/Components/SearchSelect/SearchSelectProps.d.ts +3 -3
- package/dist/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/Components/SegmentedControl/SegmentedControl.js +1 -1
- package/dist/Components/Select/Select.js +6 -0
- package/dist/Components/Select/SelectNative.d.ts +16 -0
- package/dist/Components/Select/SelectPopup.js +170 -63
- package/dist/Components/Select/SelectProps.d.ts +30 -2
- package/dist/Components/Select/groupedWindow.d.ts +21 -0
- package/dist/Components/Select/groupedWindow.js +50 -0
- package/dist/Components/SelectSearch/SelectSearch.d.ts +1 -1
- package/dist/Components/SelectSearch/SelectSearch.js +48 -38
- package/dist/Components/SelectSearch/SelectSearchProps.d.ts +3 -3
- package/dist/Components/SelectV2/SelectV2.d.ts +1 -1
- package/dist/Components/SelectV2/SelectV2.js +1 -1
- package/dist/Components/SelectV2/SelectV2Props.d.ts +3 -3
- package/dist/Components/SideBar/SecondaryBar.js +3 -2
- package/dist/Components/SideBar/components/MenuItemBox.js +3 -2
- package/dist/Components/SideBar/components/MenuItems.js +1 -1
- package/dist/Components/SideBar/components/OtherApps.js +2 -2
- package/dist/Components/SideBar/components/PinnedSection.js +1 -1
- package/dist/Components/SideBar/sidebarScale.d.ts +2 -2
- package/dist/Components/SideBar/sidebarScale.js +2 -2
- package/dist/Components/SignInActivityTable/SignInActivityTable.js +7 -2
- package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +1 -1
- package/dist/Components/SignInActivityTable/scrollRegionRing.d.ts +10 -0
- package/dist/Components/SignInActivityTable/scrollRegionRing.js +14 -0
- package/dist/Components/Skeletons/SkeletonProps.d.ts +5 -1
- package/dist/Components/Slider/Slider.d.ts +2 -0
- package/dist/Components/Slider/Slider.js +5 -4
- package/dist/Components/StageProgress/StageItem.js +2 -1
- package/dist/Components/StageProgress/StageProgress.js +8 -2
- package/dist/Components/StageProgress/StageProgressProps.d.ts +2 -0
- package/dist/Components/StageProgress/StepperStage.js +2 -1
- package/dist/Components/StickyBuyBar/StickyBuyBar.js +2 -1
- package/dist/Components/Table/Table.js +5 -3
- package/dist/Components/Table/components/HeaderActions.js +5 -3
- package/dist/Components/Table/components/TableBody.js +13 -8
- package/dist/Components/Table/components/TableGroupRow.js +2 -1
- package/dist/Components/Table/components/TableHeader.js +14 -20
- package/dist/Components/Table/components/rowDetail.js +3 -2
- package/dist/Components/Table/filters/ActiveFilters.js +6 -3
- package/dist/Components/Table/filters/CompactSelect.js +2 -1
- package/dist/Components/Table/filters/FilterDatePicker.d.ts +6 -0
- package/dist/Components/Table/filters/FilterDatePicker.js +61 -0
- package/dist/Components/Table/filters/LeftFilterPane.d.ts +1 -0
- package/dist/Components/Table/filters/LeftFilterPane.js +14 -6
- package/dist/Components/Table/hooks/useTable.js +11 -7
- package/dist/Components/Table/settings/ManageColumns.js +4 -3
- package/dist/Components/Table/settings/TableSettings.js +4 -4
- package/dist/Components/Tabs/Tabs.d.ts +1 -0
- package/dist/Components/Tabs/Tabs.js +1 -0
- package/dist/Components/Tabs/components/CountBadge.d.ts +1 -0
- package/dist/Components/Tabs/components/TabList.d.ts +1 -0
- package/dist/Components/Tabs/components/TabList.js +1 -0
- package/dist/Components/Tabs/components/TabPanel.d.ts +1 -0
- package/dist/Components/Tabs/components/TabPanel.js +1 -0
- package/dist/Components/Tabs/tabStyles.js +4 -2
- package/dist/Components/Tag/Tag.js +5 -4
- package/dist/Components/Tag/Tag.styles.js +5 -4
- package/dist/Components/Tag/TagProps.d.ts +4 -1
- package/dist/Components/Tag/tagDot.js +10 -3
- package/dist/Components/TagInput/TagInput.js +6 -5
- package/dist/Components/TagInput/TagInputProps.d.ts +15 -0
- package/dist/Components/TagInput/tagEntries.d.ts +7 -1
- package/dist/Components/TagInput/tagEntries.js +18 -5
- package/dist/Components/TimePicker/TimePicker.js +7 -3
- package/dist/Components/TimePicker/TimePickerProps.d.ts +2 -0
- package/dist/Components/Timeline/Timeline.js +13 -9
- package/dist/Components/Toaster/Toaster.js +2 -1
- package/dist/Components/Toggle/TableToggle.d.ts +1 -1
- package/dist/Components/Toggle/TableToggle.js +1 -1
- package/dist/Components/UpgradeButton/UpgradeButton.js +3 -2
- package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +1 -1
- package/dist/Components/UserDetails/UserDetails.js +5 -7
- package/dist/Components/WishlistToggle/WishlistToggle.js +2 -1
- package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +11 -1
- package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +3 -1
- package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +14 -7
- package/dist/Hooks/useOutsideMouseDown.d.ts +11 -0
- package/dist/Hooks/useOutsideMouseDown.js +30 -0
- package/dist/Hooks/usePreferences.js +30 -12
- package/dist/Hooks/useScrollableRegion.d.ts +17 -0
- package/dist/Hooks/useScrollableRegion.js +36 -0
- package/dist/Hooks/useSidebarPrefs.d.ts +1 -0
- package/dist/Theme/chakra/Menu.styles.d.ts +4 -0
- package/dist/Theme/chakra/Menu.styles.js +6 -0
- package/dist/Theme/chakra/componentStyles.d.ts +4 -0
- package/dist/Theme/chakra/componentStyles.js +1 -1
- package/dist/Theme/chakra/createBrandTheme.d.ts +1 -0
- package/dist/Theme/chakra/focusRing.styles.d.ts +1 -1
- package/dist/Theme/chakra/focusRing.styles.js +3 -3
- package/dist/Theme/chakra/paletteFromTheme.d.ts +2 -1
- package/dist/Theme/chakra/paletteFromTheme.js +18 -4
- package/dist/Theme/provider/PixelizeThemeProvider.d.ts +1 -0
- package/dist/Theme/provider/ThemeSwitcher.d.ts +1 -0
- package/dist/Theme/provider/ThemeSwitcher.js +1 -1
- package/dist/Theme/testing/testPalette.d.ts +1 -0
- package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +1 -0
- package/dist/Theme/tokens/builders/filledSurface.js +3 -2
- package/dist/Theme/tokens/builders/focusRing.js +4 -1
- package/dist/Theme/tokens/builders/paletteScale.d.ts +2 -0
- package/dist/Theme/tokens/builders/paletteScale.js +10 -0
- package/dist/Theme/tokens/types.d.ts +1 -0
- package/dist/Utils/accountHandoff.d.ts +3 -0
- package/dist/Utils/price.d.ts +1 -0
- package/dist/Utils/tabular.d.ts +30 -0
- package/dist/Utils/tabular.js +61 -0
- package/dist/esm/Components/Accordion/Accordion.js +11 -8
- package/dist/esm/Components/Accordion/accordionColors.js +2 -3
- package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +2 -1
- package/dist/esm/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
- package/dist/esm/Components/Apexcharts/ApexPieChart/pieImageTexture.js +10 -0
- package/dist/esm/Components/AppSwitcher/AppSwitcher.js +6 -3
- package/dist/esm/Components/AppSwitcher/AppSwitcherProps.js +18 -11
- package/dist/esm/Components/AppSwitcher/pixelizeSuite.js +67 -0
- package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +3 -3
- package/dist/esm/Components/Avatar/avatarColorway.js +4 -4
- package/dist/esm/Components/Button/Button.styles.js +5 -2
- package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
- package/dist/esm/Components/CalendarGrid/CalendarGrid.js +5 -3
- package/dist/esm/Components/Card/Card.js +1 -0
- package/dist/esm/Components/Checkbox/Checkbox.styles.js +3 -1
- package/dist/esm/Components/CheckoutKit/selectable.js +10 -7
- package/dist/esm/Components/CheckoutKit/tonalHover.js +2 -0
- package/dist/esm/Components/ChoiceCard/ChoiceCard.js +2 -1
- package/dist/esm/Components/Common/FormLabel.js +4 -3
- package/dist/esm/Components/Common/HelperText.js +1 -2
- package/dist/esm/Components/Common/activationKey.js +7 -0
- package/dist/esm/Components/Common/fieldMessageStyles.js +2 -1
- package/dist/esm/Components/Common/findSlot.js +17 -0
- package/dist/esm/Components/Common/surfaceFocusRing.js +3 -0
- package/dist/esm/Components/ConfirmDialog/ConfirmDialog.js +18 -6
- package/dist/esm/Components/CopyButton/CopyButton.js +3 -6
- package/dist/esm/Components/CouponField/CouponField.js +5 -2
- package/dist/esm/Components/CustomModulesTable/CustomModulesTable.js +3 -1
- package/dist/esm/Components/DatePicker/CalendarPanel.js +3 -1
- package/dist/esm/Components/DatePicker/DatePicker.js +25 -27
- package/dist/esm/Components/DatePicker/PickerPortal.js +2 -2
- package/dist/esm/Components/DatePicker/RangeDatePicker.js +10 -29
- package/dist/esm/Components/DatePicker/SingleDatePicker.js +5 -21
- package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +2 -20
- package/dist/esm/Components/DescriptionList/DescriptionList.js +1 -1
- package/dist/esm/Components/DetailSections/DetailSections.js +2 -1
- package/dist/esm/Components/Divider/Divider.js +3 -3
- package/dist/esm/Components/Drawer/Drawer.js +19 -18
- package/dist/esm/Components/Dropdown/DropDown.js +7 -22
- package/dist/esm/Components/Editor/Editor.js +7 -3
- package/dist/esm/Components/Editor/editorLabels.js +1 -0
- package/dist/esm/Components/Editor/editorTokenStyles.js +7 -0
- package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +8 -4
- package/dist/esm/Components/EmptyState/FilteredEmptyState.js +18 -0
- package/dist/esm/Components/FilePreview/FilePreview.js +8 -4
- package/dist/esm/Components/FileUpload/FileUpload.js +8 -9
- package/dist/esm/Components/FileUploader/FileUploader.js +6 -7
- package/dist/esm/Components/FilterSidebar/FilterSidebar.js +94 -237
- package/dist/esm/Components/FilterSidebar/OptionsSection.js +41 -0
- package/dist/esm/Components/FilterSidebar/RangeSection.js +78 -0
- package/dist/esm/Components/FilterSidebar/SectionHeader.js +23 -0
- package/dist/esm/Components/FilterSidebar/useStableCallback.js +8 -0
- package/dist/esm/Components/Form/FormWrapper.js +5 -3
- package/dist/esm/Components/FormField/FormField.js +1 -1
- package/dist/esm/Components/Header/Header.js +1 -1
- package/dist/esm/Components/Header/HeaderActions.js +6 -4
- package/dist/esm/Components/Input/TextInput.js +2 -2
- package/dist/esm/Components/KanbanBoard/AccountCard.js +1 -1
- package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
- package/dist/esm/Components/KanbanBoard/KanbanBoard.js +11 -7
- package/dist/esm/Components/LauncherTrigger/LauncherTrigger.js +1 -1
- package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -1
- package/dist/esm/Components/MediaViewer/MediaViewer.js +5 -4
- package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
- package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +19 -8
- package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +7 -2
- package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
- package/dist/esm/Components/MediaViewer/components/ViewerIconButton.js +3 -1
- package/dist/esm/Components/MediaViewer/mediaItems.js +4 -0
- package/dist/esm/Components/Modal/Modal.js +2 -17
- package/dist/esm/Components/Modal/warnDroppedSlotChildren.js +7 -3
- package/dist/esm/Components/NavLauncher/LauncherTabs.js +2 -1
- package/dist/esm/Components/NavLauncher/NavLauncher.js +47 -25
- package/dist/esm/Components/NavLauncher/ScopeBar.js +4 -2
- package/dist/esm/Components/NavLauncher/engine/engine.js +2 -1
- package/dist/esm/Components/NavLauncher/engine/fold.js +2 -1
- package/dist/esm/Components/NavLauncher/launcherParts.js +40 -8
- package/dist/esm/Components/NavLauncher/searchLayout.js +1 -0
- package/dist/esm/Components/NavLauncher/spotlightParts.js +23 -10
- package/dist/esm/Components/NavLauncher/useCopiedFlash.js +17 -0
- package/dist/esm/Components/NavigationBar/NavigationBar.js +6 -5
- package/dist/esm/Components/NoteTextArea/NoteTextArea.js +12 -17
- package/dist/esm/Components/Notification/Notification.js +20 -22
- package/dist/esm/Components/NotificationBell/notificationHelpers.js +12 -6
- package/dist/esm/Components/OffersList/OffersList.js +4 -2
- package/dist/esm/Components/OptionChip/OptionChip.js +3 -2
- package/dist/esm/Components/OptionChip/optionInk.js +4 -2
- package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
- package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +14 -7
- package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +5 -8
- package/dist/esm/Components/PlanPill/PlanPill.js +4 -2
- package/dist/esm/Components/ProductCard/ProductCardAction.js +2 -1
- package/dist/esm/Components/ProductCard/ProductCardSwatches.js +2 -1
- package/dist/esm/Components/ProductDetails/ProductDetails.js +2 -1
- package/dist/esm/Components/ProfileCard/ProfileCard.js +6 -17
- package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
- package/dist/esm/Components/ProgressBar/ProgressBar.js +2 -1
- package/dist/esm/Components/QuantityStepper/QuantityStepper.js +5 -2
- package/dist/esm/Components/QueryState/QueryStateBoundary.js +5 -1
- package/dist/esm/Components/RadioButton/RadioButton.js +2 -3
- package/dist/esm/Components/RolesPermission/RolesPermission.js +12 -8
- package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +9 -3
- package/dist/esm/Components/SearchSelect/SearchSelect.js +8 -5
- package/dist/esm/Components/SegmentedControl/SegmentedControl.js +1 -1
- package/dist/esm/Components/Select/Select.js +6 -0
- package/dist/esm/Components/Select/SelectPopup.js +171 -64
- package/dist/esm/Components/Select/groupedWindow.js +44 -0
- package/dist/esm/Components/SelectSearch/SelectSearch.js +49 -39
- package/dist/esm/Components/SelectV2/SelectV2.js +1 -1
- package/dist/esm/Components/SideBar/SecondaryBar.js +3 -2
- package/dist/esm/Components/SideBar/components/MenuItemBox.js +3 -2
- package/dist/esm/Components/SideBar/components/MenuItems.js +1 -1
- package/dist/esm/Components/SideBar/components/OtherApps.js +2 -2
- package/dist/esm/Components/SideBar/components/PinnedSection.js +1 -1
- package/dist/esm/Components/SideBar/sidebarScale.js +2 -2
- package/dist/esm/Components/SignInActivityTable/SignInActivityTable.js +8 -3
- package/dist/esm/Components/SignInActivityTable/scrollRegionRing.js +9 -0
- package/dist/esm/Components/Slider/Slider.js +6 -5
- package/dist/esm/Components/StageProgress/StageItem.js +2 -1
- package/dist/esm/Components/StageProgress/StageProgress.js +8 -2
- package/dist/esm/Components/StageProgress/StepperStage.js +2 -1
- package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +2 -1
- package/dist/esm/Components/Table/Table.js +8 -6
- package/dist/esm/Components/Table/components/HeaderActions.js +7 -5
- package/dist/esm/Components/Table/components/TableBody.js +13 -8
- package/dist/esm/Components/Table/components/TableGroupRow.js +2 -1
- package/dist/esm/Components/Table/components/TableHeader.js +15 -21
- package/dist/esm/Components/Table/components/rowDetail.js +3 -2
- package/dist/esm/Components/Table/filters/ActiveFilters.js +8 -5
- package/dist/esm/Components/Table/filters/CompactSelect.js +2 -1
- package/dist/esm/Components/Table/filters/FilterDatePicker.js +20 -0
- package/dist/esm/Components/Table/filters/LeftFilterPane.js +14 -6
- package/dist/esm/Components/Table/hooks/useTable.js +11 -7
- package/dist/esm/Components/Table/settings/ManageColumns.js +4 -3
- package/dist/esm/Components/Table/settings/TableSettings.js +4 -4
- package/dist/esm/Components/Tabs/Tabs.js +1 -0
- package/dist/esm/Components/Tabs/components/TabList.js +1 -0
- package/dist/esm/Components/Tabs/components/TabPanel.js +1 -0
- package/dist/esm/Components/Tabs/tabStyles.js +5 -3
- package/dist/esm/Components/Tag/Tag.js +5 -4
- package/dist/esm/Components/Tag/Tag.styles.js +5 -4
- package/dist/esm/Components/Tag/tagDot.js +10 -3
- package/dist/esm/Components/TagInput/TagInput.js +8 -7
- package/dist/esm/Components/TagInput/tagEntries.js +16 -4
- package/dist/esm/Components/TimePicker/TimePicker.js +7 -3
- package/dist/esm/Components/Timeline/Timeline.js +14 -10
- package/dist/esm/Components/Toaster/Toaster.js +2 -1
- package/dist/esm/Components/Toggle/TableToggle.js +1 -1
- package/dist/esm/Components/UpgradeButton/UpgradeButton.js +3 -2
- package/dist/esm/Components/UserDetails/UserDetails.js +5 -7
- package/dist/esm/Components/WishlistToggle/WishlistToggle.js +2 -1
- package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +12 -2
- package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +3 -1
- package/dist/esm/Hooks/useOutsideMouseDown.js +26 -0
- package/dist/esm/Hooks/usePreferences.js +30 -12
- package/dist/esm/Hooks/useScrollableRegion.js +33 -0
- package/dist/esm/Theme/chakra/Menu.styles.js +6 -0
- package/dist/esm/Theme/chakra/componentStyles.js +1 -1
- package/dist/esm/Theme/chakra/focusRing.styles.js +3 -3
- package/dist/esm/Theme/chakra/paletteFromTheme.js +16 -3
- package/dist/esm/Theme/provider/ThemeSwitcher.js +1 -1
- package/dist/esm/Theme/tokens/builders/filledSurface.js +3 -2
- package/dist/esm/Theme/tokens/builders/focusRing.js +4 -1
- package/dist/esm/Theme/tokens/builders/paletteScale.js +6 -0
- package/dist/esm/Utils/tabular.js +56 -0
- package/dist/esm/index.js +16 -24
- package/dist/index.d.ts +54 -2
- package/dist/index.js +33 -29
- package/package.json +3 -1
- package/dist/Components/Buttons/Buttons.d.ts +0 -3
- package/dist/Components/Buttons/Buttons.js +0 -9
- package/dist/Components/Buttons/ButtonsProps.d.ts +0 -12
- package/dist/Components/Common/ErrorComponent.d.ts +0 -7
- package/dist/Components/Common/ErrorComponent.js +0 -16
- package/dist/Components/Common/FormattedDescription.d.ts +0 -7
- package/dist/Components/Common/FormattedDescription.js +0 -62
- package/dist/Components/Common/Label.d.ts +0 -9
- package/dist/Components/Common/Label.js +0 -12
- package/dist/Components/Input/Input/Input.d.ts +0 -4
- package/dist/Components/Input/Input/Input.js +0 -75
- package/dist/Components/Input/Input/InputProps.d.ts +0 -24
- package/dist/Components/Input/Input/InputProps.js +0 -2
- package/dist/Components/ProductCard/productCardFixtures.d.ts +0 -7
- package/dist/Components/ProductCard/productCardFixtures.js +0 -61
- package/dist/esm/Components/Buttons/Buttons.js +0 -4
- package/dist/esm/Components/Common/ErrorComponent.js +0 -14
- package/dist/esm/Components/Common/FormattedDescription.js +0 -60
- package/dist/esm/Components/Common/Label.js +0 -10
- package/dist/esm/Components/Input/Input/Input.js +0 -37
- package/dist/esm/Components/Input/Input/InputProps.js +0 -1
- package/dist/esm/Components/ProductCard/productCardFixtures.js +0 -58
- package/dist/esm/services/feedback.js +0 -15
- package/dist/services/feedback.d.ts +0 -12
- package/dist/services/feedback.js +0 -18
- /package/dist/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
- /package/dist/esm/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
package/COMPONENT-GOTCHAS.md
CHANGED
|
@@ -127,7 +127,7 @@ also passed `native`.
|
|
|
127
127
|
| Deprecated | Status | Migration |
|
|
128
128
|
| --- | --- | --- |
|
|
129
129
|
| `SelectV2` | Now a thin wrapper — literally `<Select {...props} native={false} />` | Drop-in. DOM, ARIA roles, keyboard and the `${listboxId}-option-${id}` id scheme are unchanged, so E2E selectors keyed to it still pass |
|
|
130
|
-
| `SearchSelect` | **Not deprecated** — implementation untouched, not 1:1 replaceable yet | Hand-migrate. `insideSelect
|
|
130
|
+
| `SearchSelect` | **Not deprecated** — implementation untouched, not 1:1 replaceable yet | Hand-migrate. `insideSelect` and the paginated `pagination.onScroll` shape (1-based `startIndex`/`limit`/`query`) have **no** equivalent in `Select` today; `isSelectAll`, `rightIcon`, `isFieldLoading`, `chipMaxLength`, `isChipRemovable` and `footerAction` (closes the popup, unlike `addNew`) now do. Keep using it until they do |
|
|
131
131
|
| `SelectSearch` | **Not deprecated** — implementation untouched | Hand-migrate. It is uncontrolled (`initialSelectedOption` seeds state once and never resyncs) and moves real DOM focus into rows; `Select` is controlled and uses `aria-activedescendant` |
|
|
132
132
|
| `Dropdown` | **NOT deprecated** — the marker was wrong and was removed 2026-09-21 | Never "migrate" it to `Select`. It is a menu-button (`role="menu"`/`menuitem`, `aria-haspopup="menu"`), not a value picker (`role="combobox"`/`listbox`). Swapping it would be an accessibility regression, and nothing in this library replaces it |
|
|
133
133
|
|
|
@@ -158,7 +158,7 @@ visible at the call site, or declare the handler with both parameters. Grep for
|
|
|
158
158
|
### `Slider` is an image carousel, not a numeric range input
|
|
159
159
|
|
|
160
160
|
`Slider` auto-advances a set of images/content on a timer (paused while hovered or focused, never
|
|
161
|
-
under reduced motion) — no numeric value, min/max, or step. The
|
|
161
|
+
under reduced motion; `showPauseControl` adds a visible play/pause button) — no numeric value, min/max, or step. The
|
|
162
162
|
range-input slider is a separate component named `RangeSlider`, because this library's `Slider`
|
|
163
163
|
already owns the name. `RangeSlider` used to be a Chakra passthrough on the `Primitives` barrel; it
|
|
164
164
|
is now the library's own themed component, with a real dual-thumb mode and a `marks` prop.
|
|
@@ -203,13 +203,18 @@ and wires `aria-controls` to them. Pick by that, never by the picture. A screen
|
|
|
203
203
|
| Proportional share of a whole — slices sum to 100% | `ApexPieChart` | The default "part of a whole" chart; donut variants support a center total label |
|
|
204
204
|
| Compare independent magnitudes on a shared radial grid — values need not sum to anything | `ApexPolarCharts` | Reads like a circular bar chart, not a pie; picking Pie here makes unrelated values look like they must add to 100% |
|
|
205
205
|
|
|
206
|
-
### Which "button" — `Button` / `ButtonGroupIcon`
|
|
206
|
+
### Which "button" — `Button` / `ButtonGroupIcon`
|
|
207
207
|
|
|
208
|
-
| Need | Component | Why not the
|
|
208
|
+
| Need | Component | Why not the other |
|
|
209
209
|
| --- | --- | --- |
|
|
210
|
-
| A single themed, interactive button — any variant/size/colorScheme, dark-mode aware | `Button` |
|
|
211
|
-
| A themed row of icon + text + icon, optionally a dropdown menu on the right | `ButtonGroupIcon` |
|
|
212
|
-
|
|
210
|
+
| A single themed, interactive button — any variant/size/colorScheme, dark-mode aware | `Button` | `ButtonGroupIcon` is a fixed icon + text + icon row, not a general button |
|
|
211
|
+
| A themed row of icon + text + icon, optionally a dropdown menu on the right | `ButtonGroupIcon` | `Button` is one control; this row wires the left, center and right slots and the dropdown for you |
|
|
212
|
+
|
|
213
|
+
A gray `ghost` or `outline` `Button` is built for a card, a toolbar or a panel, where its hover step
|
|
214
|
+
reads. On the bare page canvas in light mode the hover fill measures only 1.076-1.124:1 against
|
|
215
|
+
the canvas across the nine brands (above 1.15:1 on a card), so the hover is faint there. A gray
|
|
216
|
+
ghost button that sits directly on `backgroundColor.base` should sit on a `Card` or panel surface
|
|
217
|
+
instead.
|
|
213
218
|
|
|
214
219
|
### Which "card" — `Card` / `ProductCard` / `StatCard` / `PaymentCard`
|
|
215
220
|
|
|
@@ -241,11 +246,11 @@ and wires `aria-controls` to them. Pick by that, never by the picture. A screen
|
|
|
241
246
|
| Need | Component | Why not the others |
|
|
242
247
|
| --- | --- | --- |
|
|
243
248
|
| Top bar: back control + user-avatar profile/logout dropdown | `NavigationBar` | No page-nav links at all — `navMenu` is only the avatar dropdown's own items |
|
|
244
|
-
| Top bar: horizontal page links with active-state highlighting + submenus | `Header` | Desktop submenus are hover-only, see gotcha below |
|
|
249
|
+
| Top bar: horizontal page links with active-state highlighting + submenus | `Header` | Desktop submenus are hover-only, see gotcha below; the bar is `min-height: 4.3rem` and grows when the nav wraps |
|
|
245
250
|
| Collapsible/dockable left rail — primary in-app navigation + secondary panel | `SideBar` | The persistent nav shell, not for switching between whole apps |
|
|
246
251
|
| In-app launcher: browse modules, pins, recents, search | `NavLauncher` opened by a `LauncherTrigger` in `NavigationBar`'s `leading` | An app-owned screen registry, not a cross-app switcher; pins can also surface in `SideBar` `pinnedItems` |
|
|
247
252
|
| Key cap or chord hint (`mod+k`) | `Kbd` / `KbdShortcut` | Never hand-style a `<kbd>`; `Search` and `AppSwitcher` already use it |
|
|
248
|
-
| Cross-app launcher (CRM/HRMS/Tickets/Billing/...) | `AppSwitcher` | Two-column popover grid of separate app origins — `SideBar`'s `otherApps` is the legacy predecessor; don't wire both into one shell |
|
|
253
|
+
| Cross-app launcher (CRM/HRMS/Tickets/Billing/...) | `AppSwitcher` (list from `resolveSuiteApps`; `buildSuiteApps` throws on plain `localhost` unless `devFallbackBaseUrl` is set) | Two-column popover grid of separate app origins — `SideBar`'s `otherApps` is the legacy predecessor; don't wire both into one shell |
|
|
249
254
|
| Floating Jira-style dialog to view/edit one record without leaving the page | `WorkspaceWindow` | Modal-based floating panel, not page navigation; pairs with `WorkspaceTray` |
|
|
250
255
|
|
|
251
256
|
### File pickers — `FileUpload` vs `FileUploader`
|
|
@@ -255,7 +260,7 @@ and wires `aria-controls` to them. Pick by that, never by the picture. A screen
|
|
|
255
260
|
| Real `File`/Blob objects to actually upload (FormData/API) | `FileUpload` | Controlled; `onFilesUploaded` carries real `File[]` and validates accept/size with rejection messages |
|
|
256
261
|
| Self-contained "add photos, see thumbnails, remove" list with no server upload | `FileUploader` | Manages its own state; its `onFilesChange` metadata discards the real `File` — see gotcha below |
|
|
257
262
|
|
|
258
|
-
Both
|
|
263
|
+
Both files declare a type named `FileUploaderProps`. The one at the package root describes `FileUpload` (`FileUpload/FileUploadProps.tsx`); `FileUploader`'s own props type (`FileUploader/FileUploaderProps.tsx`) is not exported, only its `UploadedFile`. Check which folder a type came from before trusting the name.
|
|
259
264
|
|
|
260
265
|
### Viewing files — `MediaViewer` / `FilePreview` / `PdfViewer` / `ProfilePhotoViewer`
|
|
261
266
|
|
|
@@ -290,7 +295,7 @@ The value `HeaderActions` comes from `Components/Header/HeaderActions.tsx`, whic
|
|
|
290
295
|
|
|
291
296
|
**`ConfirmDialog.onConfirm` does not close the dialog.** It fires and nothing else; you call `onClose` yourself. That is deliberate — it lets you keep the dialog open while an async delete is in flight — but a handler that only calls your delete function leaves the dialog on screen with no error.
|
|
292
297
|
|
|
293
|
-
`iconBg` and `iconColor` are
|
|
298
|
+
`iconBg` and `iconColor` are optional and derive a soft tint from `tone`; if you pass them, read them from `useCustomTheme()` — a hardcoded hex is stuck in light mode. For a delete that names the record, pass `entityName` (+ `entityKind`, `dependents`, `consequence`, `alternative`) instead of hand-building the body; focus opens on Cancel, never the destructive button, and `focusCancelOnOpen={false}` moves it to the close button, not Confirm.
|
|
294
299
|
|
|
295
300
|
### Busy indicators — `Spinner` vs `Backdrop` vs `Loading`
|
|
296
301
|
|
|
@@ -313,6 +318,7 @@ not enough when the overlay sits inside a transition wrapper — the wrapper kee
|
|
|
313
318
|
| Need | Component | Why |
|
|
314
319
|
| --- | --- | --- |
|
|
315
320
|
| "Nothing here yet" with an optional action | `EmptyState` | Neutral placeholder |
|
|
321
|
+
| "Nothing matches your filters" | `FilteredEmptyState` | Names the filters, offers Clear and Remove-last; in a boundary use `isEmpty` + `isFiltered` |
|
|
316
322
|
| A failed load with retry | `ErrorState` | `role="alert"`, `onRetry`/`isRetrying` built in |
|
|
317
323
|
| One fetch that can be loading, forbidden, failed, empty or ready | `QueryStateBoundary` | Picks for you: loading > forbidden > error > empty > `children` |
|
|
318
324
|
|
|
@@ -328,23 +334,21 @@ Each wrapped component gets its own `ChakraProvider` (CSS reset, global styles,
|
|
|
328
334
|
|
|
329
335
|
A test that finds the main dropdown with `getByRole("listbox")` must now pick it by id (`<id>-listbox`).
|
|
330
336
|
|
|
331
|
-
### `ChoiceCardGroup`'s children must be `ChoiceCard` elements
|
|
337
|
+
### `ChoiceCardGroup`'s children must be `ChoiceCard` elements
|
|
332
338
|
|
|
333
|
-
A wrapper component hides each card's `value` and `disabled` from the roving tab stop, so with
|
|
334
|
-
selected the group has no Tab stop at all (same rule as `PaymentOptionGroup` / `AddressCardGroup`).
|
|
335
|
-
|
|
336
|
-
The group is a column
|
|
339
|
+
A wrapper component hides each card's `value` and `disabled` / `isDisabled` from the roving tab stop, so with
|
|
340
|
+
nothing selected the group has no Tab stop at all (same rule as `PaymentOptionGroup` / `AddressCardGroup`).
|
|
341
|
+
`ChoiceCard` takes `disabled` or its `isDisabled` alias; `AddressCard` and `PaymentOption` still take
|
|
342
|
+
`disabled` only. The group is a column; `columns={n}` (n above 1) lays it out as an n-column grid.
|
|
337
343
|
|
|
338
344
|
### `Pagination` never resets `page` for you
|
|
339
345
|
|
|
340
346
|
An out-of-range `page` (a filter shrank the result) is displayed clamped but never reported, and changing
|
|
341
347
|
rows per page does not reset `page` either. Reset it yourself, in `onPageSizeChange` and when the filters change.
|
|
342
348
|
|
|
343
|
-
###
|
|
349
|
+
### A component with a behaviour its props do not hint at
|
|
344
350
|
|
|
345
|
-
- `
|
|
346
|
-
- `NoteTextArea` checks `maxNoteWordCount` against the title only until the note is next edited, so a long title can be saved; `handleCancel` always receives `false`.
|
|
347
|
-
- `VerifyEmailOtp` fields set `autocomplete="off"`, so browser or OS one-time-code autofill never offers the code.
|
|
351
|
+
- `NoteTextArea`'s `handleCancel` always receives `false`, and `handleSubmit` is called with three arguments although its type declares a fourth (both tagged `@deprecated`).
|
|
348
352
|
|
|
349
353
|
### Where `ref` lands, and what does not take one
|
|
350
354
|
|
|
@@ -359,7 +363,7 @@ itself takes no ref); `Avatar` to the outer box; `Tag` to its root, which is a `
|
|
|
359
363
|
`PageHeader`, `StatCard`, `SaveBar`, `EmptyState`, `DescriptionList`, `FilterBar` and `Skeletons` put
|
|
360
364
|
`className`, `style`, `id`, `data-*` and `aria-*` on their outermost element. `StatCard` applies
|
|
361
365
|
`aria-label` only when `onClick` makes it a button; `DescriptionList`'s loading grid keeps its own
|
|
362
|
-
`aria-label="Loading"`. `Skeletons` still accepts `alignSelf` and `flexShrink
|
|
366
|
+
`aria-label="Loading"`. `Skeletons` still accepts `alignSelf` and `flexShrink`, now `@deprecated`, but never
|
|
363
367
|
applies them; wrap it in a `Box` to position it.
|
|
364
368
|
|
|
365
369
|
### `Table` `HeaderActions` item with `customComponent` and `onClick` is mouse-only unless the custom component is focusable
|
|
@@ -386,7 +390,7 @@ The wrapper is deliberately not a button; make the custom component a button, or
|
|
|
386
390
|
| Chakra passthroughs | 34 barrel value exports (and 12 type exports) that duplicated an owned component were removed: `Input`, `Textarea`, `Progress`, `Radio`, `RadioGroup`, `Skeleton`, `ModalOverlay`, `ModalContent`, `ModalCloseButton`, `CardBody`, `ChakraCard`, `ChakraSelect`, `ChakraModal`(+`Body`/`Header`/`Footer`) the `Tabs`/`Accordion` families, and the Chakra slider sub-parts. `Tabs`, `Accordion` and `RangeSlider` now resolve to the library's own themed components (`RangeSlider` gained a real dual-thumb mode and a `marks` prop). Each removal is a compile error, never a silent swap | use the owned component — `TextInput`, `InputTextArea`, `ProgressBar`, `RadioButton`, `Skeletons`, `Modal`, `Card`, `Select` |
|
|
387
391
|
| `Avatar` / `AvatarGroup` | Now the library's own components, not Chakra passthroughs. `AvatarProps` is a closed list (`name`, `src`, `size` `2xs`–`xl`, `status`, `ariaLabel`, `getInitials`, `data-testid`) — Chakra style props and `2xl` no longer compile, and **`name` is now required `string`**, so a `user.name?: string` call site fails. The fill is derived from `name`, so stop passing `bg`/`color`; it follows brand and dark mode on its own. `AvatarGroup` takes `people=[{name, src}]`, not `<Avatar>` children, so it can build one accurate group label. Measured by typecheck: 13 of 18 consumer files break | wrap in a `Box` for placement/shadow; resolve `name` at the call site |
|
|
388
392
|
| `SettingsSection` | New optional `action` slot, right of the title/description on the header row — additive, nothing changes without it | — |
|
|
389
|
-
| `Button`
|
|
393
|
+
| `Button` | Icon-only buttons are square | — |
|
|
390
394
|
| `ProgressBar` | Fill lifted to ≥ 3:1 on its track — green/orange/blue/cyan are visibly darker in light mode | — |
|
|
391
395
|
| `PhoneNumberInput` | Default `size` `md` → `sm`, so it matches the `TextInput`s beside it | `size="md"` |
|
|
392
396
|
| `PhoneNumberInput` / `PinInput` / `NoteTextArea` | `ref` now attaches; labels bound; PIN digits grouped and named | — |
|
|
@@ -565,11 +569,10 @@ For an accent icon on the gradient, use `resolved.ink` unless the accent clears
|
|
|
565
569
|
All three match children by exact type (`child.type === XHeader/XBody/XFooter`) and render only
|
|
566
570
|
those matches — nothing else in `children` is ever read. A sibling among the slots (a nested
|
|
567
571
|
`Modal`, `AlertDialog`, a confirm dialog, a live region) silently never mounts; `Drawer` and `Modal`
|
|
568
|
-
now warn once per dropped child type in development
|
|
569
|
-
|
|
572
|
+
`ProfileCard` now warn once per dropped child type in development. All three
|
|
573
|
+
look through `<>...</>` Fragments around a slot, at any depth (so `<>{cond && <DrawerFooter>...}</>` still renders)
|
|
570
574
|
and spread styling props (`padding`, `borderBottom`, `sx`, …) from the matched slot onto the real
|
|
571
|
-
header/body/footer —
|
|
572
|
-
silently.
|
|
575
|
+
header/body/footer — any other wrapper element still drops the slot.
|
|
573
576
|
|
|
574
577
|
**Apply:** pass a nested confirm dialog, toast host or live region to `Drawer` / `Modal` as
|
|
575
578
|
`portalChildren`. It renders **inside** the dialog content after the slots (a sibling in the portal
|
|
@@ -580,6 +583,10 @@ as a sibling in a wrapping fragment. When a ternary picks between bodies, branch
|
|
|
580
583
|
rendered inside one body slot, rather than returning fragment-wrapped slots per branch. `Drawer`'s
|
|
581
584
|
misspelled `vaiant` is `@deprecated` — use `variant`.
|
|
582
585
|
|
|
586
|
+
A `Drawer` with no `DrawerHeader` is an unnamed dialog (axe `aria-dialog-name`) unless you pass its own
|
|
587
|
+
`aria-label` or `aria-labelledby`; dev builds warn once when it opens. `contentProps["aria-labelledby"]` is
|
|
588
|
+
overwritten, so it never names the drawer (`contentProps["aria-label"]` is kept).
|
|
589
|
+
|
|
583
590
|
### `FormDrawer` has no browser validation, and its submit button sits outside the `<form>`
|
|
584
591
|
|
|
585
592
|
It sets `noValidate`: validate in `onSubmit` and pass messages via `errors`. Error-summary focus
|
|
@@ -612,9 +619,19 @@ green. Pass `onClick` for a clickable card (it renders its own `<button>`); neve
|
|
|
612
619
|
Unlike `Tag` and `StatCard`, where `info` is blue, the default `tone="info"` here paints the brand
|
|
613
620
|
primary scale. `aria-label` is required — the ring has no visible caption.
|
|
614
621
|
|
|
622
|
+
### `TextInput variant="filled"` has no border, only a fill that barely separates it
|
|
623
|
+
|
|
624
|
+
`filled` draws no resting border (`borderColor: "transparent"`), so the field's edge is the fill
|
|
625
|
+
alone. That fill measures 1.01-1.06:1 against a card in light mode on the nine brands, well under
|
|
626
|
+
the 3:1 that WCAG 1.4.11 asks of a control boundary, and about 1.19:1 in dark mode. The focus ring
|
|
627
|
+
and the invalid border still show, but a resting empty field can be hard to find.
|
|
628
|
+
|
|
629
|
+
**Apply:** use the default `variant="outline"` for any form a person must find and fill in. Keep
|
|
630
|
+
`filled` for fields whose position is already obvious from the layout.
|
|
631
|
+
|
|
615
632
|
### A clickable `TextInput` icon is a real button — give it a name
|
|
616
633
|
|
|
617
|
-
With `
|
|
634
|
+
With `onRightIconClick`/`onLeftIconClick` the icon renders as a `<button>`. Without
|
|
618
635
|
`rightIconAriaLabel`/`leftIconAriaLabel` it is announced as "{label}: right icon action".
|
|
619
636
|
|
|
620
637
|
### `SelectSearch`'s `isRequired` shows the asterisk but never announces "required"
|
|
@@ -626,7 +643,7 @@ undefined and stripped. Verified by DOM dump: the rendered `<input>` carries no
|
|
|
626
643
|
even when `isRequired` is passed. The visible asterisk comes from a separate custom label, so the
|
|
627
644
|
field *looks* required to sighted users and is silent to a screen reader.
|
|
628
645
|
|
|
629
|
-
**Apply:**
|
|
646
|
+
**Apply:** prefer `Select` (`native={false}`) for new work — `SelectSearch` is not deprecated, but `Select` marks required
|
|
630
647
|
state on a plain `Box` combobox that Chakra does not rewrite. If you must stay on `SelectSearch`,
|
|
631
648
|
set the required state on your own wrapping `FormControl`. Note the obvious one-line fix inside the
|
|
632
649
|
component is not neutral: Chakra's `useFormControl` also emits native `required`, which would add
|
|
@@ -691,6 +708,15 @@ accepted, typed, never called.
|
|
|
691
708
|
**Apply:** leave at least one column without a `node`, or put an explicit control inside a `node`
|
|
692
709
|
renderer instead of relying on row click.
|
|
693
710
|
|
|
711
|
+
Row click is also mouse-only: a `Table` row has no `tabIndex`, `role` or key handler, so a keyboard
|
|
712
|
+
user can never activate `onRowClick`. The column resize handle is a bare `div` with a
|
|
713
|
+
`mousedown` handler and is likewise unreachable by keyboard. Neither is a bug to work around inside
|
|
714
|
+
the `Table`; making every row a tab stop would add a focus ring to every consumer.
|
|
715
|
+
|
|
716
|
+
**Apply:** whatever `onRowClick` does must also be reachable through a real control, such as a
|
|
717
|
+
`Button` or link in a `node` column (the name or an actions cell), so keyboard and
|
|
718
|
+
screen-reader users have the same path.
|
|
719
|
+
|
|
694
720
|
### `Table.renderRowDetail` runs for every row on every render, and `expandedRows` ids match strictly
|
|
695
721
|
|
|
696
722
|
It decides whether each row gets a chevron, so an inline function re-renders every row (defeating
|
|
@@ -723,15 +749,12 @@ const AppTable = ({ variant = 'classic', ...props }: TableProps) => <Table varia
|
|
|
723
749
|
```
|
|
724
750
|
Applies to any library prop with a default value, not just `Table`'s `variant`.
|
|
725
751
|
|
|
726
|
-
### `FormWrapper`
|
|
752
|
+
### `FormWrapper` forwards extra props to the outer wrapper only
|
|
727
753
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
the wrapper all silently disappear, and TypeScript won't catch it since excess-property checks don't
|
|
731
|
-
apply to spreads.
|
|
754
|
+
`id`, `data-*`, `aria-*`, `className`, `style` and handlers land on the outermost `Box`; the bordered content `Box`
|
|
755
|
+
receives nothing, and `children` is not type-matched.
|
|
732
756
|
|
|
733
|
-
**Apply:**
|
|
734
|
-
section — don't expect anything but `icon`/`text`/`children` to reach the DOM.
|
|
757
|
+
**Apply:** put a margin override on `FormWrapper` itself (`className`/`style`); there is no prop for the content box's padding or border.
|
|
735
758
|
|
|
736
759
|
### `ContactForm`'s `apiKey` prop is a POST URL, not an auth token
|
|
737
760
|
|
|
@@ -754,15 +777,15 @@ blank email submits successfully with no error shown.
|
|
|
754
777
|
**Apply:** if the parent needs to react to success, this component can't provide it. Don't rely on
|
|
755
778
|
`email` being enforced as required — validate it yourself first if that matters.
|
|
756
779
|
|
|
757
|
-
### `VerifyEmailOtp` can't accept alphanumeric codes
|
|
780
|
+
### `VerifyEmailOtp` can't accept alphanumeric codes, and appends "your new Pixel Account"
|
|
758
781
|
|
|
759
782
|
It wraps Chakra's `PinInput` without forwarding a `type`, so Chakra's `type="number"` default
|
|
760
783
|
applies — any letter typed is silently rejected (the character never appears, no error shown).
|
|
761
|
-
`VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description`
|
|
762
|
-
|
|
784
|
+
`VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description` also gets
|
|
785
|
+
a second line, "your new Pixel Account", unless you pass `subtitle` (`""` drops it).
|
|
763
786
|
|
|
764
|
-
**Apply:** only use this component for numeric-only OTPs
|
|
765
|
-
|
|
787
|
+
**Apply:** only use this component for numeric-only OTPs. Always pass `subtitle` outside the Pixel Account
|
|
788
|
+
product; for a non-English UI pass `labels`. For an alphanumeric code build the card from `PinInput`.
|
|
766
789
|
|
|
767
790
|
### `ApexLineChart` only ever renders one line, frozen at mount
|
|
768
791
|
|
|
@@ -873,23 +896,6 @@ the library (`TextInput`, `NumberInput`, `PhoneNumberInput`, `RadioButton`, `Pin
|
|
|
873
896
|
**Apply:** always pass `isInformation` and `informationMessage` together; never treat
|
|
874
897
|
`isInformation` alone as "use a default message."
|
|
875
898
|
|
|
876
|
-
### `ErrorComponent`'s `error` prop is the message text itself — the opposite of `error`+`errorMessage`
|
|
877
|
-
|
|
878
|
-
Every other field in the library pairs a boolean `error` with a string `errorMessage`.
|
|
879
|
-
`ErrorComponent` (used internally by `Input`) instead takes `error: string` directly as
|
|
880
|
-
the message, with no internal truthy-check — passing `error=""` still draws the full icon next to
|
|
881
|
-
blank text. It also has no `id`, so unlike `ErrorMessage` it can't be wired to `aria-describedby`.
|
|
882
|
-
|
|
883
|
-
**Apply:** treat `ErrorComponent` as `Input`-specific, not a general error row; guard it
|
|
884
|
-
with a truthy-message check yourself, and use `ErrorMessage` for any other field.
|
|
885
|
-
|
|
886
|
-
### `FormattedDescription`'s single-`*italic*` marker strips the asterisks but applies no italic style
|
|
887
|
-
|
|
888
|
-
`**bold**` works; a lone `*word*` silently renders as plain text with the markers removed, reading
|
|
889
|
-
as though the formatting was simply ignored.
|
|
890
|
-
|
|
891
|
-
**Apply:** don't rely on single-asterisk emphasis in `content` strings — use `**bold**` or plain text.
|
|
892
|
-
|
|
893
899
|
### `Timeline`'s `onEditNote` editor doesn't auto-close without `editNoteLoading` — unlike add-note
|
|
894
900
|
|
|
895
901
|
Add-note has a back-compat fallback that closes its editor immediately if `addNoteLoading` is never
|
|
@@ -970,13 +976,13 @@ props. Mixing plain and `customNode` items in one column produces inconsistent p
|
|
|
970
976
|
**Apply:** don't expect board-wide card actions to reach a `customNode` card; wire them inside your
|
|
971
977
|
custom render instead.
|
|
972
978
|
|
|
973
|
-
### `KanbanBoard`'s `AccountCard` only renders string-typed fields
|
|
979
|
+
### `KanbanBoard`'s `AccountCard` only renders string-typed fields
|
|
974
980
|
|
|
975
981
|
A numeric field on an `Account` (allowed by its index signature) is never shown in the card's field
|
|
976
|
-
list. The label is the key
|
|
977
|
-
"
|
|
982
|
+
list. The label is the key run through `toWords`, which splits snake_case, kebab-case and camelCase:
|
|
983
|
+
`account_name` renders "Account Name" and `nextFollowUp` renders "Next Follow Up".
|
|
978
984
|
|
|
979
|
-
**Apply:** keep numeric display values as strings
|
|
985
|
+
**Apply:** keep numeric display values as strings.
|
|
980
986
|
|
|
981
987
|
### `KanbanBoard`'s `onColumnDelete` receives the deleted column's **card** ids, not the column's id
|
|
982
988
|
|
|
@@ -989,7 +995,7 @@ before the click) if you need the column id itself.
|
|
|
989
995
|
|
|
990
996
|
### `isRequired` is decorative on some fields, native on others — same prop name, different behavior
|
|
991
997
|
|
|
992
|
-
`NumberInput`
|
|
998
|
+
`NumberInput` sets native `required` (browser bubble, blocks submit).
|
|
993
999
|
`TextInput` and `InputTextArea` set only `aria-required` — announced, but no native validation.
|
|
994
1000
|
`PhoneNumberInput` and `PinInput` pass it only to the label (draws a `*`); the field gets nothing.
|
|
995
1001
|
|
|
@@ -1021,15 +1027,6 @@ change those queries to `getByRole("switch", …)`.
|
|
|
1021
1027
|
Same shape of trap on `Tabs`: the owned `Tab` forwards no `data-testid`, so `getByTestId("…-tab-…")`
|
|
1022
1028
|
queries must become `getByRole("tab", { name })`.
|
|
1023
1029
|
|
|
1024
|
-
### The internal `Input.tsx` silently ignores six declared props
|
|
1025
|
-
|
|
1026
|
-
`disabled`, `autoComplete`, `autoFocus`, `inputClassName`, `labelClassName`, and `errorClassName`
|
|
1027
|
-
are all typed on `InputProps` but never read — passing them, `disabled` especially, compiles cleanly
|
|
1028
|
-
and does nothing. It also has no `id` field, so its label always renders as an unassociated `<span>`.
|
|
1029
|
-
|
|
1030
|
-
**Apply:** this is an internal component (not exported) reachable only via deep import — prefer
|
|
1031
|
-
`TextInput` for anything public-facing, which doesn't have this gap.
|
|
1032
|
-
|
|
1033
1030
|
### `AlertDialog`'s `colorScheme`/`size`/`status`/`variant`/`addRole` are dead props
|
|
1034
1031
|
|
|
1035
1032
|
Typed but never read, and `@deprecated` as a group (editors may not strike each one through). Use
|
|
@@ -1057,6 +1054,17 @@ child, with no tooltip element and no document listeners. A test that mocks Chak
|
|
|
1057
1054
|
expects it mounted at render time must hover or focus the trigger first
|
|
1058
1055
|
(`fireEvent.pointerEnter(trigger)` or `userEvent.hover`).
|
|
1059
1056
|
|
|
1057
|
+
### A keyboard-focusable `ToolTip` trigger must be a native control — never a `span` with `aria-label`
|
|
1058
|
+
|
|
1059
|
+
`ToolTip` adds `aria-describedby` to its trigger but no role and no name. An icon-only trigger written
|
|
1060
|
+
`<Box as="span" tabIndex={0} aria-label={hint}>` (a column-header hint, an info icon) fails axe
|
|
1061
|
+
`aria-prohibited-attr`: `aria-label` is not allowed on a role-less span, so a conforming screen reader may drop
|
|
1062
|
+
it and announce a nameless generic element (Chrome's tree still shows the name).
|
|
1063
|
+
|
|
1064
|
+
**Apply:** use `<Box as="button" type="button" aria-label={hint} bg="transparent" border="0" p={0}
|
|
1065
|
+
cursor="default">`. It is still a Tab stop and the tooltip still opens on focus; measured pixel-identical to
|
|
1066
|
+
the span, closed and focused. `role="img"` on the span also passes axe but changes the focused state.
|
|
1067
|
+
|
|
1060
1068
|
### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
|
|
1061
1069
|
|
|
1062
1070
|
`children` is `@deprecated` and never read — only `title`/`description`/`actions` render. The `onClose` you pass to `showToast` is wired to
|
|
@@ -1077,14 +1085,6 @@ button, right icon/dropdown), not just a "clicked outside the buttons" signal.
|
|
|
1077
1085
|
**Apply:** always set `rightIcon` + `rightIconDropdown={true}` together for the dropdown. Don't use
|
|
1078
1086
|
`onButtongroupClick` to detect background clicks — inspect `event.target` if you need to distinguish.
|
|
1079
1087
|
|
|
1080
|
-
### `Buttons` (plural) is not a group wrapper
|
|
1081
|
-
|
|
1082
|
-
Despite the plural name suggesting a group, `Buttons` is now a thin wrapper over one themed
|
|
1083
|
-
`Button` (its `className` is `@deprecated`), and it isn't exported from the package root.
|
|
1084
|
-
|
|
1085
|
-
**Apply:** use `Button` for a single themed button or `ButtonGroupIcon` for a themed group; there is
|
|
1086
|
-
no good reason to reach for `Buttons`.
|
|
1087
|
-
|
|
1088
1088
|
### `Card` already wraps `children` in a padded `CardBody` — a nested one doubles the padding
|
|
1089
1089
|
|
|
1090
1090
|
`header`/`footer` now render, and `children` sit in a flex `CardBody` laid out by `direction`/
|
|
@@ -1163,9 +1163,9 @@ Inside a `NavigationBar` `moreIcon` cluster, a full trigger needs about 88px (av
|
|
|
1163
1163
|
when its label truncates to nothing, and the title is the first thing to give way. With a long org name
|
|
1164
1164
|
the title is invisible on 320-375px bars, and a smaller `maxWidth` does not change that.
|
|
1165
1165
|
|
|
1166
|
-
**Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`.
|
|
1167
|
-
the
|
|
1168
|
-
`span` around the trigger, so don't pass the trigger a ref. `auto` falls back to `"full"` where
|
|
1166
|
+
**Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`. Both layouts
|
|
1167
|
+
name the trigger `${ariaLabel}, ${org name}` (the placeholder when no org is active), and in avatar mode
|
|
1168
|
+
the name appears in a tooltip that wraps a `span` around the trigger, so don't pass the trigger a ref. `auto` falls back to `"full"` where
|
|
1169
1169
|
`matchMedia` is missing (SSR, jsdom). `NavigationBar`'s `moreIcon` root is `min-width: 0`: give your
|
|
1170
1170
|
own icon buttons `flexShrink={0}` and let any label truncate.
|
|
1171
1171
|
|
|
@@ -1242,8 +1242,10 @@ wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
|
|
|
1242
1242
|
|
|
1243
1243
|
**Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
|
|
1244
1244
|
|
|
1245
|
-
Each image's `previewUrl` is a `blob:` URL
|
|
1246
|
-
|
|
1245
|
+
Each image's `previewUrl` is a `blob:` URL. `FileUploader` revokes it when the image is removed,
|
|
1246
|
+
truncated by `maxFiles`, rejected by `maxTotalSize` or still listed when it unmounts. Do not
|
|
1247
|
+
reuse a `previewUrl` from `onFilesChange` after the component is gone. (`FileUpload` revokes its own
|
|
1248
|
+
thumbnail URLs.)
|
|
1247
1249
|
|
|
1248
1250
|
### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
|
|
1249
1251
|
|
|
@@ -1280,6 +1282,15 @@ is also `null` until Jodit's lazy-loaded chunk resolves — a mount-time effect
|
|
|
1280
1282
|
**Apply:** never set `theme`/`popupRoot` inside the `config` you pass to `Editor`. To force a
|
|
1281
1283
|
remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key` prop.
|
|
1282
1284
|
|
|
1285
|
+
`Editor` keeps Jodit's defaults for the source view, and those defaults (`sourceEditor: "ace"`,
|
|
1286
|
+
`beautifyHTML: true`) load Ace and js-beautify from `cdnjs.cloudflare.com` when the editor mounts.
|
|
1287
|
+
Under a strict Content-Security-Policy, offline, or in a privacy review, those requests are blocked
|
|
1288
|
+
or are an outbound call you did not ask for.
|
|
1289
|
+
|
|
1290
|
+
**Apply:** pass `config={{ sourceEditor: "area", beautifyHTML: false }}` to drop both calls (source
|
|
1291
|
+
mode becomes a plain textarea), or point Jodit's `sourceEditorCDNUrlsJS` and `beautifyHTMLCDNUrlsJS`
|
|
1292
|
+
at copies you host.
|
|
1293
|
+
|
|
1283
1294
|
### `PdfViewer` `getBlob` — fetched on mount only; the toolbar already has Open and Download
|
|
1284
1295
|
|
|
1285
1296
|
- **Swapping the file needs a new React `key`.** `getBlob` is read through a ref and fetched on mount,
|
|
@@ -1315,6 +1326,15 @@ test asserting the old single-row layout needs `actionsLayout="inline"`.
|
|
|
1315
1326
|
Jodit is re-created (readonly or height change) a stable handler stops receiving events. `Editor`
|
|
1316
1327
|
binds them itself per instance; don't copy the pattern when wrapping Jodit directly.
|
|
1317
1328
|
|
|
1329
|
+
- **`EditorMergeField` `object`, `objectDescription`, `description`, `example`, `source` and `image` do nothing inside
|
|
1330
|
+
`Editor`.** They are metadata for a field browser you build; only `path`, `label`, `group` and `sample` are read.
|
|
1331
|
+
|
|
1332
|
+
### `toCsv` — no BOM by default, and formula-like text gains a `'`
|
|
1333
|
+
|
|
1334
|
+
Excel reads a BOM-less CSV as ANSI and garbles non-ASCII text: pass `{ bom: true }` when the file is for Excel. A cell
|
|
1335
|
+
starting with `=`, `+`, `-` or `@` (a signed plain number excepted) is written with a leading `'`; set
|
|
1336
|
+
`escapeFormulas: false` on a column such as phone numbers (`+91 ...`) only when you control every value in it.
|
|
1337
|
+
|
|
1318
1338
|
### `Editor`'s Jodit toolbar is fixed for screen readers and keyboard, from our wrapper only
|
|
1319
1339
|
|
|
1320
1340
|
Jodit's own markup (`node_modules/jodit`) put `aria-label` on each button's `role="listitem"`
|
|
@@ -1329,6 +1349,17 @@ above — a value you pass in `config` wins) and runs a `MutationObserver`-backe
|
|
|
1329
1349
|
**Apply:** nothing — this is automatic. Set `config.allowTabNavigation: false` only if you
|
|
1330
1350
|
deliberately want the toolbar out of the tab order; you'll reintroduce the keyboard-reachability gap.
|
|
1331
1351
|
|
|
1352
|
+
The editing area is a `role="textbox"` that Jodit leaves nameless. `Editor` names it from `label` when
|
|
1353
|
+
there is one, else from `labels.editor` (default `Rich text editor`), and sets `aria-readonly` while
|
|
1354
|
+
`config.readonly` is on. Two unlabelled editors on one page announce identically unless each gets its own
|
|
1355
|
+
`labels.editor`.
|
|
1356
|
+
|
|
1357
|
+
Jodit also ships the editing area at `tabindex="-1"`, so no keyboard could reach the text and a scrollable
|
|
1358
|
+
read-only editor could not be scrolled. `Editor` sets `tabIndex: 0` (a `config.tabIndex` you pass wins) and
|
|
1359
|
+
lights the Jodit frame while focus is inside it. Tab then walks toolbar, editing area, Jodit's status-bar
|
|
1360
|
+
buttons (`config.statusbar: false` drops those). Inside a table cell Tab and Shift+Tab stay with Jodit (next
|
|
1361
|
+
cell, a new row after the last, a new row above the first): arrow out of the table before tabbing away.
|
|
1362
|
+
|
|
1332
1363
|
### `SelectV2`, `SearchSelect`, and `SelectSearch` all search `option.label` only
|
|
1333
1364
|
|
|
1334
1365
|
None of the three checks a rendered secondary field (`option.description`, a custom `view` node,
|
|
@@ -1500,12 +1531,15 @@ control expecting `onMaximize` to fire.
|
|
|
1500
1531
|
|
|
1501
1532
|
Passing `selected` alone (uncontrolled companion `onChange` omitted) computes the next filter state
|
|
1502
1533
|
on every click and discards it — checkboxes visibly never check, forever, with no error. Separately,
|
|
1503
|
-
`onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect
|
|
1504
|
-
`FilterSection.checkboxes`
|
|
1534
|
+
`onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect, as is
|
|
1535
|
+
`FilterSection.checkboxes` (all four are `@deprecated`); radio-vs-checkbox mode is actually decided by
|
|
1505
1536
|
`type === "radio" || section.radio`.
|
|
1506
1537
|
|
|
1507
1538
|
**Apply:** always pass `selected` and `onChange` together, or omit `selected` and let `FilterSidebar`
|
|
1508
|
-
own its state.
|
|
1539
|
+
own its state.
|
|
1540
|
+
|
|
1541
|
+
Separately, `FilterSidebar` skips re-rendering sections whose `section` object is unchanged, so build `sidebarOptions`
|
|
1542
|
+
once (module constant or `useMemo`); fresh section objects every render re-render every section on each range drag. Don't reach for `onApply`/`headerPadding`/`sliderMode`/`FilterSection.checkboxes` —
|
|
1509
1543
|
none of them do anything.
|
|
1510
1544
|
|
|
1511
1545
|
### `Breadcrumbs`' `isLastChild` prop is accepted but never read
|
|
@@ -1595,7 +1629,8 @@ hidden and arrow keys stop at the edge of the visible range, so the grid looks s
|
|
|
1595
1629
|
`start` / `end` are read as local calendar dates (`end` inclusive): a UTC-midnight `Date` shows the
|
|
1596
1630
|
previous day in a negative-offset zone, so build date-only values with `new Date(y, m, d)`.
|
|
1597
1631
|
`renderDayCell` replaces each cell's chips wholesale: a 3-day event is passed to it for all 3 days
|
|
1598
|
-
but is no longer drawn as one bar, and `onEventClick` never fires from your own content.
|
|
1632
|
+
but is no longer drawn as one bar, and `onEventClick` never fires from your own content. A cell is named by
|
|
1633
|
+
its date and count followed by everything inside it, your content included, so keep that content short.
|
|
1599
1634
|
|
|
1600
1635
|
### `AudioRecorder` needs a secure context, and `onRecorded` is not called after unmount
|
|
1601
1636
|
|
|
@@ -1613,6 +1648,17 @@ carries the previous image's zoom/rotation into the new one.
|
|
|
1613
1648
|
**Apply:** keep the real extension on `fileName`, or pass `fileType` explicitly to skip inference.
|
|
1614
1649
|
Remount via `key={fileUrl}` when swapping the file in place instead of just changing the prop.
|
|
1615
1650
|
|
|
1651
|
+
### An overflowing `ScrollbarBox` is a tab stop — give it an `aria-label`
|
|
1652
|
+
|
|
1653
|
+
While its content overflows a scrollable axis (more than 1px) and holds no button, link or field, the
|
|
1654
|
+
box takes `tabIndex={0}` so a keyboard user can scroll it, and rings on `:focus-visible` only. A box that
|
|
1655
|
+
fits, scrolls `hidden`, or already holds something focusable gets no stop, and a mouse click shows no ring.
|
|
1656
|
+
Without `aria-label` the stop is unnamed (no `role="region"` either), so a screen reader announces nothing
|
|
1657
|
+
useful at it.
|
|
1658
|
+
|
|
1659
|
+
**Apply:** pass `aria-label` ("Recent deals") on every `ScrollbarBox` that can overflow, and don't wrap one
|
|
1660
|
+
around a list of controls just to get a stop.
|
|
1661
|
+
|
|
1616
1662
|
### `StageProgress`'s `tooltipThreshold`/`minStageWidth` no-op under `variant="stepper"`, and a stale `value` blanks the tracker
|
|
1617
1663
|
|
|
1618
1664
|
Both props stop having any effect the moment a tracker switches to the stepper variant. Separately,
|
|
@@ -1625,6 +1671,16 @@ matches either, even when the "same" stage is clearly intended.
|
|
|
1625
1671
|
current `stages` list whenever it's filtered, and keep `id`/`value` the same primitive type at every
|
|
1626
1672
|
call site.
|
|
1627
1673
|
|
|
1674
|
+
### A `StageProgress` strip is a tab stop only when no stage is a button — name it with `aria-label`
|
|
1675
|
+
|
|
1676
|
+
At a narrow width the strip scrolls sideways. Stage buttons already let a keyboard user reach every stage,
|
|
1677
|
+
so an interactive strip gets no extra stop. A strip with nothing focusable (`isReadOnly`, or every stage
|
|
1678
|
+
disabled) takes `tabIndex={0}` while it overflows and rings on `:focus-visible` only; nothing changes at
|
|
1679
|
+
rest, on a mouse click, or while the stages fit. Without `aria-label` the stop is unnamed. A `stepper`
|
|
1680
|
+
keeps its `ol` role, so its `aria-label` names the list rather than a region.
|
|
1681
|
+
|
|
1682
|
+
**Apply:** pass `aria-label` ("Deal stages") on every read-only `StageProgress` that can overflow.
|
|
1683
|
+
|
|
1628
1684
|
### `Table`'s `isVisiblity`, `tableSettings`, `handleExportChange`/`exportOptions`/`exportLabel`, and `onColumnFilter` are dead props — now `@deprecated`
|
|
1629
1685
|
|
|
1630
1686
|
Grepped account-frontend, tickets, crm-frontend, hrms and social-frontend: zero consumers set any of
|
|
@@ -1912,7 +1968,8 @@ A wide node header is also **clipped, not ellipsized** — the header's ellipsis
|
|
|
1912
1968
|
text. Column widths come from the rendered DOM, never from label length, so sizing is unaffected.
|
|
1913
1969
|
|
|
1914
1970
|
**Apply:** set `labelText` on every node label; put an `isTruncated` `Text` inside the node if it
|
|
1915
|
-
can outgrow the column.
|
|
1971
|
+
can outgrow the column. An icon-only tooltip trigger inside the node is a native `button`, not a `span`
|
|
1972
|
+
with `aria-label` (see the `ToolTip` gotcha above).
|
|
1916
1973
|
|
|
1917
1974
|
### `FormField`, `IconButton`, `SkipLink`: what their props do not hint at
|
|
1918
1975
|
|
|
@@ -1935,9 +1992,11 @@ can outgrow the column.
|
|
|
1935
1992
|
- `formatDate` reads a bare `YYYY-MM-DD` as that calendar day, not UTC midnight. Pass a `Date` only when you mean
|
|
1936
1993
|
an instant. Epoch *seconds* are not detected: multiply by 1000 first.
|
|
1937
1994
|
- `TimePicker` fires `onChange` with a `Date` on the day of `value` (else `baseDate`, else today). It never clears
|
|
1938
|
-
to `null
|
|
1995
|
+
to `null` on its own: pass `onClear` to make "--" pickable once a time is set (it then fires instead of `onChange`).
|
|
1939
1996
|
- For free-text chips that are not email addresses use `TagInput`: same look as `MultiSelect`, any text, with
|
|
1940
|
-
your own `validate`.
|
|
1997
|
+
your own `validate`. Its rejection messages and add/remove announcements are English by default; translate them
|
|
1998
|
+
with `labels` (functions, e.g. `duplicate: (entry) => ...`), including `labels.remove` for each chip's remove button
|
|
1999
|
+
(default `Remove <tag>`).
|
|
1941
2000
|
- **Button press scale matches a real `:active` only.** A `MenuButton as={Button}` held open by Chakra's
|
|
1942
2001
|
`data-active` keeps the darker pressed fill but does not stay at 0.98. A consumer `_active={{ transform }}`
|
|
1943
2002
|
loses to the press rule while the pointer is down; use `variant="unstyled"` or an `sx` `&:active` with
|
package/DESIGN-GUIDE.md
CHANGED
|
@@ -52,11 +52,31 @@ Borders are the one px value: `borderWidth="1px"`. Fixed widths (side panel, lis
|
|
|
52
52
|
| Body | `Text fontSize="sm" color={colors.text[800]}` |
|
|
53
53
|
| Label / meta / helper | `Text fontSize="xs" color={colors.textMuted}` |
|
|
54
54
|
| KPI tile | `StatCard` — pass `trend` and `goodDirection`; the delta is green when the change is *good* (a shorter sales cycle is green); `iconTone` tints the icon chip (unset = brand primary) |
|
|
55
|
-
| Numbers in tables/columns | `sx={
|
|
56
|
-
|
|
|
55
|
+
| Numbers in tables/columns | `sx={NUMERIC_TEXT}` (root export, tabular figures) so digits align; `Table` columns take `align: "end"` |
|
|
56
|
+
| Code, ids, shortcuts | `fontFamily="mono"` (a real monospace stack); shortcut hints are `KbdShortcut`, never a hand-styled `<kbd>` |
|
|
57
|
+
| Overline (rare) | `textStyle="overline"` |
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
**`textStyle` sets size, line height, weight and tracking in one prop.** Prefer it to hand-picking
|
|
60
|
+
the four: `<Text textStyle="label">`. The ramp (`TEXT_STYLES`, also a root export):
|
|
61
|
+
|
|
62
|
+
| `textStyle` | Use |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| `title` · `heading` · `subheading` | page / section / card titles (24 · 20 · 16px) |
|
|
65
|
+
| `body` | running text (14px) |
|
|
66
|
+
| `ui` · `label` | control and form text (13px, weight 500 · 600) |
|
|
67
|
+
| `caption` | helper and meta text (12px) |
|
|
68
|
+
| `overline` | small-caps eyebrow (11px, uppercase) |
|
|
69
|
+
|
|
70
|
+
Chakra size keys only (`xs-minus xs xs-plus sm md lg xl 2xl`) — never `fontSize="14px"`.
|
|
71
|
+
`xs-plus` (13px) is the control size; `xs-minus` (11px) is for chips, counts, keyboard hints and
|
|
72
|
+
overlines only; nothing is smaller. Weights: 400 body, 500 labels, 600 titles, 700 KPI numbers only.
|
|
73
|
+
|
|
74
|
+
**Radius and elevation come from the role, not the scale step.** `RADIUS_ROLE` (root export) names
|
|
75
|
+
the radius a surface plays: `control`, `field`, `tooltip` and `media` 8px · `option` 6px · `card`,
|
|
76
|
+
`float`, `dialog` and `sheet` 12px · `chip` full. Anchored popups (`Menu`, `Popover`, `Select`,
|
|
77
|
+
`Dropdown`) all take the 12px radius, and `Menu` and `Popover` the `md` (float) shadow, so a panel
|
|
78
|
+
you build yourself takes `borderRadius={RADIUS_ROLE.float}` and `boxShadow="md"`. A resting card is
|
|
79
|
+
`shadows.card`; heavier shadows belong to floating things only.
|
|
60
80
|
|
|
61
81
|
## 4. Color — pick by role
|
|
62
82
|
|
|
@@ -91,8 +111,9 @@ stay light in dark mode.
|
|
|
91
111
|
| Must stand out (a status that needs attention) | `variant="solid"` |
|
|
92
112
|
| Dense list, table cell, or an already-colored surface | `variant="outline"` — no fill to compete with the surface |
|
|
93
113
|
|
|
94
|
-
`secondary` and `tertiary`
|
|
95
|
-
|
|
114
|
+
`secondary` and `tertiary` are two distinct accents on every brand except `zinc`, which is
|
|
115
|
+
near-grey and has almost no hue to turn (see `COMPONENT-GOTCHAS.md`) — on `zinc`, reach for a
|
|
116
|
+
utility scheme to tell two categories apart.
|
|
96
117
|
|
|
97
118
|
## 5. Controls — two scales, `sm` by default
|
|
98
119
|
|
|
@@ -155,6 +176,7 @@ sections are `Card` with the title in `header`.
|
|
|
155
176
|
| Multi-step flow (send, import, onboard) with validated Continue and a review step | `WizardDialog` (`Wizard` inline; `chrome="inline"` inside a `WorkspaceWindow` or other host that is already the dialog) — don't hand-roll Back / Continue / Finish around `StageProgress`; each step's `validate` returns its error messages, future steps stay locked until valid, each step's `summary` drives the review |
|
|
156
177
|
| Rich-text template with `${field}` placeholders | `Editor mergeFields={…}` — not a `Select` + caret tracking + dialog beside it; use its `label` / `helperText` / `errorMessage` |
|
|
157
178
|
| A PDF behind auth, shown inline | `PdfViewer getBlob={…}` — the toolbar's Open / Download then work with the token, so don't add your own buttons |
|
|
179
|
+
| Data grid | `Table` — defaults to `variant="studio"` (flat small-caps header, one row rule, the select slot resting on the row number, status as a pill). Pass `variant="classic"` for the banded header and per-column rules; don't restyle the header or rows by hand |
|
|
158
180
|
| Toolbar: search · filters · active-filter chips · count · actions | `FilterBar` (`search`, children, `activeFilters` + `onRemoveFilter`/`onClearAll`, `summary`, `actions`) |
|
|
159
181
|
| Read-only label/value grid (record details, key facts) | `DescriptionList` (`items`, `columns`, `layout="inline"` for a side panel, `copyable`, `isLoading`) |
|
|
160
182
|
| Settings row (title + description left, control right) | `SettingRow` inside a `SettingsSection` (`isDanger` for the danger zone, `action` for a header-right button) |
|
|
@@ -177,6 +199,23 @@ sections are `Card` with the title in `header`.
|
|
|
177
199
|
scrim `Box`. `Loading` is the older API and stays on the heavier house scrim by default; pass
|
|
178
200
|
`variant="dim"` to route it through `Backdrop`, or just use `Backdrop` directly.
|
|
179
201
|
|
|
202
|
+
### Parts you reach for through their parent
|
|
203
|
+
|
|
204
|
+
These are root exports, but each belongs to a parent component; start from the parent unless a row
|
|
205
|
+
here says otherwise.
|
|
206
|
+
|
|
207
|
+
| Part | Belongs to | Use it for |
|
|
208
|
+
| --- | --- | --- |
|
|
209
|
+
| `DrawerHeader` · `DrawerBody` · `DrawerFooter` | `Drawer` | the only children a `Drawer` renders; style props go straight on each slot. For a create / edit form use `FormDrawer` instead |
|
|
210
|
+
| `ProfileCardHeader` · `ProfileCardBody` · `ProfileCardFooter` | `ProfileCard` | the only children a `ProfileCard` renders; any other sibling is dropped |
|
|
211
|
+
| `StageItem` | `StageProgress` | one chevron, bar or pill stage; `StageProgress` renders it, so don't lay stages out by hand |
|
|
212
|
+
| `FilePreviewTrigger` | `FilePreview` | a thumbnail button that opens one file in a modal; for several attachments use `MediaViewer` |
|
|
213
|
+
| `MediaScrubber` · `MediaStatusPanel` · `MediaDocumentStage` | `MediaViewer` | building a custom media UI: a `role="slider"` seek bar (`onSeek`), the no-preview / error panel (`tone="warning"` for errors), and the document stage driven by a `resolveDocument` you supply |
|
|
214
|
+
| `LazyWrapper` | `React.lazy` | a `Suspense` boundary with the themed spinner; pass `fallback` to replace it |
|
|
215
|
+
| `ScrollbarBox` | any scrolling region | a themed scroll container; give it an `aria-label`, because it is a keyboard stop while it scrolls |
|
|
216
|
+
| `AppearanceSettings` | a settings page | the theme, colour-mode and font-size controls in one panel; brand and font size are controlled, the colour-mode switch reads the theme context |
|
|
217
|
+
| `ApexPolarChart` | `ApexPieChart` | independent magnitudes as wedges of equal angle and varying radius; values that add to a whole belong in `ApexPieChart` |
|
|
218
|
+
|
|
180
219
|
### Navigation shell
|
|
181
220
|
|
|
182
221
|
`SideBar` is the rail, `NavigationBar` the top bar, `NavLauncher` the full-height "go anywhere" panel.
|
|
@@ -236,7 +275,8 @@ hides its primary; when only one section is empty on a populated page, that sect
|
|
|
236
275
|
`Menu`…) come from `pixelize-design-library` too. Anything the library owns a component for
|
|
237
276
|
(`Tabs`, `Accordion`, `Modal`, `Card`, `Select`, `TextInput`, `Skeletons`…) has no Chakra
|
|
238
277
|
passthrough at all — the owned component is the only one.
|
|
239
|
-
- Reaching for `SelectV2
|
|
278
|
+
- Reaching for `SelectV2` (`@deprecated`), `SearchSelect` or `SelectSearch` (not deprecated, but not the
|
|
279
|
+
preferred picker) in new work.
|
|
240
280
|
One picker now: `Select` (`native={false}` for the themed, searchable, multi popup).
|
|
241
281
|
`Dropdown` is the exception — it is an action menu, not a picker, and is not replaced.
|
|
242
282
|
- A card inside a card; a border on a content `Card` (it is borderless by default), or any resting
|