pixelize-design-library 2.4.2-beta.64 → 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 +520 -21
- package/COMPONENT-GOTCHAS.md +187 -95
- package/DESIGN-GUIDE.md +54 -10
- 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 +4 -1
- package/dist/Components/CopyButton/CopyButton.js +5 -8
- 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 +3 -1
- package/dist/Components/Drawer/Drawer.js +28 -26
- package/dist/Components/Drawer/DrawerProps.d.ts +4 -0
- 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/FormDrawer/FormDrawer.d.ts +1 -1
- package/dist/Components/FormDrawer/FormDrawer.js +3 -3
- package/dist/Components/FormDrawer/FormDrawerProps.d.ts +2 -0
- 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/dialogNaming.d.ts +8 -0
- package/dist/Components/Modal/dialogNaming.js +21 -0
- package/dist/Components/Modal/warnDroppedSlotChildren.d.ts +1 -1
- package/dist/Components/Modal/warnDroppedSlotChildren.js +7 -3
- package/dist/Components/NavLauncher/LauncherTabs.js +4 -3
- package/dist/Components/NavLauncher/NavLauncher.d.ts +1 -1
- package/dist/Components/NavLauncher/NavLauncher.js +288 -56
- package/dist/Components/NavLauncher/NavLauncherProps.d.ts +83 -5
- package/dist/Components/NavLauncher/ScopeBar.d.ts +14 -0
- package/dist/Components/NavLauncher/ScopeBar.js +139 -0
- package/dist/Components/NavLauncher/engine/distance.d.ts +4 -0
- package/dist/Components/NavLauncher/engine/distance.js +41 -0
- package/dist/Components/NavLauncher/engine/engine.d.ts +84 -0
- package/dist/Components/NavLauncher/engine/engine.js +472 -0
- package/dist/Components/NavLauncher/engine/fold.d.ts +15 -0
- package/dist/Components/NavLauncher/engine/fold.js +84 -0
- package/dist/Components/NavLauncher/engine/index.d.ts +21 -0
- package/dist/Components/NavLauncher/engine/index.js +17 -0
- package/dist/Components/NavLauncher/launcherParts.d.ts +14 -0
- package/dist/Components/NavLauncher/launcherParts.js +51 -13
- package/dist/Components/NavLauncher/match.d.ts +13 -2
- package/dist/Components/NavLauncher/match.js +26 -12
- package/dist/Components/NavLauncher/searchLayout.d.ts +61 -0
- package/dist/Components/NavLauncher/searchLayout.js +110 -0
- package/dist/Components/NavLauncher/spotlight.d.ts +39 -0
- package/dist/Components/NavLauncher/spotlight.js +202 -0
- package/dist/Components/NavLauncher/spotlightParts.d.ts +53 -0
- package/dist/Components/NavLauncher/spotlightParts.js +121 -0
- 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 +17 -21
- package/dist/Components/Table/components/TableLoading.js +8 -2
- 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/WizardDialog/WizardDialog.d.ts +1 -1
- package/dist/Components/WizardDialog/WizardDialog.js +15 -3
- package/dist/Components/WizardDialog/WizardDialogProps.d.ts +5 -3
- package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +11 -1
- package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +6 -3
- package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +16 -15
- 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/chakra/ringShadow.d.ts +3 -0
- package/dist/Theme/chakra/ringShadow.js +7 -0
- 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 +2 -1
- package/dist/Theme/tokens/builders/buildDarkPalette.js +5 -5
- 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 +5 -8
- 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 +24 -19
- 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/FormDrawer/FormDrawer.js +3 -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/dialogNaming.js +18 -0
- package/dist/esm/Components/Modal/warnDroppedSlotChildren.js +7 -3
- package/dist/esm/Components/NavLauncher/LauncherTabs.js +4 -3
- package/dist/esm/Components/NavLauncher/NavLauncher.js +291 -59
- package/dist/esm/Components/NavLauncher/ScopeBar.js +136 -0
- package/dist/esm/Components/NavLauncher/engine/distance.js +37 -0
- package/dist/esm/Components/NavLauncher/engine/engine.js +459 -0
- package/dist/esm/Components/NavLauncher/engine/fold.js +75 -0
- package/dist/esm/Components/NavLauncher/engine/index.js +14 -0
- package/dist/esm/Components/NavLauncher/launcherParts.js +46 -10
- package/dist/esm/Components/NavLauncher/match.js +25 -12
- package/dist/esm/Components/NavLauncher/searchLayout.js +101 -0
- package/dist/esm/Components/NavLauncher/spotlight.js +194 -0
- package/dist/esm/Components/NavLauncher/spotlightParts.js +108 -0
- 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 +19 -23
- package/dist/esm/Components/Table/components/TableLoading.js +6 -3
- 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/WizardDialog/WizardDialog.js +15 -3
- package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +12 -2
- package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +7 -4
- 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/chakra/ringShadow.js +3 -0
- package/dist/esm/Theme/provider/ThemeSwitcher.js +1 -1
- package/dist/esm/Theme/tokens/builders/buildDarkPalette.js +5 -5
- 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 +18 -25
- package/dist/index.d.ts +59 -5
- package/dist/index.js +36 -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,13 +583,18 @@ 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
|
|
586
593
|
fires only after a submit; if validation is async, set `isSubmitting` synchronously in `onSubmit` so
|
|
587
594
|
focus waits for the result, otherwise errors that arrive later are not focused. The footer submit
|
|
588
595
|
button is tied to the form with the `form` attribute — Enter-to-submit works in browsers, but
|
|
589
|
-
jsdom / user-event
|
|
596
|
+
jsdom / user-event only simulates it for a form with exactly one text field, so use
|
|
597
|
+
`fireEvent.submit(form)` in tests. `isSubmitDisabled` swallows both: `onSubmit` is not called while it is true.
|
|
590
598
|
|
|
591
599
|
### `QueryStateBoundary` evaluates JSX `children` even while loading
|
|
592
600
|
|
|
@@ -611,9 +619,19 @@ green. Pass `onClick` for a clickable card (it renders its own `<button>`); neve
|
|
|
611
619
|
Unlike `Tag` and `StatCard`, where `info` is blue, the default `tone="info"` here paints the brand
|
|
612
620
|
primary scale. `aria-label` is required — the ring has no visible caption.
|
|
613
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
|
+
|
|
614
632
|
### A clickable `TextInput` icon is a real button — give it a name
|
|
615
633
|
|
|
616
|
-
With `
|
|
634
|
+
With `onRightIconClick`/`onLeftIconClick` the icon renders as a `<button>`. Without
|
|
617
635
|
`rightIconAriaLabel`/`leftIconAriaLabel` it is announced as "{label}: right icon action".
|
|
618
636
|
|
|
619
637
|
### `SelectSearch`'s `isRequired` shows the asterisk but never announces "required"
|
|
@@ -625,7 +643,7 @@ undefined and stripped. Verified by DOM dump: the rendered `<input>` carries no
|
|
|
625
643
|
even when `isRequired` is passed. The visible asterisk comes from a separate custom label, so the
|
|
626
644
|
field *looks* required to sighted users and is silent to a screen reader.
|
|
627
645
|
|
|
628
|
-
**Apply:**
|
|
646
|
+
**Apply:** prefer `Select` (`native={false}`) for new work — `SelectSearch` is not deprecated, but `Select` marks required
|
|
629
647
|
state on a plain `Box` combobox that Chakra does not rewrite. If you must stay on `SelectSearch`,
|
|
630
648
|
set the required state on your own wrapping `FormControl`. Note the obvious one-line fix inside the
|
|
631
649
|
component is not neutral: Chakra's `useFormControl` also emits native `required`, which would add
|
|
@@ -690,6 +708,15 @@ accepted, typed, never called.
|
|
|
690
708
|
**Apply:** leave at least one column without a `node`, or put an explicit control inside a `node`
|
|
691
709
|
renderer instead of relying on row click.
|
|
692
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
|
+
|
|
693
720
|
### `Table.renderRowDetail` runs for every row on every render, and `expandedRows` ids match strictly
|
|
694
721
|
|
|
695
722
|
It decides whether each row gets a chevron, so an inline function re-renders every row (defeating
|
|
@@ -722,15 +749,12 @@ const AppTable = ({ variant = 'classic', ...props }: TableProps) => <Table varia
|
|
|
722
749
|
```
|
|
723
750
|
Applies to any library prop with a default value, not just `Table`'s `variant`.
|
|
724
751
|
|
|
725
|
-
### `FormWrapper`
|
|
752
|
+
### `FormWrapper` forwards extra props to the outer wrapper only
|
|
726
753
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
the wrapper all silently disappear, and TypeScript won't catch it since excess-property checks don't
|
|
730
|
-
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.
|
|
731
756
|
|
|
732
|
-
**Apply:**
|
|
733
|
-
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.
|
|
734
758
|
|
|
735
759
|
### `ContactForm`'s `apiKey` prop is a POST URL, not an auth token
|
|
736
760
|
|
|
@@ -753,15 +777,15 @@ blank email submits successfully with no error shown.
|
|
|
753
777
|
**Apply:** if the parent needs to react to success, this component can't provide it. Don't rely on
|
|
754
778
|
`email` being enforced as required — validate it yourself first if that matters.
|
|
755
779
|
|
|
756
|
-
### `VerifyEmailOtp` can't accept alphanumeric codes
|
|
780
|
+
### `VerifyEmailOtp` can't accept alphanumeric codes, and appends "your new Pixel Account"
|
|
757
781
|
|
|
758
782
|
It wraps Chakra's `PinInput` without forwarding a `type`, so Chakra's `type="number"` default
|
|
759
783
|
applies — any letter typed is silently rejected (the character never appears, no error shown).
|
|
760
|
-
`VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description`
|
|
761
|
-
|
|
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).
|
|
762
786
|
|
|
763
|
-
**Apply:** only use this component for numeric-only OTPs
|
|
764
|
-
|
|
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`.
|
|
765
789
|
|
|
766
790
|
### `ApexLineChart` only ever renders one line, frozen at mount
|
|
767
791
|
|
|
@@ -872,23 +896,6 @@ the library (`TextInput`, `NumberInput`, `PhoneNumberInput`, `RadioButton`, `Pin
|
|
|
872
896
|
**Apply:** always pass `isInformation` and `informationMessage` together; never treat
|
|
873
897
|
`isInformation` alone as "use a default message."
|
|
874
898
|
|
|
875
|
-
### `ErrorComponent`'s `error` prop is the message text itself — the opposite of `error`+`errorMessage`
|
|
876
|
-
|
|
877
|
-
Every other field in the library pairs a boolean `error` with a string `errorMessage`.
|
|
878
|
-
`ErrorComponent` (used internally by `Input`) instead takes `error: string` directly as
|
|
879
|
-
the message, with no internal truthy-check — passing `error=""` still draws the full icon next to
|
|
880
|
-
blank text. It also has no `id`, so unlike `ErrorMessage` it can't be wired to `aria-describedby`.
|
|
881
|
-
|
|
882
|
-
**Apply:** treat `ErrorComponent` as `Input`-specific, not a general error row; guard it
|
|
883
|
-
with a truthy-message check yourself, and use `ErrorMessage` for any other field.
|
|
884
|
-
|
|
885
|
-
### `FormattedDescription`'s single-`*italic*` marker strips the asterisks but applies no italic style
|
|
886
|
-
|
|
887
|
-
`**bold**` works; a lone `*word*` silently renders as plain text with the markers removed, reading
|
|
888
|
-
as though the formatting was simply ignored.
|
|
889
|
-
|
|
890
|
-
**Apply:** don't rely on single-asterisk emphasis in `content` strings — use `**bold**` or plain text.
|
|
891
|
-
|
|
892
899
|
### `Timeline`'s `onEditNote` editor doesn't auto-close without `editNoteLoading` — unlike add-note
|
|
893
900
|
|
|
894
901
|
Add-note has a back-compat fallback that closes its editor immediately if `addNoteLoading` is never
|
|
@@ -969,13 +976,13 @@ props. Mixing plain and `customNode` items in one column produces inconsistent p
|
|
|
969
976
|
**Apply:** don't expect board-wide card actions to reach a `customNode` card; wire them inside your
|
|
970
977
|
custom render instead.
|
|
971
978
|
|
|
972
|
-
### `KanbanBoard`'s `AccountCard` only renders string-typed fields
|
|
979
|
+
### `KanbanBoard`'s `AccountCard` only renders string-typed fields
|
|
973
980
|
|
|
974
981
|
A numeric field on an `Account` (allowed by its index signature) is never shown in the card's field
|
|
975
|
-
list. The label is the key
|
|
976
|
-
"
|
|
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".
|
|
977
984
|
|
|
978
|
-
**Apply:** keep numeric display values as strings
|
|
985
|
+
**Apply:** keep numeric display values as strings.
|
|
979
986
|
|
|
980
987
|
### `KanbanBoard`'s `onColumnDelete` receives the deleted column's **card** ids, not the column's id
|
|
981
988
|
|
|
@@ -988,7 +995,7 @@ before the click) if you need the column id itself.
|
|
|
988
995
|
|
|
989
996
|
### `isRequired` is decorative on some fields, native on others — same prop name, different behavior
|
|
990
997
|
|
|
991
|
-
`NumberInput`
|
|
998
|
+
`NumberInput` sets native `required` (browser bubble, blocks submit).
|
|
992
999
|
`TextInput` and `InputTextArea` set only `aria-required` — announced, but no native validation.
|
|
993
1000
|
`PhoneNumberInput` and `PinInput` pass it only to the label (draws a `*`); the field gets nothing.
|
|
994
1001
|
|
|
@@ -1020,15 +1027,6 @@ change those queries to `getByRole("switch", …)`.
|
|
|
1020
1027
|
Same shape of trap on `Tabs`: the owned `Tab` forwards no `data-testid`, so `getByTestId("…-tab-…")`
|
|
1021
1028
|
queries must become `getByRole("tab", { name })`.
|
|
1022
1029
|
|
|
1023
|
-
### The internal `Input.tsx` silently ignores six declared props
|
|
1024
|
-
|
|
1025
|
-
`disabled`, `autoComplete`, `autoFocus`, `inputClassName`, `labelClassName`, and `errorClassName`
|
|
1026
|
-
are all typed on `InputProps` but never read — passing them, `disabled` especially, compiles cleanly
|
|
1027
|
-
and does nothing. It also has no `id` field, so its label always renders as an unassociated `<span>`.
|
|
1028
|
-
|
|
1029
|
-
**Apply:** this is an internal component (not exported) reachable only via deep import — prefer
|
|
1030
|
-
`TextInput` for anything public-facing, which doesn't have this gap.
|
|
1031
|
-
|
|
1032
1030
|
### `AlertDialog`'s `colorScheme`/`size`/`status`/`variant`/`addRole` are dead props
|
|
1033
1031
|
|
|
1034
1032
|
Typed but never read, and `@deprecated` as a group (editors may not strike each one through). Use
|
|
@@ -1056,6 +1054,17 @@ child, with no tooltip element and no document listeners. A test that mocks Chak
|
|
|
1056
1054
|
expects it mounted at render time must hover or focus the trigger first
|
|
1057
1055
|
(`fireEvent.pointerEnter(trigger)` or `userEvent.hover`).
|
|
1058
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
|
+
|
|
1059
1068
|
### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
|
|
1060
1069
|
|
|
1061
1070
|
`children` is `@deprecated` and never read — only `title`/`description`/`actions` render. The `onClose` you pass to `showToast` is wired to
|
|
@@ -1076,14 +1085,6 @@ button, right icon/dropdown), not just a "clicked outside the buttons" signal.
|
|
|
1076
1085
|
**Apply:** always set `rightIcon` + `rightIconDropdown={true}` together for the dropdown. Don't use
|
|
1077
1086
|
`onButtongroupClick` to detect background clicks — inspect `event.target` if you need to distinguish.
|
|
1078
1087
|
|
|
1079
|
-
### `Buttons` (plural) is not a group wrapper
|
|
1080
|
-
|
|
1081
|
-
Despite the plural name suggesting a group, `Buttons` is now a thin wrapper over one themed
|
|
1082
|
-
`Button` (its `className` is `@deprecated`), and it isn't exported from the package root.
|
|
1083
|
-
|
|
1084
|
-
**Apply:** use `Button` for a single themed button or `ButtonGroupIcon` for a themed group; there is
|
|
1085
|
-
no good reason to reach for `Buttons`.
|
|
1086
|
-
|
|
1087
1088
|
### `Card` already wraps `children` in a padded `CardBody` — a nested one doubles the padding
|
|
1088
1089
|
|
|
1089
1090
|
`header`/`footer` now render, and `children` sit in a flex `CardBody` laid out by `direction`/
|
|
@@ -1162,9 +1163,9 @@ Inside a `NavigationBar` `moreIcon` cluster, a full trigger needs about 88px (av
|
|
|
1162
1163
|
when its label truncates to nothing, and the title is the first thing to give way. With a long org name
|
|
1163
1164
|
the title is invisible on 320-375px bars, and a smaller `maxWidth` does not change that.
|
|
1164
1165
|
|
|
1165
|
-
**Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`.
|
|
1166
|
-
the
|
|
1167
|
-
`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
|
|
1168
1169
|
`matchMedia` is missing (SSR, jsdom). `NavigationBar`'s `moreIcon` root is `min-width: 0`: give your
|
|
1169
1170
|
own icon buttons `flexShrink={0}` and let any label truncate.
|
|
1170
1171
|
|
|
@@ -1241,8 +1242,10 @@ wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
|
|
|
1241
1242
|
|
|
1242
1243
|
**Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
|
|
1243
1244
|
|
|
1244
|
-
Each image's `previewUrl` is a `blob:` URL
|
|
1245
|
-
|
|
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.)
|
|
1246
1249
|
|
|
1247
1250
|
### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
|
|
1248
1251
|
|
|
@@ -1279,6 +1282,15 @@ is also `null` until Jodit's lazy-loaded chunk resolves — a mount-time effect
|
|
|
1279
1282
|
**Apply:** never set `theme`/`popupRoot` inside the `config` you pass to `Editor`. To force a
|
|
1280
1283
|
remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key` prop.
|
|
1281
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
|
+
|
|
1282
1294
|
### `PdfViewer` `getBlob` — fetched on mount only; the toolbar already has Open and Download
|
|
1283
1295
|
|
|
1284
1296
|
- **Swapping the file needs a new React `key`.** `getBlob` is read through a ref and fetched on mount,
|
|
@@ -1292,7 +1304,9 @@ remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key`
|
|
|
1292
1304
|
|
|
1293
1305
|
`validate` runs on Continue, on Finish, and again for every step on Finish. Passing `stepId` controls
|
|
1294
1306
|
the visible step only: stages past the furthest valid step stay disabled. Esc, close, Back and Cancel
|
|
1295
|
-
are disabled while `isFinishing`.
|
|
1307
|
+
are disabled while `isFinishing`. With `chrome="inline"` there is no Modal at all: no focus trap, no Esc,
|
|
1308
|
+
no close X and no `role="dialog"` (the host window supplies them), `size` is ignored, and nothing renders
|
|
1309
|
+
while `isOpen` is false; Cancel still calls `onClose`, so the host must close itself there.
|
|
1296
1310
|
|
|
1297
1311
|
### `PageHeader` actions wrap by default
|
|
1298
1312
|
|
|
@@ -1312,6 +1326,15 @@ test asserting the old single-row layout needs `actionsLayout="inline"`.
|
|
|
1312
1326
|
Jodit is re-created (readonly or height change) a stable handler stops receiving events. `Editor`
|
|
1313
1327
|
binds them itself per instance; don't copy the pattern when wrapping Jodit directly.
|
|
1314
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
|
+
|
|
1315
1338
|
### `Editor`'s Jodit toolbar is fixed for screen readers and keyboard, from our wrapper only
|
|
1316
1339
|
|
|
1317
1340
|
Jodit's own markup (`node_modules/jodit`) put `aria-label` on each button's `role="listitem"`
|
|
@@ -1326,6 +1349,17 @@ above — a value you pass in `config` wins) and runs a `MutationObserver`-backe
|
|
|
1326
1349
|
**Apply:** nothing — this is automatic. Set `config.allowTabNavigation: false` only if you
|
|
1327
1350
|
deliberately want the toolbar out of the tab order; you'll reintroduce the keyboard-reachability gap.
|
|
1328
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
|
+
|
|
1329
1363
|
### `SelectV2`, `SearchSelect`, and `SelectSearch` all search `option.label` only
|
|
1330
1364
|
|
|
1331
1365
|
None of the three checks a rendered secondary field (`option.description`, a custom `view` node,
|
|
@@ -1413,8 +1447,9 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
|
|
|
1413
1447
|
- **Esc is handled by the launcher, not the Drawer** (`closeOnEsc` is off): it clears a non-empty
|
|
1414
1448
|
query and keeps focus in the field, and closes only when the query is empty. The keydown is stopped inside
|
|
1415
1449
|
the launcher, so a consumer `Escape` listener on `document` never sees it.
|
|
1416
|
-
-
|
|
1417
|
-
|
|
1450
|
+
- **The dialog's accessible name is always `labels.title`** (a hidden heading, through `Drawer`'s
|
|
1451
|
+
`aria-labelledby`); the search value, scope chips and `headerActions` no longer join it. A consumer
|
|
1452
|
+
test asserting the old "Menu leave" style name must assert `labels.title` instead.
|
|
1418
1453
|
- **The result count is `aria-hidden`; the announcement is a separate visually hidden `aria-live="polite"`
|
|
1419
1454
|
node, deliberately not `role="status"`**, so `getByRole("status")` still matches only the no-results
|
|
1420
1455
|
message and the loading skeleton.
|
|
@@ -1429,6 +1464,7 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
|
|
|
1429
1464
|
a consumer that annotates a *full* `LauncherLabels` object fails to compile.
|
|
1430
1465
|
- **`openShortcutHint` and `labels.hintOpenMenu` are deprecated no-ops:** the open chord is no longer
|
|
1431
1466
|
shown in the footer. Drop them; the footer's hints are arrows, ENTER, ⌘ ENTER, ⌘ + click, P, ESC.
|
|
1467
|
+
Both are optional, so a full `LauncherLabels` object needs no `Omit<LauncherLabels, "hintOpenMenu">`.
|
|
1432
1468
|
- **`apps` is data-driven.** Gate by plan by changing the array or setting `locked` / `lockedReason`;
|
|
1433
1469
|
keep `id`s stable (hues and `key` derive from them), and pass `color` on an app whose mark must not
|
|
1434
1470
|
shift when siblings are added or removed. Locked rows are not links, not focusable, `aria-disabled`,
|
|
@@ -1441,6 +1477,34 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
|
|
|
1441
1477
|
stylesheet.
|
|
1442
1478
|
- **A search row without `href` (an action with `run`) cannot open in a new tab:** any click, with or
|
|
1443
1479
|
without Cmd/Ctrl, runs it and closes the launcher, same as Enter.
|
|
1480
|
+
- **Spotlight search is opt-in (`searchMode="spotlight"`).** Without it matching, ranking and row
|
|
1481
|
+
order are exactly as before; `scopes`, `quickActions`, `answers`, `facts` and `groupLimit` work in
|
|
1482
|
+
both modes. Facts are searchable in spotlight only.
|
|
1483
|
+
- **Two search models, and classic never matches a screen on its module.** Classic (the default) runs
|
|
1484
|
+
`searchLauncherSections`: registry order, no ranking, and every query word must appear in one row's
|
|
1485
|
+
own label or keywords. "leave balance" therefore finds nothing unless one screen's keywords carry
|
|
1486
|
+
both words. Spotlight ranks and also matches a screen on its module and section labels, so the same
|
|
1487
|
+
query finds Leave › Balances. The exported `searchLauncher` (one flat Screens group) is legacy and
|
|
1488
|
+
`@deprecated`; the component never calls it.
|
|
1489
|
+
- **Scope chips live in the header row and are always shown** (their own header row below `md`);
|
|
1490
|
+
while a query is active each chip's name carries its count ("People, 3 results"), so a test that
|
|
1491
|
+
types first must match `getByRole("radio", { name: /^People/ })`, not the bare label.
|
|
1492
|
+
- **Picking a chip other than All or Screens with an empty field lists that scope** exactly as
|
|
1493
|
+
passed: its `actions` or `extraResults` groups, so a remote group with nothing loaded yet shows
|
|
1494
|
+
`labels.scopeEmpty`. Load the scope's items when `onScopeChange` fires if it should list them.
|
|
1495
|
+
- **Quick actions show only under All with an empty query, as the first block of the menu** (not
|
|
1496
|
+
while `isLoading`); only the first 5 render.
|
|
1497
|
+
- **Closing resets the scope to "all"** and calls `onScopeChange("all")`; a controlled `activeScope`
|
|
1498
|
+
must apply it, like `onQueryChange("")`.
|
|
1499
|
+
- **`facts` swap the Quick access rail for a Preview pane at `lg`** whenever any visible result has
|
|
1500
|
+
facts; below `lg` the active result's facts dock under the list. Copy buttons are never inside an
|
|
1501
|
+
`option` or the listbox (axe `nested-interactive`, `aria-required-children`).
|
|
1502
|
+
- **An answer without `run` or `href` copies `answer.value` on Enter/click**; answers show in the
|
|
1503
|
+
All scope only.
|
|
1504
|
+
- **`extraResults` groups are not filtered** unless `matchLocally: true`; remote rows the query does not
|
|
1505
|
+
match stay listed (score 0) and can never be the Top hit.
|
|
1506
|
+
- **`LauncherSearchEngine` searches what it is given.** It has no React, DOM or network; build the
|
|
1507
|
+
index with `createIndex` once per data change, not per keystroke.
|
|
1444
1508
|
- **`LauncherTrigger` does not bind its shortcut**; `shortcut={null}` removes the hint and
|
|
1445
1509
|
`aria-keyshortcuts`. An explicit `aria-label` hides the visible label from assistive tech, so keep
|
|
1446
1510
|
the visible text inside the label (WCAG 2.5.3). `display="icon"` has no visible text: the label is
|
|
@@ -1467,12 +1531,15 @@ control expecting `onMaximize` to fire.
|
|
|
1467
1531
|
|
|
1468
1532
|
Passing `selected` alone (uncontrolled companion `onChange` omitted) computes the next filter state
|
|
1469
1533
|
on every click and discards it — checkboxes visibly never check, forever, with no error. Separately,
|
|
1470
|
-
`onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect
|
|
1471
|
-
`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
|
|
1472
1536
|
`type === "radio" || section.radio`.
|
|
1473
1537
|
|
|
1474
1538
|
**Apply:** always pass `selected` and `onChange` together, or omit `selected` and let `FilterSidebar`
|
|
1475
|
-
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` —
|
|
1476
1543
|
none of them do anything.
|
|
1477
1544
|
|
|
1478
1545
|
### `Breadcrumbs`' `isLastChild` prop is accepted but never read
|
|
@@ -1562,7 +1629,8 @@ hidden and arrow keys stop at the edge of the visible range, so the grid looks s
|
|
|
1562
1629
|
`start` / `end` are read as local calendar dates (`end` inclusive): a UTC-midnight `Date` shows the
|
|
1563
1630
|
previous day in a negative-offset zone, so build date-only values with `new Date(y, m, d)`.
|
|
1564
1631
|
`renderDayCell` replaces each cell's chips wholesale: a 3-day event is passed to it for all 3 days
|
|
1565
|
-
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.
|
|
1566
1634
|
|
|
1567
1635
|
### `AudioRecorder` needs a secure context, and `onRecorded` is not called after unmount
|
|
1568
1636
|
|
|
@@ -1580,6 +1648,17 @@ carries the previous image's zoom/rotation into the new one.
|
|
|
1580
1648
|
**Apply:** keep the real extension on `fileName`, or pass `fileType` explicitly to skip inference.
|
|
1581
1649
|
Remount via `key={fileUrl}` when swapping the file in place instead of just changing the prop.
|
|
1582
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
|
+
|
|
1583
1662
|
### `StageProgress`'s `tooltipThreshold`/`minStageWidth` no-op under `variant="stepper"`, and a stale `value` blanks the tracker
|
|
1584
1663
|
|
|
1585
1664
|
Both props stop having any effect the moment a tracker switches to the stepper variant. Separately,
|
|
@@ -1592,6 +1671,16 @@ matches either, even when the "same" stage is clearly intended.
|
|
|
1592
1671
|
current `stages` list whenever it's filtered, and keep `id`/`value` the same primitive type at every
|
|
1593
1672
|
call site.
|
|
1594
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
|
+
|
|
1595
1684
|
### `Table`'s `isVisiblity`, `tableSettings`, `handleExportChange`/`exportOptions`/`exportLabel`, and `onColumnFilter` are dead props — now `@deprecated`
|
|
1596
1685
|
|
|
1597
1686
|
Grepped account-frontend, tickets, crm-frontend, hrms and social-frontend: zero consumers set any of
|
|
@@ -1879,7 +1968,8 @@ A wide node header is also **clipped, not ellipsized** — the header's ellipsis
|
|
|
1879
1968
|
text. Column widths come from the rendered DOM, never from label length, so sizing is unaffected.
|
|
1880
1969
|
|
|
1881
1970
|
**Apply:** set `labelText` on every node label; put an `isTruncated` `Text` inside the node if it
|
|
1882
|
-
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).
|
|
1883
1973
|
|
|
1884
1974
|
### `FormField`, `IconButton`, `SkipLink`: what their props do not hint at
|
|
1885
1975
|
|
|
@@ -1902,9 +1992,11 @@ can outgrow the column.
|
|
|
1902
1992
|
- `formatDate` reads a bare `YYYY-MM-DD` as that calendar day, not UTC midnight. Pass a `Date` only when you mean
|
|
1903
1993
|
an instant. Epoch *seconds* are not detected: multiply by 1000 first.
|
|
1904
1994
|
- `TimePicker` fires `onChange` with a `Date` on the day of `value` (else `baseDate`, else today). It never clears
|
|
1905
|
-
to `null
|
|
1995
|
+
to `null` on its own: pass `onClear` to make "--" pickable once a time is set (it then fires instead of `onChange`).
|
|
1906
1996
|
- For free-text chips that are not email addresses use `TagInput`: same look as `MultiSelect`, any text, with
|
|
1907
|
-
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>`).
|
|
1908
2000
|
- **Button press scale matches a real `:active` only.** A `MenuButton as={Button}` held open by Chakra's
|
|
1909
2001
|
`data-active` keeps the darker pressed fill but does not stay at 0.98. A consumer `_active={{ transform }}`
|
|
1910
2002
|
loses to the press rule while the pointer is down; use `variant="unstyled"` or an `sx` `&:active` with
|