pixelize-design-library 2.4.2-beta.5 → 2.4.2-beta.51
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 +300 -0
- package/COMPONENT-GOTCHAS.md +1460 -0
- package/DESIGN-GUIDE.md +214 -0
- package/README.md +77 -26
- package/dist/Components/Accordion/Accordion.d.ts +1 -0
- package/dist/Components/Accordion/Accordion.js +8 -7
- package/dist/Components/Accordion/AccordionProps.d.ts +2 -0
- package/dist/Components/Accordion/accordionColors.d.ts +6 -0
- package/dist/Components/Accordion/accordionColors.js +11 -11
- package/dist/Components/AlertDialog/AlertDialog.d.ts +2 -1
- package/dist/Components/AlertDialog/AlertDialog.js +6 -5
- package/dist/Components/AlertDialog/AlertDialogProps.d.ts +27 -2
- package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChart.js +7 -2
- package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChartProps.d.ts +4 -0
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.js +8 -4
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChartProps.d.ts +6 -0
- package/dist/Components/Apexcharts/ApexChartFallback.d.ts +7 -0
- package/dist/Components/Apexcharts/ApexChartFallback.js +10 -0
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +7 -2
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChartProps.d.ts +8 -0
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +7 -2
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChartProps.d.ts +6 -0
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.js +9 -5
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarChartsProps.d.ts +3 -0
- package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChart.d.ts +1 -0
- package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChart.js +7 -4
- package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChartProps.d.ts +3 -0
- package/dist/Components/Apexcharts/LazyReactApexChart.d.ts +2 -0
- package/dist/Components/Apexcharts/LazyReactApexChart.js +40 -0
- package/dist/Components/AppSwitcher/AppMark.d.ts +14 -0
- package/dist/Components/AppSwitcher/AppMark.js +58 -0
- package/dist/Components/AppSwitcher/AppSwitcher.d.ts +4 -0
- package/dist/Components/AppSwitcher/AppSwitcher.js +273 -0
- package/dist/Components/AppSwitcher/AppSwitcherProps.d.ts +70 -0
- package/dist/Components/AppSwitcher/AppSwitcherProps.js +86 -0
- package/dist/Components/AppSwitcher/useAppSwitcherShortcut.d.ts +3 -0
- package/dist/Components/AppSwitcher/useAppSwitcherShortcut.js +31 -0
- package/dist/Components/AppearanceSettings/AppearanceSettings.js +2 -1
- package/dist/Components/AppearanceSettings/AppearanceSettingsProps.d.ts +2 -0
- package/dist/Components/Avatar/Avatar.d.ts +3 -0
- package/dist/Components/Avatar/Avatar.js +24 -0
- package/dist/Components/Avatar/AvatarGroup.d.ts +3 -0
- package/dist/Components/Avatar/AvatarGroup.js +24 -0
- package/dist/Components/Avatar/AvatarGroupProps.d.ts +19 -0
- package/dist/Components/Avatar/AvatarProps.d.ts +22 -0
- package/dist/Components/Avatar/AvatarProps.js +2 -0
- package/dist/Components/Avatar/avatarColorway.d.ts +11 -0
- package/dist/Components/Avatar/avatarColorway.js +31 -0
- package/dist/Components/Avatar/avatarSizing.d.ts +5 -0
- package/dist/Components/Avatar/avatarSizing.js +15 -0
- package/dist/Components/Backdrop/Backdrop.d.ts +3 -0
- package/dist/Components/Backdrop/Backdrop.js +34 -0
- package/dist/Components/Backdrop/BackdropProps.d.ts +33 -0
- package/dist/Components/Backdrop/BackdropProps.js +2 -0
- package/dist/Components/Breadcrumbs/Breadcrumbs.js +14 -4
- package/dist/Components/Breadcrumbs/BreadcrumbsProps.d.ts +3 -0
- package/dist/Components/Breadcrumbs/breadcrumbInk.d.ts +9 -0
- package/dist/Components/Breadcrumbs/breadcrumbInk.js +11 -0
- package/dist/Components/Button/Button.d.ts +2 -2
- package/dist/Components/Button/Button.js +4 -3
- package/dist/Components/Button/Button.styles.js +47 -74
- package/dist/Components/Button/ButtonProps.d.ts +15 -1
- package/dist/Components/ButtonGroupIcon/ButtonGoupIconProps.d.ts +2 -35
- package/dist/Components/ButtonGroupIcon/ButtonGoupIconProps.js +16 -0
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.d.ts +1 -1
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +5 -14
- package/dist/Components/ButtonGroupIcon/ButtonGroupIconProps.d.ts +42 -0
- package/dist/Components/ButtonGroupIcon/ButtonGroupIconProps.js +2 -0
- package/dist/Components/Buttons/Buttons.d.ts +1 -1
- package/dist/Components/Buttons/Buttons.js +5 -3
- package/dist/Components/Buttons/ButtonsProps.d.ts +6 -0
- package/dist/Components/Card/Card.d.ts +18 -2
- package/dist/Components/Card/Card.js +10 -5
- package/dist/Components/Card/CardProps.d.ts +27 -7
- package/dist/Components/Card/PaymentCard/PaymentCard.js +31 -18
- package/dist/Components/Card/PaymentCard/PaymentCardProps.d.ts +6 -0
- package/dist/Components/Checkbox/Checkbox.d.ts +2 -1
- package/dist/Components/Checkbox/Checkbox.js +11 -8
- package/dist/Components/Checkbox/Checkbox.styles.js +44 -34
- package/dist/Components/Checkbox/CheckboxProps.d.ts +13 -0
- package/dist/Components/Common/ErrorComponent.d.ts +2 -0
- package/dist/Components/Common/ErrorComponent.js +7 -5
- package/dist/Components/Common/ErrorMessage.d.ts +1 -1
- package/dist/Components/Common/ErrorMessage.js +3 -3
- package/dist/Components/Common/FieldMessage.d.ts +9 -0
- package/dist/Components/Common/FieldMessage.js +19 -0
- package/dist/Components/Common/FormLabel.d.ts +13 -0
- package/dist/Components/Common/FormLabel.js +16 -9
- package/dist/Components/Common/FormattedDescription.d.ts +2 -0
- package/dist/Components/Common/FormattedDescription.js +1 -0
- package/dist/Components/Common/HelperText.d.ts +2 -0
- package/dist/Components/Common/HelperText.js +4 -1
- package/dist/Components/Common/Label.d.ts +1 -0
- package/dist/Components/Common/Label.js +3 -1
- package/dist/Components/Common/chipTriggerSize.d.ts +10 -0
- package/dist/Components/Common/chipTriggerSize.js +15 -0
- package/dist/Components/Common/fieldMessageStyles.d.ts +19 -0
- package/dist/Components/Common/fieldMessageStyles.js +18 -0
- package/dist/Components/Common/fieldStyles.d.ts +46 -9
- package/dist/Components/Common/fieldStyles.js +72 -30
- package/dist/Components/Common/iconBox.d.ts +3 -0
- package/dist/Components/Common/iconBox.js +16 -0
- package/dist/Components/Common/useFieldIds.d.ts +16 -0
- package/dist/Components/Common/useFieldIds.js +27 -0
- package/dist/Components/ConfirmDialog/ConfirmDialog.d.ts +4 -0
- package/dist/Components/ConfirmDialog/ConfirmDialog.js +23 -0
- package/dist/Components/ConfirmDialog/ConfirmDialogProps.d.ts +45 -0
- package/dist/Components/ConfirmDialog/ConfirmDialogProps.js +2 -0
- package/dist/Components/ContactForm/ContactForm.d.ts +2 -1
- package/dist/Components/ContactForm/ContactForm.js +19 -14
- package/dist/Components/ContactForm/ContactFormProps.d.ts +18 -0
- package/dist/Components/CopyButton/CopyButton.d.ts +3 -1
- package/dist/Components/CopyButton/CopyButton.js +11 -6
- package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +8 -0
- package/dist/Components/CustomModulesTable/DeleteModuleModal.js +2 -2
- package/dist/Components/CustomModulesTable/EditModuleModal.js +2 -4
- package/dist/Components/DatePicker/CalendarPanel.d.ts +6 -0
- package/dist/Components/DatePicker/CalendarPanel.js +42 -24
- package/dist/Components/DatePicker/DatePicker.d.ts +5 -2
- package/dist/Components/DatePicker/DatePicker.js +12 -49
- package/dist/Components/DatePicker/DatePickerProps.d.ts +76 -2
- package/dist/Components/DatePicker/DatePickerProps.js +3 -0
- package/dist/Components/DatePicker/RangeDatePicker.d.ts +1 -0
- package/dist/Components/DatePicker/RangeDatePicker.js +41 -20
- package/dist/Components/DatePicker/SingleDatePicker.d.ts +5 -2
- package/dist/Components/DatePicker/SingleDatePicker.js +82 -64
- package/dist/Components/DatePicker/ThemeDatePicker.d.ts +4 -2
- package/dist/Components/DatePicker/ThemeDatePicker.js +12 -17
- package/dist/Components/DatePicker/TimeOnlyPicker.d.ts +5 -2
- package/dist/Components/DatePicker/TimeOnlyPicker.js +44 -21
- package/dist/Components/DatePicker/TimePicker.d.ts +1 -0
- package/dist/Components/DatePicker/TimePicker.js +9 -12
- package/dist/Components/DatePicker/TimePickerInput.d.ts +6 -1
- package/dist/Components/DatePicker/TimePickerInput.js +5 -10
- package/dist/Components/DatePicker/dayStates.d.ts +33 -0
- package/dist/Components/DatePicker/dayStates.js +75 -0
- package/dist/Components/DatePicker/pickerField.d.ts +24 -0
- package/dist/Components/DatePicker/pickerField.js +31 -0
- package/dist/Components/DatePicker/valueFormat.d.ts +4 -0
- package/dist/Components/DatePicker/valueFormat.js +21 -0
- package/dist/Components/DescriptionList/DescriptionList.d.ts +4 -0
- package/dist/Components/DescriptionList/DescriptionList.js +32 -0
- package/dist/Components/DescriptionList/DescriptionListProps.d.ts +29 -0
- package/dist/Components/DescriptionList/DescriptionListProps.js +2 -0
- package/dist/Components/Divider/Divider.d.ts +1 -0
- package/dist/Components/Divider/Divider.js +1 -0
- package/dist/Components/Drawer/Drawer.d.ts +5 -11
- package/dist/Components/Drawer/Drawer.js +22 -8
- package/dist/Components/Drawer/DrawerProps.d.ts +16 -2
- package/dist/Components/Dropdown/DropDown.d.ts +1 -0
- package/dist/Components/Dropdown/DropDown.js +64 -36
- package/dist/Components/Dropdown/DropdownProps.d.ts +17 -1
- package/dist/Components/Editor/Editor.d.ts +1 -0
- package/dist/Components/Editor/Editor.js +13 -0
- package/dist/Components/Editor/EditorProps.d.ts +2 -0
- package/dist/Components/Editor/joditAccessibility.d.ts +1 -0
- package/dist/Components/Editor/joditAccessibility.js +28 -0
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -0
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +3 -8
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +4 -0
- package/dist/Components/EmptyState/EmptyState.d.ts +1 -0
- package/dist/Components/EmptyState/EmptyState.js +25 -14
- package/dist/Components/EmptyState/EmptyStateProps.d.ts +8 -1
- package/dist/Components/FeedbackForm/FeedbackForm.d.ts +3 -0
- package/dist/Components/FeedbackForm/FeedbackForm.js +19 -5
- package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +3 -2
- package/dist/Components/FieldSelectModal/FieldSelectModal.js +3 -4
- package/dist/Components/FilePreview/FilePreview.d.ts +1 -0
- package/dist/Components/FilePreview/FilePreview.js +11 -9
- package/dist/Components/FilePreview/FilePreviewProps.d.ts +5 -2
- package/dist/Components/FileUpload/FileUpload.d.ts +1 -0
- package/dist/Components/FileUpload/FileUpload.js +27 -6
- package/dist/Components/FileUpload/FileUploadProps.d.ts +29 -1
- package/dist/Components/FileUpload/constants.d.ts +1 -0
- package/dist/Components/FileUpload/constants.js +3 -1
- package/dist/Components/FileUploader/FileUploader.d.ts +1 -0
- package/dist/Components/FileUploader/FileUploader.js +7 -5
- package/dist/Components/FileUploader/FileUploaderProps.d.ts +2 -0
- package/dist/Components/FilterBar/FilterBar.d.ts +4 -0
- package/dist/Components/FilterBar/FilterBar.js +17 -0
- package/dist/Components/FilterBar/FilterBarProps.d.ts +25 -0
- package/dist/Components/FilterBar/FilterBarProps.js +2 -0
- package/dist/Components/FilterSidebar/FilterSidebar.d.ts +3 -0
- package/dist/Components/FilterSidebar/FilterSidebar.js +28 -33
- package/dist/Components/FilterSidebar/filterHoverStyle.d.ts +2 -10
- package/dist/Components/FilterSidebar/filterHoverStyle.js +3 -10
- package/dist/Components/Form/FormWrapper.d.ts +3 -0
- package/dist/Components/Form/FormWrapper.js +2 -1
- package/dist/Components/Header/Header.d.ts +0 -15
- package/dist/Components/Header/Header.js +2 -16
- package/dist/Components/Header/HeaderActions.d.ts +4 -0
- package/dist/Components/Header/HeaderActions.js +4 -4
- package/dist/Components/Header/HeaderProps.d.ts +19 -1
- package/dist/Components/Header/components/desktopMenu.d.ts +1 -1
- package/dist/Components/Header/components/desktopMenu.js +10 -11
- package/dist/Components/Header/components/mobileMenu.d.ts +1 -1
- package/dist/Components/Header/components/mobileMenu.js +26 -14
- package/dist/Components/Input/Input/Input.d.ts +1 -1
- package/dist/Components/Input/Input/Input.js +3 -2
- package/dist/Components/Input/Input/InputProps.d.ts +5 -0
- package/dist/Components/Input/PhoneNumberInput.d.ts +2 -1
- package/dist/Components/Input/PhoneNumberInput.js +7 -3
- package/dist/Components/Input/PhoneNumberInputProps.d.ts +6 -1
- package/dist/Components/Input/Switch/InputSwitch.d.ts +16 -3
- package/dist/Components/Input/Switch/InputSwitch.js +17 -18
- package/dist/Components/Input/TextInput.js +80 -6
- package/dist/Components/Input/TextInput.styles.d.ts +18 -1
- package/dist/Components/Input/TextInput.styles.js +47 -90
- package/dist/Components/Input/TextInputProps.d.ts +44 -7
- package/dist/Components/Input/textInputIconSize.d.ts +2 -7
- package/dist/Components/Input/textInputIconSize.js +6 -32
- package/dist/Components/Input/useAriaRequired.d.ts +2 -0
- package/dist/Components/Input/useAriaRequired.js +19 -0
- package/dist/Components/InputTextArea/InputTextArea.d.ts +2 -1
- package/dist/Components/InputTextArea/InputTextArea.js +9 -4
- package/dist/Components/InputTextArea/InputTextArea.style.js +13 -67
- package/dist/Components/InputTextArea/InputTextAreaProps.d.ts +9 -1
- package/dist/Components/KanbanBoard/AccountCard.d.ts +3 -0
- package/dist/Components/KanbanBoard/AccountCard.js +9 -5
- package/dist/Components/KanbanBoard/AccountRow.d.ts +1 -0
- package/dist/Components/KanbanBoard/AccountRow.js +1 -0
- package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.d.ts +2 -0
- package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
- package/dist/Components/KanbanBoard/KanbanBoard.d.ts +2 -1
- package/dist/Components/KanbanBoard/KanbanBoard.js +86 -49
- package/dist/Components/KanbanBoard/KanbanBoardProps.d.ts +71 -28
- package/dist/Components/KanbanBoard/MeasuredItem.d.ts +1 -0
- package/dist/Components/KanbanBoard/MeasuredItem.js +1 -0
- package/dist/Components/KanbanBoard/index.d.ts +2 -0
- package/dist/Components/KanbanBoard/index.js +8 -0
- package/dist/Components/LazyWrapper/LazyWrapper.d.ts +3 -2
- package/dist/Components/LazyWrapper/LazyWrapper.js +1 -0
- package/dist/Components/LimitReachedModal/LimitReachedModal.js +1 -1
- package/dist/Components/LimitReachedModal/LimitReachedModalProps.d.ts +4 -1
- package/dist/Components/LimitReachedModal/limitReachedCopy.d.ts +2 -0
- package/dist/Components/LimitReachedModal/limitReachedCopy.js +3 -3
- package/dist/Components/Loading/Loading.d.ts +2 -1
- package/dist/Components/Loading/Loading.js +17 -15
- package/dist/Components/Loading/LoadingProps.d.ts +7 -1
- package/dist/Components/MediaViewer/MediaViewer.d.ts +5 -0
- package/dist/Components/MediaViewer/MediaViewer.js +234 -0
- package/dist/Components/MediaViewer/MediaViewerProps.d.ts +92 -0
- package/dist/Components/MediaViewer/MediaViewerProps.js +32 -0
- package/dist/Components/MediaViewer/components/MediaAudioPlayer.d.ts +4 -0
- package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +138 -0
- package/dist/Components/MediaViewer/components/MediaAudioPlayerProps.d.ts +48 -0
- package/dist/Components/MediaViewer/components/MediaAudioPlayerProps.js +21 -0
- package/dist/Components/MediaViewer/components/MediaDocumentStage.d.ts +4 -0
- package/dist/Components/MediaViewer/components/MediaDocumentStage.js +149 -0
- package/dist/Components/MediaViewer/components/MediaDocumentStageProps.d.ts +42 -0
- package/dist/Components/MediaViewer/components/MediaDocumentStageProps.js +11 -0
- package/dist/Components/MediaViewer/components/MediaImageViewer.d.ts +4 -0
- package/dist/Components/MediaViewer/components/MediaImageViewer.js +103 -0
- package/dist/Components/MediaViewer/components/MediaImageViewerProps.d.ts +47 -0
- package/dist/Components/MediaViewer/components/MediaImageViewerProps.js +18 -0
- package/dist/Components/MediaViewer/components/MediaScrubber.d.ts +5 -0
- package/dist/Components/MediaViewer/components/MediaScrubber.js +89 -0
- package/dist/Components/MediaViewer/components/MediaScrubberProps.d.ts +30 -0
- package/dist/Components/MediaViewer/components/MediaScrubberProps.js +2 -0
- package/dist/Components/MediaViewer/components/MediaStatusPanel.d.ts +5 -0
- package/dist/Components/MediaViewer/components/MediaStatusPanel.js +14 -0
- package/dist/Components/MediaViewer/components/MediaStatusPanelProps.d.ts +24 -0
- package/dist/Components/MediaViewer/components/MediaStatusPanelProps.js +2 -0
- package/dist/Components/MediaViewer/components/MediaVideoPlayer.d.ts +4 -0
- package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +248 -0
- package/dist/Components/MediaViewer/components/MediaVideoPlayerProps.d.ts +71 -0
- package/dist/Components/MediaViewer/components/MediaVideoPlayerProps.js +31 -0
- package/dist/Components/MediaViewer/components/TileChip.d.ts +5 -0
- package/dist/Components/MediaViewer/components/TileChip.js +12 -0
- package/dist/Components/MediaViewer/components/TileChipProps.d.ts +7 -0
- package/dist/Components/MediaViewer/components/TileChipProps.js +2 -0
- package/dist/Components/MediaViewer/components/VideoPoster.d.ts +5 -0
- package/dist/Components/MediaViewer/components/VideoPoster.js +16 -0
- package/dist/Components/MediaViewer/components/VideoPosterProps.d.ts +6 -0
- package/dist/Components/MediaViewer/components/VideoPosterProps.js +2 -0
- package/dist/Components/MediaViewer/components/ViewerIconButton.d.ts +5 -0
- package/dist/Components/MediaViewer/components/ViewerIconButton.js +20 -0
- package/dist/Components/MediaViewer/components/ViewerIconButtonProps.d.ts +24 -0
- package/dist/Components/MediaViewer/components/ViewerIconButtonProps.js +2 -0
- package/dist/Components/MediaViewer/components/mediaKindIcon.d.ts +5 -0
- package/dist/Components/MediaViewer/components/mediaKindIcon.js +23 -0
- package/dist/Components/MediaViewer/components/sanitizeDocxHrefs.d.ts +1 -0
- package/dist/Components/MediaViewer/components/sanitizeDocxHrefs.js +30 -0
- package/dist/Components/MediaViewer/hooks/useAutoHideChrome.d.ts +15 -0
- package/dist/Components/MediaViewer/hooks/useAutoHideChrome.js +43 -0
- package/dist/Components/MediaViewer/hooks/useFileViewer.d.ts +18 -0
- package/dist/Components/MediaViewer/hooks/useFileViewer.js +51 -0
- package/dist/Components/MediaViewer/mediaItems.d.ts +64 -0
- package/dist/Components/MediaViewer/mediaItems.js +196 -0
- package/dist/Components/MediaViewer/useViewerChrome.d.ts +15 -0
- package/dist/Components/MediaViewer/useViewerChrome.js +30 -0
- package/dist/Components/Modal/Modal.d.ts +5 -11
- package/dist/Components/Modal/Modal.js +24 -18
- package/dist/Components/Modal/ModalProps.d.ts +19 -2
- package/dist/Components/MoreItems/MoreItems.d.ts +1 -0
- package/dist/Components/MoreItems/MoreItems.js +7 -2
- package/dist/Components/MoreItems/MoreItemsProps.d.ts +4 -2
- package/dist/Components/MultiSelect/MultiSelect.d.ts +1 -1
- package/dist/Components/MultiSelect/MultiSelect.js +40 -28
- package/dist/Components/MultiSelect/MultiSelectProps.d.ts +15 -3
- package/dist/Components/NavigationBar/NavigationBar.js +17 -16
- package/dist/Components/NavigationBar/NavigationBarProps.d.ts +3 -0
- package/dist/Components/NoteTextArea/NoteTextArea.d.ts +4 -1
- package/dist/Components/NoteTextArea/NoteTextArea.js +19 -9
- package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +6 -2
- package/dist/Components/Notification/Notification.d.ts +1 -0
- package/dist/Components/Notification/Notification.js +10 -2
- package/dist/Components/Notification/NotificationProps.d.ts +6 -0
- package/dist/Components/NotificationBell/NotificationBell.d.ts +4 -0
- package/dist/Components/NotificationBell/NotificationBell.js +35 -0
- package/dist/Components/NotificationBell/NotificationBellProps.d.ts +147 -0
- package/dist/Components/NotificationBell/NotificationBellProps.js +2 -0
- package/dist/Components/NotificationBell/NotificationItem.d.ts +4 -0
- package/dist/Components/NotificationBell/NotificationItem.js +34 -0
- package/dist/Components/NotificationBell/NotificationList.d.ts +4 -0
- package/dist/Components/NotificationBell/NotificationList.js +41 -0
- package/dist/Components/NotificationBell/NotificationPanel.d.ts +4 -0
- package/dist/Components/NotificationBell/NotificationPanel.js +36 -0
- package/dist/Components/NotificationBell/index.d.ts +6 -0
- package/dist/Components/NotificationBell/index.js +30 -0
- package/dist/Components/NotificationBell/notificationHelpers.d.ts +32 -0
- package/dist/Components/NotificationBell/notificationHelpers.js +115 -0
- package/dist/Components/NumberInput/NumberInput.d.ts +6 -1
- package/dist/Components/NumberInput/NumberInput.js +9 -2
- package/dist/Components/NumberInput/NumberInput.styles.js +19 -77
- package/dist/Components/NumberInput/NumberInputProps.d.ts +23 -1
- package/dist/Components/OrgSwitcher/OrgSwitcher.js +18 -22
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +7 -2
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.js +3 -1
- package/dist/Components/OrganizationDetails/CreateOrgModal.js +1 -1
- package/dist/Components/OrganizationDetails/DeleteOrgModal.js +4 -6
- package/dist/Components/OrganizationDetails/OrganizationDetails.d.ts +1 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.js +12 -9
- package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +17 -4
- package/dist/Components/PageHeader/PageHeader.d.ts +4 -0
- package/dist/Components/PageHeader/PageHeader.js +11 -0
- package/dist/Components/PageHeader/PageHeaderProps.d.ts +20 -0
- package/dist/Components/PageHeader/PageHeaderProps.js +2 -0
- package/dist/Components/PdfViewer/PdfViewer.d.ts +2 -1
- package/dist/Components/PdfViewer/PdfViewer.js +7 -1
- package/dist/Components/PersonChip/PersonChip.d.ts +3 -0
- package/dist/Components/PersonChip/PersonChip.js +47 -0
- package/dist/Components/PersonChip/PersonChipProps.d.ts +33 -0
- package/dist/Components/PersonChip/PersonChipProps.js +2 -0
- package/dist/Components/PinInput/PinInput.d.ts +2 -1
- package/dist/Components/PinInput/PinInput.js +11 -9
- package/dist/Components/PinInput/PinInputProps.d.ts +3 -0
- package/dist/Components/PinInput/pinInputCellSize.d.ts +7 -0
- package/dist/Components/PinInput/pinInputCellSize.js +10 -0
- package/dist/Components/PlanBadge/PlanBadge.d.ts +0 -7
- package/dist/Components/PlanBadge/PlanBadge.js +1 -7
- package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +2 -0
- package/dist/Components/PlanPill/PlanPill.js +2 -3
- package/dist/Components/PlanPill/PlanPillProps.d.ts +2 -0
- package/dist/Components/PlanPill/planPillGradient.d.ts +5 -21
- package/dist/Components/PlanPill/planPillGradient.js +8 -23
- package/dist/Components/Primitives/Primitives.d.ts +3 -0
- package/dist/Components/Primitives/Primitives.js +75 -0
- package/dist/Components/ProductCard/ProductCardProps.d.ts +10 -0
- package/dist/Components/ProductCard/ProductPrice.js +18 -7
- package/dist/Components/ProductCard/ProductReview.d.ts +1 -0
- package/dist/Components/ProductCard/ProductReview.js +8 -2
- package/dist/Components/ProductCard/ProductTags.js +1 -1
- package/dist/Components/ProductDetails/ProductDetails.js +1 -1
- package/dist/Components/ProductDetails/ProductDetailsProps.d.ts +7 -0
- package/dist/Components/ProductDetails/ProductDtlPrice.js +5 -5
- package/dist/Components/ProductDetails/ProductImageSlider.d.ts +3 -1
- package/dist/Components/ProductDetails/ProductImageSlider.js +36 -20
- package/dist/Components/ProfileCard/ProfileCard.d.ts +4 -10
- package/dist/Components/ProfileCard/ProfileCard.js +26 -11
- package/dist/Components/ProfileCard/ProfileCardProps.d.ts +10 -1
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +1 -0
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +11 -6
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewerProps.d.ts +9 -1
- package/dist/Components/ProgressBar/ProgressBar.d.ts +2 -1
- package/dist/Components/ProgressBar/ProgressBar.js +28 -3
- package/dist/Components/ProgressBar/ProgressBarProps.d.ts +10 -2
- package/dist/Components/QueryState/ErrorState.d.ts +4 -0
- package/dist/Components/QueryState/ErrorState.js +16 -0
- package/dist/Components/QueryState/QueryStateBoundary.d.ts +4 -0
- package/dist/Components/QueryState/QueryStateBoundary.js +25 -0
- package/dist/Components/QueryState/QueryStateProps.d.ts +48 -0
- package/dist/Components/QueryState/QueryStateProps.js +2 -0
- package/dist/Components/RadioButton/RadioButton.d.ts +2 -2
- package/dist/Components/RadioButton/RadioButton.js +34 -13
- package/dist/Components/RadioButton/RadioButtonProps.d.ts +50 -4
- package/dist/Components/RangeSlider/RangeSlider.d.ts +4 -0
- package/dist/Components/RangeSlider/RangeSlider.js +136 -0
- package/dist/Components/RangeSlider/RangeSliderProps.d.ts +74 -0
- package/dist/Components/RangeSlider/RangeSliderProps.js +2 -0
- package/dist/Components/RangeSlider/rangeSliderColors.d.ts +9 -0
- package/dist/Components/RangeSlider/rangeSliderColors.js +11 -0
- package/dist/Components/RangeSlider/rangeSliderMath.d.ts +16 -0
- package/dist/Components/RangeSlider/rangeSliderMath.js +79 -0
- package/dist/Components/RangeSlider/rangeSliderSize.d.ts +7 -0
- package/dist/Components/RangeSlider/rangeSliderSize.js +12 -0
- package/dist/Components/Reorder/Reorder.d.ts +2 -5
- package/dist/Components/Reorder/Reorder.js +3 -2
- package/dist/Components/Reorder/ReorderProps.d.ts +6 -0
- package/dist/Components/RolesPermission/DeleteRoleModal.js +4 -6
- package/dist/Components/RolesPermission/RolesPermission.d.ts +1 -0
- package/dist/Components/RolesPermission/RolesPermission.js +6 -4
- package/dist/Components/RolesPermission/RolesPermissionProps.d.ts +16 -1
- package/dist/Components/SaveBar/SaveBar.d.ts +4 -0
- package/dist/Components/SaveBar/SaveBar.js +24 -0
- package/dist/Components/SaveBar/SaveBarProps.d.ts +22 -0
- package/dist/Components/SaveBar/SaveBarProps.js +2 -0
- package/dist/Components/ScrollToTop/ScrollToTop.d.ts +3 -2
- package/dist/Components/ScrollToTop/ScrollToTop.js +8 -2
- package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +7 -0
- package/dist/Components/ScrollbarBox/ScrollbarBox.js +1 -0
- package/dist/Components/Search/Search.d.ts +3 -1
- package/dist/Components/Search/Search.js +33 -14
- package/dist/Components/Search/SearchProps.d.ts +26 -2
- package/dist/Components/SearchSelect/SearchSelect.d.ts +3 -1
- package/dist/Components/SearchSelect/SearchSelect.js +156 -113
- package/dist/Components/SearchSelect/SearchSelectProps.d.ts +51 -0
- package/dist/Components/SearchSelect/searchSelectSize.d.ts +4 -19
- package/dist/Components/SearchSelect/searchSelectSize.js +15 -27
- package/dist/Components/SegmentedControl/SegmentedControl.d.ts +3 -0
- package/dist/Components/SegmentedControl/SegmentedControl.js +113 -0
- package/dist/Components/SegmentedControl/SegmentedControlProps.d.ts +33 -0
- package/dist/Components/SegmentedControl/SegmentedControlProps.js +2 -0
- package/dist/Components/SegmentedControl/segmentedInk.d.ts +11 -0
- package/dist/Components/SegmentedControl/segmentedInk.js +27 -0
- package/dist/Components/SegmentedControl/useSlidingPill.d.ts +11 -0
- package/dist/Components/SegmentedControl/useSlidingPill.js +25 -0
- package/dist/Components/Select/Select.d.ts +5 -2
- package/dist/Components/Select/Select.js +65 -22
- package/dist/Components/Select/Select.styles.js +14 -82
- package/dist/Components/Select/SelectNative.d.ts +65 -0
- package/dist/Components/Select/SelectNative.js +49 -0
- package/dist/Components/Select/SelectPopup.d.ts +5 -0
- package/dist/Components/Select/SelectPopup.js +485 -0
- package/dist/Components/Select/SelectProps.d.ts +126 -10
- package/dist/Components/Select/optionRowInk.d.ts +7 -0
- package/dist/Components/Select/optionRowInk.js +17 -0
- package/dist/Components/SelectSearch/SelectSearch.d.ts +2 -1
- package/dist/Components/SelectSearch/SelectSearch.js +51 -87
- package/dist/Components/SelectSearch/SelectSearchProps.d.ts +34 -0
- package/dist/Components/SelectV2/SelectV2.d.ts +8 -2
- package/dist/Components/SelectV2/SelectV2.js +10 -250
- package/dist/Components/SelectV2/SelectV2Props.d.ts +44 -13
- package/dist/Components/SettingRow/SettingRow.d.ts +4 -0
- package/dist/Components/SettingRow/SettingRow.js +24 -0
- package/dist/Components/SettingRow/SettingRowProps.d.ts +16 -0
- package/dist/Components/SettingRow/SettingRowProps.js +2 -0
- package/dist/Components/SettingRow/SettingsSection.d.ts +4 -0
- package/dist/Components/SettingRow/SettingsSection.js +16 -0
- package/dist/Components/SettingRow/SettingsSectionProps.d.ts +18 -0
- package/dist/Components/SettingRow/SettingsSectionProps.js +2 -0
- package/dist/Components/SideBar/SecondaryBar.js +21 -10
- package/dist/Components/SideBar/SideBar.js +42 -24
- package/dist/Components/SideBar/SideBarProps.d.ts +47 -24
- package/dist/Components/SideBar/components/MenuItemBox.d.ts +2 -0
- package/dist/Components/SideBar/components/MenuItemBox.js +52 -32
- package/dist/Components/SideBar/components/MenuItems.js +4 -4
- package/dist/Components/SideBar/components/MenuPopoverContent.js +26 -12
- package/dist/Components/SideBar/components/OtherApps.js +3 -3
- package/dist/Components/SideBar/components/OverflowTooltipText.js +3 -1
- package/dist/Components/SideBar/components/TextTruncation.js +3 -1
- package/dist/Components/SideBar/menuDisabled.d.ts +5 -0
- package/dist/Components/SideBar/menuDisabled.js +7 -0
- package/dist/Components/SideBar/sidebarId.d.ts +2 -0
- package/dist/Components/SideBar/sidebarId.js +6 -0
- package/dist/Components/SideBar/sidebarScale.d.ts +15 -0
- package/dist/Components/SideBar/sidebarScale.js +18 -0
- package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +3 -0
- package/dist/Components/Skeletons/SkeletonProps.d.ts +5 -1
- package/dist/Components/Skeletons/Skeletons.d.ts +2 -1
- package/dist/Components/Skeletons/Skeletons.js +3 -2
- package/dist/Components/Slider/Slider.d.ts +3 -0
- package/dist/Components/Slider/Slider.js +10 -1
- package/dist/Components/Spinner/Spinner.d.ts +3 -0
- package/dist/Components/Spinner/Spinner.js +22 -0
- package/dist/Components/Spinner/SpinnerProps.d.ts +15 -0
- package/dist/Components/Spinner/SpinnerProps.js +2 -0
- package/dist/Components/StageProgress/StageItem.d.ts +1 -0
- package/dist/Components/StageProgress/StageItem.js +13 -4
- package/dist/Components/StageProgress/StageProgress.d.ts +1 -0
- package/dist/Components/StageProgress/StageProgress.js +7 -7
- package/dist/Components/StageProgress/StageProgressProps.d.ts +52 -5
- package/dist/Components/StageProgress/StageProgressProps.js +12 -6
- package/dist/Components/StageProgress/StepperStage.js +7 -4
- package/dist/Components/StatCard/StatCard.d.ts +4 -0
- package/dist/Components/StatCard/StatCard.js +42 -0
- package/dist/Components/StatCard/StatCardProps.d.ts +26 -0
- package/dist/Components/StatCard/StatCardProps.js +2 -0
- package/dist/Components/Switch/Switch.d.ts +2 -1
- package/dist/Components/Switch/Switch.js +13 -8
- package/dist/Components/Switch/SwitchProps.d.ts +7 -0
- package/dist/Components/Table/Table.d.ts +2 -1
- package/dist/Components/Table/Table.js +67 -51
- package/dist/Components/Table/TableProps.d.ts +98 -5
- package/dist/Components/Table/components/HeaderActions.js +3 -2
- package/dist/Components/Table/components/Pagination.d.ts +2 -2
- package/dist/Components/Table/components/Pagination.js +19 -8
- package/dist/Components/Table/components/TableActions.js +2 -2
- package/dist/Components/Table/components/TableBody.d.ts +2 -1
- package/dist/Components/Table/components/TableBody.js +153 -68
- package/dist/Components/Table/components/TableGroupRow.js +1 -1
- package/dist/Components/Table/components/TableHeader.d.ts +1 -1
- package/dist/Components/Table/components/TableHeader.js +34 -20
- package/dist/Components/Table/components/TableSearch.js +1 -1
- package/dist/Components/Table/components/rowMetrics.d.ts +10 -0
- package/dist/Components/Table/components/rowMetrics.js +15 -0
- package/dist/Components/Table/filters/ActiveFilters.js +7 -4
- package/dist/Components/Table/filters/CompactSelect.d.ts +1 -0
- package/dist/Components/Table/filters/CompactSelect.js +32 -8
- package/dist/Components/Table/filters/LeftFilterPane.d.ts +9 -1
- package/dist/Components/Table/filters/LeftFilterPane.js +1 -1
- package/dist/Components/Table/filters/SelectOperationControls.js +9 -1
- package/dist/Components/Table/filters/TableFilters.js +1 -1
- package/dist/Components/Table/filters/TextOperationControls.js +8 -1
- package/dist/Components/Table/hooks/useTable.d.ts +7 -11
- package/dist/Components/Table/hooks/useTable.js +61 -32
- package/dist/Components/Table/settings/ManageColumns.js +14 -10
- package/dist/Components/Table/settings/TableSettings.js +8 -5
- package/dist/Components/Table/variants/TableVariantContext.d.ts +4 -0
- package/dist/Components/Table/variants/TableVariantContext.js +17 -0
- package/dist/Components/Table/variants/classic.d.ts +6 -0
- package/dist/Components/Table/variants/classic.js +49 -0
- package/dist/Components/Table/variants/index.d.ts +7 -0
- package/dist/Components/Table/variants/index.js +27 -0
- package/dist/Components/Table/variants/pillInk.d.ts +6 -0
- package/dist/Components/Table/variants/pillInk.js +21 -0
- package/dist/Components/Table/variants/stripe.d.ts +3 -0
- package/dist/Components/Table/variants/stripe.js +7 -0
- package/dist/Components/Table/variants/studio.d.ts +6 -0
- package/dist/Components/Table/variants/studio.js +52 -0
- package/dist/Components/Table/variants/tokens.d.ts +51 -0
- package/dist/Components/Table/variants/tokens.js +2 -0
- package/dist/Components/Tabs/Tabs.d.ts +3 -0
- package/dist/Components/Tabs/Tabs.js +70 -0
- package/dist/Components/Tabs/TabsContext.d.ts +22 -0
- package/dist/Components/Tabs/TabsContext.js +16 -0
- package/dist/Components/Tabs/TabsProps.d.ts +74 -0
- package/dist/Components/Tabs/TabsProps.js +2 -0
- package/dist/Components/Tabs/components/CountBadge.d.ts +12 -0
- package/dist/Components/Tabs/components/CountBadge.js +17 -0
- package/dist/Components/Tabs/components/Tab.d.ts +3 -0
- package/dist/Components/Tabs/components/Tab.js +50 -0
- package/dist/Components/Tabs/components/TabList.d.ts +3 -0
- package/dist/Components/Tabs/components/TabList.js +71 -0
- package/dist/Components/Tabs/components/TabPanel.d.ts +3 -0
- package/dist/Components/Tabs/components/TabPanel.js +17 -0
- package/dist/Components/Tabs/components/TabPanels.d.ts +3 -0
- package/dist/Components/Tabs/components/TabPanels.js +14 -0
- package/dist/Components/Tabs/index.d.ts +6 -0
- package/dist/Components/Tabs/index.js +16 -0
- package/dist/Components/Tabs/tabStyles.d.ts +15 -0
- package/dist/Components/Tabs/tabStyles.js +38 -0
- package/dist/Components/Tag/Tag.d.ts +1 -0
- package/dist/Components/Tag/Tag.js +15 -6
- package/dist/Components/Tag/Tag.styles.d.ts +2 -0
- package/dist/Components/Tag/Tag.styles.js +48 -36
- package/dist/Components/Tag/TagProps.d.ts +20 -0
- package/dist/Components/Timeline/Timeline.d.ts +2 -1
- package/dist/Components/Timeline/Timeline.js +43 -30
- package/dist/Components/Timeline/TimelineProps.d.ts +31 -0
- package/dist/Components/Toaster/Toaster.d.ts +1 -0
- package/dist/Components/Toaster/Toaster.js +74 -55
- package/dist/Components/Toaster/ToasterProps.d.ts +20 -4
- package/dist/Components/Toaster/toastDuration.d.ts +4 -0
- package/dist/Components/Toaster/toastDuration.js +7 -0
- package/dist/Components/Toggle/TableToggle.d.ts +1 -0
- package/dist/Components/Toggle/TableToggle.js +62 -19
- package/dist/Components/Toggle/TableToggleProps.d.ts +7 -0
- package/dist/Components/ToggleSwitch/ToggleSwitch.d.ts +3 -0
- package/dist/Components/ToggleSwitch/ToggleSwitch.js +53 -0
- package/dist/Components/ToggleSwitch/ToggleSwitchProps.d.ts +68 -0
- package/dist/Components/ToggleSwitch/ToggleSwitchProps.js +2 -0
- package/dist/Components/ToolTip/OverflowToolTip.d.ts +0 -15
- package/dist/Components/ToolTip/OverflowToolTip.js +1 -15
- package/dist/Components/ToolTip/ToolTip.d.ts +1 -0
- package/dist/Components/ToolTip/ToolTip.js +14 -13
- package/dist/Components/ToolTip/ToolTipProps.d.ts +8 -1
- package/dist/Components/UpgradeButton/UpgradeButton.js +9 -14
- package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +6 -2
- package/dist/Components/UserDetails/AddUserModal.js +1 -1
- package/dist/Components/UserDetails/ChangeRoleModal.js +1 -1
- package/dist/Components/UserDetails/DeactivateConfirmModal.js +4 -6
- package/dist/Components/UserDetails/UserDetails.d.ts +1 -0
- package/dist/Components/UserDetails/UserDetails.js +12 -11
- package/dist/Components/UserDetails/UserDetailsProps.d.ts +30 -1
- package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.d.ts +0 -13
- package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +2 -14
- package/dist/Components/WorkspaceWindow/WorkspaceWindow.d.ts +0 -11
- package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +6 -23
- package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +6 -1
- package/dist/Constants/Sidebar.d.ts +2 -38
- package/dist/Constants/Sidebar.js +1 -16
- package/dist/Hooks/exclusiveOverlay.d.ts +4 -0
- package/dist/Hooks/exclusiveOverlay.js +22 -0
- package/dist/Hooks/useDebounce.d.ts +6 -0
- package/dist/Hooks/useDebounce.js +33 -0
- package/dist/Hooks/useExclusiveOverlay.d.ts +1 -0
- package/dist/Hooks/useExclusiveOverlay.js +21 -0
- package/dist/Hooks/useFullscreen.d.ts +8 -0
- package/dist/Hooks/useFullscreen.js +32 -0
- package/dist/Hooks/useIsTruncated.d.ts +0 -30
- package/dist/Hooks/useIsTruncated.js +1 -30
- package/dist/Hooks/usePreferences.js +1 -6
- package/dist/Hooks/useSidebarPrefs.d.ts +1 -42
- package/dist/Hooks/useSidebarPrefs.js +1 -2
- package/dist/Theme/assertPalette.d.ts +1 -1
- package/dist/Theme/assertPalette.js +4 -3
- package/dist/Theme/chakra/Card.styles.d.ts +78 -0
- package/dist/Theme/chakra/Card.styles.js +48 -0
- package/dist/Theme/chakra/Drawer.styles.d.ts +41 -9
- package/dist/Theme/chakra/Drawer.styles.js +14 -13
- package/dist/Theme/chakra/Menu.styles.d.ts +11 -18
- package/dist/Theme/chakra/Menu.styles.js +17 -26
- package/dist/Theme/chakra/Modal.styles.d.ts +42 -9
- package/dist/Theme/chakra/Modal.styles.js +15 -13
- package/dist/Theme/chakra/Popover.styles.d.ts +6 -3
- package/dist/Theme/chakra/Popover.styles.js +6 -10
- package/dist/Theme/chakra/Slider.styles.d.ts +3 -3
- package/dist/Theme/chakra/Slider.styles.js +1 -6
- package/dist/Theme/chakra/common.web.d.ts +0 -4
- package/dist/Theme/chakra/common.web.js +1 -7
- package/dist/Theme/chakra/componentStyles.d.ts +168 -103
- package/dist/Theme/chakra/componentStyles.js +82 -95
- package/dist/Theme/chakra/createBrandTheme.d.ts +0 -10
- package/dist/Theme/chakra/createBrandTheme.js +23 -54
- package/dist/Theme/chakra/focusRing.styles.d.ts +45 -0
- package/dist/Theme/chakra/focusRing.styles.js +42 -0
- package/dist/Theme/chakra/fonts.web.d.ts +0 -5
- package/dist/Theme/chakra/fonts.web.js +1 -5
- package/dist/Theme/chakra/motion.d.ts +5 -0
- package/dist/Theme/chakra/motion.js +27 -0
- package/dist/Theme/chakra/overlay.styles.d.ts +51 -0
- package/dist/Theme/chakra/overlay.styles.js +48 -0
- package/dist/Theme/chakra/paletteFromTheme.d.ts +0 -4
- package/dist/Theme/chakra/paletteFromTheme.js +1 -4
- package/dist/Theme/index.d.ts +0 -12
- package/dist/Theme/index.js +3 -18
- package/dist/Theme/provider/PixelizeThemeProvider.d.ts +0 -32
- package/dist/Theme/provider/PixelizeThemeProvider.js +6 -74
- package/dist/Theme/provider/ThemeSwitcher.js +22 -20
- package/dist/Theme/provider/colorModeStorage.js +1 -4
- package/dist/Theme/tokens/brands/emerald/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/emerald/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/emerald/palette.light.js +2 -10
- package/dist/Theme/tokens/brands/index.js +6 -1
- package/dist/Theme/tokens/brands/lavender/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/lavender/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/lavender/palette.light.js +4 -13
- package/dist/Theme/tokens/brands/meadow/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/meadow/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/meadow/palette.light.js +2 -11
- package/dist/Theme/tokens/brands/radiant/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/radiant/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/radiant/palette.light.js +2 -10
- package/dist/Theme/tokens/brands/rosewood/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/rosewood/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/rosewood/palette.light.js +2 -14
- package/dist/Theme/tokens/brands/skyline/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/skyline/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/skyline/palette.light.js +2 -11
- package/dist/Theme/tokens/brands/slate/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/slate/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/slate/palette.light.js +1 -11
- package/dist/Theme/tokens/brands/storefront/palette.dark.d.ts +0 -4
- package/dist/Theme/tokens/brands/storefront/palette.dark.js +0 -4
- package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts +11 -9
- package/dist/Theme/tokens/brands/zinc/palette.dark.js +5 -35
- package/dist/Theme/tokens/brands/zinc/palette.light.js +3 -12
- package/dist/Theme/tokens/builders/accentText.d.ts +0 -43
- package/dist/Theme/tokens/builders/accentText.js +5 -48
- package/dist/Theme/tokens/builders/brandInk.d.ts +2 -0
- package/dist/Theme/tokens/builders/brandInk.js +19 -1
- package/dist/Theme/tokens/builders/buildBrandTokens.d.ts +0 -3
- package/dist/Theme/tokens/builders/buildBrandTokens.js +1 -3
- package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +0 -12
- package/dist/Theme/tokens/builders/buildDarkPalette.js +19 -102
- package/dist/Theme/tokens/builders/chartColorsFromTheme.d.ts +0 -8
- package/dist/Theme/tokens/builders/chartColorsFromTheme.js +2 -9
- package/dist/Theme/tokens/builders/color.d.ts +0 -20
- package/dist/Theme/tokens/builders/color.js +3 -20
- package/dist/Theme/tokens/builders/filledSurface.d.ts +19 -0
- package/dist/Theme/tokens/builders/filledSurface.js +84 -0
- package/dist/Theme/tokens/builders/focusRing.d.ts +7 -0
- package/dist/Theme/tokens/builders/focusRing.js +48 -0
- package/dist/Theme/tokens/builders/gradientInk.d.ts +0 -10
- package/dist/Theme/tokens/builders/gradientInk.js +2 -10
- package/dist/Theme/tokens/builders/index.d.ts +6 -0
- package/dist/Theme/tokens/builders/index.js +6 -0
- package/dist/Theme/tokens/builders/outlineRung.d.ts +7 -33
- package/dist/Theme/tokens/builders/outlineRung.js +61 -37
- package/dist/Theme/tokens/builders/placeholderInk.d.ts +7 -0
- package/dist/Theme/tokens/builders/placeholderInk.js +25 -0
- package/dist/Theme/tokens/builders/resolvedRungs.d.ts +0 -1
- package/dist/Theme/tokens/builders/resolvedRungs.js +3 -2
- package/dist/Theme/tokens/builders/rowStates.d.ts +7 -0
- package/dist/Theme/tokens/builders/rowStates.js +14 -0
- package/dist/Theme/tokens/builders/scrim.d.ts +6 -0
- package/dist/Theme/tokens/builders/scrim.js +17 -0
- package/dist/Theme/tokens/builders/scrollShadow.d.ts +2 -0
- package/dist/Theme/tokens/builders/scrollShadow.js +16 -0
- package/dist/Theme/tokens/builders/scrollbar.d.ts +0 -4
- package/dist/Theme/tokens/builders/scrollbar.js +1 -4
- package/dist/Theme/tokens/builders/semanticText.d.ts +0 -5
- package/dist/Theme/tokens/builders/semanticText.js +1 -5
- package/dist/Theme/tokens/builders/sidebarAccent.d.ts +8 -0
- package/dist/Theme/tokens/builders/sidebarAccent.js +15 -1
- package/dist/Theme/tokens/builders/statusTone.d.ts +1 -19
- package/dist/Theme/tokens/builders/statusTone.js +4 -19
- package/dist/Theme/tokens/builders/surfaceRaised.d.ts +6 -0
- package/dist/Theme/tokens/builders/surfaceRaised.js +21 -0
- package/dist/Theme/tokens/builders/surfaceRungs.d.ts +1 -2
- package/dist/Theme/tokens/builders/surfaceRungs.js +13 -9
- package/dist/Theme/tokens/builders/tone.d.ts +22 -0
- package/dist/Theme/tokens/builders/tone.js +54 -0
- package/dist/Theme/tokens/builders/tooltipSurface.d.ts +6 -0
- package/dist/Theme/tokens/builders/tooltipSurface.js +10 -0
- package/dist/Theme/tokens/builders/viewportHeight.d.ts +8 -0
- package/dist/Theme/tokens/builders/viewportHeight.js +9 -0
- package/dist/Theme/tokens/index.d.ts +0 -10
- package/dist/Theme/tokens/index.js +1 -10
- package/dist/Theme/tokens/primitives/controlSizes.d.ts +12 -0
- package/dist/Theme/tokens/primitives/controlSizes.js +14 -0
- package/dist/Theme/tokens/primitives/index.d.ts +2 -0
- package/dist/Theme/tokens/primitives/index.js +16 -0
- package/dist/Theme/tokens/primitives/motion.d.ts +8 -0
- package/dist/Theme/tokens/primitives/motion.js +12 -0
- package/dist/Theme/tokens/primitives/optionRowSizes.d.ts +20 -0
- package/dist/Theme/tokens/primitives/optionRowSizes.js +29 -0
- package/dist/Theme/tokens/primitives/sizes.d.ts +0 -4
- package/dist/Theme/tokens/primitives/sizes.js +1 -4
- package/dist/Theme/tokens/primitives/typography.d.ts +0 -7
- package/dist/Theme/tokens/primitives/typography.js +1 -7
- package/dist/Theme/tokens/types.d.ts +16 -16
- package/dist/Theme/tokens/types.js +1 -6
- package/dist/Utils/accountHandoff.d.ts +0 -17
- package/dist/Utils/accountHandoff.js +2 -17
- package/dist/Utils/apiError.d.ts +2 -0
- package/dist/Utils/apiError.js +28 -0
- package/dist/Utils/functions.d.ts +1 -0
- package/dist/Utils/functions.js +6 -4
- package/dist/Utils/humanize.d.ts +4 -0
- package/dist/Utils/humanize.js +19 -0
- package/dist/Utils/lazyWithRetry.d.ts +9 -0
- package/dist/Utils/lazyWithRetry.js +51 -0
- package/dist/Utils/mergeRefs.d.ts +0 -5
- package/dist/Utils/mergeRefs.js +1 -5
- package/dist/Utils/planBadge.d.ts +1 -11
- package/dist/Utils/planBadge.js +2 -12
- package/dist/Utils/planExpiry.d.ts +0 -26
- package/dist/Utils/planExpiry.js +4 -29
- package/dist/Utils/rafThrottle.d.ts +0 -11
- package/dist/Utils/rafThrottle.js +1 -11
- package/dist/Utils/table.d.ts +5 -22
- package/dist/Utils/table.js +64 -88
- package/dist/Utils/validation.d.ts +13 -0
- package/dist/Utils/validation.js +86 -0
- package/dist/esm/Components/Accordion/Accordion.js +9 -8
- package/dist/esm/Components/Accordion/accordionColors.js +9 -10
- package/dist/esm/Components/AlertDialog/AlertDialog.js +4 -6
- package/dist/esm/Components/Apexcharts/ApexAreaChart/ApexAreaChart.js +8 -3
- package/dist/esm/Components/Apexcharts/ApexBarChart/ApexBarChart.js +9 -5
- package/dist/esm/Components/Apexcharts/ApexChartFallback.js +5 -0
- package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +8 -3
- package/dist/esm/Components/Apexcharts/ApexPieChart/ApexPieChart.js +8 -3
- package/dist/esm/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.js +10 -6
- package/dist/esm/Components/Apexcharts/ApexRadialChart/ApexRadialChart.js +8 -5
- package/dist/esm/Components/Apexcharts/LazyReactApexChart.js +5 -0
- package/dist/esm/Components/AppSwitcher/AppMark.js +52 -0
- package/dist/esm/Components/AppSwitcher/AppSwitcher.js +238 -0
- package/dist/esm/Components/AppSwitcher/AppSwitcherProps.js +78 -0
- package/dist/esm/Components/AppSwitcher/useAppSwitcherShortcut.js +27 -0
- package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +2 -1
- package/dist/esm/Components/Avatar/Avatar.js +22 -0
- package/dist/esm/Components/Avatar/AvatarGroup.js +19 -0
- package/dist/esm/Components/Avatar/AvatarProps.js +1 -0
- package/dist/esm/Components/Avatar/avatarColorway.js +25 -0
- package/dist/esm/Components/Avatar/avatarSizing.js +12 -0
- package/dist/esm/Components/Backdrop/Backdrop.js +28 -0
- package/dist/esm/Components/Backdrop/BackdropProps.js +1 -0
- package/dist/esm/Components/Breadcrumbs/Breadcrumbs.js +15 -5
- package/dist/esm/Components/Breadcrumbs/breadcrumbInk.js +7 -0
- package/dist/esm/Components/Button/Button.js +5 -4
- package/dist/esm/Components/Button/Button.styles.js +48 -75
- package/dist/esm/Components/ButtonGroupIcon/ButtonGoupIconProps.js +2 -1
- package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +5 -14
- package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIconProps.js +1 -0
- package/dist/esm/Components/Buttons/Buttons.js +2 -3
- package/dist/esm/Components/Card/Card.js +11 -5
- package/dist/esm/Components/Card/PaymentCard/PaymentCard.js +32 -19
- package/dist/esm/Components/Checkbox/Checkbox.js +11 -8
- package/dist/esm/Components/Checkbox/Checkbox.styles.js +44 -34
- package/dist/esm/Components/Common/ErrorComponent.js +7 -5
- package/dist/esm/Components/Common/ErrorMessage.js +5 -5
- package/dist/esm/Components/Common/FieldMessage.js +14 -0
- package/dist/esm/Components/Common/FormLabel.js +14 -8
- package/dist/esm/Components/Common/FormattedDescription.js +1 -0
- package/dist/esm/Components/Common/HelperText.js +4 -1
- package/dist/esm/Components/Common/Label.js +3 -1
- package/dist/esm/Components/Common/chipTriggerSize.js +11 -0
- package/dist/esm/Components/Common/fieldMessageStyles.js +13 -0
- package/dist/esm/Components/Common/fieldStyles.js +66 -29
- package/dist/esm/Components/Common/iconBox.js +12 -0
- package/dist/esm/Components/Common/useFieldIds.js +23 -0
- package/dist/esm/Components/ConfirmDialog/ConfirmDialog.js +18 -0
- package/dist/esm/Components/ConfirmDialog/ConfirmDialogProps.js +1 -0
- package/dist/esm/Components/ContactForm/ContactForm.js +19 -14
- package/dist/esm/Components/CopyButton/CopyButton.js +12 -7
- package/dist/esm/Components/CustomModulesTable/DeleteModuleModal.js +4 -4
- package/dist/esm/Components/CustomModulesTable/EditModuleModal.js +2 -4
- package/dist/esm/Components/DatePicker/CalendarPanel.js +43 -25
- package/dist/esm/Components/DatePicker/DatePicker.js +12 -48
- package/dist/esm/Components/DatePicker/DatePickerProps.js +1 -1
- package/dist/esm/Components/DatePicker/RangeDatePicker.js +42 -21
- package/dist/esm/Components/DatePicker/SingleDatePicker.js +80 -61
- package/dist/esm/Components/DatePicker/ThemeDatePicker.js +11 -17
- package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +42 -18
- package/dist/esm/Components/DatePicker/TimePicker.js +9 -12
- package/dist/esm/Components/DatePicker/TimePickerInput.js +5 -10
- package/dist/esm/Components/DatePicker/dayStates.js +67 -0
- package/dist/esm/Components/DatePicker/pickerField.js +24 -0
- package/dist/esm/Components/DatePicker/valueFormat.js +15 -0
- package/dist/esm/Components/DescriptionList/DescriptionList.js +27 -0
- package/dist/esm/Components/DescriptionList/DescriptionListProps.js +1 -0
- package/dist/esm/Components/Divider/Divider.js +1 -0
- package/dist/esm/Components/Drawer/Drawer.js +22 -8
- package/dist/esm/Components/Dropdown/DropDown.js +66 -38
- package/dist/esm/Components/Editor/Editor.js +14 -1
- package/dist/esm/Components/Editor/joditAccessibility.js +24 -0
- package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +3 -8
- package/dist/esm/Components/EmptyState/EmptyState.js +25 -14
- package/dist/esm/Components/FeedbackForm/FeedbackForm.js +17 -6
- package/dist/esm/Components/FieldSelectModal/FieldSelectModal.js +4 -5
- package/dist/esm/Components/FilePreview/FilePreview.js +11 -9
- package/dist/esm/Components/FileUpload/FileUpload.js +26 -8
- package/dist/esm/Components/FileUpload/constants.js +2 -0
- package/dist/esm/Components/FileUploader/FileUploader.js +7 -5
- package/dist/esm/Components/FilterBar/FilterBar.js +12 -0
- package/dist/esm/Components/FilterBar/FilterBarProps.js +1 -0
- package/dist/esm/Components/FilterSidebar/FilterSidebar.js +29 -34
- package/dist/esm/Components/FilterSidebar/filterHoverStyle.js +3 -10
- package/dist/esm/Components/Form/FormWrapper.js +2 -1
- package/dist/esm/Components/Header/Header.js +2 -16
- package/dist/esm/Components/Header/HeaderActions.js +4 -4
- package/dist/esm/Components/Header/components/desktopMenu.js +10 -11
- package/dist/esm/Components/Header/components/mobileMenu.js +26 -14
- package/dist/esm/Components/Input/Input/Input.js +3 -2
- package/dist/esm/Components/Input/PhoneNumberInput.js +8 -4
- package/dist/esm/Components/Input/Switch/InputSwitch.js +16 -20
- package/dist/esm/Components/Input/TextInput.js +83 -9
- package/dist/esm/Components/Input/TextInput.styles.js +41 -89
- package/dist/esm/Components/Input/textInputIconSize.js +6 -32
- package/dist/esm/Components/Input/useAriaRequired.js +15 -0
- package/dist/esm/Components/InputTextArea/InputTextArea.js +10 -5
- package/dist/esm/Components/InputTextArea/InputTextArea.style.js +13 -67
- package/dist/esm/Components/KanbanBoard/AccountCard.js +10 -6
- package/dist/esm/Components/KanbanBoard/AccountRow.js +1 -0
- package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
- package/dist/esm/Components/KanbanBoard/KanbanBoard.js +87 -50
- package/dist/esm/Components/KanbanBoard/MeasuredItem.js +1 -0
- package/dist/esm/Components/KanbanBoard/index.js +1 -0
- package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -0
- package/dist/esm/Components/LimitReachedModal/LimitReachedModal.js +2 -2
- package/dist/esm/Components/LimitReachedModal/limitReachedCopy.js +3 -3
- package/dist/esm/Components/Loading/Loading.js +16 -17
- package/dist/esm/Components/MediaViewer/MediaViewer.js +196 -0
- package/dist/esm/Components/MediaViewer/MediaViewerProps.js +29 -0
- package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +133 -0
- package/dist/esm/Components/MediaViewer/components/MediaAudioPlayerProps.js +18 -0
- package/dist/esm/Components/MediaViewer/components/MediaDocumentStage.js +109 -0
- package/dist/esm/Components/MediaViewer/components/MediaDocumentStageProps.js +8 -0
- package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +98 -0
- package/dist/esm/Components/MediaViewer/components/MediaImageViewerProps.js +15 -0
- package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +87 -0
- package/dist/esm/Components/MediaViewer/components/MediaScrubberProps.js +1 -0
- package/dist/esm/Components/MediaViewer/components/MediaStatusPanel.js +12 -0
- package/dist/esm/Components/MediaViewer/components/MediaStatusPanelProps.js +1 -0
- package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +243 -0
- package/dist/esm/Components/MediaViewer/components/MediaVideoPlayerProps.js +28 -0
- package/dist/esm/Components/MediaViewer/components/TileChip.js +10 -0
- package/dist/esm/Components/MediaViewer/components/TileChipProps.js +1 -0
- package/dist/esm/Components/MediaViewer/components/VideoPoster.js +11 -0
- package/dist/esm/Components/MediaViewer/components/VideoPosterProps.js +1 -0
- package/dist/esm/Components/MediaViewer/components/ViewerIconButton.js +15 -0
- package/dist/esm/Components/MediaViewer/components/ViewerIconButtonProps.js +1 -0
- package/dist/esm/Components/MediaViewer/components/mediaKindIcon.js +18 -0
- package/dist/esm/Components/MediaViewer/components/sanitizeDocxHrefs.js +27 -0
- package/dist/esm/Components/MediaViewer/hooks/useAutoHideChrome.js +40 -0
- package/dist/esm/Components/MediaViewer/hooks/useFileViewer.js +45 -0
- package/dist/esm/Components/MediaViewer/mediaItems.js +174 -0
- package/dist/esm/Components/MediaViewer/useViewerChrome.js +27 -0
- package/dist/esm/Components/Modal/Modal.js +25 -19
- package/dist/esm/Components/MoreItems/MoreItems.js +7 -2
- package/dist/esm/Components/MultiSelect/MultiSelect.js +40 -28
- package/dist/esm/Components/NavigationBar/NavigationBar.js +15 -17
- package/dist/esm/Components/NoteTextArea/NoteTextArea.js +21 -10
- package/dist/esm/Components/Notification/Notification.js +9 -4
- package/dist/esm/Components/NotificationBell/NotificationBell.js +33 -0
- package/dist/esm/Components/NotificationBell/NotificationBellProps.js +1 -0
- package/dist/esm/Components/NotificationBell/NotificationItem.js +29 -0
- package/dist/esm/Components/NotificationBell/NotificationList.js +36 -0
- package/dist/esm/Components/NotificationBell/NotificationPanel.js +31 -0
- package/dist/esm/Components/NotificationBell/index.js +6 -0
- package/dist/esm/Components/NotificationBell/notificationHelpers.js +107 -0
- package/dist/esm/Components/NumberInput/NumberInput.js +6 -2
- package/dist/esm/Components/NumberInput/NumberInput.styles.js +19 -77
- package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +18 -22
- package/dist/esm/Components/OrgSwitcher/OrgSwitcherProps.js +3 -1
- package/dist/esm/Components/OrganizationDetails/CreateOrgModal.js +1 -1
- package/dist/esm/Components/OrganizationDetails/DeleteOrgModal.js +7 -9
- package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +13 -10
- package/dist/esm/Components/PageHeader/PageHeader.js +9 -0
- package/dist/esm/Components/PageHeader/PageHeaderProps.js +1 -0
- package/dist/esm/Components/PdfViewer/PdfViewer.js +7 -1
- package/dist/esm/Components/PersonChip/PersonChip.js +42 -0
- package/dist/esm/Components/PersonChip/PersonChipProps.js +1 -0
- package/dist/esm/Components/PinInput/PinInput.js +11 -9
- package/dist/esm/Components/PinInput/pinInputCellSize.js +6 -0
- package/dist/esm/Components/PlanBadge/PlanBadge.js +1 -7
- package/dist/esm/Components/PlanPill/PlanPill.js +2 -3
- package/dist/esm/Components/PlanPill/planPillGradient.js +6 -20
- package/dist/esm/Components/Primitives/Primitives.js +3 -0
- package/dist/esm/Components/ProductCard/ProductPrice.js +18 -7
- package/dist/esm/Components/ProductCard/ProductReview.js +8 -2
- package/dist/esm/Components/ProductCard/ProductTags.js +1 -1
- package/dist/esm/Components/ProductDetails/ProductDetails.js +1 -1
- package/dist/esm/Components/ProductDetails/ProductDtlPrice.js +5 -5
- package/dist/esm/Components/ProductDetails/ProductImageSlider.js +36 -20
- package/dist/esm/Components/ProfileCard/ProfileCard.js +26 -11
- package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +12 -7
- package/dist/esm/Components/ProgressBar/ProgressBar.js +28 -3
- package/dist/esm/Components/QueryState/ErrorState.js +11 -0
- package/dist/esm/Components/QueryState/QueryStateBoundary.js +20 -0
- package/dist/esm/Components/QueryState/QueryStateProps.js +1 -0
- package/dist/esm/Components/RadioButton/RadioButton.js +33 -15
- package/dist/esm/Components/RangeSlider/RangeSlider.js +131 -0
- package/dist/esm/Components/RangeSlider/RangeSliderProps.js +1 -0
- package/dist/esm/Components/RangeSlider/rangeSliderColors.js +7 -0
- package/dist/esm/Components/RangeSlider/rangeSliderMath.js +69 -0
- package/dist/esm/Components/RangeSlider/rangeSliderSize.js +8 -0
- package/dist/esm/Components/Reorder/Reorder.js +3 -2
- package/dist/esm/Components/RolesPermission/DeleteRoleModal.js +7 -9
- package/dist/esm/Components/RolesPermission/RolesPermission.js +6 -4
- package/dist/esm/Components/SaveBar/SaveBar.js +19 -0
- package/dist/esm/Components/SaveBar/SaveBarProps.js +1 -0
- package/dist/esm/Components/ScrollToTop/ScrollToTop.js +8 -2
- package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +1 -0
- package/dist/esm/Components/Search/Search.js +35 -15
- package/dist/esm/Components/SearchSelect/SearchSelect.js +157 -114
- package/dist/esm/Components/SearchSelect/searchSelectSize.js +15 -27
- package/dist/esm/Components/SegmentedControl/SegmentedControl.js +107 -0
- package/dist/esm/Components/SegmentedControl/SegmentedControlProps.js +1 -0
- package/dist/esm/Components/SegmentedControl/segmentedInk.js +20 -0
- package/dist/esm/Components/SegmentedControl/useSlidingPill.js +22 -0
- package/dist/esm/Components/Select/Select.js +67 -23
- package/dist/esm/Components/Select/Select.styles.js +14 -82
- package/dist/esm/Components/Select/SelectNative.js +44 -0
- package/dist/esm/Components/Select/SelectPopup.js +447 -0
- package/dist/esm/Components/Select/optionRowInk.js +11 -0
- package/dist/esm/Components/SelectSearch/SelectSearch.js +54 -90
- package/dist/esm/Components/SelectV2/SelectV2.js +10 -217
- package/dist/esm/Components/SettingRow/SettingRow.js +22 -0
- package/dist/esm/Components/SettingRow/SettingRowProps.js +1 -0
- package/dist/esm/Components/SettingRow/SettingsSection.js +11 -0
- package/dist/esm/Components/SettingRow/SettingsSectionProps.js +1 -0
- package/dist/esm/Components/SideBar/SecondaryBar.js +21 -10
- package/dist/esm/Components/SideBar/SideBar.js +44 -26
- package/dist/esm/Components/SideBar/components/MenuItemBox.js +51 -31
- package/dist/esm/Components/SideBar/components/MenuItems.js +4 -4
- package/dist/esm/Components/SideBar/components/MenuPopoverContent.js +26 -12
- package/dist/esm/Components/SideBar/components/OtherApps.js +3 -3
- package/dist/esm/Components/SideBar/components/OverflowTooltipText.js +3 -1
- package/dist/esm/Components/SideBar/components/TextTruncation.js +3 -1
- package/dist/esm/Components/SideBar/menuDisabled.js +3 -0
- package/dist/esm/Components/SideBar/sidebarId.js +2 -0
- package/dist/esm/Components/SideBar/sidebarScale.js +15 -0
- package/dist/esm/Components/Skeletons/Skeletons.js +3 -2
- package/dist/esm/Components/Slider/Slider.js +10 -1
- package/dist/esm/Components/Spinner/Spinner.js +19 -0
- package/dist/esm/Components/Spinner/SpinnerProps.js +1 -0
- package/dist/esm/Components/StageProgress/StageItem.js +13 -4
- package/dist/esm/Components/StageProgress/StageProgress.js +7 -7
- package/dist/esm/Components/StageProgress/StageProgressProps.js +13 -7
- package/dist/esm/Components/StageProgress/StepperStage.js +7 -4
- package/dist/esm/Components/StatCard/StatCard.js +37 -0
- package/dist/esm/Components/StatCard/StatCardProps.js +1 -0
- package/dist/esm/Components/Switch/Switch.js +12 -10
- package/dist/esm/Components/Table/Table.js +68 -52
- package/dist/esm/Components/Table/components/HeaderActions.js +3 -2
- package/dist/esm/Components/Table/components/Pagination.js +20 -9
- package/dist/esm/Components/Table/components/TableActions.js +2 -2
- package/dist/esm/Components/Table/components/TableBody.js +151 -68
- package/dist/esm/Components/Table/components/TableGroupRow.js +1 -1
- package/dist/esm/Components/Table/components/TableHeader.js +34 -20
- package/dist/esm/Components/Table/components/TableSearch.js +1 -1
- package/dist/esm/Components/Table/components/rowMetrics.js +10 -0
- package/dist/esm/Components/Table/filters/ActiveFilters.js +7 -4
- package/dist/esm/Components/Table/filters/CompactSelect.js +33 -9
- package/dist/esm/Components/Table/filters/LeftFilterPane.js +1 -1
- package/dist/esm/Components/Table/filters/SelectOperationControls.js +8 -3
- package/dist/esm/Components/Table/filters/TableFilters.js +1 -1
- package/dist/esm/Components/Table/filters/TextOperationControls.js +6 -2
- package/dist/esm/Components/Table/hooks/useTable.js +61 -33
- package/dist/esm/Components/Table/settings/ManageColumns.js +14 -10
- package/dist/esm/Components/Table/settings/TableSettings.js +9 -6
- package/dist/esm/Components/Table/variants/TableVariantContext.js +13 -0
- package/dist/esm/Components/Table/variants/classic.js +45 -0
- package/dist/esm/Components/Table/variants/index.js +9 -0
- package/dist/esm/Components/Table/variants/pillInk.js +18 -0
- package/dist/esm/Components/Table/variants/stripe.js +3 -0
- package/dist/esm/Components/Table/variants/studio.js +48 -0
- package/dist/esm/Components/Table/variants/tokens.js +1 -0
- package/dist/esm/Components/Tabs/Tabs.js +65 -0
- package/dist/esm/Components/Tabs/TabsContext.js +10 -0
- package/dist/esm/Components/Tabs/TabsProps.js +1 -0
- package/dist/esm/Components/Tabs/components/CountBadge.js +15 -0
- package/dist/esm/Components/Tabs/components/Tab.js +45 -0
- package/dist/esm/Components/Tabs/components/TabList.js +69 -0
- package/dist/esm/Components/Tabs/components/TabPanel.js +15 -0
- package/dist/esm/Components/Tabs/components/TabPanels.js +12 -0
- package/dist/esm/Components/Tabs/index.js +5 -0
- package/dist/esm/Components/Tabs/tabStyles.js +33 -0
- package/dist/esm/Components/Tag/Tag.js +16 -7
- package/dist/esm/Components/Tag/Tag.styles.js +48 -36
- package/dist/esm/Components/Timeline/Timeline.js +43 -30
- package/dist/esm/Components/Toaster/Toaster.js +74 -58
- package/dist/esm/Components/Toaster/toastDuration.js +3 -0
- package/dist/esm/Components/Toggle/TableToggle.js +62 -19
- package/dist/esm/Components/ToggleSwitch/ToggleSwitch.js +47 -0
- package/dist/esm/Components/ToggleSwitch/ToggleSwitchProps.js +1 -0
- package/dist/esm/Components/ToolTip/OverflowToolTip.js +1 -15
- package/dist/esm/Components/ToolTip/ToolTip.js +15 -14
- package/dist/esm/Components/UpgradeButton/UpgradeButton.js +9 -14
- package/dist/esm/Components/UserDetails/AddUserModal.js +1 -1
- package/dist/esm/Components/UserDetails/ChangeRoleModal.js +1 -1
- package/dist/esm/Components/UserDetails/DeactivateConfirmModal.js +6 -8
- package/dist/esm/Components/UserDetails/UserDetails.js +13 -12
- package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +2 -14
- package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +6 -23
- package/dist/esm/Constants/Sidebar.js +0 -15
- package/dist/esm/Hooks/exclusiveOverlay.js +16 -0
- package/dist/esm/Hooks/useDebounce.js +29 -0
- package/dist/esm/Hooks/useExclusiveOverlay.js +17 -0
- package/dist/esm/Hooks/useFullscreen.js +29 -0
- package/dist/esm/Hooks/useIsTruncated.js +1 -30
- package/dist/esm/Hooks/usePreferences.js +1 -6
- package/dist/esm/Hooks/useSidebarPrefs.js +1 -2
- package/dist/esm/Theme/assertPalette.js +4 -3
- package/dist/esm/Theme/chakra/Card.styles.js +45 -0
- package/dist/esm/Theme/chakra/Drawer.styles.js +14 -13
- package/dist/esm/Theme/chakra/Menu.styles.js +17 -26
- package/dist/esm/Theme/chakra/Modal.styles.js +15 -13
- package/dist/esm/Theme/chakra/Popover.styles.js +6 -10
- package/dist/esm/Theme/chakra/Slider.styles.js +1 -6
- package/dist/esm/Theme/chakra/common.web.js +1 -7
- package/dist/esm/Theme/chakra/componentStyles.js +84 -97
- package/dist/esm/Theme/chakra/createBrandTheme.js +23 -54
- package/dist/esm/Theme/chakra/focusRing.styles.js +34 -0
- package/dist/esm/Theme/chakra/fonts.web.js +1 -5
- package/dist/esm/Theme/chakra/motion.js +22 -0
- package/dist/esm/Theme/chakra/overlay.styles.js +43 -0
- package/dist/esm/Theme/chakra/paletteFromTheme.js +1 -4
- package/dist/esm/Theme/index.js +3 -18
- package/dist/esm/Theme/provider/PixelizeThemeProvider.js +6 -74
- package/dist/esm/Theme/provider/ThemeSwitcher.js +23 -21
- package/dist/esm/Theme/provider/colorModeStorage.js +1 -4
- package/dist/esm/Theme/tokens/brands/emerald/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/emerald/palette.light.js +2 -10
- package/dist/esm/Theme/tokens/brands/index.js +6 -1
- package/dist/esm/Theme/tokens/brands/lavender/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/lavender/palette.light.js +4 -13
- package/dist/esm/Theme/tokens/brands/meadow/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/meadow/palette.light.js +2 -11
- package/dist/esm/Theme/tokens/brands/radiant/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/radiant/palette.light.js +2 -10
- package/dist/esm/Theme/tokens/brands/rosewood/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/rosewood/palette.light.js +2 -14
- package/dist/esm/Theme/tokens/brands/skyline/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/skyline/palette.light.js +2 -11
- package/dist/esm/Theme/tokens/brands/slate/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/slate/palette.light.js +1 -11
- package/dist/esm/Theme/tokens/brands/storefront/palette.dark.js +0 -4
- package/dist/esm/Theme/tokens/brands/zinc/palette.dark.js +5 -35
- package/dist/esm/Theme/tokens/brands/zinc/palette.light.js +3 -12
- package/dist/esm/Theme/tokens/builders/accentText.js +5 -48
- package/dist/esm/Theme/tokens/builders/brandInk.js +18 -2
- package/dist/esm/Theme/tokens/builders/buildBrandTokens.js +1 -3
- package/dist/esm/Theme/tokens/builders/buildDarkPalette.js +19 -102
- package/dist/esm/Theme/tokens/builders/chartColorsFromTheme.js +2 -9
- package/dist/esm/Theme/tokens/builders/color.js +3 -20
- package/dist/esm/Theme/tokens/builders/filledSurface.js +77 -0
- package/dist/esm/Theme/tokens/builders/focusRing.js +41 -0
- package/dist/esm/Theme/tokens/builders/gradientInk.js +2 -10
- package/dist/esm/Theme/tokens/builders/index.js +6 -0
- package/dist/esm/Theme/tokens/builders/outlineRung.js +56 -36
- package/dist/esm/Theme/tokens/builders/placeholderInk.js +19 -0
- package/dist/esm/Theme/tokens/builders/resolvedRungs.js +3 -2
- package/dist/esm/Theme/tokens/builders/rowStates.js +10 -0
- package/dist/esm/Theme/tokens/builders/scrim.js +12 -0
- package/dist/esm/Theme/tokens/builders/scrollShadow.js +13 -0
- package/dist/esm/Theme/tokens/builders/scrollbar.js +1 -4
- package/dist/esm/Theme/tokens/builders/semanticText.js +1 -5
- package/dist/esm/Theme/tokens/builders/sidebarAccent.js +11 -0
- package/dist/esm/Theme/tokens/builders/statusTone.js +4 -19
- package/dist/esm/Theme/tokens/builders/surfaceRaised.js +15 -0
- package/dist/esm/Theme/tokens/builders/surfaceRungs.js +14 -10
- package/dist/esm/Theme/tokens/builders/tone.js +47 -0
- package/dist/esm/Theme/tokens/builders/tooltipSurface.js +6 -0
- package/dist/esm/Theme/tokens/builders/viewportHeight.js +6 -0
- package/dist/esm/Theme/tokens/index.js +1 -10
- package/dist/esm/Theme/tokens/primitives/controlSizes.js +10 -0
- package/dist/esm/Theme/tokens/primitives/index.js +2 -0
- package/dist/esm/Theme/tokens/primitives/motion.js +8 -0
- package/dist/esm/Theme/tokens/primitives/optionRowSizes.js +25 -0
- package/dist/esm/Theme/tokens/primitives/sizes.js +1 -4
- package/dist/esm/Theme/tokens/primitives/typography.js +1 -7
- package/dist/esm/Theme/tokens/types.js +1 -6
- package/dist/esm/Utils/accountHandoff.js +2 -17
- package/dist/esm/Utils/apiError.js +24 -0
- package/dist/esm/Utils/functions.js +6 -4
- package/dist/esm/Utils/humanize.js +15 -0
- package/dist/esm/Utils/lazyWithRetry.js +45 -0
- package/dist/esm/Utils/mergeRefs.js +1 -5
- package/dist/esm/Utils/planBadge.js +2 -12
- package/dist/esm/Utils/planExpiry.js +4 -29
- package/dist/esm/Utils/rafThrottle.js +1 -11
- package/dist/esm/Utils/table.js +61 -55
- package/dist/esm/Utils/validation.js +73 -0
- package/dist/esm/index.js +90 -2
- package/dist/global.css +6 -1
- package/dist/index.d.ts +133 -7
- package/dist/index.js +257 -5
- package/package.json +27 -6
- package/dist/Assets/defaultLogo.tsx +0 -26
- package/dist/Components/PinInputs/PinInputs.d.ts +0 -3
- package/dist/Components/PinInputs/PinInputs.js +0 -46
- package/dist/Components/PinInputs/PinInputsProps.d.ts +0 -9
- package/dist/Components/Table/hooks/useDebounce.d.ts +0 -2
- package/dist/Components/Table/hooks/useDebounce.js +0 -24
- package/dist/Components/Trail/EditableCell.d.ts +0 -11
- package/dist/Components/Trail/EditableCell.js +0 -34
- package/dist/Components/Trail/SelectAllCheckbox.d.ts +0 -8
- package/dist/Components/Trail/SelectAllCheckbox.js +0 -9
- package/dist/Components/Trail/TrailWorks.d.ts +0 -2
- package/dist/Components/Trail/TrailWorks.js +0 -56
- package/dist/Components/Trail/data.d.ts +0 -15
- package/dist/Components/Trail/data.js +0 -29
- package/dist/Theme/chakra/Avatar.styles.d.ts +0 -32
- package/dist/Theme/chakra/Avatar.styles.js +0 -28
- package/dist/Theme/chakra/Switch.styles.d.ts +0 -30
- package/dist/Theme/chakra/Switch.styles.js +0 -22
- package/dist/Theme/chakra/Tabs.styles.d.ts +0 -42
- package/dist/Theme/chakra/Tabs.styles.js +0 -36
- package/dist/esm/Components/PinInputs/PinInputs.js +0 -41
- package/dist/esm/Components/Table/hooks/useDebounce.js +0 -22
- package/dist/esm/Components/Trail/EditableCell.js +0 -30
- package/dist/esm/Components/Trail/SelectAllCheckbox.js +0 -5
- package/dist/esm/Components/Trail/TrailWorks.js +0 -54
- package/dist/esm/Components/Trail/data.js +0 -26
- package/dist/esm/Theme/chakra/Avatar.styles.js +0 -25
- package/dist/esm/Theme/chakra/Switch.styles.js +0 -19
- package/dist/esm/Theme/chakra/Tabs.styles.js +0 -33
- /package/dist/Components/{PinInputs/PinInputsProps.js → Avatar/AvatarGroupProps.js} +0 -0
- /package/dist/esm/Components/{PinInputs/PinInputsProps.js → Avatar/AvatarGroupProps.js} +0 -0
|
@@ -0,0 +1,1460 @@
|
|
|
1
|
+
# Component Gotchas & Decision Guide
|
|
2
|
+
|
|
3
|
+
For anyone — human or AI — consuming `pixelize-design-library` in an app. Read this **before**
|
|
4
|
+
choosing a component or a prop value, not after something looks wrong. Every entry below compiles
|
|
5
|
+
cleanly, accepts what you pass, and produces the wrong result with no warning — TypeScript cannot
|
|
6
|
+
catch any of these, and a unit suite that mocks the library won't either.
|
|
7
|
+
|
|
8
|
+
This file ships inside the published package (`node_modules/pixelize-design-library/COMPONENT-GOTCHAS.md`)
|
|
9
|
+
so it's available without checking out the library's source repo. Its companion
|
|
10
|
+
[DESIGN-GUIDE.md](DESIGN-GUIDE.md) ships beside it and covers how to compose components into a page.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Found a gap or a bug? Report it, then track it
|
|
15
|
+
|
|
16
|
+
The library exists so a UI change is made **once, here** — not patched per app. So when a component
|
|
17
|
+
is wrong, missing a prop, or can't express what a screen needs, **don't work around it in your app
|
|
18
|
+
and move on.** Report it upstream; a workaround nobody knows about is a bug that gets rediscovered
|
|
19
|
+
in every other app.
|
|
20
|
+
|
|
21
|
+
**What counts:** a component that renders wrong (misaligned, clipped, wrong size or colour, off the
|
|
22
|
+
control scale), a prop you need that doesn't exist, a silent-failure trap that isn't listed below, or
|
|
23
|
+
a doc that contradicts what you measured.
|
|
24
|
+
|
|
25
|
+
**How to report** — one GitHub issue on `pixelize-tech/Micro-Components`, with the label `bug` or
|
|
26
|
+
`enhancement`. From a terminal (AI agents included) this is one command:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
gh issue create --repo pixelize-tech/Micro-Components --label bug \
|
|
30
|
+
--title "[consumer] <Component>: <what is wrong>" \
|
|
31
|
+
--body "Version: <output of: npm ls pixelize-design-library>
|
|
32
|
+
App / screen: <where you saw it>
|
|
33
|
+
Expected: <what should happen>
|
|
34
|
+
Actual: <what happens, with measured numbers if it is visual>
|
|
35
|
+
Repro: <props / minimal snippet>
|
|
36
|
+
Workaround in the app: <none, or what you did and where, so it can be removed>"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Measure, don't eyeball: for a visual bug give the rendered size and offset (`getBoundingClientRect`)
|
|
40
|
+
and the `size` prop — "icon 1.5px above centre at `sm`" gets fixed; "looks off" doesn't.
|
|
41
|
+
|
|
42
|
+
**How it is tracked** — the issue is the record; there is no second list.
|
|
43
|
+
|
|
44
|
+
| State | What it means | What you do |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| Open | Reported, not yet fixed | Keep any workaround, and comment its file path on the issue |
|
|
47
|
+
| Closed with a version | Fixed in the named beta/release, and the fix is under `### Fixed` in [CHANGELOG.md](CHANGELOG.md) citing the issue | Bump the pin to that version (exact, never a caret on a prerelease), **delete the workaround**, close your own follow-up |
|
|
48
|
+
| Closed as `wontfix` / `invalid` / `duplicate` | Not changing, or already covered | Read the reason; the workaround stays, or use the issue it points to |
|
|
49
|
+
|
|
50
|
+
Before reporting, search first — `gh issue list --repo pixelize-tech/Micro-Components --search "<component>" --state all`
|
|
51
|
+
— and check the [CHANGELOG.md](CHANGELOG.md) shipped with your installed version; the gap may already
|
|
52
|
+
be fixed in a newer beta.
|
|
53
|
+
|
|
54
|
+
**Maintainers:** a fix closes its issue in the same change that lands it, and its CHANGELOG line
|
|
55
|
+
names the issue number and the version that ships it. A workaround someone left in an app is only
|
|
56
|
+
removable if the issue says which version fixes it, so never close without naming one.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## A colour rung flips direction between light and dark
|
|
61
|
+
|
|
62
|
+
`colors.primary[700]` is a deep purple in light mode and a **pale** lavender in dark. The scales are
|
|
63
|
+
ordered so a high rung always contrasts with the page canvas, which means its lightness inverts
|
|
64
|
+
with the mode. Using one as ink is what the ordering is for; using one as a **background fill**
|
|
65
|
+
gives you a dark bar in light mode and a pale one in dark, with whatever you put on top now
|
|
66
|
+
unreadable.
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
// Wrong — pale lavender bar in dark mode, and the label on it is unreadable
|
|
70
|
+
<Box bg={colors.primary[700]}>…</Box>
|
|
71
|
+
|
|
72
|
+
// Right — a brand fill that stays a brand fill, with its own guaranteed-AA foreground
|
|
73
|
+
const brand = resolveFilledSurface(colors.primary, colors);
|
|
74
|
+
<Box bg={brand.activeFill} color={brand.activeColor}>…</Box>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`resolveFilledSurface` is exported from the package root. Use `.fill`/`.color` for a standard
|
|
78
|
+
brand surface and `.activeFill`/`.activeColor` for a deeper one behind other content.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Choosing between components
|
|
83
|
+
|
|
84
|
+
### Segmented control look — `SegmentedControl` / `Toggle/TableToggle`
|
|
85
|
+
|
|
86
|
+
Both take `variant?: "default" | "brandSlide" | "underlineSlide"` (default `"default"` — always
|
|
87
|
+
opt-in, never assume a non-default look).
|
|
88
|
+
|
|
89
|
+
| Context | `variant` | Look |
|
|
90
|
+
| --- | --- | --- |
|
|
91
|
+
| Most call sites — settings rows, filters, table view switches | `"default"` | Neutral chip |
|
|
92
|
+
| The primary, hard-to-miss view switcher on a page (not a dense toolbar) | `"brandSlide"` | Solid brand-filled pill slides behind the active segment |
|
|
93
|
+
| A dense toolbar, table header, or anywhere a boxed control feels heavy | `"underlineSlide"` | Thin brand-colored bar glides under the active label, no fill/chip |
|
|
94
|
+
|
|
95
|
+
Pick by density and emphasis, not by taste. When unsure, or migrating an existing call site, leave
|
|
96
|
+
it on `"default"` — it's the only variant guaranteed to match previously-shipped screenshots.
|
|
97
|
+
|
|
98
|
+
**`brandSlide` no longer guesses its backdrop — and `surface` is now optional.** Until
|
|
99
|
+
2.4.2-beta.46 the track was an 8% brand tint composited over the **page canvas**, and the inactive
|
|
100
|
+
label's ink was lifted against that same assumed canvas. Dropped into a brand-filled header both
|
|
101
|
+
went wrong at once: the tint sank into the bar, and the label landed at **1.03–2.03:1** — rendered,
|
|
102
|
+
effectively invisible. The track is now an opaque plate (`colors.surfaceRaised`) whatever it sits
|
|
103
|
+
on, so a control on a coloured bar is readable with no prop passed (rest ink 7.58–18.39:1).
|
|
104
|
+
|
|
105
|
+
Pass `surface` only to aim the plate's 1px edge at the real backdrop instead of the page canvas.
|
|
106
|
+
The edge is what carries the boundary: in dark mode the plate and a brand bar can sit at almost the
|
|
107
|
+
same lightness (as low as 1.56:1 on radiant), so hue alone would not separate them.
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
<Box bg={theme.colors.primary[700]}>
|
|
111
|
+
<Switch ... surface={theme.colors.primary[700]} /> // optional: sharpens the plate's edge
|
|
112
|
+
</Box>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Which "select" component — `Select` is the only one to reach for now
|
|
116
|
+
|
|
117
|
+
There is now **one** picker. `Select` does both modes off the `native` prop:
|
|
118
|
+
`native` (default `true`) renders a real `<select>`; `native={false}` renders the themed,
|
|
119
|
+
fully-React popup — searchable, `isMulti` with chips, grouped options, `isClearable`,
|
|
120
|
+
`onCreate`, `renderOption`, `onLoadMore`, optional windowing via `virtualizeAfter`.
|
|
121
|
+
|
|
122
|
+
`isMulti` always forces the popup — there is no native multi-select — and dev-warns if you
|
|
123
|
+
also passed `native`.
|
|
124
|
+
|
|
125
|
+
**Only `SelectV2` is `@deprecated`. None was deleted; every existing call site still works.**
|
|
126
|
+
|
|
127
|
+
| Deprecated | Status | Migration |
|
|
128
|
+
| --- | --- | --- |
|
|
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`, `isSelectAll`, `rightIcon`, a field-level loading slot and the paginated `pagination.onScroll` shape (1-based `startIndex`/`limit`/`query`) have **no** equivalent in `Select` today. Keep using it until they do |
|
|
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
|
+
| `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
|
+
|
|
134
|
+
**Still genuinely different, not pickers at all:**
|
|
135
|
+
|
|
136
|
+
| Doing | Component |
|
|
137
|
+
| --- | --- |
|
|
138
|
+
| Typing free-text tags (e.g. email addresses), no options list | `MultiSelect` — despite the name there is nothing to pick from; see gotcha below |
|
|
139
|
+
| Choosing which fields/columns to include, in a modal, from a checkbox grid | `FieldSelectModal` |
|
|
140
|
+
|
|
141
|
+
`onChange` is the change prop on `Select` and `SelectV2` (`SearchSelect.onSelect` is the one it
|
|
142
|
+
actually uses; its `onChange` is passed almost nowhere). `Search` uses `onSearch`/`onClear`
|
|
143
|
+
(`onclose` is `@deprecated`).
|
|
144
|
+
|
|
145
|
+
### `Dropdown`'s `handleOptionSelect` takes TWO arguments and TypeScript will not tell you
|
|
146
|
+
|
|
147
|
+
The prop is `(id, label) => void`. TypeScript accepts a one-argument function anywhere a
|
|
148
|
+
two-argument one is expected, so `handleOptionSelect={handleSelect}` where `handleSelect`
|
|
149
|
+
is `(id: string | number) => void` compiles cleanly and silently never receives `label`.
|
|
150
|
+
|
|
151
|
+
This is live in **10 call sites today** across crm-frontend and commerce — every one of them
|
|
152
|
+
a bare function reference rather than an inline arrow.
|
|
153
|
+
|
|
154
|
+
**Apply:** pass an inline arrow (`(id, label) => handleSelect(id, label)`) so the arity is
|
|
155
|
+
visible at the call site, or declare the handler with both parameters. Grep for
|
|
156
|
+
`handleOptionSelect={` followed by a bare identifier.
|
|
157
|
+
|
|
158
|
+
### `Slider` is an image carousel, not a numeric range input
|
|
159
|
+
|
|
160
|
+
`Slider` auto-advances a set of images/content on a timer — no numeric value, min/max, or step. The
|
|
161
|
+
range-input slider is a separate component named `RangeSlider`, because this library's `Slider`
|
|
162
|
+
already owns the name. `RangeSlider` used to be a Chakra passthrough on the `Primitives` barrel; it
|
|
163
|
+
is now the library's own themed component, with a real dual-thumb mode and a `marks` prop.
|
|
164
|
+
|
|
165
|
+
**Apply:** for a numeric/range form control import `RangeSlider` from the package root — never
|
|
166
|
+
`Slider`, and no longer from the `Primitives` barrel, which no longer carries it.
|
|
167
|
+
|
|
168
|
+
### Which "switch" — `ToggleSwitch` / `SegmentedControl` / `Tabs` / `InputSwitch` / `Switch`
|
|
169
|
+
|
|
170
|
+
| Choosing | Component | Why |
|
|
171
|
+
| --- | --- | --- |
|
|
172
|
+
| A real on/off toggle | `ToggleSwitch` | `role="switch"` + `aria-checked`, full keyboard support |
|
|
173
|
+
| One of 2-5 named options | `SegmentedControl` | `role="radiogroup"`, keyboard-navigable, supports per-option disabling |
|
|
174
|
+
| Switching between views or panels | `Tabs` | `role="tablist"` + `aria-controls`, count badges, lazy panels, vertical orientation |
|
|
175
|
+
| *(avoid)* | `InputSwitch` | `@deprecated` — now a thin wrapper that renders `ToggleSwitch` |
|
|
176
|
+
| *(avoid)* | `Switch` | `@deprecated` — a two-label segmented control (`leftText`/`rightText`), not a boolean; for a single on/off field use `ToggleSwitch` instead |
|
|
177
|
+
|
|
178
|
+
**Apply:** "on vs off" is always `ToggleSwitch`; 2+ named options is always `SegmentedControl`.
|
|
179
|
+
|
|
180
|
+
**`SegmentedControl` and `Tabs` look near-identical and are not interchangeable.** They share the
|
|
181
|
+
size scale and tokens, so `SegmentedControl variant="underlineSlide"` and `Tabs variant="line"`
|
|
182
|
+
render almost the same picture, as do `variant="default"` and `Tabs variant="subtle"`. The
|
|
183
|
+
difference is what the control *is*: `SegmentedControl` is a **radiogroup** — it filters or sets a
|
|
184
|
+
value and owns nothing else on the page; `Tabs` is a **tablist** — it shows one of several panels
|
|
185
|
+
and wires `aria-controls` to them. Pick by that, never by the picture. A screen reader announces
|
|
186
|
+
"radio 1 of 3" versus "tab 1 of 3, selected", and only `Tabs` gives you panels, count badges,
|
|
187
|
+
`isLazy` and `orientation="vertical"`.
|
|
188
|
+
|
|
189
|
+
### Circular charts — `ApexPieChart` vs `ApexPolarCharts`
|
|
190
|
+
|
|
191
|
+
| Need | Component | Why not the other |
|
|
192
|
+
| --- | --- | --- |
|
|
193
|
+
| Proportional share of a whole — slices sum to 100% | `ApexPieChart` | The default "part of a whole" chart; donut variants support a center total label |
|
|
194
|
+
| 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% |
|
|
195
|
+
|
|
196
|
+
### Which "button" — `Button` / `ButtonGroupIcon` / `Buttons`
|
|
197
|
+
|
|
198
|
+
| Need | Component | Why not the others |
|
|
199
|
+
| --- | --- | --- |
|
|
200
|
+
| A single themed, interactive button — any variant/size/colorScheme, dark-mode aware | `Button` | The only one of the three that reads design tokens at all |
|
|
201
|
+
| A themed row of icon + text + icon, optionally a dropdown menu on the right | `ButtonGroupIcon` | The real "group" component despite `Buttons`' plural name suggesting otherwise |
|
|
202
|
+
| *(avoid)* | `Buttons` (plural) | Legacy single-`Button` wrapper, not exported from the package root — see gotcha below |
|
|
203
|
+
|
|
204
|
+
### Which "card" — `Card` / `ProductCard` / `ProductDetails` / `PaymentCard`
|
|
205
|
+
|
|
206
|
+
| Need | Component | Why not the others |
|
|
207
|
+
| --- | --- | --- |
|
|
208
|
+
| Generic bordered/padded container, no commerce semantics | `Card` | Layout wrapper with `header`/`footer` slots and a padded body — see gotcha below |
|
|
209
|
+
| Compact product tile for a grid/listing page | `ProductCard` | Fixed size presets, single-image hover-swap, no gallery |
|
|
210
|
+
| Full product detail page layout (gallery + description + variant picker) | `ProductDetails` | No card chrome of its own; same variant-list shape as `ProductCard` but named `price`, not `options` |
|
|
211
|
+
| Subscription/pricing-tier card (plans, billing cycle, feature list) | `PaymentCard` | Takes a `Plan` object, unrelated to `options`/`productImage` |
|
|
212
|
+
|
|
213
|
+
### Managing organizations — `OrganizationDetails` vs `OrgSwitcher`
|
|
214
|
+
|
|
215
|
+
| Doing | Component | Why not the other |
|
|
216
|
+
| --- | --- | --- |
|
|
217
|
+
| Quickly changing which org is active for the current session (navbar/header) | `OrgSwitcher` | Compact trigger + searchable popover; no create/rename/delete — session-scoped |
|
|
218
|
+
| Managing the org list — rename, delete, accept/decline invites, create new, set a persisted default | `OrganizationDetails` | Full admin panel with bundled CRUD modals; `default`/`onSetDefault` is a persisted preference, not OrgSwitcher's session-scoped `value`/`onChange` |
|
|
219
|
+
|
|
220
|
+
### Plan/upgrade cluster — `UpgradeButton` / `PlanPill` / `PlanBadge` / `LimitReachedModal`
|
|
221
|
+
|
|
222
|
+
| Doing | Component | Why not the others |
|
|
223
|
+
| --- | --- | --- |
|
|
224
|
+
| A prominent, animated "upgrade now" CTA button | `UpgradeButton` | Shimmer/hover-lift button with size variants |
|
|
225
|
+
| Showing a plan-state badge and you already have label/tone/copy decided | `PlanPill` | Presentational only — no resolution logic |
|
|
226
|
+
| Showing the top-bar plan-name/"upgrade" badge from raw org plan data | `PlanBadge` | Wraps `PlanPill` with `resolvePlanBadge()`; renders nothing if `canManageBilling` is falsy |
|
|
227
|
+
| Blocking a user who hit a plan limit, with an explanation and upgrade path | `LimitReachedModal` | Full modal, fully controlled, reuses `UpgradeButton` as its own CTA |
|
|
228
|
+
|
|
229
|
+
### Top-of-app navigation — `NavigationBar` / `Header` / `SideBar` / `AppSwitcher` / `WorkspaceWindow`
|
|
230
|
+
|
|
231
|
+
| Need | Component | Why not the others |
|
|
232
|
+
| --- | --- | --- |
|
|
233
|
+
| 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 |
|
|
234
|
+
| Top bar: horizontal page links with active-state highlighting + submenus | `Header` | Desktop submenus are hover-only, see gotcha below |
|
|
235
|
+
| Collapsible/dockable left rail — primary in-app navigation + secondary panel | `SideBar` | The persistent nav shell, not for switching between whole apps |
|
|
236
|
+
| 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 |
|
|
237
|
+
| Floating Jira-style dialog to view/edit one record without leaving the page | `WorkspaceWindow` | Modal-based floating panel, not page navigation; pairs with `WorkspaceTray` |
|
|
238
|
+
|
|
239
|
+
### File pickers — `FileUpload` vs `FileUploader`
|
|
240
|
+
|
|
241
|
+
| Need | Component | Why |
|
|
242
|
+
| --- | --- | --- |
|
|
243
|
+
| Real `File`/Blob objects to actually upload (FormData/API) | `FileUpload` | Controlled; `onFilesUploaded` carries real `File[]` and validates accept/size with rejection messages |
|
|
244
|
+
| 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 |
|
|
245
|
+
|
|
246
|
+
Both export a type named `FileUploaderProps` — the one re-exported from the package root (`src/index.ts`) describes `FileUpload`, not `FileUploader`. Check which folder a type came from before trusting the name.
|
|
247
|
+
|
|
248
|
+
### Viewing files — `MediaViewer` / `FilePreview` / `PdfViewer` / `ProfilePhotoViewer`
|
|
249
|
+
|
|
250
|
+
Four components open a file, and only one of them is the general answer.
|
|
251
|
+
|
|
252
|
+
| Need | Component | Why |
|
|
253
|
+
| --- | --- | --- |
|
|
254
|
+
| A gallery of mixed media with next/prev, a filmstrip and per-type stages | `MediaViewer` | The full lightbox: image/video/audio/pdf/doc stages, keyboard nav, fullscreen, download. Collapses the filmstrip and stepper automatically for a single item |
|
|
255
|
+
| One file, click-to-open, no gallery | `FilePreview` | Lighter controlled modal; auto-detects type, zoom/rotate for images |
|
|
256
|
+
| Always-visible inline PDF panel in the page flow | `PdfViewer` | Non-modal, PDF-only, small open/download toolbar |
|
|
257
|
+
| Crop/preview a user avatar | `ProfilePhotoViewer` | Avatar-specific, not a general file viewer |
|
|
258
|
+
|
|
259
|
+
`PdfViewer` and `FilePreview` both render a PDF through the identical unstyled `<embed type="application/pdf">` with no error handling if the browser can't render it inline — neither tells you when that happens. `MediaViewer` does handle it: formats a browser cannot decode (`.avi`, `.mkv`, `.m3u8`, `.heic`, `.tiff`) render an icon and a file-type chip with a download action instead of a blank frame.
|
|
260
|
+
|
|
261
|
+
`MediaViewer.labels` takes a `Partial<MediaViewerLabels>` — that type and `defaultMediaViewerLabels` are both exported from the package root, so you can merge rather than restate every string.
|
|
262
|
+
|
|
263
|
+
`MediaViewer`'s `index`/`onIndexChange` are now optional: omit both for uncontrolled (it owns the index, starting at `defaultIndex ?? 0`), or pass both to control it. Passing `index` without `onIndexChange` freezes the viewer — every nav path has nowhere to write the new index — and now warns loudly in dev.
|
|
264
|
+
|
|
265
|
+
### `HeaderActionsProps` describes a different component than `HeaderActions`
|
|
266
|
+
|
|
267
|
+
The value `HeaderActions` comes from `Components/Header/HeaderActions.tsx`, which declares its props inline. The type `HeaderActionsProps` re-exported from the package root comes from `Components/Table/TableProps.tsx` — the *table's* internal bulk-action bar. Typing a `HeaderActions` usage with `HeaderActionsProps` compiles into the wrong shape.
|
|
268
|
+
|
|
269
|
+
**Apply:** don't annotate `HeaderActions` with `HeaderActionsProps`. Let the props infer from the component, or use `React.ComponentProps<typeof HeaderActions>`. Same trap as `FileUploaderProps` above — check which folder a type came from before trusting the name.
|
|
270
|
+
|
|
271
|
+
### Confirm prompts — `ConfirmDialog` vs `AlertDialog` vs `Modal`
|
|
272
|
+
|
|
273
|
+
| Need | Component | Why |
|
|
274
|
+
| --- | --- | --- |
|
|
275
|
+
| A delete/deactivate prompt with a header swatch and a red Confirm | `ConfirmDialog` | The shared shape behind the library's confirm modals; `tone="destructive"` (the default) fills Confirm red |
|
|
276
|
+
| A simple two-button yes/no | `AlertDialog` | Lighter; `confirmButtonText`/`cancelButtonText`, `tone="danger"` for a red Confirm |
|
|
277
|
+
| Anything else | `Modal` | Named slots only — see the slot gotcha below |
|
|
278
|
+
|
|
279
|
+
**`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.
|
|
280
|
+
|
|
281
|
+
`iconBg` and `iconColor` are **required** and take raw colour strings, so the caller resolves the tone. Read them from `useCustomTheme()` — a hardcoded hex there is stuck in light mode.
|
|
282
|
+
|
|
283
|
+
### Busy indicators — `Spinner` vs `Backdrop` vs `Loading`
|
|
284
|
+
|
|
285
|
+
| Need | Component | Why |
|
|
286
|
+
| --- | --- | --- |
|
|
287
|
+
| Inline busy mark in a row, cell or button area | `Spinner` | The package-root `Spinner` is the themed one (accent colour, own xs–xl `size` scale), not Chakra's raw spinner |
|
|
288
|
+
| **Scrim over the page or one panel — the default for new work** | **`Backdrop`** | `variant="dim"` by default: black at 0.5, no blur, 225ms in / 195ms out, 40px spinner. `container` scopes it, `onClick` dismisses, `invisible` blocks without painting |
|
|
289
|
+
| Let clicks reach the page while a scrim is showing | `Backdrop allowBackgroundInteraction` | Drops `pointer-events` on the scrim **and** its transition wrapper. `onClick` cannot fire while set — that is the trade |
|
|
290
|
+
| Existing screens already using it | `Loading` | The older API. Its default `variant="frosted"` keeps the heavier house scrim (0.6 + 4px blur) so nothing shifts; `variant="dim"` routes it through `Backdrop` |
|
|
291
|
+
|
|
292
|
+
**Never hand-roll a scrim.** A `position: fixed` `Box` with your own `rgba()` will not match the
|
|
293
|
+
Modal/Drawer overlay, will not fade, and will not follow dark mode. `Backdrop` is the one owner.
|
|
294
|
+
|
|
295
|
+
One trap if you build anything similar yourself: setting `pointer-events: none` on your overlay is
|
|
296
|
+
not enough when the overlay sits inside a transition wrapper — the wrapper keeps capturing clicks.
|
|
297
|
+
`Backdrop` sets it on both.
|
|
298
|
+
|
|
299
|
+
### Data states — `EmptyState` / `ErrorState` / `QueryStateBoundary`
|
|
300
|
+
|
|
301
|
+
| Need | Component | Why |
|
|
302
|
+
| --- | --- | --- |
|
|
303
|
+
| "Nothing here yet" with an optional action | `EmptyState` | Neutral placeholder |
|
|
304
|
+
| A failed load with retry | `ErrorState` | `role="alert"`, `onRetry`/`isRetrying` built in |
|
|
305
|
+
| One fetch that can be loading, failed, empty or ready | `QueryStateBoundary` | Picks for you: loading > error > empty > `children` |
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Known gotchas (silent failures)
|
|
310
|
+
|
|
311
|
+
### Defaults changed in 2.4.2-beta.44 — read this first when upgrading from beta.43
|
|
312
|
+
|
|
313
|
+
| Component | beta.43 → beta.44 | Restore the old look |
|
|
314
|
+
| --- | --- | --- |
|
|
315
|
+
| Fields, selects, buttons (`Button`, `TextInput`, `InputTextArea`, `NumberInput`, DatePicker family, `Select`, `SelectV2`, `SearchSelect`, `SelectSearch`, `Search`, `Dropdown`, `SegmentedControl`) | Default size `md` → `sm` (35px). One scale for all: xs 28 / sm 35 / md 40 / lg 48 — `md` is now 40px everywhere (`TextInput` was 44, selects 38, `SegmentedControl` ~36). `TimePicker` has no `size` (fixed `sm`); `SegmentedControl` has no `xs` | `size="md"` |
|
|
316
|
+
| `Button` | Text one step smaller (sm 14→13px, md 16→14, lg 18→16). Busy = spinner only, width kept (was "Loading" + spinner). Outline: 1px border, hover is a tint, not a fill | `loadingText="Loading"` |
|
|
317
|
+
| `Tag` | `solid`/`md` → `subtle`/`sm`. Hover + pointer only with `onTagClick`; `maxW` truncates with the full text as a title. Exact heights 20/24/28/32, weight 500, 1px inset ring (never adds height); subtle is a light tint with ink ≥ 6.5:1 | `variant="solid" size="md"` |
|
|
318
|
+
| `resolveSoftTone` | `bg`/`border` are now translucent (alpha hex) — composite onto the surface before `contrastRatio`; optional 3rd `surface` arg; adds `hoverBg`/`activeBg`. Badge/Alert/Toaster/EmptyState follow | — |
|
|
319
|
+
| `resolveFilledSurface` | Still white-first; when a white-labelled fill would vanish on the canvas (zinc dark primary) it falls back to a light fill with dark ink. Takes `background` in `colors` now | — |
|
|
320
|
+
| `Checkbox` / `RadioButton` | Box 16/20/24 → 14/16/20; label 14px; 1px border; one fill rung for every `colorScheme`. **`RadioButton colorScheme` now applies** (was always primary) | — |
|
|
321
|
+
| `ToggleSwitch` / `SegmentedControl` / `TableToggle` | Off track lifted to 3:1; thumb ink flips on light fills. Radius `lg`; `TableToggle` tooltips = button names, `aria-pressed` | — |
|
|
322
|
+
| `MultiSelect` | Default `md` → `sm`; real `<label>`; shared two-tone focus ring | `size="md"` |
|
|
323
|
+
| Selected rows (`Dropdown`, `SelectV2`, `SearchSelect`, `SelectSearch`, `MoreItems`, `Table` filters, menus) | Dark aliases `backgroundColor.tertiary` to the panel, so a selected row sat at 1.025:1 and was invisible. It is now lifted to a perceptible step. Light is byte-identical on eight brands; `zinc` moves slightly, having been below the step too | — |
|
|
324
|
+
| `tertiary` | Was an exact copy of `secondary` on six brands and of `primary` on three, so `colorScheme="tertiary"` rendered as another scheme. Now a real third accent: `primary`'s hue turned 60° at `secondary`'s luminances, so contrast is unchanged | use `secondary` |
|
|
325
|
+
| `SelectV2` | Trigger is now `div[role=combobox]`, not `<button>` — widen a `useRef<HTMLButtonElement>` to `HTMLDivElement`; assert `aria-disabled`, not `toBeDisabled()`. `isMulti` shows removable `Tag` chips (`maxVisibleChips`, default 6, then `+N`); Backspace removes the last; `maxLabelsBeforeSummary` now only shapes the `aria-label`. Read-only is `data-readonly`, not `aria-readonly` | custom `renderValue` for text |
|
|
326
|
+
| `SearchSelect` / `SelectSearch` | Menu radius `lg` → `xl`, shadow `lg`. `SearchSelect`'s button triggers are now `role=button` named `"Label: value"`; only the text input is `role=combobox` — update `getByRole("combobox")` queries | — |
|
|
327
|
+
| `TextInput` | **`type="password"` now auto-renders a show/hide toggle** — a plain password field gains a button it did not have in beta.43. Suppressed automatically when `inputRightIcon` is set, so a hand-rolled toggle never doubles up; `isPasswordToggleDisabled` opts out entirely. Also new: `variant` (`outline` default / `filled` / `flushed`), `isClearable`, `showCharacterCount` + `maxLength`, `inputLeftAddon`/`inputRightAddon`, `isLoading`. `inputStyle`/`leftElementStyle`/`rightElementStyle` are now `SystemProps` and `inputGroupStyle` is `CSSProperties` — all four were bare `object`, so a wrong key that used to compile now fails | `isPasswordToggleDisabled` |
|
|
328
|
+
| 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` |
|
|
329
|
+
| `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 |
|
|
330
|
+
| `SettingsSection` | New optional `action` slot, right of the title/description on the header row — additive, nothing changes without it | — |
|
|
331
|
+
| `Button` / `Buttons` | Icon-only buttons are square. `Buttons` (plural) is themed instead of hardcoded purple | — |
|
|
332
|
+
| `ProgressBar` | Fill lifted to ≥ 3:1 on its track — green/orange/blue/cyan are visibly darker in light mode | — |
|
|
333
|
+
| `PhoneNumberInput` / `PinInput` / `NoteTextArea` | `ref` now attaches; labels bound; PIN digits grouped and named | — |
|
|
334
|
+
| `RangeDatePicker` | Outside click keeps a fully picked range (was discarded) | — |
|
|
335
|
+
| `FilePreview` / `ContactForm` | Radius `2xl` → `xl` | — |
|
|
336
|
+
| `Avatar` / `Timeline` / `Table` | Generated avatar fills now guarantee ≥ 4.5:1 initials (a name may get a different shade); Timeline rail lifted to 3:1; Table status/filter chips use the soft recipe; stray radii → `lg`/`xl`/`full` | — |
|
|
337
|
+
| `AlertDialog` | Yes/No → Confirm/Cancel; Cancel is a neutral gray outline (was red) | `confirmButtonText`/`cancelButtonText`; `tone="danger"` for a red Confirm |
|
|
338
|
+
| `Modal` | Page scroll now locks (`blockScrollOnMount` was silently off); `motionPreset="scale"`; theme scrim (60% black + blur) — drop any `overlaybackdropFilter` hue-rotate workaround; `isLoading` keeps header + close button | `blockScrollOnMount={false}` |
|
|
339
|
+
| `Toaster` | `showToast` returns an id; `update(id, patch)` / `close(id)`; `loading` toasts never auto-dismiss | pass `duration` |
|
|
340
|
+
| `ToolTip` | `openDelay` 0 → 300ms; 13px themed look | `openDelay={0}` |
|
|
341
|
+
| `InputTextArea` / `FileUpload` / `TextInput` | Width 500px → 100% / `maxSizeKB` 5 → 5120 / no default "Placeholder" text | `width="500px"` / — (5 KB was a bug) / — |
|
|
342
|
+
| `DatePicker` (no `pickerType`) | Inference is case-sensitive: `MM` is month, `mm` minutes. `dd/MM/yyyy` was misread as date+time and showed time selects; it is now date-only | `pickerType="datetime"` |
|
|
343
|
+
| `EmptyState` | Title is an `h3`; image is decorative (`alt=""`, was the title) | `titleAs`, `imageAlt` |
|
|
344
|
+
| Theme `Badge` / `Card` / field labels | Badge: pill, no uppercase, default `sm`. Card: default variant `outline`. Label colour `text[700]`; helper/error row 12px | `size`/`variant` props |
|
|
345
|
+
| `Header` | `position: sticky; top: 0`, z-index `sticky` (1100, was 1000); `rightSlot` mounts once, not per layout | — |
|
|
346
|
+
| `Table` | Radius `xl`; row height 32/40/52 by density; filter button is named "Filter {label}" (tests querying "Search" break); client pagination resets to page 1 when `data.length` changes | — |
|
|
347
|
+
| `KanbanBoard` | `height`/`maxH` props replace the clipping wrapper; `height="100%"` needs a parent with a definite height | — |
|
|
348
|
+
| `ProfileCard` / `SideBar` | `variant="outlein"` now draws an outline; header divider 1px `boxborder[200]` / mobile backdrop uses the shared scrim | — |
|
|
349
|
+
| `SideBar` | Scroll-container and submenu ids are generated (`useId`) — `#sidebar-scroll-container` / `#submenu-<label>` no longer exist; row heights fixed 20/32/48; count badges use soft tone | — |
|
|
350
|
+
| `ToggleSwitch` | No `aria-required` on the switch (invalid for `role=switch`); `isRequired` still shows `*` | — |
|
|
351
|
+
| `KanbanBoard` / `PdfViewer` / `UserDetails` | Cards, drag handles and toolbar links get accessible names; scroll panels are focusable regions; `UserDetails` badges 12px | — |
|
|
352
|
+
| `NumberInput` / `FileUpload` | Steppers exactly half the field height; drop-zone border 1px (was 2px) | — |
|
|
353
|
+
| `HeaderActions` | Edit/Create are real `<button>`s (keyboard reachable, focus ring); select named by `select.ariaLabel` or its placeholder | — |
|
|
354
|
+
| `SearchSelect` | New `aria-label` prop for fields without a visible `label` | — |
|
|
355
|
+
| New root exports | `mergeRefs`/`setRef`, `rafThrottle`, `toWords`, `useDebouncedCallback`/`useDebouncedValue`, and the chart theming kit (`getCategoricalSeriesColors`, `chartInk`, `labelOnSeries`, …) — previously internal-only | — |
|
|
356
|
+
| `toWords` | Now splits camelCase (`nextFollowUp` → `Next Follow Up`), so `Timeline`/`KanbanBoard` auto-labels read correctly instead of `Nextfollowup` | pass an explicit label |
|
|
357
|
+
| Focus rings (all controls) | `focusRing.ring` is now the brand accent itself (lavender `#8B3FC8`), not a near-black band — the white halo already separates it from a filled control | — |
|
|
358
|
+
| `Tag` | Label line-height 1.45 so descenders (`p`, `g`, `y`) are no longer clipped by the ellipsis overflow | — |
|
|
359
|
+
| `Toaster` | `error` toasts announce assertively (`role="alert"`); status icons have a text equivalent | — |
|
|
360
|
+
| `FeedbackForm` | Built on `TextInput`/`InputTextArea`/`RadioButtonGroup`; required fields show `*` in the label | — |
|
|
361
|
+
| `PinInput` | `size` now works (square cells 28/35/40/48, default `sm`) — it was silently ignored | `size="md"` |
|
|
362
|
+
| `Tag` | New `leadingIcon` (decorative, before the label) and `isDisabled` (sets `aria-disabled` + native `disabled` on the clickable/remove buttons, so they leave the tab order — not just dimmed) | — |
|
|
363
|
+
| `ToolTip` | Defaults a Popper `preventOverflow` padding of 8px, so a bubble near the right edge no longer overhangs by a subpixel and raises page scrollbars. A caller-supplied `preventOverflow` modifier still wins | pass your own `modifiers` |
|
|
364
|
+
| `Table` / `KanbanBoard` | Column sort buttons and draggable cards now show the library focus ring on keyboard focus (was an opacity flicker / the browser default outline). Kanban card wrappers render as Chakra `Box`; keyboard drag (Space, arrows, Space) is unchanged | — |
|
|
365
|
+
| `Search` / `FilterBar` / `SettingRow` / `NoteTextArea` | `Search` names itself from `placeholder` when there's no `label`/`aria-label`. `FilterBar` wraps `search` in a `role="search"` landmark named by `searchLabel` (default "Search"). `SettingRow` auto-wires an unnamed `control` to the row's title/description via `aria-labelledby`/`aria-describedby` unless it already has its own `aria-label`. `NoteTextArea` adds `titleAriaLabel`/`noteAriaLabel` (default "Note title" / `customPlaceholder`) | — |
|
|
366
|
+
|
|
367
|
+
### Removed barrel exports → what to import instead (beta.44)
|
|
368
|
+
|
|
369
|
+
Every name below stopped resolving from `pixelize-design-library` in beta.44. Each is a **compile
|
|
370
|
+
error**, never a silent swap, and each has an owned replacement that is already exported. Props
|
|
371
|
+
differ — this is a rewrite of the call site, not a rename.
|
|
372
|
+
|
|
373
|
+
| No longer exported | Import instead | Note |
|
|
374
|
+
| --- | --- | --- |
|
|
375
|
+
| `Input` | `TextInput` | Owns its label, helper/error text and password toggle |
|
|
376
|
+
| `Textarea` | `InputTextArea` | |
|
|
377
|
+
| `ChakraModal`, `ModalContent`, `ModalOverlay`, `ModalCloseButton`, `ChakraModalHeader`, `ChakraModalBody`, `ChakraModalFooter` | `Modal` | `Modal` renders the overlay, content and close button itself — drop those three. **`ModalHeader`/`ModalBody`/`ModalFooter` are still exported** and are still how you fill it; only the `Chakra`-prefixed aliases went. Header text can come from `title`/`subtitle` instead |
|
|
378
|
+
| `ChakraCard`, `CardBody` | `Card` | `header`/`footer` slots + `bodyProps` |
|
|
379
|
+
| `ChakraSelect` | `Select` | |
|
|
380
|
+
| `Radio`, `RadioGroup` | `RadioButton` / `RadioButtonGroup` | |
|
|
381
|
+
| `Skeleton` | `Skeletons` | Takes `borderRadius` |
|
|
382
|
+
| `Progress` | `ProgressBar` | |
|
|
383
|
+
| `AccordionItem`, `AccordionButton`, `AccordionPanel`, `AccordionIcon` | `Accordion` | Takes an `items` array, not compound children |
|
|
384
|
+
| `SliderTrack`, `SliderFilledTrack`, `SliderThumb`, `SliderMark` | `Slider` / `RangeSlider` | Owned components; the Chakra sub-parts are gone |
|
|
385
|
+
|
|
386
|
+
**Ten names still resolve** and only narrowed their props — `Accordion`, `Avatar`, `AvatarGroup`,
|
|
387
|
+
`RangeSlider`, `Spinner`, `Tab`, `TabList`, `TabPanel`, `TabPanels`, `Tabs`. They now point at the
|
|
388
|
+
library's own themed component rather than the Chakra passthrough.
|
|
389
|
+
|
|
390
|
+
### `Tag`'s `onIconClick` renders nothing without `icon` — the remove button silently never appears
|
|
391
|
+
|
|
392
|
+
`onIconClick` only turns `icon` into a remove button; it has no effect on its own (`Tag.tsx`
|
|
393
|
+
`{icon && (onIconClick ? … : …)}`). Passing `onIconClick` alone — expecting a default close
|
|
394
|
+
affordance the way Chakra's own `TagCloseButton` or AntD's `closable` work — compiles fine and
|
|
395
|
+
renders a plain tag with no way to remove it.
|
|
396
|
+
|
|
397
|
+
**Apply:** always pass both `icon` (e.g. `lucide-react`'s `X`) and `onIconClick` together for a
|
|
398
|
+
removable chip. `icon` alone (no `onIconClick`) is the decorative case — a plain right-side icon
|
|
399
|
+
with no click affordance, aria-hidden.
|
|
400
|
+
|
|
401
|
+
### A rounded box with `overflow: hidden` clips glyphs at the corners — never round the clipping element
|
|
402
|
+
|
|
403
|
+
`border-radius` reshapes the overflow clip, so a pill-shaped element with `overflow: hidden`
|
|
404
|
+
clips text along an **ellipse**, not a rectangle. A leading `p`, `j`, `g`, `q` or `y` loses part
|
|
405
|
+
of its descender to the bottom-left curve. It looks like a font or line-height problem; it is not.
|
|
406
|
+
This shipped in `Tag`, where the label carried both `borderRadius: "full"` (to round its focus
|
|
407
|
+
ring) and `overflow: hidden` (for `text-overflow: ellipsis`).
|
|
408
|
+
|
|
409
|
+
The two cannot live on the same element. `overflow-clip-margin` does not rescue it either:
|
|
410
|
+
`text-overflow: ellipsis` needs a non-`clip` horizontal axis, and mixing `hidden`/`clip` across
|
|
411
|
+
axes collapses both to `hidden`, which makes the margin inert.
|
|
412
|
+
|
|
413
|
+
**Apply:** keep the radius on the outer element and put `overflow: hidden` +
|
|
414
|
+
`text-overflow: ellipsis` on a square (`borderRadius: 0`) child. Chakra's `TagLabel` also forces
|
|
415
|
+
`noOfLines={1}` as a style prop, which outranks the theme — pass `noOfLines={undefined}` to drop
|
|
416
|
+
it. In your own components, the same rule holds for any rounded chip, avatar or badge that clips
|
|
417
|
+
its own text. The `/tag` playground's "Glyph clipping" section renders every letter leading and
|
|
418
|
+
trailing at all four sizes as the visual check.
|
|
419
|
+
|
|
420
|
+
### `colorScheme="tertiary"` is a real third accent from beta.44 (it used to be a duplicate)
|
|
421
|
+
|
|
422
|
+
Through beta.43 `tertiary` was an exact copy of `secondary` on six brands and of `primary` on three,
|
|
423
|
+
so the two schemes were indistinguishable. It is now `primary`'s hue turned 60° re-solved to
|
|
424
|
+
`secondary`'s luminances, so every contrast guarantee is unchanged.
|
|
425
|
+
|
|
426
|
+
**Apply:** `secondary` vs `tertiary` is now a real visual distinction on every brand except `zinc`,
|
|
427
|
+
which is near-grey and has almost no hue to turn — use a semantic scheme (`blue`, `teal`, `purple`)
|
|
428
|
+
there if the two categories must read apart.
|
|
429
|
+
|
|
430
|
+
### Your own overlay painted `background[50]` sinks into the dark canvas
|
|
431
|
+
|
|
432
|
+
In dark mode `background[50]` equals the page canvas on 8 of 9 brands. Library dialogs, drawers,
|
|
433
|
+
popovers and menus now paint `colors.surfaceRaised` — identical `#ffffff` in light, one elevation
|
|
434
|
+
step up in dark. A custom panel, popover or `ModalContent bg=` in an app should read
|
|
435
|
+
`surfaceRaised` too, and a divider inside it `raisedRule(colors)`.
|
|
436
|
+
|
|
437
|
+
### `Drawer` / `Modal` / `ProfileCard` drop any child that isn't a named slot
|
|
438
|
+
|
|
439
|
+
All three match children by exact type (`child.type === XHeader/XBody/XFooter`) and render only
|
|
440
|
+
those matches — nothing else in `children` is ever read. A sibling among the slots (a nested
|
|
441
|
+
`Modal`, `AlertDialog`, a confirm dialog, a portal after the footer) silently never mounts. All
|
|
442
|
+
three now unwrap **one** `<>...</>` level around a slot (so `<>{cond && <DrawerFooter>...}</>`
|
|
443
|
+
still renders) and spread styling props (`padding`, `borderBottom`, `sx`, …) from the matched slot
|
|
444
|
+
onto the real header/body/footer — a second nested fragment, or any other wrapper element, still
|
|
445
|
+
drops the slot silently.
|
|
446
|
+
|
|
447
|
+
**Apply:** put a confirm dialog **outside** the `Drawer`/`Modal`/`ProfileCard`, as a sibling in a
|
|
448
|
+
wrapping fragment — never among the header/body/footer slots. When a ternary picks between bodies,
|
|
449
|
+
branch into a variable rendered inside one body slot, rather than returning fragment-wrapped slots
|
|
450
|
+
per branch. `Drawer`'s misspelled `vaiant` is `@deprecated` — use `variant`.
|
|
451
|
+
|
|
452
|
+
### `QueryStateBoundary` evaluates JSX `children` even while loading
|
|
453
|
+
|
|
454
|
+
JSX children are built before the boundary decides what to show, so `data.items.map(...)` crashes
|
|
455
|
+
while `data` is still `undefined`. **Apply:** pass `children` as a function — `{() => <List
|
|
456
|
+
items={data.items} />}` — whenever it reads data that may not exist yet.
|
|
457
|
+
|
|
458
|
+
### `StatCard`'s delta colour follows `trend` vs `goodDirection`, not `trend` alone
|
|
459
|
+
|
|
460
|
+
Green when `trend === goodDirection`, red otherwise — a falling cost with `goodDirection="down"` is
|
|
461
|
+
green. Pass `onClick` for a clickable card (it renders its own `<button>`); never wrap it in one.
|
|
462
|
+
|
|
463
|
+
### A clickable `TextInput` icon is a real button — give it a name
|
|
464
|
+
|
|
465
|
+
With `onRightIconclick`/`onLeftIconClick` the icon renders as a `<button>`. Without
|
|
466
|
+
`rightIconAriaLabel`/`leftIconAriaLabel` it is announced as "{label}: right icon action".
|
|
467
|
+
|
|
468
|
+
### `SelectSearch`'s `isRequired` shows the asterisk but never announces "required"
|
|
469
|
+
|
|
470
|
+
`SelectSearch` sets `aria-required` by hand on its Chakra `Input`, but Chakra's `useFormControl`
|
|
471
|
+
re-adds its own `"aria-required"` key *after* spreading your props, computed from the surrounding
|
|
472
|
+
`FormControl`. That `FormControl` is never given `isRequired`, so the attribute is recomputed as
|
|
473
|
+
undefined and stripped. Verified by DOM dump: the rendered `<input>` carries no `aria-required`
|
|
474
|
+
even when `isRequired` is passed. The visible asterisk comes from a separate custom label, so the
|
|
475
|
+
field *looks* required to sighted users and is silent to a screen reader.
|
|
476
|
+
|
|
477
|
+
**Apply:** `SelectSearch` is `@deprecated` — use `Select` (`native={false}`), which marks required
|
|
478
|
+
state on a plain `Box` combobox that Chakra does not rewrite. If you must stay on `SelectSearch`,
|
|
479
|
+
set the required state on your own wrapping `FormControl`. Note the obvious one-line fix inside the
|
|
480
|
+
component is not neutral: Chakra's `useFormControl` also emits native `required`, which would add
|
|
481
|
+
browser validation to a *filter* input that was never submitted before.
|
|
482
|
+
|
|
483
|
+
### `Select` with `onSearchChange` no longer filters locally (beta.48)
|
|
484
|
+
|
|
485
|
+
Passing `onSearchChange` means the server owns matching, so `Select` stops applying its own
|
|
486
|
+
substring filter to `options`. Before this, a fuzzy or ranked server result whose label did not
|
|
487
|
+
literally contain the typed text was fetched and then hidden. Pass `filterOptions={true}` to keep
|
|
488
|
+
the local pass on top, or `filterOptions={false}` to drop it even without `onSearchChange`.
|
|
489
|
+
|
|
490
|
+
**Apply:** if a server-backed `Select` suddenly shows more rows than it used to, that is this fix,
|
|
491
|
+
not a regression. Paged `Select`s should also pass `hasMore={false}` once the last page lands —
|
|
492
|
+
without it, `onLoadMore` fires again every time the user reaches the bottom.
|
|
493
|
+
|
|
494
|
+
### `Select` with `isMulti` keeps picks that leave `options` (beta.48)
|
|
495
|
+
|
|
496
|
+
`onChange` used to be built from the options currently in the list, so replacing `options` with a
|
|
497
|
+
server-search result silently dropped every earlier pick the new page did not contain — the chips
|
|
498
|
+
vanished and the next selection emitted a truncated array. Selected options are now remembered
|
|
499
|
+
independently of `options`.
|
|
500
|
+
|
|
501
|
+
**Apply:** nothing to change. If you worked around this by merging the old selection back in
|
|
502
|
+
yourself, that workaround is now redundant.
|
|
503
|
+
|
|
504
|
+
### `Table`'s column search covers every page (beta.48)
|
|
505
|
+
|
|
506
|
+
The per-column search box used to run after the page slice, so it matched only the rows on screen
|
|
507
|
+
while the pager still counted the whole data set. It now runs first: the page count, the
|
|
508
|
+
`1 - 20 of N` readout and the rows all come from the matched set, and a new search returns to page
|
|
509
|
+
1. Under `paginationMode="server"` the client still only sees the loaded page — filter on the
|
|
510
|
+
server there.
|
|
511
|
+
|
|
512
|
+
**Apply:** a client-side table that looked like it had "no matches" past page 1 now finds them.
|
|
513
|
+
|
|
514
|
+
### `Select`'s `onChange` never fires for the built-in placeholder
|
|
515
|
+
|
|
516
|
+
`Select` resolves the changed value against its `options` list and calls `onChange` only on a hit.
|
|
517
|
+
The built-in `placeholder` renders as its own empty-value option, which isn't in `options` — so
|
|
518
|
+
picking it resolves to no match and nothing fires. An "Any / All / None" reset built on the
|
|
519
|
+
placeholder alone is a dead control; the value snaps back and no filter clears.
|
|
520
|
+
|
|
521
|
+
**Apply:** fine for a plain pick-one-of-N. For a clearable filter, add an explicit
|
|
522
|
+
`{ id: "", label: "Any" }` entry to `options` instead of relying on the placeholder. With
|
|
523
|
+
`isReadOnly`, `onChange` never fires at all.
|
|
524
|
+
|
|
525
|
+
### `MultiSelect` is an email-chip input, not a picker
|
|
526
|
+
|
|
527
|
+
Despite the name, `MultiSelect` takes **no `options` prop at all**. Typed text is validated as an
|
|
528
|
+
email address and rejected if it doesn't match — there is no way to choose from a product/entity
|
|
529
|
+
list.
|
|
530
|
+
|
|
531
|
+
**Apply:** use `Select` with `isMulti` to pick multiple values from an options list.
|
|
532
|
+
|
|
533
|
+
### `Table`'s `onRowClick` is dead if every column has a `node` renderer
|
|
534
|
+
|
|
535
|
+
Row-click is gated **per column**, not per row: a column supplying a custom `node` renderer
|
|
536
|
+
swallows the click on that cell. Give every column a `node` and `onRowClick` becomes dead code —
|
|
537
|
+
accepted, typed, never called.
|
|
538
|
+
|
|
539
|
+
**Apply:** leave at least one column without a `node`, or put an explicit control inside a `node`
|
|
540
|
+
renderer instead of relying on row click.
|
|
541
|
+
|
|
542
|
+
### `error` without `errorMessage` renders the literal word "Error" — and erases `helperText`
|
|
543
|
+
|
|
544
|
+
Every field that shows validation errors (`TextInput`, `InputTextArea`, `Select`, `MultiSelect`,
|
|
545
|
+
`SelectV2`, `SearchSelect`, `SelectSearch`, `Search`, `Checkbox`, the `DatePicker` variants,
|
|
546
|
+
`PhoneNumberInput`) falls back to the literal word **"Error"** when `error` is `true` but
|
|
547
|
+
`errorMessage` is empty. Worse, `helperText` only renders when `!error` — so the guidance
|
|
548
|
+
disappears exactly when it's needed.
|
|
549
|
+
|
|
550
|
+
**Apply:** never pass `error` without `errorMessage`. Gate `error` on a `touched` flag so a field
|
|
551
|
+
whose defaults arrive asynchronously doesn't open already red.
|
|
552
|
+
|
|
553
|
+
### A wrapper presetting a prop must destructure with a default, not rely on JSX prop order
|
|
554
|
+
|
|
555
|
+
Wrapping a library component to preset a prop (e.g. `Table`'s `variant`) as
|
|
556
|
+
`<Table variant="studio" {...props} />` silently reverts to the library's own default the moment a
|
|
557
|
+
caller passes `variant={undefined}` — a later spread always wins in JSX, even with `undefined`,
|
|
558
|
+
and the library component resolves that `undefined` via its own default parameter.
|
|
559
|
+
|
|
560
|
+
**Apply:**
|
|
561
|
+
```tsx
|
|
562
|
+
const AppTable = ({ variant = 'studio', ...props }: TableProps) => <Table variant={variant} {...props} />;
|
|
563
|
+
```
|
|
564
|
+
Applies to any library prop with a default value, not just `Table`'s `variant`.
|
|
565
|
+
|
|
566
|
+
### `FormWrapper` has a closed prop list — no `...rest`
|
|
567
|
+
|
|
568
|
+
It destructures exactly `{ icon, text, children }` and forwards nothing else to either the outer
|
|
569
|
+
wrapper or the bordered content `Box` — a `data-testid`, `id`, a margin override, or an `onClick` on
|
|
570
|
+
the wrapper all silently disappear, and TypeScript won't catch it since excess-property checks don't
|
|
571
|
+
apply to spreads.
|
|
572
|
+
|
|
573
|
+
**Apply:** wrap `FormWrapper` in your own `Box` when you need margin, a test hook, or an id on the
|
|
574
|
+
section — don't expect anything but `icon`/`text`/`children` to reach the DOM.
|
|
575
|
+
|
|
576
|
+
### `ContactForm`'s `apiKey` prop is a POST URL, not an auth token
|
|
577
|
+
|
|
578
|
+
Despite the name, `apiKey` is passed straight into `fetch(apiKey, { method: "POST" })` as the submit
|
|
579
|
+
endpoint — never sent as a header or credential. A real API key/secret fails silently as an invalid
|
|
580
|
+
URL, surfaced only as a generic "Failed to send message" alert. There's no `headers` prop, so an
|
|
581
|
+
authenticated endpoint can't be reached through this component at all.
|
|
582
|
+
|
|
583
|
+
**Apply:** pass the full POST URL, never a token. If the endpoint needs auth headers, proxy through
|
|
584
|
+
your own backend instead.
|
|
585
|
+
|
|
586
|
+
### `ContactForm` can't tell its parent the submission result
|
|
587
|
+
|
|
588
|
+
It does its own internal `fetch` and renders its own success/error alert from local state — there is
|
|
589
|
+
no `onSuccess`, `onSubmit`, or `onError` prop (a dead `// onSubmit(formData)` line is the only trace
|
|
590
|
+
one ever existed). A call site can't redirect, toast, or update its own state when the enquiry sends.
|
|
591
|
+
Separately, the email field is validated for format but its "required" check is commented out, so a
|
|
592
|
+
blank email submits successfully with no error shown.
|
|
593
|
+
|
|
594
|
+
**Apply:** if the parent needs to react to success, this component can't provide it. Don't rely on
|
|
595
|
+
`email` being enforced as required — validate it yourself first if that matters.
|
|
596
|
+
|
|
597
|
+
### `VerifyEmailOtp` can't accept alphanumeric codes
|
|
598
|
+
|
|
599
|
+
It wraps Chakra's `PinInput` without forwarding a `type`, so Chakra's `type="number"` default
|
|
600
|
+
applies — any letter typed is silently rejected (the character never appears, no error shown).
|
|
601
|
+
`VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description` text also
|
|
602
|
+
always gets a hardcoded second line appended — "your new Pixel Account" — with no prop to remove it.
|
|
603
|
+
|
|
604
|
+
**Apply:** only use this component for numeric-only OTPs with product copy that matches that exact
|
|
605
|
+
trailing phrase. Otherwise build the card from `PinInput` plus your own text.
|
|
606
|
+
|
|
607
|
+
### `ApexLineChart` only ever renders one line, frozen at mount
|
|
608
|
+
|
|
609
|
+
`data`/`series` changes after the first render are silently ignored unless the component remounts
|
|
610
|
+
(no effect syncs later prop changes into state); `series` only reads index 0 for the line's name
|
|
611
|
+
despite the plural name; `variant="realtime"` replaces your data with random numbers on an interval
|
|
612
|
+
rather than animating it. Its `legendStyle` prop also type-checks but has no effect, unlike the
|
|
613
|
+
identical prop on `ApexPieChart`/`ApexPolarCharts`.
|
|
614
|
+
|
|
615
|
+
**Apply:** remount (`key`) `ApexLineChart` when the underlying data changes. Don't use
|
|
616
|
+
`variant="realtime"` expecting it to reflect a live feed.
|
|
617
|
+
|
|
618
|
+
### `ApexPieChart`'s `showDataLabels` can be silently overridden by chart height
|
|
619
|
+
|
|
620
|
+
With the default `labelPlacement="auto"`, a **numeric** `height` under 240 forces labels off even
|
|
621
|
+
with `showDataLabels={true}` — no warning. Slices under `minLabelPercent` (default 8%) render blank
|
|
622
|
+
label text rather than being hidden as a unit.
|
|
623
|
+
|
|
624
|
+
**Apply:** pass `labelPlacement="inside"`/`"outside"` explicitly for small numeric-height charts;
|
|
625
|
+
lower `minLabelPercent` when every slice needs a visible value.
|
|
626
|
+
|
|
627
|
+
### `ApexBarChart` and `ApexAreaChart` silently drop `data` when `series` is also passed
|
|
628
|
+
|
|
629
|
+
`series` always wins over `data` with no warning, on both components — a natural mistake when
|
|
630
|
+
migrating from single- to multi-series. Separately, `ApexBarChart`'s `barColor` array only paints one
|
|
631
|
+
color per bar when `distributed={true}`; with the default `false`, every bar takes `barColor[0]` and
|
|
632
|
+
the rest of the array is silently unused. `ApexRadialChart`'s `hollowSize` has its own unrelated trap
|
|
633
|
+
— it's silently overridden to a fixed `"52%"` whenever `variant="multi"`.
|
|
634
|
+
|
|
635
|
+
**Apply:** never pass `data` and `series` together on `ApexBarChart`/`ApexAreaChart`. Set
|
|
636
|
+
`distributed` whenever `ApexBarChart`'s `barColor` has more than one color. Don't expect
|
|
637
|
+
`ApexRadialChart`'s `hollowSize` to apply under `variant="multi"`.
|
|
638
|
+
|
|
639
|
+
### `Skeletons`' `isLoaded` and `borderRadius` only work for `type="skeleton"`
|
|
640
|
+
|
|
641
|
+
`type="circle"`/`"text"` never receive `isLoaded`, `borderRadius` (or `children`/`bg`/`color`/
|
|
642
|
+
`fadeDuration`) — passing them compiles and is silently dropped; the shimmer never stops no matter
|
|
643
|
+
what `isLoaded` is set to. Neither `Skeletons` nor `ProgressBar` forwards a `ref`; `ProgressBar`'s
|
|
644
|
+
`color` is `@deprecated` (use `colorScheme`).
|
|
645
|
+
|
|
646
|
+
**Apply:** for `circle`/`text`, control visibility by conditionally rendering the `Skeletons` element
|
|
647
|
+
itself, not via `isLoaded`.
|
|
648
|
+
|
|
649
|
+
### Five exports start with `Notification` and only one of them is a notification tray
|
|
650
|
+
|
|
651
|
+
Autocomplete offers `Notification`, `NotificationBell`, `NotificationPanel`, `NotificationList` and
|
|
652
|
+
`NotificationItem`. They are not a family — `Notification` is a standalone countdown card from a
|
|
653
|
+
different era, and picking it for an inbox row is the common mistake.
|
|
654
|
+
|
|
655
|
+
| Export | What it actually is |
|
|
656
|
+
| --- | --- |
|
|
657
|
+
| `NotificationBell` | The badge/bell button only. Requires `aria-label`; it renders no list |
|
|
658
|
+
| `NotificationPanel` | The tray the bell opens — zones, filters, loading/error/empty/data |
|
|
659
|
+
| `NotificationList` | The panel's scrolling body without the panel chrome — owns the day bucketing and `groupKey` collapsing |
|
|
660
|
+
| `NotificationItem` | One inbox row: the tone-driven chassis the list paints for each item |
|
|
661
|
+
| `Notification` | **Not deprecated.** A dated countdown card — its dot colour comes from `dueDate`/`endDate` math, not from a tone. `NotificationItem` cannot replace it: `formatRelativeTime` clamps every future date to "Just now" |
|
|
662
|
+
|
|
663
|
+
`Notification` is kept only because nothing else does that date-driven countdown; it is not a thin
|
|
664
|
+
alias, so it has not been removed.
|
|
665
|
+
|
|
666
|
+
**Apply:** for a notification tray use `NotificationBell` + `NotificationPanel`. For rows inside your
|
|
667
|
+
own layout use `NotificationList` or `NotificationItem`. Reach for `Notification` only when you
|
|
668
|
+
specifically want the deadline-countdown card, and read the gotcha below before you do.
|
|
669
|
+
|
|
670
|
+
### `Notification`'s `onClick` only reaches the title text, and its status dot has two gates
|
|
671
|
+
|
|
672
|
+
`onClick` is wired solely to the title text — the card, avatar, and description are not clickable
|
|
673
|
+
despite the generic prop name. Separately, `warningColor`/`errorColor`/`successColor` only take
|
|
674
|
+
effect when `showStatus` is also `true`, and populating `notification.status` (e.g. `"blocked"`) has
|
|
675
|
+
no effect at all — the dot's color comes purely from `dueDate`/`endDate` math.
|
|
676
|
+
|
|
677
|
+
**Apply:** for a fully clickable card, wrap it yourself with your own `onClick`. Always pair the
|
|
678
|
+
three color overrides with `showStatus`; don't use `status` to drive dot color.
|
|
679
|
+
|
|
680
|
+
### `FeedbackForm` shows a success toast and resets even with no `onSubmit`/`submitUrl`
|
|
681
|
+
|
|
682
|
+
Both props are optional, and when neither is provided, submit still falls through to the success
|
|
683
|
+
toast and form reset — validation, spinner, and reset all work end-to-end while the payload is never
|
|
684
|
+
sent or captured anywhere. Separately, `defaultValues` only seeds state at mount (no resync if it
|
|
685
|
+
arrives later from an async fetch), and its toast is Chakra's raw `useToast`, not this library's
|
|
686
|
+
`Toaster` — the same portal issue documented for `Toaster`/`Modal` can silently hide it when this
|
|
687
|
+
form is embedded in a `Modal`.
|
|
688
|
+
|
|
689
|
+
**Apply:** always pass `onSubmit` or `submitUrl` — treat a bare `<FeedbackForm />` as a bug, not a
|
|
690
|
+
minimal valid usage. Key the element to force a remount if `defaultValues` arrives late. Verify the
|
|
691
|
+
toast actually appears if embedding inside a `Modal`.
|
|
692
|
+
|
|
693
|
+
### `Checkbox`'s `variant` is a no-op
|
|
694
|
+
|
|
695
|
+
Typed and accepted, but `Checkbox.styles.ts` defines no `variants` key, so no value changes the
|
|
696
|
+
look. (`error` now sets `isInvalid` and links its message — no need to pass both.)
|
|
697
|
+
|
|
698
|
+
### `Slider`'s pagination dots can desync from the visible slide
|
|
699
|
+
|
|
700
|
+
The main track sorts `images` by `order`; the pagination dots map over the unsorted array. Passing
|
|
701
|
+
`images` out of `order` sequence makes the active dot point at the wrong slide.
|
|
702
|
+
|
|
703
|
+
**Apply:** pre-sort `images` by `order` before passing them in.
|
|
704
|
+
|
|
705
|
+
### `TextLabel`'s `isInformation` alone renders no icon — it also needs `informationMessage`
|
|
706
|
+
|
|
707
|
+
The info-tooltip icon is gated on `isInformation && informationMessage` — both must be truthy or
|
|
708
|
+
nothing renders, not even a bare icon. `TextLabel` is the shared label engine behind most fields in
|
|
709
|
+
the library (`TextInput`, `NumberInput`, `PhoneNumberInput`, `RadioButton`, `PinInput`,
|
|
710
|
+
`InputSwitch`, `SelectV2`, the `DatePicker` family, `InputTextArea`, `SelectSearch`, `Search`,
|
|
711
|
+
`SearchSelect`, `MultiSelect`, `Select`), so the same silent no-op repeats at every one of them.
|
|
712
|
+
|
|
713
|
+
**Apply:** always pass `isInformation` and `informationMessage` together; never treat
|
|
714
|
+
`isInformation` alone as "use a default message."
|
|
715
|
+
|
|
716
|
+
### `ErrorComponent`'s `error` prop is the message text itself — the opposite of `error`+`errorMessage`
|
|
717
|
+
|
|
718
|
+
Every other field in the library pairs a boolean `error` with a string `errorMessage`.
|
|
719
|
+
`ErrorComponent` (used internally by `Input`) instead takes `error: string` directly as
|
|
720
|
+
the message, with no internal truthy-check — passing `error=""` still draws the full icon next to
|
|
721
|
+
blank text. It also has no `id`, so unlike `ErrorMessage` it can't be wired to `aria-describedby`.
|
|
722
|
+
|
|
723
|
+
**Apply:** treat `ErrorComponent` as `Input`-specific, not a general error row; guard it
|
|
724
|
+
with a truthy-message check yourself, and use `ErrorMessage` for any other field.
|
|
725
|
+
|
|
726
|
+
### `FormattedDescription`'s single-`*italic*` marker strips the asterisks but applies no italic style
|
|
727
|
+
|
|
728
|
+
`**bold**` works; a lone `*word*` silently renders as plain text with the markers removed, reading
|
|
729
|
+
as though the formatting was simply ignored.
|
|
730
|
+
|
|
731
|
+
**Apply:** don't rely on single-asterisk emphasis in `content` strings — use `**bold**` or plain text.
|
|
732
|
+
|
|
733
|
+
### `Timeline`'s `onEditNote` editor doesn't auto-close without `editNoteLoading` — unlike add-note
|
|
734
|
+
|
|
735
|
+
Add-note has a back-compat fallback that closes its editor immediately if `addNoteLoading` is never
|
|
736
|
+
wired. Edit-note has no equivalent fallback — its only close path is an effect watching
|
|
737
|
+
`editNoteLoading` transition `true → false`. Wire `onEditNote` without `editNoteLoading` and Save
|
|
738
|
+
looks like it does nothing: the form stays open with no error or feedback.
|
|
739
|
+
|
|
740
|
+
**Apply:** always pass `editNoteLoading` alongside `onEditNote`, even a client-only flag flipped
|
|
741
|
+
right after the call resolves.
|
|
742
|
+
|
|
743
|
+
### `Timeline`'s `events` prop is `@deprecated` and still renders nothing
|
|
744
|
+
|
|
745
|
+
Pass `timelineEvents`; `events` (and the `TimelineEvent` type) is never read, not even as a fallback.
|
|
746
|
+
Rows are now static unless you pass `onEventClick`.
|
|
747
|
+
|
|
748
|
+
### `Timeline` drops events with an unparseable `created_at`, with no visible trace
|
|
749
|
+
|
|
750
|
+
An event whose formatted date resolves to `"Invalid Date"` is excluded from every date group — not
|
|
751
|
+
shown in a fallback bucket, just gone. The only signal is a `console.warn` inside the formatter.
|
|
752
|
+
|
|
753
|
+
**Apply:** validate/normalize `created_at` before handing events to `Timeline` — a bad timestamp is
|
|
754
|
+
silent, total content loss for that row.
|
|
755
|
+
|
|
756
|
+
### `Reorder`'s `onReorder` fires even when nothing moved
|
|
757
|
+
|
|
758
|
+
A drag that ends back at its starting index still has a drop target and still calls `onReorder` with
|
|
759
|
+
a new array reference in the same order.
|
|
760
|
+
|
|
761
|
+
**Apply:** compare source/destination index (or diff the array) before persisting a reorder, if a
|
|
762
|
+
no-op write matters. `showRemoveIcon`/`onRemove` are declared on `ReorderListProps` and work as
|
|
763
|
+
expected; a missing-name item's image alt falls back to `item-<1-based position>`.
|
|
764
|
+
|
|
765
|
+
### `Divider` isn't exported from the package at all
|
|
766
|
+
|
|
767
|
+
`src/Components/Divider/` doesn't appear in `src/index.ts`, though it still compiles into `dist/`
|
|
768
|
+
and is deep-import-reachable. The library's own `Divider` is always vertical, fixed size/color,
|
|
769
|
+
zero props — a different thing from the general-purpose (horizontal, styleable) `Divider`
|
|
770
|
+
re-exported from the `Primitives` barrel.
|
|
771
|
+
|
|
772
|
+
**Apply:** for a divider in a consuming app, use the `Divider` from `Primitives`, not this library's
|
|
773
|
+
own.
|
|
774
|
+
|
|
775
|
+
### `KanbanActions` is exported but still not wired into `KanbanBoard`
|
|
776
|
+
|
|
777
|
+
`KanbanBoard`'s header select/edit/create bar is driven by its own `kanbanSelect`/`kanbanEdit`/
|
|
778
|
+
`kanbanCreate` props, via a different internal component. `KanbanActions` is a separate, standalone
|
|
779
|
+
component (exported from the package root as of 2.4.2-beta.39) that a consumer must render and wire
|
|
780
|
+
up itself — its `options`-driven buttons always render with no permission gating, unlike
|
|
781
|
+
`KanbanBoard`'s own header actions, which respect `permissions.isEditable`/`isCreatable`.
|
|
782
|
+
|
|
783
|
+
**Apply:** use `KanbanBoard`'s own `kanbanSelect`/`kanbanEdit`/`kanbanCreate` props for the board's
|
|
784
|
+
built-in header actions. Reach for `KanbanActions` only when building a custom toolbar outside
|
|
785
|
+
`KanbanBoard`, and gate it yourself — it has no permissions awareness of its own.
|
|
786
|
+
|
|
787
|
+
### `KanbanBoard`'s `permissions.isEditable: false` disables card drag but not column-reorder drag
|
|
788
|
+
|
|
789
|
+
Card `Draggable`s get `isDragDisabled={!canDrag}`; the column-reorder `Draggable` (active when
|
|
790
|
+
`enableColumnReorder` is true) never checks it — a "read-only" board still lets users reorder whole
|
|
791
|
+
columns.
|
|
792
|
+
|
|
793
|
+
**Apply:** also set `enableColumnReorder={false}` to fully lock a read-only board.
|
|
794
|
+
|
|
795
|
+
### `KanbanBoard`'s `collapsedColumns` only seeds initial state — not a live controlled prop
|
|
796
|
+
|
|
797
|
+
It seeds a `useState` lazy initializer once, on mount. Without the `preferences` feature wired, a
|
|
798
|
+
later render passing a different `collapsedColumns` value does nothing, despite the name implying a
|
|
799
|
+
controlled value.
|
|
800
|
+
|
|
801
|
+
**Apply:** to force a column open/closed post-mount without `preferences`, remount the board (change
|
|
802
|
+
its `key`) rather than re-passing the prop.
|
|
803
|
+
|
|
804
|
+
### `KanbanBoard`'s `account.customNode` silently drops delete/open/expand for that one card
|
|
805
|
+
|
|
806
|
+
An item with `customNode` set renders that function instead of `AccountCard`, so `onDelete`,
|
|
807
|
+
`onOpen`, `isDeletable`, and expand/collapse never apply — even though they read as board-wide
|
|
808
|
+
props. Mixing plain and `customNode` items in one column produces inconsistent per-card behavior.
|
|
809
|
+
|
|
810
|
+
**Apply:** don't expect board-wide card actions to reach a `customNode` card; wire them inside your
|
|
811
|
+
custom render instead.
|
|
812
|
+
|
|
813
|
+
### `KanbanBoard`'s `AccountCard` only renders string-typed fields, and labels are the raw key
|
|
814
|
+
|
|
815
|
+
A numeric field on an `Account` (allowed by its index signature) is never shown in the card's field
|
|
816
|
+
list. The label is the key with only its first letter capitalised — `account_name` renders
|
|
817
|
+
"Account_name", `nextFollowUp` renders "NextFollowUp"; nothing splits words.
|
|
818
|
+
|
|
819
|
+
**Apply:** keep numeric display values as strings; use keys that read acceptably as-is.
|
|
820
|
+
|
|
821
|
+
### `KanbanBoard`'s `onColumnDelete` receives the deleted column's **card** ids, not the column's id
|
|
822
|
+
|
|
823
|
+
Despite the callback parameter being named `colId`-adjacent, what's actually passed is
|
|
824
|
+
`columns[colId].items.map(item => item.id)` — the cards that were in the column, never the column's
|
|
825
|
+
own id.
|
|
826
|
+
|
|
827
|
+
**Apply:** track which column was being deleted another way (e.g. hover/selection state captured
|
|
828
|
+
before the click) if you need the column id itself.
|
|
829
|
+
|
|
830
|
+
### `isRequired` is decorative on some fields, native on others — same prop name, different behavior
|
|
831
|
+
|
|
832
|
+
`NumberInput` and the internal `Input.tsx` set native `required` (browser bubble, blocks submit).
|
|
833
|
+
`TextInput` and `InputTextArea` set only `aria-required` — announced, but no native validation.
|
|
834
|
+
`PhoneNumberInput` and `PinInput` pass it only to the label (draws a `*`); the field gets nothing.
|
|
835
|
+
|
|
836
|
+
**Apply:** don't rely on `isRequired` for native form validation — validate required fields yourself
|
|
837
|
+
regardless of which component you're using.
|
|
838
|
+
|
|
839
|
+
### `NoteTextArea`'s `saveButtonLoading` going `true → false` clears the draft even on a failed save
|
|
840
|
+
|
|
841
|
+
The effect that resets note/title/files fires whenever `saveButtonLoading` goes falsy — there's no
|
|
842
|
+
separate success/failure signal, so a parent that turns off the loading flag after a failed save
|
|
843
|
+
silently discards everything the user typed.
|
|
844
|
+
|
|
845
|
+
**Apply:** don't flip `saveButtonLoading` back to `false` on failure without your own recovery path
|
|
846
|
+
(e.g. keep the draft in your own state and re-seed it).
|
|
847
|
+
|
|
848
|
+
### `InputSwitch` now renders `ToggleSwitch` — `.chakra-switch__*` selectors match nothing
|
|
849
|
+
|
|
850
|
+
`InputSwitch` is `@deprecated` and wraps `ToggleSwitch`, which is not a Chakra `Switch`. An `sx`
|
|
851
|
+
targeting `.chakra-switch__track`/`__thumb` still compiles and lands on the wrapper, but styles
|
|
852
|
+
nothing. `colorScheme` and `isReadOnly` are real now (colorScheme used to be silently discarded);
|
|
853
|
+
`variant`/`spacing`/`isFocusable` stay typed `@deprecated` no-ops. **Apply:** migrate to
|
|
854
|
+
`ToggleSwitch` (`fieldLabel` for the label InputSwitch drew above the track) and drop those selectors.
|
|
855
|
+
|
|
856
|
+
**This breaks tests, not types.** Chakra's `Switch` rendered `role="checkbox"`; `ToggleSwitch`
|
|
857
|
+
renders the correct `role="switch"`, so `getByRole("checkbox", { name })` silently stops matching
|
|
858
|
+
while everything still compiles. Two consumer repos hit this on the beta.44 upgrade. **Apply:**
|
|
859
|
+
change those queries to `getByRole("switch", …)`.
|
|
860
|
+
|
|
861
|
+
Same shape of trap on `Tabs`: the owned `Tab` forwards no `data-testid`, so `getByTestId("…-tab-…")`
|
|
862
|
+
queries must become `getByRole("tab", { name })`.
|
|
863
|
+
|
|
864
|
+
### The internal `Input.tsx` silently ignores six declared props
|
|
865
|
+
|
|
866
|
+
`disabled`, `autoComplete`, `autoFocus`, `inputClassName`, `labelClassName`, and `errorClassName`
|
|
867
|
+
are all typed on `InputProps` but never read — passing them, `disabled` especially, compiles cleanly
|
|
868
|
+
and does nothing. It also has no `id` field, so its label always renders as an unassociated `<span>`.
|
|
869
|
+
|
|
870
|
+
**Apply:** this is an internal component (not exported) reachable only via deep import — prefer
|
|
871
|
+
`TextInput` for anything public-facing, which doesn't have this gap.
|
|
872
|
+
|
|
873
|
+
### `AlertDialog`'s `colorScheme`/`size`/`status`/`variant`/`addRole` are dead props
|
|
874
|
+
|
|
875
|
+
Typed but never read, and `@deprecated` as a group (editors may not strike each one through). Use
|
|
876
|
+
`tone="danger"` for a red Confirm, or `button1Style`/`button2Style`.
|
|
877
|
+
|
|
878
|
+
### `AlertDialog`'s `onClose` also fires on Escape and overlay click
|
|
879
|
+
|
|
880
|
+
`closeOnEsc`/`closeOnOverlayClick` default to `true`, and every dismiss path calls the same
|
|
881
|
+
`onClose`. **Apply:** don't read `onClose` as "the user chose Cancel"; pass both as `false` when
|
|
882
|
+
only the buttons may close it.
|
|
883
|
+
|
|
884
|
+
### `ToolTip`'s `overflowOnly` silently no-ops on non-single-element children
|
|
885
|
+
|
|
886
|
+
The truncation ref only attaches when `children` passes `React.isValidElement` — a bare string, a
|
|
887
|
+
Fragment, or multiple children skip that branch, so the tooltip always shows instead of
|
|
888
|
+
only-when-truncated (the opposite of the prop's contract).
|
|
889
|
+
|
|
890
|
+
**Apply:** give `overflowOnly`/`OverflowToolTip` exactly one real element as `children` (e.g. a
|
|
891
|
+
single `Text noOfLines`), never a Fragment or bare text.
|
|
892
|
+
|
|
893
|
+
### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
|
|
894
|
+
|
|
895
|
+
`children` is `@deprecated` and never read — only `title`/`description`/`actions` render. The `onClose` you pass to `showToast` is wired to
|
|
896
|
+
Chakra's `onCloseComplete` (fires after the exit animation, on any dismiss path); the `onClose` your
|
|
897
|
+
`actions` render-prop receives is a different, immediate per-toast dismiss function.
|
|
898
|
+
|
|
899
|
+
**Apply:** pass `description`, not `children`. Don't assume your `onClose` fires the instant the
|
|
900
|
+
user clicks close — it fires after the exit transition completes.
|
|
901
|
+
|
|
902
|
+
### `ButtonGroupIcon`'s dropdown needs `rightIcon` **and** `rightIconDropdown` both set
|
|
903
|
+
|
|
904
|
+
The `Menu`/`dropdownOptions` branch only renders inside `rightIcon && rightIconDropdown`. Supplying
|
|
905
|
+
`dropdownOptions` alone, or `rightIconDropdown` without `rightIcon`, silently renders nothing on the
|
|
906
|
+
right side. Separately, `onButtongroupClick` is wired to Chakra `ButtonGroup`'s own `onClick` on the
|
|
907
|
+
wrapping div — native DOM bubbling means it fires on every click inside the group (left icon, center
|
|
908
|
+
button, right icon/dropdown), not just a "clicked outside the buttons" signal.
|
|
909
|
+
|
|
910
|
+
**Apply:** always set `rightIcon` + `rightIconDropdown={true}` together for the dropdown. Don't use
|
|
911
|
+
`onButtongroupClick` to detect background clicks — inspect `event.target` if you need to distinguish.
|
|
912
|
+
|
|
913
|
+
### `Buttons` (plural) is not a group wrapper
|
|
914
|
+
|
|
915
|
+
Despite the plural name suggesting a group, `Buttons` is now a thin wrapper over one themed
|
|
916
|
+
`Button` (its `className` is `@deprecated`), and it isn't exported from the package root.
|
|
917
|
+
|
|
918
|
+
**Apply:** use `Button` for a single themed button or `ButtonGroupIcon` for a themed group; there is
|
|
919
|
+
no good reason to reach for `Buttons`.
|
|
920
|
+
|
|
921
|
+
### `Card` already wraps `children` in a padded `CardBody` — a nested one doubles the padding
|
|
922
|
+
|
|
923
|
+
`header`/`footer` now render, and `children` sit in a flex `CardBody` laid out by `direction`/
|
|
924
|
+
`align`/`justify`. Code written for the old Card that nested its own `CardBody` now gets padding
|
|
925
|
+
twice. `colorScheme` does nothing (the Card theme never reads it) and `color` is its `@deprecated` alias; the three divider props are `@deprecated` and
|
|
926
|
+
draw nothing.
|
|
927
|
+
|
|
928
|
+
**Apply:** drop the nested `CardBody`, or pass `bodyProps={{ p: 0 }}`.
|
|
929
|
+
|
|
930
|
+
### `ProductCard`'s variant selection goes stale after an `options` update, and `options={[]}` crashes it
|
|
931
|
+
|
|
932
|
+
Both `ProductCard` and its internal `ProductPrice` capture `options[0]` into state only once, at
|
|
933
|
+
mount, with no resync effect — a later re-render with refreshed `options` (new stock/price) is
|
|
934
|
+
silently ignored, so Add to Cart/Notify Me act on stale data. An empty array crashes on
|
|
935
|
+
`selected.label`. Separately, `description` and `avalabilitys` are typed and accepted but never
|
|
936
|
+
read by the component.
|
|
937
|
+
|
|
938
|
+
**Apply:** treat `options` as effectively static per mount (remount via `key` if it changes), and
|
|
939
|
+
never pass `[]`. Don't rely on `description`/`avalabilitys` — there's currently no way to show either.
|
|
940
|
+
|
|
941
|
+
### `ProductTags` (shared by `ProductCard`/`ProductDetails`) silently renders zero tags past 4
|
|
942
|
+
|
|
943
|
+
The row-layout helper only handles 1-4 entries — 5 or more tags renders nothing at all, no
|
|
944
|
+
truncation or "+N more" affordance.
|
|
945
|
+
|
|
946
|
+
**Apply:** cap `tags` at 4 entries at the call site until the component adds an overflow case.
|
|
947
|
+
|
|
948
|
+
### `PaymentCard`'s `onHover` never fires its `"card"` variant, and the CTA hides unless `isRenewal`
|
|
949
|
+
|
|
950
|
+
`onHover`'s type promises `"card" | "button"`, but no hover handler exists on the outer plan card —
|
|
951
|
+
only the CTA button wires hover. Separately, the CTA (and its callbacks) disappears whenever
|
|
952
|
+
`isActive` is true unless `isRenewal` is also set, regardless of `plan.buttonText`.
|
|
953
|
+
|
|
954
|
+
**Apply:** don't build "card" hover analytics on this prop. Pass `isRenewal` to show a CTA on the
|
|
955
|
+
current/active plan.
|
|
956
|
+
|
|
957
|
+
### `OrganizationDetails`' `defaultOrg === 1` silently overrides an explicit `canDelete: true`
|
|
958
|
+
|
|
959
|
+
`isProtected` is computed as `item.defaultOrg === 1 || canProtect` — `defaultOrg` short-circuits the
|
|
960
|
+
`canDelete`/role check unconditionally. An org that is both the user's default and marked
|
|
961
|
+
`canDelete: true` still renders a disabled delete button, with only a tooltip explaining why.
|
|
962
|
+
|
|
963
|
+
**Apply:** don't rely on `canDelete` alone to guarantee delete is enabled — check `defaultOrg` too.
|
|
964
|
+
|
|
965
|
+
### `OrganizationDetails`, `CustomModulesTable`'s create/edit/delete modals show no error UI on rejection
|
|
966
|
+
|
|
967
|
+
`onCreateOrganization`/`onDeleteOrganization`/`onEditOrganization` (and `CustomModulesTable`'s
|
|
968
|
+
`onUpdateModule`/`onDeleteModule`) are `await`ed and the modal only resets on success — a rejection
|
|
969
|
+
is an unhandled promise rejection with zero visible feedback.
|
|
970
|
+
|
|
971
|
+
**Apply:** wrap your own handler in try/catch and show your own error toast; the library never does
|
|
972
|
+
it for you.
|
|
973
|
+
|
|
974
|
+
### `OrgSwitcher`'s `onChange` doesn't fire on re-selecting the already-active org, and has a closed prop list
|
|
975
|
+
|
|
976
|
+
Re-clicking the current org closes the popover but skips `onChange` entirely (`org.id !== value` gate)
|
|
977
|
+
— don't rely on it for a side effect that must run on every click (analytics, refetch). Separately,
|
|
978
|
+
the trigger has no `...rest`/`ref` escape hatch: a `data-testid`, `id`, or positioning `ref` can't
|
|
979
|
+
reach it.
|
|
980
|
+
|
|
981
|
+
**Apply:** don't depend on `onChange` firing for a repeat pick. There's no supported way to attach
|
|
982
|
+
test hooks or a ref to the trigger.
|
|
983
|
+
|
|
984
|
+
### `UpgradeButton`'s gold icon accent silently falls back to the label color on low contrast
|
|
985
|
+
|
|
986
|
+
The gold accent is only used when it clears AA contrast against both gradient stops; a custom
|
|
987
|
+
`gradient` prop can flip it to the label's own ink color with no signal.
|
|
988
|
+
|
|
989
|
+
**Apply:** don't assume the icon stays gold with a custom `gradient` — check contrast yourself if the
|
|
990
|
+
gold accent is load-bearing for your design.
|
|
991
|
+
|
|
992
|
+
### `PlanPill`/`PlanBadge` always render as a real, focusable `<button>` — even with no `onClick`
|
|
993
|
+
|
|
994
|
+
`as="button"`, `cursor="pointer"`, and the hover-lift are unconditional. Omitting the optional
|
|
995
|
+
`onClick` does not get you a static/informational pill — it stays tabbable and screen-reader
|
|
996
|
+
-announced as a button regardless.
|
|
997
|
+
|
|
998
|
+
**Apply:** there is currently no way to get a non-interactive plan badge from this component.
|
|
999
|
+
|
|
1000
|
+
### `LimitReachedModal`'s `onUpgrade` never triggers `onClose`, and needs both `limit` and `used` to show usage
|
|
1001
|
+
|
|
1002
|
+
Clicking the CTA calls only `onUpgrade` — confirmed by the component's own test. Separately, the
|
|
1003
|
+
inline usage line renders only when **both** `limit` and `used` are non-nullish; passing just one
|
|
1004
|
+
silently omits the whole line.
|
|
1005
|
+
|
|
1006
|
+
**Apply:** close the modal yourself inside your `onUpgrade` handler if upgrading should dismiss it.
|
|
1007
|
+
Always pass `limit`/`used` together, or neither.
|
|
1008
|
+
|
|
1009
|
+
### `CustomModulesTable`'s `ModuleItem.module_id` is the one snake_case field on an otherwise camelCase type
|
|
1010
|
+
|
|
1011
|
+
A loosely-typed API response cast straight to `ModuleItem[]` can leave `module_id: undefined` with
|
|
1012
|
+
no compile error, colliding React `key`s.
|
|
1013
|
+
|
|
1014
|
+
**Apply:** map the API field explicitly to `module_id` — don't assume this type is uniformly
|
|
1015
|
+
camelCase like its sibling payload type (`UpdateModulePayload.moduleId`).
|
|
1016
|
+
|
|
1017
|
+
### `RolesPermission`'s permission matrix silently reroutes every column for an "Automation" row
|
|
1018
|
+
|
|
1019
|
+
Any `permissions[]` row whose `module` case-insensitively equals `"automation"` collapses every
|
|
1020
|
+
column onto a single `automation` boolean — only the Read cell renders/toggles, and clicking it
|
|
1021
|
+
calls `onPermissionChange(module, "automation")`, not `"read"`. Separately, `roles_id` (typed
|
|
1022
|
+
`string`) is coerced via `Number()` before `onDeleteRole` fires — a UUID or ObjectId silently
|
|
1023
|
+
becomes `NaN`.
|
|
1024
|
+
|
|
1025
|
+
**Apply:** if a row's `module` can be `"automation"`, expect only its Read checkbox to work, toggling
|
|
1026
|
+
`automation` — create/edit/delete/import/export are unreachable for that row. Only pass
|
|
1027
|
+
numeric-string `roles_id` values.
|
|
1028
|
+
|
|
1029
|
+
### Several delete/deactivate modals close before their async handler can be awaited
|
|
1030
|
+
|
|
1031
|
+
`RolesPermission`'s `DeleteRoleModal` and `UserDetails`' `DeactivateConfirmModal` call their
|
|
1032
|
+
handlers fire-and-forget (typed plain `() => void`) and close synchronously in the same tick — the
|
|
1033
|
+
opposite failure mode from the create/edit modals above, whose handlers are genuinely awaited.
|
|
1034
|
+
|
|
1035
|
+
**Apply:** any `isLoading`/spinner wiring for delete/deactivate can never be seen — handle
|
|
1036
|
+
loading/error UI outside these two modals (e.g. a toast).
|
|
1037
|
+
|
|
1038
|
+
### `UserDetails`' Change Role and Resend Invitation buttons silently no-op when `userId` is null
|
|
1039
|
+
|
|
1040
|
+
Only Deactivate actually disables itself when `selectedUser.userId` is null — the other two stay
|
|
1041
|
+
visually enabled and do nothing on click. Separately, `ChangeRoleModal` pre-selects the current role
|
|
1042
|
+
by case-insensitive **label text** match, not an id — any mismatch (whitespace, a renamed role)
|
|
1043
|
+
silently opens the modal with nothing pre-selected, no error shown.
|
|
1044
|
+
|
|
1045
|
+
**Apply:** always populate `selectedUser.userId` when those two actions should be usable. Keep
|
|
1046
|
+
`currentRole` as the exact display label kept in sync with `roleOptions[].label`.
|
|
1047
|
+
|
|
1048
|
+
### `FileUploader`'s `onFilesChange` discards the real `File`, and its `acceptTypes`/`maxFiles` enforce nothing
|
|
1049
|
+
|
|
1050
|
+
`FileUploader` hands back lightweight `{id, name, size, previewUrl}` metadata — the original `File`
|
|
1051
|
+
is discarded in `handleFiles`, so it can never back an actual upload. `acceptTypes` only sets the
|
|
1052
|
+
native picker's `accept` attribute; drag-and-drop ignores it completely and no code path rejects a
|
|
1053
|
+
wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
|
|
1054
|
+
|
|
1055
|
+
**Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
|
|
1056
|
+
|
|
1057
|
+
### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
|
|
1058
|
+
|
|
1059
|
+
`RangeDatePicker` never reads `pickerType` — whether time inputs show is controlled entirely by
|
|
1060
|
+
whether `dateFormat` contains time tokens. Separately, every time-capable picker caps at minute
|
|
1061
|
+
granularity regardless of `dateFormat` — a format containing `ss` compiles and parses but seconds
|
|
1062
|
+
are never user-editable.
|
|
1063
|
+
|
|
1064
|
+
**Apply:** for a range picker, control the time row via `dateFormat`, never `pickerType`. Don't
|
|
1065
|
+
request second-precision input from any DatePicker variant.
|
|
1066
|
+
|
|
1067
|
+
### `SingleDatePicker`/`TimeOnlyPicker` default to `Date` objects — opt into strings with `valueFormat="iso"`
|
|
1068
|
+
|
|
1069
|
+
By default `selectedDate`/`value`/`onChange` speak `Date`. `valueFormat="iso"` switches one instance
|
|
1070
|
+
to strings: `yyyy-MM-dd` (date), `HH:mm` (time, 24h), local `yyyy-MM-dd'T'HH:mm:ss` (datetime, no
|
|
1071
|
+
offset). An unparsable string reads as `null`. `RangeDatePicker` and legacy `DatePicker` stay Date-only.
|
|
1072
|
+
|
|
1073
|
+
**Apply:** use this instead of `TextInput type="date"/"time"` plus hand-rolled ISO parsing.
|
|
1074
|
+
|
|
1075
|
+
### `TimeOnlyPicker` ignores the date-range props and `autoComplete`
|
|
1076
|
+
|
|
1077
|
+
Label and `name` now work. `minDate`/`maxDate`/`disableFutureDates`/`disablePastDates` are still
|
|
1078
|
+
dropped, and `autoComplete` is forced to `"off"`. `DatePicker`'s `disabled`/`placeholderText` are
|
|
1079
|
+
`@deprecated` — use `isDisabled`/`placeholder` (the new name wins when both are set).
|
|
1080
|
+
|
|
1081
|
+
### `Editor`'s `config` prop can silently break dark mode, and its `key` prop can never reach Jodit
|
|
1082
|
+
|
|
1083
|
+
`Editor` computes `config.theme`/`config.popupRoot` itself to fix Jodit's dark-mode/popup theming,
|
|
1084
|
+
then spreads your `config` on top — any `theme`/`popupRoot` key you pass wins and silently disables
|
|
1085
|
+
the fix. Separately, `key` is typed as if readable, but React reserves and strips it before the
|
|
1086
|
+
component sees `props`, so it's always `undefined` internally and can't force a remount. `editorRef`
|
|
1087
|
+
is also `null` until Jodit's lazy-loaded chunk resolves — a mount-time effect reading it gets nothing.
|
|
1088
|
+
|
|
1089
|
+
**Apply:** never set `theme`/`popupRoot` inside the `config` you pass to `Editor`. To force a
|
|
1090
|
+
remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key` prop.
|
|
1091
|
+
|
|
1092
|
+
### `Editor`'s Jodit toolbar is fixed for screen readers and keyboard, from our wrapper only
|
|
1093
|
+
|
|
1094
|
+
Jodit's own markup (`node_modules/jodit`) put `aria-label` on each button's `role="listitem"`
|
|
1095
|
+
wrapper instead of the real inner `<button>`, used the invalid ARIA role `"trigger"` for its
|
|
1096
|
+
dropdown-chevron spans, gave `listitem` no `role="list"` ancestor, and ships every toolbar button
|
|
1097
|
+
at `tabindex="-1"` unless `config.allowTabNavigation` is on — so by default the toolbar failed
|
|
1098
|
+
axe's `button-name`/`aria-roles`/`aria-required-parent` and was entirely unreachable by keyboard.
|
|
1099
|
+
`Editor` now sets `allowTabNavigation: true` by default (same override rule as `theme`/`popupRoot`
|
|
1100
|
+
above — a value you pass in `config` wins) and runs a `MutationObserver`-backed DOM pass
|
|
1101
|
+
(`joditAccessibility.ts`) that copies each button's real name onto it and fixes the two roles.
|
|
1102
|
+
|
|
1103
|
+
**Apply:** nothing — this is automatic. Set `config.allowTabNavigation: false` only if you
|
|
1104
|
+
deliberately want the toolbar out of the tab order; you'll reintroduce the keyboard-reachability gap.
|
|
1105
|
+
|
|
1106
|
+
### `SelectV2`, `SearchSelect`, and `SelectSearch` all search `option.label` only
|
|
1107
|
+
|
|
1108
|
+
None of the three checks a rendered secondary field (`option.description`, a custom `view` node,
|
|
1109
|
+
`option.email` on a profile row) — typing text that's visibly on-screen in a secondary field returns
|
|
1110
|
+
no match.
|
|
1111
|
+
|
|
1112
|
+
**Apply:** if a secondary field needs to be searchable, fold it into `option.label` yourself, or
|
|
1113
|
+
pre-filter `options` before passing them in.
|
|
1114
|
+
|
|
1115
|
+
### `SearchSelect` never virtualizes
|
|
1116
|
+
|
|
1117
|
+
Despite the prop name, `virtualization` does nothing — every filtered option renders as a real DOM
|
|
1118
|
+
node. Page a large dataset in via `pagination` instead. (`chip.maxChips={0}` now works: no chips,
|
|
1119
|
+
just "+N".)
|
|
1120
|
+
|
|
1121
|
+
### `SelectSearch`'s Enter key requires an exact full-label match, not the keyboard-highlighted option
|
|
1122
|
+
|
|
1123
|
+
Typing a partial query and pressing Enter without arrowing down first does not pick the
|
|
1124
|
+
visually-highlighted top option — it only fires if the typed text exactly equals an option's full
|
|
1125
|
+
label. `SelectV2`/`SearchSelect` both correctly select the highlighted option on Enter; `SelectSearch`
|
|
1126
|
+
doesn't. Two more props (`isSearchEnabled`, `BottomIconStyle`) are typed but never read, and
|
|
1127
|
+
`initialSelectedOption` only seeds selection at mount with no resync if the real value arrives later.
|
|
1128
|
+
|
|
1129
|
+
**Apply:** tell users to arrow down before Enter with this component specifically. Don't pass
|
|
1130
|
+
`initialSelectedOption` before the real value is known (or key the component to force a remount).
|
|
1131
|
+
|
|
1132
|
+
### `FieldSelectModal`'s "Select all" ignores the active search filter, and resets on any parent re-render
|
|
1133
|
+
|
|
1134
|
+
The header checkbox (and its indeterminate state) always operates on the complete `fields` list, not
|
|
1135
|
+
the search-filtered subset — clicking it while filtered silently selects/clears fields the user can't
|
|
1136
|
+
see. Separately, an effect re-seeds selection whenever `fields`/`defaultSelected` changes
|
|
1137
|
+
**reference**, so an inline array literal for either prop silently wipes in-progress picks on the
|
|
1138
|
+
next parent re-render.
|
|
1139
|
+
|
|
1140
|
+
**Apply:** clear the search before using "Select all." Memoize `fields`/`defaultSelected` in the
|
|
1141
|
+
parent before passing them down.
|
|
1142
|
+
|
|
1143
|
+
### `Dropdown`'s `ButtonText`/`text` are mutually exclusive per `dropdownType`, silently
|
|
1144
|
+
|
|
1145
|
+
The `"button"` trigger renders `ButtonText` only; the `"text"` trigger renders `text` only — pairing
|
|
1146
|
+
the wrong prop with the active `dropdownType` renders an icon-only or bare-chevron trigger with no
|
|
1147
|
+
visible label, and the `aria-label` fallback then substitutes "Open menu" as the accessible name too.
|
|
1148
|
+
Separately, `buttonProps.sx` fully replaces the built-in trigger style rather than merging, silently
|
|
1149
|
+
dropping the hover transition.
|
|
1150
|
+
|
|
1151
|
+
**Apply:** pair `ButtonText` with the default/`"button"` type and `text` with `dropdownType="text"`.
|
|
1152
|
+
Fold custom styling into `dropDownButtonStyle`, not `buttonProps.sx`.
|
|
1153
|
+
|
|
1154
|
+
### Every `Search` grabs a page-wide Ctrl+K by default
|
|
1155
|
+
|
|
1156
|
+
Each mounted `Search` registers its own `window` Ctrl+K listener, so two on one view race for the
|
|
1157
|
+
keypress. **Apply:** pass `shortcut={false}` on all but one. `showShortcutHint={false}` only hides
|
|
1158
|
+
the hint; the listener stays.
|
|
1159
|
+
|
|
1160
|
+
### `Header`'s desktop submenus open on hover only — no keyboard or click trigger
|
|
1161
|
+
|
|
1162
|
+
Dropdown children are gated on local hover state (`onMouseEnter`/`onMouseLeave`), with no `onFocus`.
|
|
1163
|
+
A keyboard user tabbing to a parent item can never open its children on the desktop layout — the
|
|
1164
|
+
identical data renders as a click-toggled accordion on mobile.
|
|
1165
|
+
|
|
1166
|
+
**Apply:** don't put anything a keyboard user must reach behind `children` on desktop; use `rightSlot`
|
|
1167
|
+
(real focusable buttons) for critical actions until this gets a keyboard path.
|
|
1168
|
+
|
|
1169
|
+
### `WorkspaceWindow`'s `state="maximized"` is indistinguishable from `"medium"`
|
|
1170
|
+
|
|
1171
|
+
The component only branches on `state === "minimized"` — size is always the same fixed constant, and
|
|
1172
|
+
`onMedium`/`onMaximize` are accepted callbacks that are never invoked anywhere in the component.
|
|
1173
|
+
|
|
1174
|
+
**Apply:** treat `state` as effectively two-valued (open vs. `"minimized"`); don't wire a maximize
|
|
1175
|
+
control expecting `onMaximize` to fire.
|
|
1176
|
+
|
|
1177
|
+
### `FilterSidebar`'s `selected` without `onChange` makes every filter silently inert
|
|
1178
|
+
|
|
1179
|
+
Passing `selected` alone (uncontrolled companion `onChange` omitted) computes the next filter state
|
|
1180
|
+
on every click and discards it — checkboxes visibly never check, forever, with no error. Separately,
|
|
1181
|
+
`onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect —
|
|
1182
|
+
`FilterSection.checkboxes` doesn't exist either; radio-vs-checkbox mode is actually decided by
|
|
1183
|
+
`type === "radio" || section.radio`.
|
|
1184
|
+
|
|
1185
|
+
**Apply:** always pass `selected` and `onChange` together, or omit `selected` and let `FilterSidebar`
|
|
1186
|
+
own its state. Don't reach for `onApply`/`headerPadding`/`sliderMode`/`FilterSection.checkboxes` —
|
|
1187
|
+
none of them do anything.
|
|
1188
|
+
|
|
1189
|
+
### `Breadcrumbs`' `isLastChild` prop is accepted but never read
|
|
1190
|
+
|
|
1191
|
+
It's declared on the type but omitted from the component's destructure entirely.
|
|
1192
|
+
|
|
1193
|
+
**Apply:** don't pass it expecting it to mark or style the final crumb — there's nothing it can do.
|
|
1194
|
+
|
|
1195
|
+
### `Accordion`'s `items[].buttonProps` replaces, not merges, the expanded/hover highlight
|
|
1196
|
+
|
|
1197
|
+
It spreads after the built-in `bg`/`_hover` that encode `isExpanded` state — passing `bg` or
|
|
1198
|
+
`_hover` there silently kills that item's expanded indication. An `sx` inside `buttonProps` or
|
|
1199
|
+
`itemProps` is always overwritten by `customStyles`.
|
|
1200
|
+
|
|
1201
|
+
**Apply:** style around the defaults via `customStyles` (merged through `sx`) when the highlight
|
|
1202
|
+
must survive.
|
|
1203
|
+
|
|
1204
|
+
### `Table`'s `LeftFilterPane` Clear All only re-applies filters in `"sidebar"` mode
|
|
1205
|
+
|
|
1206
|
+
`handleClear` calls `onClear` unconditionally, but only calls `onApply(cleared)` when
|
|
1207
|
+
`filterMode === "sidebar"` — in `"modal"` mode, Clear All visually unchecks every filter but never
|
|
1208
|
+
tells the parent the selection changed, so a consumer whose `onClear` doesn't itself reset
|
|
1209
|
+
applied/query state keeps serving pre-clear filtered data.
|
|
1210
|
+
|
|
1211
|
+
**Apply:** when using `filterMode="modal"`, drive your data refetch from `onClear`, not `onApply` —
|
|
1212
|
+
don't assume `onApply` fires on every Clear All.
|
|
1213
|
+
|
|
1214
|
+
### `ScrollToTop` watches one `parentElement` hop, not "the nearest scrollable ancestor"
|
|
1215
|
+
|
|
1216
|
+
It reads `scrollTop` off its immediate DOM parent only, with no upward search for an `overflow:
|
|
1217
|
+
auto/scroll` element. Wrap it in one extra layout `<div>` and the button silently never appears — no
|
|
1218
|
+
error, no warning, `scrollTop` on a non-scrolling parent just stays `0` forever.
|
|
1219
|
+
|
|
1220
|
+
**Apply:** `ScrollToTop`'s JSX parent must be the actual scroll container, or pass `useWindow` when
|
|
1221
|
+
the page itself scrolls.
|
|
1222
|
+
|
|
1223
|
+
### `ProfilePhotoViewer`'s PDF detection breaks the moment a file is picked, and `photoUrl` is read once
|
|
1224
|
+
|
|
1225
|
+
PDF detection is a literal `.endsWith(".pdf")` check — picking a file through the built-in editor
|
|
1226
|
+
replaces the value with a base64 data URI that never ends in `.pdf`, so a freshly-picked PDF renders
|
|
1227
|
+
as a broken image instead of the intended file badge (only the original URL prop is detected
|
|
1228
|
+
correctly). Separately, `photoUrl` only seeds state at mount — a later re-render with a new
|
|
1229
|
+
`photoUrl` (list virtualization, route change without remount) keeps showing the old photo.
|
|
1230
|
+
|
|
1231
|
+
**Apply:** don't use the built-in edit flow for PDF documents; detect kind from `File.type` in your
|
|
1232
|
+
own handler instead. Use `key={photoUrl}` to force a remount when the photo identity changes.
|
|
1233
|
+
|
|
1234
|
+
### `FilePreview` infers file kind from `fileName`, not `fileUrl`, and never resets zoom/rotation on its own
|
|
1235
|
+
|
|
1236
|
+
Once `fileName` is set, `fileUrl`'s own extension is never consulted — a friendly display name with
|
|
1237
|
+
no extension forces the "preview unavailable" fallback even when `fileUrl` points at a perfectly
|
|
1238
|
+
renderable file. Separately, cycling `fileUrl` while the modal stays open (a gallery next/prev)
|
|
1239
|
+
carries the previous image's zoom/rotation into the new one.
|
|
1240
|
+
|
|
1241
|
+
**Apply:** keep the real extension on `fileName`, or pass `fileType` explicitly to skip inference.
|
|
1242
|
+
Remount via `key={fileUrl}` when swapping the file in place instead of just changing the prop.
|
|
1243
|
+
|
|
1244
|
+
### `StageProgress`'s `tooltipThreshold`/`minStageWidth` no-op under `variant="stepper"`, and a stale `value` blanks the tracker
|
|
1245
|
+
|
|
1246
|
+
Both props stop having any effect the moment a tracker switches to the stepper variant. Separately,
|
|
1247
|
+
if `value` matches no `stage.id` (e.g. `stages` was filtered/re-derived and went stale), every stage
|
|
1248
|
+
silently renders as `"upcoming"` — no stage is ever active or completed, with no error. The match is
|
|
1249
|
+
also a strict `===`: a numeric `stage.id` compared against a string `value` (or vice versa) never
|
|
1250
|
+
matches either, even when the "same" stage is clearly intended.
|
|
1251
|
+
|
|
1252
|
+
**Apply:** don't rely on either prop once on the stepper variant. Re-validate `value` against the
|
|
1253
|
+
current `stages` list whenever it's filtered, and keep `id`/`value` the same primitive type at every
|
|
1254
|
+
call site.
|
|
1255
|
+
|
|
1256
|
+
### `Table`'s `isVisiblity`, `tableSettings`, `handleExportChange`/`exportOptions`/`exportLabel`, and `onColumnFilter` are dead props — now `@deprecated`
|
|
1257
|
+
|
|
1258
|
+
Grepped account-frontend, tickets, crm-frontend, hrms and social-frontend: zero consumers set any of
|
|
1259
|
+
these six. All six are now marked `@deprecated` in `TableProps.tsx` rather than removed outright, in
|
|
1260
|
+
case an app outside those five repos relies on one. None of these do anything in the current
|
|
1261
|
+
implementation, despite being typed on `TableProps` (and some documented on the demo page):
|
|
1262
|
+
|
|
1263
|
+
- `isVisiblity` — `Table`'s own destructure never lists it, so a consumer's value is dropped. It's
|
|
1264
|
+
hardcoded `true` into both `Pagination` call sites regardless, and `Pagination` doesn't read it
|
|
1265
|
+
either. It is a misspelling of `isVisibility`, but do not rename it (breaking change) — and do not
|
|
1266
|
+
expect it to do anything if you do.
|
|
1267
|
+
- `tableSettings` (`{filters, filterSelected, onFilterSelection}`) — `Table` passes it to
|
|
1268
|
+
`TableSettings`, but `TableSettings`'s function signature never destructures it.
|
|
1269
|
+
- `handleExportChange` / `exportOptions` / `exportLabel` — `Table` renders no export UI at all; none
|
|
1270
|
+
of the three are read anywhere, despite `src/Pages/table.tsx` documenting them as if live.
|
|
1271
|
+
- `onColumnFilter` — commented out of `Table`'s own destructure (`// onColumnFilter`).
|
|
1272
|
+
- `headerBgColor` / `tableBorderColor` — also dead and `@deprecated`; the header paints the
|
|
1273
|
+
variant's own background.
|
|
1274
|
+
|
|
1275
|
+
**Apply:** don't reach for any of these expecting an effect. Column visibility is driven by
|
|
1276
|
+
`isTableSettings` (shows the Settings gear) + `preferences` (server persistence) + the Manage
|
|
1277
|
+
Columns tab — not by `isVisiblity`/`tableSettings`.
|
|
1278
|
+
|
|
1279
|
+
### `Table`'s `preferences` prop is silent-by-default, not required
|
|
1280
|
+
|
|
1281
|
+
Omitting `preferences` (or leaving `preferences.url` empty, the default) does not throw or disable
|
|
1282
|
+
the table — the persistence hooks both early-return when the base URL is falsy. The table works
|
|
1283
|
+
fully in memory; it just never persists column order/visibility, density, or grouping across
|
|
1284
|
+
reloads. When you do wire a `url`, `token` is sent as a **raw** `Authorization` header value — do
|
|
1285
|
+
not prefix it with `"Bearer "` yourself expecting the hook to strip it.
|
|
1286
|
+
|
|
1287
|
+
**Apply:** treat `preferences` as opt-in persistence, not a required config block. If settings
|
|
1288
|
+
aren't surviving a refresh, check `preferences.url` is actually set before assuming a bug.
|
|
1289
|
+
|
|
1290
|
+
### `SearchSelect`'s `height` prop only resizes the `insideSelect` segment, not the field
|
|
1291
|
+
|
|
1292
|
+
Despite the name, `height` is read only to size the nested `insideSelect` trigger. The main
|
|
1293
|
+
control's height always comes from `size`'s token set — passing `height` with no `insideSelect`
|
|
1294
|
+
configured has no visible effect at all.
|
|
1295
|
+
|
|
1296
|
+
**Apply:** to change the main field's height, change `size`; `height` only matters when
|
|
1297
|
+
`insideSelect` is also passed.
|
|
1298
|
+
|
|
1299
|
+
### `SearchSelect`'s `pagination` now takes an explicit "has more" signal — prefer it at an exact-multiple total
|
|
1300
|
+
|
|
1301
|
+
Without `pagination.hasMore`/`pagination.totalRecords`, `hasMore` still falls back to guessing from
|
|
1302
|
+
`options.length % (pagination.limit ?? 10) === 0`. A total that's an exact multiple of `limit`
|
|
1303
|
+
(30 items, limit 10) still looks like "more pages exist" for the *first* extra scroll, firing one
|
|
1304
|
+
empty `onScroll` call — after that empty response, `SearchSelect` stops asking (it no longer loops
|
|
1305
|
+
forever the way earlier versions did).
|
|
1306
|
+
|
|
1307
|
+
**Apply:** pass `pagination.hasMore` (a boolean) or `pagination.totalRecords` (a count) so the field
|
|
1308
|
+
never fires that one avoidable empty request; both take precedence over the `limit` guess.
|
|
1309
|
+
|
|
1310
|
+
### `RolesPermission`'s `RoleData.permission`/`designation`/`makeSuperAdmin`/`automation`/`trackLocation`/`show_records` are dead weight in this component
|
|
1311
|
+
|
|
1312
|
+
None of these fields are read by `RolesPermission` — the roles list only renders
|
|
1313
|
+
`roleName`/`createdBy`/`created_at`/`roles_id`. They exist solely to be round-tripped unchanged
|
|
1314
|
+
through `onViewRole`/`onEditRole` so the consumer can prefill its own edit form. Setting them has no
|
|
1315
|
+
visible effect inside this component.
|
|
1316
|
+
|
|
1317
|
+
**Apply:** treat these fields as pass-through-only storage — populate them for your own edit form,
|
|
1318
|
+
not to change anything `RolesPermission` itself renders.
|
|
1319
|
+
|
|
1320
|
+
### `OrganizationDetails`' `OrganizationItem.uiInvite` is never read
|
|
1321
|
+
|
|
1322
|
+
Active vs. invited organizations are decided purely by which array (`activeOrganizations` vs
|
|
1323
|
+
`invitedOrganizations`) an item is placed in — `uiInvite` is carried on the type but
|
|
1324
|
+
`OrganizationDetails` never inspects it.
|
|
1325
|
+
|
|
1326
|
+
**Apply:** don't rely on `uiInvite` to control which section an item renders in — move the item
|
|
1327
|
+
between the two arrays instead.
|
|
1328
|
+
|
|
1329
|
+
### `OrganizationDetails`' `onSetDefault`/`onAcceptInvite`/`onDeclineInvite` are fire-and-forget despite their `Promise<void>` signature
|
|
1330
|
+
|
|
1331
|
+
Unlike `onCreateOrganization`/`onEditOrganization`/`onDeleteOrganization` (all awaited), these three
|
|
1332
|
+
are called without `await` — the `switchingOrgIds`/`respondingOrgIds` spinner arrays are entirely
|
|
1333
|
+
consumer-managed state, not driven by this component resolving the promise.
|
|
1334
|
+
|
|
1335
|
+
**Apply:** don't assume symmetry with the awaited callbacks in the same props interface; manage your
|
|
1336
|
+
own loading state for these three around the promise you return.
|
|
1337
|
+
|
|
1338
|
+
### `OrganizationDetails`' `CreateOrgFormValues.default`/`defaultOrg` are dead fields — now `@deprecated`
|
|
1339
|
+
|
|
1340
|
+
The built-in `CreateOrgModal`'s internal state and submit handler never set or forward them, and the
|
|
1341
|
+
public `onCreateOrganization` callback's parameter type doesn't declare them at all — populating
|
|
1342
|
+
them in a custom create form has no effect on the built-in flow. account-frontend, the only real
|
|
1343
|
+
consumer of `OrganizationDetails`, never reads either field. Both are now `@deprecated` in
|
|
1344
|
+
`OrganizationDetailsProps.tsx`.
|
|
1345
|
+
|
|
1346
|
+
**Apply:** don't rely on these two fields to pre-mark a newly created org as default.
|
|
1347
|
+
|
|
1348
|
+
### `SideBar`'s `selectedSubMenu` prop is accepted but never read — now `@deprecated`
|
|
1349
|
+
|
|
1350
|
+
`SidebarProps.selectedSubMenu` is threaded through `SideBar` → `MenuItems` → `MenuItemBox`, but the
|
|
1351
|
+
component's destructure never includes it — passing it has no effect of any kind. Zero consumers set
|
|
1352
|
+
it; now `@deprecated` in `SideBarProps.tsx`.
|
|
1353
|
+
|
|
1354
|
+
**Apply:** don't pass `selectedSubMenu` expecting it to highlight a submenu row.
|
|
1355
|
+
|
|
1356
|
+
### `KanbanBoard`'s `kanbanSelect`/`onOpen` don't check `permissions` — decision: accepted as-is
|
|
1357
|
+
|
|
1358
|
+
Looked like an asymmetry with the gated `kanbanEdit`/`kanbanCreate`/`onDelete`, but on inspection
|
|
1359
|
+
`kanbanSelect` is a header filter dropdown (`options`/`onSelectChange`/`value`) — a view-level
|
|
1360
|
+
affordance, not a mutation trigger — and `onOpen` (opening a card) is a view action too. Both are
|
|
1361
|
+
already covered by the existing `permissions.isViewable` gate: the whole board (including the
|
|
1362
|
+
header) returns `null` before rendering when `isViewable` is `false`, so a viewer who can't see the
|
|
1363
|
+
board can't reach either. Gating them a second time against `isEditable`/`isCreatable`/`isDeletable`
|
|
1364
|
+
would be wrong — filtering/opening isn't an edit, create, or delete. No code change made.
|
|
1365
|
+
|
|
1366
|
+
**Apply:** if you need `kanbanSelect` or `onOpen` gated on something narrower than view access, gate
|
|
1367
|
+
it yourself (e.g. `isSelect: canEdit`); the component won't do it for you.
|
|
1368
|
+
|
|
1369
|
+
### `SideBar`'s `locked` menu-item flag — decision: fixed to actually block interaction
|
|
1370
|
+
|
|
1371
|
+
Previously `locked` only swapped in a padlock icon; the click handler checked `disabled`, not
|
|
1372
|
+
`locked`, so a `locked: true` item still fully navigated. Zero consumers set `locked: true` in
|
|
1373
|
+
account-frontend, tickets, crm-frontend, hrms, social-frontend or crm-mobile, so there was no
|
|
1374
|
+
working behavior to preserve — the misleading name was a trap waiting for the first adopter. As of
|
|
1375
|
+
this release, `locked` blocks clicks/expansion the same way `disabled` does, in both the expanded
|
|
1376
|
+
sidebar (`MenuItemBox`) and the collapsed-sidebar flyout (`MenuPopoverContent`), for both top-level
|
|
1377
|
+
and submenu items. `disabled` is unchanged and still works independently.
|
|
1378
|
+
|
|
1379
|
+
**Apply:** `locked: true` alone now prevents interaction; you no longer need to also set
|
|
1380
|
+
`disabled: true`.
|
|
1381
|
+
|
|
1382
|
+
### `SideBar` menu-item labels clipped the bottom of descenders (g/y/p/q/j) — fixed
|
|
1383
|
+
|
|
1384
|
+
`TextTruncation.tsx`'s label used `overflow="hidden"` (both axes) with `lineHeight="1"`, so the line
|
|
1385
|
+
box was exactly font-size tall and any glyph descender got clipped flat — reported live on
|
|
1386
|
+
lfour.pixelizetech.com ("Legal Requests").
|
|
1387
|
+
|
|
1388
|
+
**An earlier fix here did not work and shipped looking correct.** It paired `overflowX="hidden"`
|
|
1389
|
+
(needed for the ellipsis) with `overflowY="clip"` + `sx={{ overflowClipMargin: "3px" }}`. CSS
|
|
1390
|
+
discards that: when one axis is `clip` and the other is a non-`clip`, non-`visible` value, `clip`
|
|
1391
|
+
computes to `hidden` — the mirror of the `visible`→`auto` rule. Measured in Chrome 152,
|
|
1392
|
+
`overflow-x: hidden; overflow-y: clip` computes to `hidden`/`hidden`, so `overflow-clip-margin` was
|
|
1393
|
+
inert on all 177 elements carrying it.
|
|
1394
|
+
|
|
1395
|
+
The working fix is vertical padding to grow the clip box, cancelled by an equal negative margin so
|
|
1396
|
+
the label's layout height is unchanged: `py="0.35em" my="-0.35em"`. The padding must suit the
|
|
1397
|
+
line-height — `0.35em` clears `lineHeight: 1`, while `Tag`'s label needs only `0.2em` at
|
|
1398
|
+
`lineHeight: 1.45` (a bigger box there would push its focus ring outside the pill).
|
|
1399
|
+
|
|
1400
|
+
**Apply:** nothing to do — this was a rendering bug, not a prop. Building another truncated
|
|
1401
|
+
single-line label? Use the `py`/negative-`my` pair. `overflow-clip-margin` only works when **both**
|
|
1402
|
+
axes are `clip`, which `text-overflow: ellipsis` rules out.
|
|
1403
|
+
|
|
1404
|
+
### `SideBar` nav list showed a bare, unthemed scrollbar when items overflowed — fixed
|
|
1405
|
+
|
|
1406
|
+
`SideBar.tsx`'s `#sidebar-scroll-container` used `Constants/Sidebar.ts`'s `FlexCss`, which only set
|
|
1407
|
+
the `::-webkit-scrollbar-*` pseudo-elements — never the standard `scrollbar-width`/`scrollbar-color`
|
|
1408
|
+
properties. Chromium honors the webkit pseudo-elements, but any engine that reads the standard
|
|
1409
|
+
properties first, or doesn't support the pseudo-elements at all, fell back to the browser's default
|
|
1410
|
+
scrollbar: a plain bar with no relation to the dark sidebar theme, showing up the moment a nav list
|
|
1411
|
+
(enough sections/items) overflowed the viewport. Fixed by switching to the already-written
|
|
1412
|
+
`cssForScrollBar(theme)` (same file), which sets `scrollbarWidth`/`scrollbarColor` **and** the
|
|
1413
|
+
webkit pseudo-elements, themed to `sidebar.background[500]` / `primary[500]`, hidden until hover.
|
|
1414
|
+
`FlexCss` is removed — `cssForScrollBar` is now the only scrollbar treatment the SideBar uses.
|
|
1415
|
+
|
|
1416
|
+
**Apply:** nothing to do. If a nav list is long enough to scroll, the bar now stays invisible until
|
|
1417
|
+
hovered, in the sidebar's own colors, on every engine — not just Chromium.
|
|
1418
|
+
|
|
1419
|
+
### `KanbanBoard`'s `permissions.isViewable: false` hides everything, including header actions
|
|
1420
|
+
|
|
1421
|
+
Not just the columns — the select/edit/create header bar disappears too, since the whole component
|
|
1422
|
+
returns `null` before rendering anything.
|
|
1423
|
+
|
|
1424
|
+
**Apply:** there's no prop for hiding only the board body while keeping header actions visible.
|
|
1425
|
+
|
|
1426
|
+
### `Switch` was forced to 200px even with no labels — it overflowed a narrow cell
|
|
1427
|
+
|
|
1428
|
+
`Switch` (`leftText`/`rightText`) kept a 12.5rem minimum width regardless of whether any label was
|
|
1429
|
+
set. Used as a boolean toggle — the wrong component for that, but the mistake shipped live in
|
|
1430
|
+
tickets' project custom-fields page — an unlabelled instance rendered as two unlabelled brand-filled
|
|
1431
|
+
pills at 200px inside a 120px table cell, overflowing by 80px. The width floor now only applies once
|
|
1432
|
+
`leftText`/`rightText` is actually set; an unlabelled instance shrinks to fit (~58px measured).
|
|
1433
|
+
|
|
1434
|
+
**Apply:** for a single on/off field use `ToggleSwitch`, not `Switch`, even now that it no longer
|
|
1435
|
+
overflows — a two-option segmented control still announces as `role="radiogroup"`, not
|
|
1436
|
+
`role="switch"`. Swapping `Switch` for `ToggleSwitch` changes `getByRole("radio", …)` queries to
|
|
1437
|
+
`getByRole("switch", …)` — the same test break the `InputSwitch` → `ToggleSwitch` migration caused.
|
|
1438
|
+
|
|
1439
|
+
### A `SearchSelect`/`Select` custom row node inherits the row's font size and padding — don't restate them
|
|
1440
|
+
|
|
1441
|
+
`SearchSelect`'s `option.view` and `Select`'s `renderOption` render straight inside the option row,
|
|
1442
|
+
which now carries its own `fontSize`/`px`/`py` so a plain-text row is legible with no extra markup.
|
|
1443
|
+
A custom node that also sets its own `px`/`py`/`fontSize` stacks on top of the row's rather than
|
|
1444
|
+
replacing it — this is what made rows in crm-frontend render 57–75px tall instead of the ~30px every
|
|
1445
|
+
other row uses.
|
|
1446
|
+
|
|
1447
|
+
**Apply:** size a custom `option.view`/`renderOption` node yourself only when it needs something
|
|
1448
|
+
*different* from the row default — inherit by default, don't restate it.
|
|
1449
|
+
|
|
1450
|
+
### A custom option row's sub-line must not use `colors.textMuted` directly
|
|
1451
|
+
|
|
1452
|
+
A selected row sits on a tinted fill, and the hovered-selected rung is the busiest one in the
|
|
1453
|
+
ladder. In dark mode `surfaceRaised` carries only ~0.86 of contrast headroom above AA, so raw
|
|
1454
|
+
`textMuted` on that rung measures **4.00–4.22:1** in 6 of 9 brands — under the 4.5:1 a 12px
|
|
1455
|
+
sub-line needs. The library's own rows no longer use it.
|
|
1456
|
+
|
|
1457
|
+
**Apply:** in a `SearchSelect` `option.view` or `Select` `renderOption` node, read the sub-line ink
|
|
1458
|
+
from `optionRowDescriptionInk(theme.colors)` (exported from the package root) rather than
|
|
1459
|
+
`theme.colors.textMuted`. It is a no-op in light mode. The row's main label is
|
|
1460
|
+
`optionRowInk(theme.colors, isSelected)` with `optionRowWeight(isSelected)` — never brand ink.
|