pixelize-design-library 2.4.2-beta.65 → 2.4.2-beta.67

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.
Files changed (489) hide show
  1. package/CHANGELOG.md +447 -13
  2. package/COMPONENT-GOTCHAS.md +150 -91
  3. package/DESIGN-GUIDE.md +47 -7
  4. package/README.md +37 -3
  5. package/dist/Components/Accordion/Accordion.js +11 -8
  6. package/dist/Components/Accordion/AccordionProps.d.ts +4 -0
  7. package/dist/Components/Accordion/accordionColors.js +1 -2
  8. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -0
  9. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChartProps.d.ts +2 -2
  10. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts +1 -1
  11. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
  12. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChartProps.d.ts +3 -1
  13. package/dist/Components/Apexcharts/ApexPieChart/pieImageTexture.d.ts +2 -0
  14. package/dist/Components/Apexcharts/ApexPieChart/pieImageTexture.js +13 -0
  15. package/dist/Components/AppSwitcher/AppSwitcher.js +6 -3
  16. package/dist/Components/AppSwitcher/AppSwitcherProps.d.ts +3 -1
  17. package/dist/Components/AppSwitcher/AppSwitcherProps.js +18 -11
  18. package/dist/Components/AppSwitcher/pixelizeSuite.d.ts +24 -0
  19. package/dist/Components/AppSwitcher/pixelizeSuite.js +71 -0
  20. package/dist/Components/AppearanceSettings/AppearanceSettings.js +3 -3
  21. package/dist/Components/AppearanceSettings/AppearanceSettingsProps.d.ts +2 -2
  22. package/dist/Components/Avatar/avatarColorway.d.ts +2 -2
  23. package/dist/Components/Avatar/avatarColorway.js +7 -6
  24. package/dist/Components/Breadcrumbs/BreadcrumbsProps.d.ts +1 -1
  25. package/dist/Components/Button/Button.styles.js +5 -2
  26. package/dist/Components/Button/ButtonProps.d.ts +2 -4
  27. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
  28. package/dist/Components/CalendarGrid/CalendarGrid.js +5 -3
  29. package/dist/Components/CalendarGrid/CalendarGridProps.d.ts +1 -1
  30. package/dist/Components/Card/Card.d.ts +1 -0
  31. package/dist/Components/Card/Card.js +1 -0
  32. package/dist/Components/Checkbox/Checkbox.styles.js +3 -1
  33. package/dist/Components/CheckoutKit/selectable.d.ts +3 -1
  34. package/dist/Components/CheckoutKit/selectable.js +10 -7
  35. package/dist/Components/CheckoutKit/tonalHover.d.ts +2 -0
  36. package/dist/Components/CheckoutKit/tonalHover.js +6 -0
  37. package/dist/Components/ChoiceCard/ChoiceCard.d.ts +1 -1
  38. package/dist/Components/ChoiceCard/ChoiceCard.js +2 -1
  39. package/dist/Components/ChoiceCard/ChoiceCardProps.d.ts +6 -0
  40. package/dist/Components/Common/FieldMessage.d.ts +1 -0
  41. package/dist/Components/Common/FormLabel.d.ts +1 -1
  42. package/dist/Components/Common/FormLabel.js +4 -3
  43. package/dist/Components/Common/HelperText.d.ts +2 -2
  44. package/dist/Components/Common/HelperText.js +1 -2
  45. package/dist/Components/Common/activationKey.d.ts +5 -0
  46. package/dist/Components/Common/activationKey.js +12 -0
  47. package/dist/Components/Common/dataAttributes.d.ts +4 -0
  48. package/dist/Components/Common/fieldMessageStyles.js +2 -1
  49. package/dist/Components/Common/findSlot.d.ts +2 -0
  50. package/dist/Components/Common/findSlot.js +24 -0
  51. package/dist/Components/Common/surfaceFocusRing.d.ts +1 -0
  52. package/dist/Components/Common/surfaceFocusRing.js +7 -0
  53. package/dist/Components/ConfirmDialog/ConfirmDialog.js +17 -5
  54. package/dist/Components/ConfirmDialog/ConfirmDialogProps.d.ts +38 -10
  55. package/dist/Components/CopyButton/CopyButton.d.ts +1 -0
  56. package/dist/Components/CopyButton/CopyButton.js +3 -6
  57. package/dist/Components/CouponField/CouponField.js +5 -2
  58. package/dist/Components/CustomModulesTable/CustomModulesTable.js +3 -1
  59. package/dist/Components/DatePicker/CalendarPanel.d.ts +1 -0
  60. package/dist/Components/DatePicker/CalendarPanel.js +3 -1
  61. package/dist/Components/DatePicker/DatePicker.js +24 -26
  62. package/dist/Components/DatePicker/DatePickerProps.d.ts +8 -0
  63. package/dist/Components/DatePicker/PickerPortal.js +1 -1
  64. package/dist/Components/DatePicker/RangeDatePicker.d.ts +7 -0
  65. package/dist/Components/DatePicker/RangeDatePicker.js +10 -29
  66. package/dist/Components/DatePicker/SingleDatePicker.js +5 -21
  67. package/dist/Components/DatePicker/TimeOnlyPicker.js +2 -20
  68. package/dist/Components/DescriptionList/DescriptionList.js +1 -1
  69. package/dist/Components/DetailSections/DetailSections.js +2 -1
  70. package/dist/Components/Divider/Divider.d.ts +3 -3
  71. package/dist/Components/Divider/Divider.js +3 -3
  72. package/dist/Components/Drawer/Drawer.d.ts +2 -0
  73. package/dist/Components/Drawer/Drawer.js +23 -25
  74. package/dist/Components/Dropdown/DropDown.js +6 -21
  75. package/dist/Components/Editor/Editor.js +6 -2
  76. package/dist/Components/Editor/EditorProps.d.ts +17 -1
  77. package/dist/Components/Editor/editorLabels.js +1 -0
  78. package/dist/Components/Editor/editorTokenStyles.d.ts +8 -0
  79. package/dist/Components/Editor/editorTokenStyles.js +9 -1
  80. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -1
  81. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +9 -2
  82. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +15 -1
  83. package/dist/Components/EmptyState/EmptyStateProps.d.ts +21 -0
  84. package/dist/Components/EmptyState/FilteredEmptyState.d.ts +5 -0
  85. package/dist/Components/EmptyState/FilteredEmptyState.js +23 -0
  86. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +1 -0
  87. package/dist/Components/FilePreview/FilePreview.js +7 -3
  88. package/dist/Components/FilePreview/FilePreviewProps.d.ts +2 -1
  89. package/dist/Components/FileUpload/FileUpload.js +8 -9
  90. package/dist/Components/FileUpload/FileUploadProps.d.ts +2 -2
  91. package/dist/Components/FileUploader/FileUploader.js +5 -6
  92. package/dist/Components/FilterSidebar/FilterSidebar.d.ts +7 -9
  93. package/dist/Components/FilterSidebar/FilterSidebar.js +90 -233
  94. package/dist/Components/FilterSidebar/OptionsSection.d.ts +14 -0
  95. package/dist/Components/FilterSidebar/OptionsSection.js +46 -0
  96. package/dist/Components/FilterSidebar/RangeSection.d.ts +17 -0
  97. package/dist/Components/FilterSidebar/RangeSection.js +80 -0
  98. package/dist/Components/FilterSidebar/SectionHeader.d.ts +13 -0
  99. package/dist/Components/FilterSidebar/SectionHeader.js +29 -0
  100. package/dist/Components/FilterSidebar/useStableCallback.d.ts +1 -0
  101. package/dist/Components/FilterSidebar/useStableCallback.js +12 -0
  102. package/dist/Components/Form/FormWrapper.d.ts +7 -7
  103. package/dist/Components/Form/FormWrapper.js +5 -3
  104. package/dist/Components/FormField/FormField.js +1 -1
  105. package/dist/Components/Header/Header.js +1 -1
  106. package/dist/Components/Header/HeaderActions.js +4 -2
  107. package/dist/Components/IconButton/IconButtonProps.d.ts +2 -1
  108. package/dist/Components/Input/TextInput.js +2 -2
  109. package/dist/Components/Input/TextInputProps.d.ts +3 -1
  110. package/dist/Components/KanbanBoard/AccountCard.js +1 -1
  111. package/dist/Components/KanbanBoard/KanbanBoard.d.ts +1 -1
  112. package/dist/Components/KanbanBoard/KanbanBoard.js +11 -7
  113. package/dist/Components/LauncherTrigger/LauncherTrigger.js +1 -1
  114. package/dist/Components/LazyWrapper/LazyWrapper.d.ts +2 -1
  115. package/dist/Components/LazyWrapper/LazyWrapper.js +1 -1
  116. package/dist/Components/MediaViewer/MediaViewer.js +4 -3
  117. package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
  118. package/dist/Components/MediaViewer/components/MediaImageViewer.js +19 -8
  119. package/dist/Components/MediaViewer/components/MediaScrubber.js +7 -2
  120. package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
  121. package/dist/Components/MediaViewer/components/ViewerIconButton.js +3 -1
  122. package/dist/Components/MediaViewer/hooks/useFileViewer.d.ts +1 -0
  123. package/dist/Components/MediaViewer/mediaItems.d.ts +1 -0
  124. package/dist/Components/MediaViewer/mediaItems.js +5 -0
  125. package/dist/Components/Modal/Modal.d.ts +1 -0
  126. package/dist/Components/Modal/Modal.js +7 -25
  127. package/dist/Components/Modal/warnDroppedSlotChildren.d.ts +1 -1
  128. package/dist/Components/Modal/warnDroppedSlotChildren.js +7 -3
  129. package/dist/Components/NavLauncher/LauncherTabs.js +2 -1
  130. package/dist/Components/NavLauncher/NavLauncher.js +47 -22
  131. package/dist/Components/NavLauncher/NavLauncherProps.d.ts +6 -4
  132. package/dist/Components/NavLauncher/ScopeBar.js +4 -2
  133. package/dist/Components/NavLauncher/engine/engine.js +2 -1
  134. package/dist/Components/NavLauncher/engine/fold.js +2 -1
  135. package/dist/Components/NavLauncher/launcherMotion.d.ts +19 -0
  136. package/dist/Components/NavLauncher/launcherMotion.js +15 -0
  137. package/dist/Components/NavLauncher/launcherParts.d.ts +12 -0
  138. package/dist/Components/NavLauncher/launcherParts.js +45 -11
  139. package/dist/Components/NavLauncher/searchLayout.d.ts +1 -0
  140. package/dist/Components/NavLauncher/searchLayout.js +3 -1
  141. package/dist/Components/NavLauncher/spotlightParts.d.ts +6 -2
  142. package/dist/Components/NavLauncher/spotlightParts.js +22 -9
  143. package/dist/Components/NavLauncher/useCopiedFlash.d.ts +6 -0
  144. package/dist/Components/NavLauncher/useCopiedFlash.js +21 -0
  145. package/dist/Components/NavigationBar/NavigationBar.js +6 -5
  146. package/dist/Components/NoteTextArea/NoteTextArea.js +12 -17
  147. package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +5 -3
  148. package/dist/Components/Notification/Notification.js +19 -21
  149. package/dist/Components/Notification/NotificationProps.d.ts +1 -1
  150. package/dist/Components/NotificationBell/notificationHelpers.d.ts +16 -1
  151. package/dist/Components/NotificationBell/notificationHelpers.js +13 -7
  152. package/dist/Components/OffersList/OffersList.js +4 -2
  153. package/dist/Components/OptionChip/OptionChip.js +3 -2
  154. package/dist/Components/OptionChip/optionInk.js +4 -2
  155. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  156. package/dist/Components/OrgSwitcher/OrgSwitcher.js +13 -6
  157. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +1 -1
  158. package/dist/Components/OrganizationDetails/OrganizationDetails.js +4 -7
  159. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +4 -2
  160. package/dist/Components/PdfViewer/PdfViewer.d.ts +1 -0
  161. package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +1 -1
  162. package/dist/Components/PlanPill/PlanPill.js +4 -2
  163. package/dist/Components/PlanPill/PlanPillProps.d.ts +1 -1
  164. package/dist/Components/ProductCard/ProductCardAction.js +2 -1
  165. package/dist/Components/ProductCard/ProductCardSwatches.js +2 -1
  166. package/dist/Components/ProductDetails/ProductDetails.js +2 -1
  167. package/dist/Components/ProfileCard/ProfileCard.d.ts +1 -0
  168. package/dist/Components/ProfileCard/ProfileCard.js +12 -26
  169. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
  170. package/dist/Components/ProgressBar/ProgressBar.js +2 -1
  171. package/dist/Components/QuantityStepper/QuantityStepper.js +5 -2
  172. package/dist/Components/QueryState/QueryStateBoundary.d.ts +1 -1
  173. package/dist/Components/QueryState/QueryStateBoundary.js +5 -1
  174. package/dist/Components/QueryState/QueryStateProps.d.ts +6 -2
  175. package/dist/Components/RadioButton/RadioButton.js +2 -3
  176. package/dist/Components/RolesPermission/RolesPermission.js +12 -8
  177. package/dist/Components/ScrollToTop/ScrollToTop.d.ts +1 -0
  178. package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +4 -1
  179. package/dist/Components/ScrollbarBox/ScrollbarBox.js +10 -4
  180. package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -1
  181. package/dist/Components/SearchSelect/SearchSelect.js +8 -5
  182. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +3 -3
  183. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
  184. package/dist/Components/SegmentedControl/SegmentedControl.js +1 -1
  185. package/dist/Components/Select/Select.js +6 -0
  186. package/dist/Components/Select/SelectNative.d.ts +16 -0
  187. package/dist/Components/Select/SelectPopup.js +170 -63
  188. package/dist/Components/Select/SelectProps.d.ts +30 -2
  189. package/dist/Components/Select/groupedWindow.d.ts +21 -0
  190. package/dist/Components/Select/groupedWindow.js +50 -0
  191. package/dist/Components/SelectSearch/SelectSearch.d.ts +1 -1
  192. package/dist/Components/SelectSearch/SelectSearch.js +48 -38
  193. package/dist/Components/SelectSearch/SelectSearchProps.d.ts +3 -3
  194. package/dist/Components/SelectV2/SelectV2.d.ts +1 -1
  195. package/dist/Components/SelectV2/SelectV2.js +1 -1
  196. package/dist/Components/SelectV2/SelectV2Props.d.ts +3 -3
  197. package/dist/Components/SideBar/SecondaryBar.js +3 -2
  198. package/dist/Components/SideBar/components/MenuItemBox.js +3 -2
  199. package/dist/Components/SideBar/components/MenuItems.js +1 -1
  200. package/dist/Components/SideBar/components/OtherApps.js +2 -2
  201. package/dist/Components/SideBar/components/PinnedSection.js +1 -1
  202. package/dist/Components/SideBar/sidebarScale.d.ts +2 -2
  203. package/dist/Components/SideBar/sidebarScale.js +2 -2
  204. package/dist/Components/SignInActivityTable/SignInActivityTable.js +7 -2
  205. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +1 -1
  206. package/dist/Components/SignInActivityTable/scrollRegionRing.d.ts +10 -0
  207. package/dist/Components/SignInActivityTable/scrollRegionRing.js +14 -0
  208. package/dist/Components/Skeletons/SkeletonProps.d.ts +5 -1
  209. package/dist/Components/Slider/Slider.d.ts +2 -0
  210. package/dist/Components/Slider/Slider.js +5 -4
  211. package/dist/Components/StageProgress/StageItem.js +2 -1
  212. package/dist/Components/StageProgress/StageProgress.js +8 -2
  213. package/dist/Components/StageProgress/StageProgressProps.d.ts +2 -0
  214. package/dist/Components/StageProgress/StepperStage.js +2 -1
  215. package/dist/Components/StickyBuyBar/StickyBuyBar.js +2 -1
  216. package/dist/Components/Table/Table.js +5 -3
  217. package/dist/Components/Table/TableProps.d.ts +1 -1
  218. package/dist/Components/Table/components/HeaderActions.js +5 -3
  219. package/dist/Components/Table/components/TableBody.js +22 -8
  220. package/dist/Components/Table/components/TableGroupRow.js +2 -1
  221. package/dist/Components/Table/components/TableHeader.js +14 -20
  222. package/dist/Components/Table/components/rowDetail.js +3 -2
  223. package/dist/Components/Table/components/rowFocusRing.d.ts +21 -0
  224. package/dist/Components/Table/components/rowFocusRing.js +20 -0
  225. package/dist/Components/Table/filters/ActiveFilters.js +6 -3
  226. package/dist/Components/Table/filters/CompactSelect.js +2 -1
  227. package/dist/Components/Table/filters/FilterDatePicker.d.ts +6 -0
  228. package/dist/Components/Table/filters/FilterDatePicker.js +61 -0
  229. package/dist/Components/Table/filters/LeftFilterPane.d.ts +1 -0
  230. package/dist/Components/Table/filters/LeftFilterPane.js +14 -6
  231. package/dist/Components/Table/hooks/useTable.js +11 -7
  232. package/dist/Components/Table/settings/ManageColumns.js +4 -3
  233. package/dist/Components/Table/settings/TableSettings.js +4 -4
  234. package/dist/Components/Tabs/Tabs.d.ts +1 -0
  235. package/dist/Components/Tabs/Tabs.js +1 -0
  236. package/dist/Components/Tabs/components/CountBadge.d.ts +1 -0
  237. package/dist/Components/Tabs/components/TabList.d.ts +1 -0
  238. package/dist/Components/Tabs/components/TabList.js +1 -0
  239. package/dist/Components/Tabs/components/TabPanel.d.ts +1 -0
  240. package/dist/Components/Tabs/components/TabPanel.js +1 -0
  241. package/dist/Components/Tabs/tabStyles.js +4 -2
  242. package/dist/Components/Tag/Tag.js +5 -4
  243. package/dist/Components/Tag/Tag.styles.js +5 -4
  244. package/dist/Components/Tag/TagProps.d.ts +4 -1
  245. package/dist/Components/Tag/tagDot.js +10 -3
  246. package/dist/Components/TagInput/TagInput.js +6 -5
  247. package/dist/Components/TagInput/TagInputProps.d.ts +15 -0
  248. package/dist/Components/TagInput/tagEntries.d.ts +7 -1
  249. package/dist/Components/TagInput/tagEntries.js +18 -5
  250. package/dist/Components/TimePicker/TimePicker.js +7 -3
  251. package/dist/Components/TimePicker/TimePickerProps.d.ts +2 -0
  252. package/dist/Components/Timeline/Timeline.js +13 -9
  253. package/dist/Components/Toaster/Toaster.js +2 -1
  254. package/dist/Components/Toggle/TableToggle.d.ts +1 -1
  255. package/dist/Components/Toggle/TableToggle.js +1 -1
  256. package/dist/Components/UpgradeButton/UpgradeButton.js +3 -2
  257. package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +1 -1
  258. package/dist/Components/UserDetails/UserDetails.js +5 -7
  259. package/dist/Components/WishlistToggle/WishlistToggle.js +2 -1
  260. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +11 -1
  261. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +3 -1
  262. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +14 -7
  263. package/dist/Hooks/useOutsideMouseDown.d.ts +11 -0
  264. package/dist/Hooks/useOutsideMouseDown.js +30 -0
  265. package/dist/Hooks/usePreferences.js +30 -12
  266. package/dist/Hooks/useScrollableRegion.d.ts +17 -0
  267. package/dist/Hooks/useScrollableRegion.js +36 -0
  268. package/dist/Hooks/useSidebarPrefs.d.ts +1 -0
  269. package/dist/Theme/chakra/Menu.styles.d.ts +4 -0
  270. package/dist/Theme/chakra/Menu.styles.js +6 -0
  271. package/dist/Theme/chakra/componentStyles.d.ts +4 -0
  272. package/dist/Theme/chakra/componentStyles.js +1 -1
  273. package/dist/Theme/chakra/createBrandTheme.d.ts +1 -0
  274. package/dist/Theme/chakra/focusRing.styles.d.ts +1 -1
  275. package/dist/Theme/chakra/focusRing.styles.js +3 -3
  276. package/dist/Theme/chakra/paletteFromTheme.d.ts +2 -1
  277. package/dist/Theme/chakra/paletteFromTheme.js +18 -4
  278. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +1 -0
  279. package/dist/Theme/provider/ThemeSwitcher.d.ts +1 -0
  280. package/dist/Theme/provider/ThemeSwitcher.js +1 -1
  281. package/dist/Theme/testing/testPalette.d.ts +1 -0
  282. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +1 -0
  283. package/dist/Theme/tokens/builders/filledSurface.js +3 -2
  284. package/dist/Theme/tokens/builders/focusRing.js +4 -1
  285. package/dist/Theme/tokens/builders/paletteScale.d.ts +2 -0
  286. package/dist/Theme/tokens/builders/paletteScale.js +10 -0
  287. package/dist/Theme/tokens/types.d.ts +1 -0
  288. package/dist/Utils/accountHandoff.d.ts +3 -0
  289. package/dist/Utils/price.d.ts +1 -0
  290. package/dist/Utils/tabular.d.ts +30 -0
  291. package/dist/Utils/tabular.js +61 -0
  292. package/dist/esm/Components/Accordion/Accordion.js +11 -8
  293. package/dist/esm/Components/Accordion/accordionColors.js +2 -3
  294. package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +2 -1
  295. package/dist/esm/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
  296. package/dist/esm/Components/Apexcharts/ApexPieChart/pieImageTexture.js +10 -0
  297. package/dist/esm/Components/AppSwitcher/AppSwitcher.js +6 -3
  298. package/dist/esm/Components/AppSwitcher/AppSwitcherProps.js +18 -11
  299. package/dist/esm/Components/AppSwitcher/pixelizeSuite.js +67 -0
  300. package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +3 -3
  301. package/dist/esm/Components/Avatar/avatarColorway.js +4 -4
  302. package/dist/esm/Components/Button/Button.styles.js +5 -2
  303. package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
  304. package/dist/esm/Components/CalendarGrid/CalendarGrid.js +5 -3
  305. package/dist/esm/Components/Card/Card.js +1 -0
  306. package/dist/esm/Components/Checkbox/Checkbox.styles.js +3 -1
  307. package/dist/esm/Components/CheckoutKit/selectable.js +10 -7
  308. package/dist/esm/Components/CheckoutKit/tonalHover.js +2 -0
  309. package/dist/esm/Components/ChoiceCard/ChoiceCard.js +2 -1
  310. package/dist/esm/Components/Common/FormLabel.js +4 -3
  311. package/dist/esm/Components/Common/HelperText.js +1 -2
  312. package/dist/esm/Components/Common/activationKey.js +7 -0
  313. package/dist/esm/Components/Common/fieldMessageStyles.js +2 -1
  314. package/dist/esm/Components/Common/findSlot.js +17 -0
  315. package/dist/esm/Components/Common/surfaceFocusRing.js +3 -0
  316. package/dist/esm/Components/ConfirmDialog/ConfirmDialog.js +18 -6
  317. package/dist/esm/Components/CopyButton/CopyButton.js +3 -6
  318. package/dist/esm/Components/CouponField/CouponField.js +5 -2
  319. package/dist/esm/Components/CustomModulesTable/CustomModulesTable.js +3 -1
  320. package/dist/esm/Components/DatePicker/CalendarPanel.js +3 -1
  321. package/dist/esm/Components/DatePicker/DatePicker.js +25 -27
  322. package/dist/esm/Components/DatePicker/PickerPortal.js +2 -2
  323. package/dist/esm/Components/DatePicker/RangeDatePicker.js +10 -29
  324. package/dist/esm/Components/DatePicker/SingleDatePicker.js +5 -21
  325. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +2 -20
  326. package/dist/esm/Components/DescriptionList/DescriptionList.js +1 -1
  327. package/dist/esm/Components/DetailSections/DetailSections.js +2 -1
  328. package/dist/esm/Components/Divider/Divider.js +3 -3
  329. package/dist/esm/Components/Drawer/Drawer.js +19 -18
  330. package/dist/esm/Components/Dropdown/DropDown.js +7 -22
  331. package/dist/esm/Components/Editor/Editor.js +7 -3
  332. package/dist/esm/Components/Editor/editorLabels.js +1 -0
  333. package/dist/esm/Components/Editor/editorTokenStyles.js +7 -0
  334. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +8 -4
  335. package/dist/esm/Components/EmptyState/FilteredEmptyState.js +18 -0
  336. package/dist/esm/Components/FilePreview/FilePreview.js +8 -4
  337. package/dist/esm/Components/FileUpload/FileUpload.js +8 -9
  338. package/dist/esm/Components/FileUploader/FileUploader.js +6 -7
  339. package/dist/esm/Components/FilterSidebar/FilterSidebar.js +94 -237
  340. package/dist/esm/Components/FilterSidebar/OptionsSection.js +41 -0
  341. package/dist/esm/Components/FilterSidebar/RangeSection.js +78 -0
  342. package/dist/esm/Components/FilterSidebar/SectionHeader.js +23 -0
  343. package/dist/esm/Components/FilterSidebar/useStableCallback.js +8 -0
  344. package/dist/esm/Components/Form/FormWrapper.js +5 -3
  345. package/dist/esm/Components/FormField/FormField.js +1 -1
  346. package/dist/esm/Components/Header/Header.js +1 -1
  347. package/dist/esm/Components/Header/HeaderActions.js +6 -4
  348. package/dist/esm/Components/Input/TextInput.js +2 -2
  349. package/dist/esm/Components/KanbanBoard/AccountCard.js +1 -1
  350. package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
  351. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +11 -7
  352. package/dist/esm/Components/LauncherTrigger/LauncherTrigger.js +1 -1
  353. package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -1
  354. package/dist/esm/Components/MediaViewer/MediaViewer.js +5 -4
  355. package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
  356. package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +19 -8
  357. package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +7 -2
  358. package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
  359. package/dist/esm/Components/MediaViewer/components/ViewerIconButton.js +3 -1
  360. package/dist/esm/Components/MediaViewer/mediaItems.js +4 -0
  361. package/dist/esm/Components/Modal/Modal.js +2 -17
  362. package/dist/esm/Components/Modal/warnDroppedSlotChildren.js +7 -3
  363. package/dist/esm/Components/NavLauncher/LauncherTabs.js +2 -1
  364. package/dist/esm/Components/NavLauncher/NavLauncher.js +51 -26
  365. package/dist/esm/Components/NavLauncher/ScopeBar.js +4 -2
  366. package/dist/esm/Components/NavLauncher/engine/engine.js +2 -1
  367. package/dist/esm/Components/NavLauncher/engine/fold.js +2 -1
  368. package/dist/esm/Components/NavLauncher/launcherMotion.js +11 -0
  369. package/dist/esm/Components/NavLauncher/launcherParts.js +40 -8
  370. package/dist/esm/Components/NavLauncher/searchLayout.js +1 -0
  371. package/dist/esm/Components/NavLauncher/spotlightParts.js +23 -10
  372. package/dist/esm/Components/NavLauncher/useCopiedFlash.js +17 -0
  373. package/dist/esm/Components/NavigationBar/NavigationBar.js +6 -5
  374. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +12 -17
  375. package/dist/esm/Components/Notification/Notification.js +20 -22
  376. package/dist/esm/Components/NotificationBell/notificationHelpers.js +12 -6
  377. package/dist/esm/Components/OffersList/OffersList.js +4 -2
  378. package/dist/esm/Components/OptionChip/OptionChip.js +3 -2
  379. package/dist/esm/Components/OptionChip/optionInk.js +4 -2
  380. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  381. package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +14 -7
  382. package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +5 -8
  383. package/dist/esm/Components/PlanPill/PlanPill.js +4 -2
  384. package/dist/esm/Components/ProductCard/ProductCardAction.js +2 -1
  385. package/dist/esm/Components/ProductCard/ProductCardSwatches.js +2 -1
  386. package/dist/esm/Components/ProductDetails/ProductDetails.js +2 -1
  387. package/dist/esm/Components/ProfileCard/ProfileCard.js +6 -17
  388. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
  389. package/dist/esm/Components/ProgressBar/ProgressBar.js +2 -1
  390. package/dist/esm/Components/QuantityStepper/QuantityStepper.js +5 -2
  391. package/dist/esm/Components/QueryState/QueryStateBoundary.js +5 -1
  392. package/dist/esm/Components/RadioButton/RadioButton.js +2 -3
  393. package/dist/esm/Components/RolesPermission/RolesPermission.js +12 -8
  394. package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +9 -3
  395. package/dist/esm/Components/SearchSelect/SearchSelect.js +8 -5
  396. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +1 -1
  397. package/dist/esm/Components/Select/Select.js +6 -0
  398. package/dist/esm/Components/Select/SelectPopup.js +171 -64
  399. package/dist/esm/Components/Select/groupedWindow.js +44 -0
  400. package/dist/esm/Components/SelectSearch/SelectSearch.js +49 -39
  401. package/dist/esm/Components/SelectV2/SelectV2.js +1 -1
  402. package/dist/esm/Components/SideBar/SecondaryBar.js +3 -2
  403. package/dist/esm/Components/SideBar/components/MenuItemBox.js +3 -2
  404. package/dist/esm/Components/SideBar/components/MenuItems.js +1 -1
  405. package/dist/esm/Components/SideBar/components/OtherApps.js +2 -2
  406. package/dist/esm/Components/SideBar/components/PinnedSection.js +1 -1
  407. package/dist/esm/Components/SideBar/sidebarScale.js +2 -2
  408. package/dist/esm/Components/SignInActivityTable/SignInActivityTable.js +8 -3
  409. package/dist/esm/Components/SignInActivityTable/scrollRegionRing.js +9 -0
  410. package/dist/esm/Components/Slider/Slider.js +6 -5
  411. package/dist/esm/Components/StageProgress/StageItem.js +2 -1
  412. package/dist/esm/Components/StageProgress/StageProgress.js +8 -2
  413. package/dist/esm/Components/StageProgress/StepperStage.js +2 -1
  414. package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +2 -1
  415. package/dist/esm/Components/Table/Table.js +8 -6
  416. package/dist/esm/Components/Table/components/HeaderActions.js +7 -5
  417. package/dist/esm/Components/Table/components/TableBody.js +22 -8
  418. package/dist/esm/Components/Table/components/TableGroupRow.js +2 -1
  419. package/dist/esm/Components/Table/components/TableHeader.js +15 -21
  420. package/dist/esm/Components/Table/components/rowDetail.js +3 -2
  421. package/dist/esm/Components/Table/components/rowFocusRing.js +16 -0
  422. package/dist/esm/Components/Table/filters/ActiveFilters.js +8 -5
  423. package/dist/esm/Components/Table/filters/CompactSelect.js +2 -1
  424. package/dist/esm/Components/Table/filters/FilterDatePicker.js +20 -0
  425. package/dist/esm/Components/Table/filters/LeftFilterPane.js +14 -6
  426. package/dist/esm/Components/Table/hooks/useTable.js +11 -7
  427. package/dist/esm/Components/Table/settings/ManageColumns.js +4 -3
  428. package/dist/esm/Components/Table/settings/TableSettings.js +4 -4
  429. package/dist/esm/Components/Tabs/Tabs.js +1 -0
  430. package/dist/esm/Components/Tabs/components/TabList.js +1 -0
  431. package/dist/esm/Components/Tabs/components/TabPanel.js +1 -0
  432. package/dist/esm/Components/Tabs/tabStyles.js +5 -3
  433. package/dist/esm/Components/Tag/Tag.js +5 -4
  434. package/dist/esm/Components/Tag/Tag.styles.js +5 -4
  435. package/dist/esm/Components/Tag/tagDot.js +10 -3
  436. package/dist/esm/Components/TagInput/TagInput.js +8 -7
  437. package/dist/esm/Components/TagInput/tagEntries.js +16 -4
  438. package/dist/esm/Components/TimePicker/TimePicker.js +7 -3
  439. package/dist/esm/Components/Timeline/Timeline.js +14 -10
  440. package/dist/esm/Components/Toaster/Toaster.js +2 -1
  441. package/dist/esm/Components/Toggle/TableToggle.js +1 -1
  442. package/dist/esm/Components/UpgradeButton/UpgradeButton.js +3 -2
  443. package/dist/esm/Components/UserDetails/UserDetails.js +5 -7
  444. package/dist/esm/Components/WishlistToggle/WishlistToggle.js +2 -1
  445. package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +12 -2
  446. package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +3 -1
  447. package/dist/esm/Hooks/useOutsideMouseDown.js +26 -0
  448. package/dist/esm/Hooks/usePreferences.js +30 -12
  449. package/dist/esm/Hooks/useScrollableRegion.js +33 -0
  450. package/dist/esm/Theme/chakra/Menu.styles.js +6 -0
  451. package/dist/esm/Theme/chakra/componentStyles.js +1 -1
  452. package/dist/esm/Theme/chakra/focusRing.styles.js +3 -3
  453. package/dist/esm/Theme/chakra/paletteFromTheme.js +16 -3
  454. package/dist/esm/Theme/provider/ThemeSwitcher.js +1 -1
  455. package/dist/esm/Theme/tokens/builders/filledSurface.js +3 -2
  456. package/dist/esm/Theme/tokens/builders/focusRing.js +4 -1
  457. package/dist/esm/Theme/tokens/builders/paletteScale.js +6 -0
  458. package/dist/esm/Utils/tabular.js +56 -0
  459. package/dist/esm/index.js +16 -24
  460. package/dist/index.d.ts +54 -2
  461. package/dist/index.js +33 -29
  462. package/package.json +3 -1
  463. package/dist/Components/Buttons/Buttons.d.ts +0 -3
  464. package/dist/Components/Buttons/Buttons.js +0 -9
  465. package/dist/Components/Buttons/ButtonsProps.d.ts +0 -12
  466. package/dist/Components/Common/ErrorComponent.d.ts +0 -7
  467. package/dist/Components/Common/ErrorComponent.js +0 -16
  468. package/dist/Components/Common/FormattedDescription.d.ts +0 -7
  469. package/dist/Components/Common/FormattedDescription.js +0 -62
  470. package/dist/Components/Common/Label.d.ts +0 -9
  471. package/dist/Components/Common/Label.js +0 -12
  472. package/dist/Components/Input/Input/Input.d.ts +0 -4
  473. package/dist/Components/Input/Input/Input.js +0 -75
  474. package/dist/Components/Input/Input/InputProps.d.ts +0 -24
  475. package/dist/Components/Input/Input/InputProps.js +0 -2
  476. package/dist/Components/ProductCard/productCardFixtures.d.ts +0 -7
  477. package/dist/Components/ProductCard/productCardFixtures.js +0 -61
  478. package/dist/esm/Components/Buttons/Buttons.js +0 -4
  479. package/dist/esm/Components/Common/ErrorComponent.js +0 -14
  480. package/dist/esm/Components/Common/FormattedDescription.js +0 -60
  481. package/dist/esm/Components/Common/Label.js +0 -10
  482. package/dist/esm/Components/Input/Input/Input.js +0 -37
  483. package/dist/esm/Components/Input/Input/InputProps.js +0 -1
  484. package/dist/esm/Components/ProductCard/productCardFixtures.js +0 -58
  485. package/dist/esm/services/feedback.js +0 -15
  486. package/dist/services/feedback.d.ts +0 -12
  487. package/dist/services/feedback.js +0 -18
  488. /package/dist/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
  489. /package/dist/esm/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -3,9 +3,9 @@
3
3
  All notable changes to `pixelize-design-library`.
4
4
 
5
5
  Versions follow semver. The `beta` dist-tag is released manually from the active feature branch;
6
- `latest` is published by CI from `develop`. **Pin a prerelease exactly** (`2.4.2-beta.43`, never
7
- `^2.4.2-beta.43`) — a caret range on a prerelease is satisfied by the next stable publish, which
8
- silently downgrades you.
6
+ `latest` is published by CI from `develop`. **Pin a prerelease exactly** (`X.Y.Z-beta.N`, never
7
+ `^X.Y.Z-beta.N`) — a caret range on a prerelease is satisfied by that version's stable release as
8
+ soon as it exists, which silently downgrades you.
9
9
 
10
10
  Found a bug or a gap? Report it as a GitHub issue and track it to closure — see
11
11
  [COMPONENT-GOTCHAS.md](COMPONENT-GOTCHAS.md#found-a-gap-or-a-bug-report-it-then-track-it). A fix's
@@ -18,9 +18,66 @@ next major.
18
18
 
19
19
  ### Added
20
20
 
21
+ - **Development warning for an unthemed `colorScheme`.** `Tag` (dot), `RadioButton` and every style that resolves a scale
22
+ by name now log one `console.warn` per unknown name outside production, then fall back exactly as before (gray, or
23
+ primary for `RadioButton`). Nothing throws and production is silent.
24
+ - **Six prop types reach the package root.** `CopyButtonProps`, `FilterSidebarProps`, `LazyWrapperProps`,
25
+ `ScrollToTopProps`, `FieldSelectModalProps` and `ThemedSwitchProps` (the props of `InputSwitch`) were declared beside
26
+ their exported components but not re-exported. Type-only, additive.
27
+ - **`Tag` `removeLabel` and `TagInput` `labels.remove`.** Name the chip remove button in your own language: `removeLabel`
28
+ takes a string or a function of the label, `labels.remove` a function of the tag. Both default to `Remove <label>`, so
29
+ existing output is unchanged.
30
+ - **`TextInput` `onRightIconClick`**: the correctly spelt name for the right-icon button handler. It wins when both
31
+ names are set; omitted, the output is exactly as before.
32
+ - **`TimePicker` `onClear`**: makes the "--" option pickable once a time is set; choosing it in any select calls `onClear`
33
+ instead of `onChange` (which still only emits a `Date`). Omitted, the output is exactly as before.
34
+ - **`Slider` `showPauseControl`** (default off) adds a play/pause button for the auto-advance (WCAG 2.2.2). It shows only
35
+ while the timer can run (`interval` > 0, two or more slides, no reduced motion). Omitted, the output is exactly as before.
36
+ - **`formatRelativeTime` takes `{ labels, locale }`.** `labels` ({`justNow`, `minutesAgo(n)`, `hoursAgo(n)`, `daysAgo(n)`})
37
+ replaces the English wording and `locale` sets the short date shown past a week (default `en-US`). Omitted, the output is
38
+ exactly as before.
39
+ - **`Tag` and `IconButton` accept any typed `data-*` prop.** The type moved from `Button` to `Common/dataAttributes.ts`; `Tag`
40
+ now puts every `data-*` prop on its root (chip and dot), not only `data-testid`. Omitted, the output is exactly as before.
41
+ - **`ChoiceCardGroup` `columns` and `gap`; `ChoiceCard` `isDisabled`.** `columns` (default `1`, today's column) lays the
42
+ cards out in an equal-width grid, `gap` sets the space between them, and `isDisabled` is an alias of `disabled`
43
+ (either disables the card and skips it for the tab stop). Omitted, the output is exactly as before.
44
+ - **`VerifyEmailOtp` `subtitle` and `labels`**: `subtitle` replaces the hardcoded second line "your new Pixel Account"
45
+ (`""` drops it); `labels` ({`verificationCode`, `digit(index, total)`, `didntReceive`, `resend`}) replaces the English
46
+ UI text. Both optional; omitted, the text is exactly as before.
47
+ - **`WorkspaceTrayPreview` render-prop children**: `{({ triggerProps }) => <button {...triggerProps} />}` hands the one
48
+ focusable trigger `aria-expanded`, plus `aria-controls` and `aria-describedby` pointing at the card while it is open.
49
+ Plain `ReactNode` children work as before and get no ARIA (a bare wrapper `div` cannot hold `aria-expanded`).
50
+ - **`Select` (`native={false}`) gains nine additive props, all default-off.** Search: `searchFields`
51
+ (`["label","description"]` makes the description searchable) and `filterOption(option, query)` (replaces the
52
+ substring match). Multi: `isSelectAll` (Select All / Unselect All row over the rows the filter shows, skipping
53
+ disabled ones), `chipMaxLength`, `isChipRemovable`. Trigger: `rightIcon` (static, or a labelled button via
54
+ `onClick` + `ariaLabel`) and `isFieldLoading` (spinner in the trailing slot, `aria-busy`). Create: `createWhen`
55
+ (`"no-exact-match"` offers Create beside partial matches) and `footerAction` (a persistent last row that calls
56
+ `onSelect(query)` and closes). The Select All, Create and footer rows are keyboard stops.
57
+ - **`TagInput` `labels`**: translate the rejection messages (`maxTags`, `duplicate`, `invalid`) and the live-region announcements
58
+ (`added`, `removed`); omitted keys keep today's English text. The chips' `Remove <tag>` buttons are named by `Tag` and stay English.
59
+
60
+ - **`FilteredEmptyState`, and `QueryStateBoundary` `isFiltered` / `filteredEmpty`.** The "nothing matches your filters" panel:
61
+ `filterCount`, `onClearFilters`, `onRemoveLastFilter` (+ `removeLastFilterLabel`, `clearLabel`), `scale` `"page" | "card"`,
62
+ `title`, `description`. On the boundary, `isEmpty` + `isFiltered` shows it instead of `empty`/`emptyFallback`; omitted, the
63
+ boundary is unchanged.
64
+
65
+ - **`ConfirmDialog` consequences.** `entityName` / `entityKind` (default title `Delete leave type "Sabbatical"?`), `dependents`,
66
+ `consequence` (defaults to "This cannot be undone." with `entityName`), `alternative` (`label`, `description`, `onSelect`,
67
+ `isLoading`; Confirm turns outline, focus still opens on Cancel) and `isConfirmDisabled`. `iconBg` / `iconColor` are now
68
+ optional and derive a soft tint from `tone`; `title` is optional when `entityName` is set. Existing call sites render as before.
69
+
70
+ - **`PIXELIZE_SUITE`, `resolveSuiteApps` and `buildSuiteApps` `devFallbackBaseUrl`.** One catalogue of the six suite apps with
71
+ per-app `preRelease` and `overrides`; `devFallbackBaseUrl` lets a plain-`localhost` host derive the other apps from a labelled
72
+ dev URL instead of throwing (the throw stays the default).
73
+
74
+ - **`RangeDatePicker` `presets`**: `{ label, range: { from, to } }[]` replaces the five built-in shortcuts; `[]` hides the row.
75
+ Omitted, the list is unchanged.
76
+
21
77
  - **`WorkspaceTray` is usable over an open modal.** It is portalled above the modal layer, labelled as a live region
22
78
  (so Chakra's modal aria-hidden skips it) and outside the focus trap, so a window minimised over a wizard can be
23
- restored without closing the wizard. New props: `placement` (`"bottom-end"` | `"bottom-start"`), `offset`,
79
+ restored by pointer without closing the wizard; Tab does not reach the tray until the modal closes. New props:
80
+ `placement` (`"bottom-end"` | `"bottom-start"`), `offset`,
24
81
  `closeLabel(item)`, `dirtyLabel`, `label`; `WorkspaceTrayItem` gains `isDirty` (unsaved dot) and `subtitle`.
25
82
  `WorkspaceWindow` gains `labels` ({minimize, close, openFullPage}) and `finalFocusRef`.
26
83
  The tray now renders in a portal, so a test that queries inside its render container must query `document.body`.
@@ -82,6 +139,7 @@ next major.
82
139
  - **`ChoiceCard` / `ChoiceCardGroup`**: radio cards for picking one of a few options that each need a line of
83
140
  explanation. Group: `value` / `defaultValue` / `onValueChange`; card: `label`, `description`, `icon`,
84
141
  `disabled`. One tab stop; arrows, Home and End move focus and selection. Same look as `PaymentOption`.
142
+ `Pagination` and `ChoiceCard`: reviewed on screen by the owner 2026-10-15, take as-is.
85
143
  - **Plain HTML attributes on the page primitives**: `PageHeader`, `StatCard`, `SaveBar`, `EmptyState`,
86
144
  `DescriptionList`, `FilterBar` and `Skeletons` pass `id`, `className`, `style`, `data-*`, `aria-*` and
87
145
  event handlers to their root element; the component's own props still win and Chakra style props are
@@ -340,9 +398,58 @@ next major.
340
398
  - **`RangeSlider`** as an owned dual/single-thumb component with a `marks` prop.
341
399
  - `resolveFilledSurface(scale, colors)` — picks readable ink for any filled surface.
342
400
  - `size="2xs"` (16px) on `Avatar`, and `getInitials` to override the built-in derivation.
401
+ - **`Drawer` / `FormDrawer` warn in development when an open drawer has no accessible name.** A drawer with no
402
+ `DrawerHeader`, `aria-label` or `aria-labelledby` is announced as an unnamed dialog; it now logs
403
+ `UNNAMED_DRAWER_WARNING` once per mount (production is silent and unchanged).
404
+ - **77 prop types now reach the package root**, so a consumer can type a wrapper without a deep import of `dist/`:
405
+ `AccordionProps`, the `Apex*ChartProps` and their variant unions, `PaymentCardProps` (+ `Plan` as `PaymentCardPlan`),
406
+ `DropdownProps`, `FilePreviewProps`, `NoteTextAreaProps`, `NotificationProps`, the `NotificationBell*` family,
407
+ `PhoneNumberInputProps`, `Reorder*`, `Select{Single,Multi,Field}Props`, `SelectV2{Single,Multi}Props`, the Drawer, Modal
408
+ and ProfileCard slot props, `UpgradeButtonProps`, `CustomThemeProps` and more (type-only, no runtime change).
409
+ `src/index.propTypes.test.ts` now fails when a prop type in a `*Props` file is neither exported nor marked internal.
410
+ - **`toCsv`, `downloadBlob`, `safeFileName` and the `TabularCell` / `TabularColumn` / `ToCsvOptions` types** (`Utils/tabular.ts`):
411
+ RFC 4180 CSV with a formula-injection guard (a leading `=`, `+`, `-`, `@` gets a `'`, plain signed numbers excepted) and an
412
+ optional BOM; a browser download that revokes its object URL; a file name safe on every OS. Port of the Mobile library's
413
+ `core/files/tabular.ts`. No `.xlsx` and no `Table` export button yet.
414
+ - **Editor token helpers on the root:** `fieldToken`, `extractTokens`, `unknownTokens`, `chipHtml`, `chipify`, `serializeChips`
415
+ and the `ChipContext` type, so an app no longer copies `chipHtml`. `EditorMergeField` gains optional `object`,
416
+ `objectDescription`, `description`, `example`, `source` and `image` for a field browser; `Editor` itself ignores them.
417
+ - **`DarkPaletteOptions` and `DarkPlanes` types** are exported, so the options of `buildDarkPalette` can be named.
418
+ - **README Exports index.** Every value the package root exports is listed in `README.md`, grouped as components,
419
+ hooks, constants and helpers, so a developer or LLM with only this package can find any export. It is generated
420
+ (`UPDATE_README_EXPORTS=1 npx jest src/readmeExportsIndex.test.ts`) and `readmeExportsIndex.test.ts` fails when it
421
+ drifts from `src/index.ts`. `DESIGN-GUIDE.md` gains the type ramp (`textStyle`, `NUMERIC_TEXT`), radius by role,
422
+ the `Table` studio default and a table of parts that belong to a parent (`DrawerBody`, `ProfileCardFooter`,
423
+ `StageItem`, `MediaScrubber`, `LazyWrapper`, `AppearanceSettings`, `ApexPolarChart` and the rest).
424
+ - **Repo tooling, no package change.** `mouseOnlyHandlers.test.ts` is a lower-only ratchet on click-only elements (host
425
+ elements and Chakra layout primitives with `onClick` and no `role`, `tabIndex` or key handler).
426
+ - **Repo tooling, no package change.** `npm run size:web` bundles the root barrel with esbuild and fails over the beta.65
427
+ size +3% (opt-in, not wired to CI).
428
+ - **Repo tooling, no package change.** `scripts/verify-consumers.sh` now covers `lfour/frontend`, finds consumers from a git
429
+ worktree (`CONSUMERS_ROOT`), writes nothing in a consumer, and exits non-zero when nothing was compared or `tsc` rejected
430
+ its own config, instead of printing a clean pass.
343
431
 
344
432
  ### Changed
345
433
 
434
+ - **`Table` rows are keyboard-reachable when `onRowClick` is set.** Each row becomes a tab stop (`tabIndex` 0) and Enter or Space
435
+ on the focused row fires `onRowClick` with the first visible column that has no `node`, the same call a click on that cell makes.
436
+ Rows of a table without `onRowClick`, with every column on `node`, or while `isLoading` are unchanged. **Consumers that pass
437
+ `onRowClick` gain one Tab stop per row**: update tab-order tests and expect long tables to need more Tab presses to cross.
438
+
439
+ - **`ProfileCard` shares the dropped-slot dev warning with `Modal` and `Drawer`.** The helper takes any owner name and
440
+ warns once per owner and type (previously one set across owners); `ProfileCard` keeps its own message text.
441
+ - **`MediaViewer` image pan no longer re-renders the viewer on every pointer move.** The pan offset is held in a ref and
442
+ written to the image's transform directly, so dragging a zoomed photo re-renders nothing (the toolbar and its five
443
+ tooltip-wrapped buttons used to re-render per move). Zooming out or resetting mid-drag now ends the drag.
444
+ - **`MediaViewer` no longer loads `date-fns`** for its one "Uploaded" date; `Intl.DateTimeFormat` prints the same
445
+ `Oct 12, 2026` text (-5.6 KB gzip for an app that does not also use `DatePicker`).
446
+ - **NavLauncher** search rows are `memo` with stable handlers: moving the active option with the arrow keys or the pointer re-renders the 2 rows that change instead of every row (80 rows: 80 renders before, 2 after); the consumer's `onClose`, `onNavigate` and `onTogglePin` may be inline functions without defeating it. Pixel-identical.
447
+ - **`ProfileCard` warns in development when it drops a child**, once per dropped type, like `Drawer` and `Modal`: anything
448
+ that is not a `ProfileCardHeader`/`Body`/`Footer` (or a Fragment of them) never renders.
449
+ - **`Table` rows render once on mount, not three times.** Measured column widths and the select slot's width only feed frozen columns and the row-detail chevron, but a fresh offsets array on every measurement re-rendered every row. Tables without a frozen column or `renderRowDetail` now keep a stable offsets array; frozen and detail tables still update when widths settle. No visual change.
450
+ - **`Table`, `Button` and `Toaster` hairlines and small text read the tokens.** 18 `0.063rem` borders now use `BORDER_WIDTHS.hairline` and 12 pixel font sizes use the `fontSizes` keys; the token-ownership baselines drop to match (`remHairline` 24 to 6, `fontSizePx` 54 to 42). Computed styles and layout of the demo page, filter pane, chips and settings sheet are identical before and after, in light and dark.
451
+ - **`KanbanBoard` cards no longer re-render when `onOpen` or `onDelete` is an inline arrow.** The board hands cards stable wrappers that call the latest prop, so a parent re-render leaves every card alone and a click still reaches the current handler. No visual change.
452
+ - **`Table` header controls skip renders they do not need.** Each column's sort, search and filter-open handlers keep their identity, so hovering a header or sorting one column no longer re-renders every other column's sort icon and filter control. No visual change.
346
453
  - **Performance, no visual change** (web premium/perf campaign):
347
454
  - Theme colour math is memoised (`resolveFilledSurface`, `liftToContrast`, `softenToContrast`,
348
455
  `resolveSoftTone`, luminance) in bounded, content-keyed caches: the hot calls are 5-20x faster and
@@ -451,9 +558,67 @@ next major.
451
558
  `colorScheme` (any brand/global scale, via `resolveFilledSurface`), `isReadOnly` with real
452
559
  `aria-readonly`, and `m`/`mt`/`mb`/`ml`/`mr`/`mx`/`my` on the wrapper. `InputSwitch` is now a
453
560
  genuine thin wrapper — no prop it previously accepted is silently dropped.
561
+ - `jsdoc/require-jsdoc` now also covers exported `*Props` / `*Options` types outside `*Props` files; around 30 types gained a one-line doc.
454
562
 
455
563
  ### Changed (visual)
456
564
 
565
+ - **`Table` rows with `onRowClick` show a keyboard focus ring.** A focused row draws the library's two-tone ring inset around its
566
+ cells (sticky cells included), on `:focus-visible` only, so a mouse click draws nothing. It clears 3:1 on every row plane in light and dark.
567
+
568
+ - **`NavLauncher` slides in with the library's 200 ms enter tween instead of Chakra's drawer spring.** The spring took about 570 ms to come to rest on a full-height panel; the tween (`motionTransition("enter", "out")`, instant under `prefers-reduced-motion`) lands in 200 ms. Measured at 4x CPU throttle, 1280x800, 12 runs against an unchanged build: click to panel at rest and search field focused, median 765 to 413 ms (spotlight, -46%), 819 to 481 ms (classic, -41%), 787 to 460 ms (dark spotlight, -42%). The resting layout and the exit are unchanged.
569
+ - **`NavLauncher` text snaps to the type scale.** The trigger, panel and spotlight (`NavLauncher`, `launcherParts`, `spotlightParts`) read
570
+ `xs-plus` (13px) where they drew `12.5px` and `xs-minus` (11px) where they drew `11.5px`; the `13.5px` sizes stay. Each size moves by 0.5px.
571
+ - **Disabled `Button` dims to the shared 0.5.** The base style drew `opacity: 0.6` while every other disabled control reads
572
+ `DISABLED_OPACITY` (0.5); disabled buttons, and the `IconButton`s that inherit them, now read slightly dimmer.
573
+ - **`Toaster` card no longer slides twice.** The card added a 24px `x` slide on top of Chakra's own wrapper slide (400ms), so a toast travelled twice and settled late. The card now only fades; the wrapper's slide is the only one.
574
+ - **Focus on dark chrome draws the library's two-band ring.** `Header` edit/create buttons, the `MediaViewer` controls (icon buttons, scrubber, volume and seek thumbs) and the `Dropdown` option rows replace a single 2px band with halo + ring (`surfaceFocusRing` on the dark surface; `insetFocusRingShadow` for the rows), so the ring is 4px at its outer edge like every other control.
575
+ - **Overlay and card elevation read the shadow tokens.** The `AppSwitcher` and `OrgSwitcher` panels use `shadows.float` (was a single `0 10px 30px` layer), `SignInActivityTable` uses `shadows.sm`, and the `SearchSelect` open-state inset border and `Timeline` node rings are `BORDER_WIDTHS.hairline` (1px) instead of `0.063rem`.
576
+ - **Hover fades and small transforms take the motion tokens.** `CopyButton`, `CustomModulesTable`, `UserDetails`, `SignInActivityTable`, `RolesPermission`, `OrgSwitcher`, `AppSwitcher`, `NavigationBar`, `ButtonGroupIcon`, `DatePicker` days, `Checkbox`, `PlanPill`, `FilePreview` and `MediaViewer` replace literal `0.12s` / `0.15s` / `0.2s` with `transitionFor`: fades are 150ms and `PlanPill` / zoom are 200ms, on the standard curve (the `ease-out` drags use the out curve). Differences are at most 30ms.
577
+ - **`PlanPill` and the `SideBar` chrome snap to the type scale.** `12.5px` becomes `13px` (`xs-plus`; `PlanPill` label, `SIDEBAR_CHROME.titleFontSize`) and `11.5px` / `9.5px` become `11px` (`xs-minus`; `SIDEBAR_CHROME.labelFontSize`, section captions in `MenuItems`, `OtherApps`, `PinnedSection`). Sizes change by at most 0.5px; `10px` and `15px` stay as they are.
578
+ - **Hover lift and the `Timeline` divider use whole pixels.** `KanbanBoard` account cards and clickable `Timeline` cards lift by `-1px` (was `-0.063rem`, 1.008px at the default root size, which anti-aliases a transform), and the `Timeline` divider is `BORDER_WIDTHS.hairline` tall.
579
+ - **Disabled and blocked rows dim to `DISABLED_OPACITY` (0.5).** `CouponField` options, `CheckoutKit` selectable cards, `SideBar` blocked items (primary and secondary), `StageProgress` / `StepperStage` and `UpgradeButton` dimmed to 0.6 or 0.55; they now match `Tag` and the token. Busy-state dims are unchanged.
580
+ - **NavLauncher Top hit and answer cards show their ENTER chip only while active.** Both drew "ENTER" (and an answer its "copy" hint) permanently, so while another row was active two results claimed Enter; search rows already showed the chip on the active row only. The chip is hidden with `visibility`, so nothing shifts, and a card that just copied still shows "Copied".
581
+ - **NavLauncher footer stays one row on a tablet.** Between `md` and `lg` (768-1023px) the legend plus the footer note wrapped to two rows, 53px; the "+ click for new tab" hint (a mouse hint) now shows from `lg` up, so the footer is 32px at 768px and 820px. Unchanged from `lg` up.
582
+ - **NavLauncher footer legend follows the active entry on a Show more option and for copy-only answers.** ENTER read "open here" while a Show N more row was active although Enter expands the group; it now reads `labels.hintExpand` (new, default "expand"). The ⌘ ENTER "new tab" hint dims while the active result cannot open in a tab (a copy-only answer, an action, Show more). The ENTER label reserves the widest of its three texts, so nothing after it moves.
583
+ - **Inset focus ring: ring on the outer edge, halo inside.** `insetFocusRingShadow` drew them the other way round, so a child
584
+ covering the inner band left only the surface-coloured halo. It now matches `Accordion` (unchanged). Affects NoteTextArea,
585
+ CalendarGrid, SearchSelect, SelectSearch, MediaGallery and the FilterSidebar range and options sections.
586
+ - **Focus ring settles against the table header band.** `focusRing.ring` is now also lifted to 3:1 on the table header band
587
+ (raw and as stepped): rosewood light and lavender, meadow, skyline and slate dark move one or two lightness steps from
588
+ 2.97-2.99:1; every other brand and mode keeps its ring.
589
+ - **`Timeline` attachment chip hover ink clears AA in light.** The hovered chip kept the rest ink on the darker
590
+ `primary[100]` fill (3.86:1 radiant, 4.05:1 lavender, 4.39:1 slate); the ink is now picked against the hover fill in
591
+ both modes. Only light hover on brands whose rest ink fell short changes.
592
+ - **Commerce hover fills are a visible step in dark.** `OffersList`, `CouponField`, `DetailSections`, `StickyBuyBar` (notify), `QuantityStepper`, `WishlistToggle` (soft, ghost), `ProductCard`'s off-photo action, `ProductDetails`' share button, selectable `AddressCard`/`PaymentOption` and `OptionChip` hovered `background[100]` to `[200]` (`[300]` to `[400]` for the chip), 1.05-1.08:1 in dark. The hover now steps 1.15:1 or more off the resting fill; light is unchanged.
593
+ - **`ApexPieChart` `variant="pie-with-image"` no longer calls imgur** (two hard-coded URLs that answered 403, so the slices
594
+ painted nothing). Each slice now gets an inline striped texture in its own colour, light and dark. New optional
595
+ `images?: string[]` supplies your own sources (one per slice; the first repeats past the end).
596
+ - **`ApexLineChart` toolbar and its "Download SVG/PNG/CSV" menu are themed in dark.** The chart never told ApexCharts the
597
+ canvas mode, so its menu rendered light text on a white panel (1.13:1); it now follows the palette (15:1). Light is unchanged.
598
+ - **`FilterSidebar`'s rules inside the card use the in-card weight** (`cardRule`): the section dividers, the Filters header rule,
599
+ the cards-variant section edge, the range track and the range value chips. Dark lifts them off the card; light is unchanged.
600
+ The outer container outline keeps `boxborder[200]`.
601
+ - **`SelectSearch`'s separator above the bottom action** uses the overlay rule (`raisedRule`) like the action row below it,
602
+ not Chakra's default border colour. Dark gets the in-card weight; light moves by a few channel values.
603
+ - **`SelectSearch` colour-option swatch** uses the `full` radius token instead of `50%`. The dot is the same circle; Chromium
604
+ anti-aliases its edge pixels slightly differently.
605
+ - **`Notification` countdown label keeps counting.** It was computed once at first render and stayed at "due in 5
606
+ hours" for the life of the card; it now refreshes every minute while a `dueDate` or `endDate` is set (no timer
607
+ otherwise, cleared on unmount).
608
+ - **`NoteTextArea` dark footer band separates from the note area.** In dark the active band under the note was 1.11:1
609
+ against it and read as one slab; it now steps to 1.19:1, and the attachment chip fill, its remove-hover and the control
610
+ hover follow so a chip keeps a visible step and its text stays above 4.5:1. Light mode is byte-identical.
611
+ - **`Notification` overdue label** reads "Task overdue by 3 hours", without the trailing "ago".
612
+ - **`Notification` dismiss control** shows the focus ring on keyboard focus, like the title button beside it. It was
613
+ focusable with no visible indicator.
614
+ - **`WorkspaceWindow` header and `WorkspaceTrayPreview` card rule in dark**: the header strip read 1.08:1 off the raised
615
+ window and its rule 1.00-1.07:1; both now step off `surfaceRaised` (`bandOn`, `raisedRule`) to 1.16:1 and about 1.35:1.
616
+ The preview card's border takes the same rule. Light is unchanged.
617
+ - **`Table` settings sheet option cards and column-row hover outline are visible in dark.** The Density and Group option cards and the Manage Columns row hover used `boxborder[200]` on the raised surface (about 1.0-1.07:1); they now use `raisedRule`. Light is unchanged.
618
+ - **`Table` filter pane rules and expanded row are visible in dark.** The pane's edge, header, search and Apply-bar rules use `cardRule` instead of `boxborder[200]` (1.08-1.16:1 on the lifted card), and an expanded section steps off the card with `bandOn`. Light is unchanged.
619
+ - **`Table` active-filter strip reads as a band in dark.** The strip behind the filter chips was 1.06:1 from the card; it now uses `bandOn` (about 1.19:1), and the chip tone and Clear All ink are derived against that strip. Light is unchanged.
620
+ - **`Table` bulk-action hover fill is visible in dark.** The hover on Delete and Mass Update used `background[100]`, which sits about 1.06:1 from the card; it now steps off the card with `bandOn` and the accent ink is re-derived against the lifted fill. Light is unchanged.
621
+ - **`Table`'s date filter loads on demand.** The filter pane's `DatePicker` (and date-fns) no longer ships in `Table`'s static graph: the Table's initial JS drops about 7.5 KB gzip (51.9 to 44.4 KB measured with peers external) and the picker loads as its own 8.8 KB chunk, preloaded when the pane has a date item. Once loaded the control is pixel-identical; a control-height skeleton shows only if it renders before the chunk arrives.
457
622
  - **Dark surfaces are hue-neutral on every brand.** The canvas, card, overlay, named `backgroundColor` ladder,
458
623
  `background[50-900]` and `table.hover` no longer take a brand tint (`SURFACE_SAT` 14 to 0): all 9 brands share
459
624
  canvas `#121212`, card `#212121` (1.163:1 over the canvas) and overlay `#2c2c2c` (1.153:1 over the card), so
@@ -552,9 +717,155 @@ next major.
552
717
  - **Light page canvas (`backgroundColor.base`) sits 1.09:1 below the card on all 9 brands**, so a borderless card keeps
553
718
  its top edge (zinc and slate `#fafafa` to `#f5f5f5`, lavender `#fbfafd` to `#f5f4f8`). `main` and every other token
554
719
  are unchanged.
720
+ - **`NavLauncher` outlines stay visible on the dark overlay.** Scope chips and arrows, the Top hit and answer cards,
721
+ suggestion chips, pinned tiles, the Pin buttons, the tab bar, section rules and the rail and preview-pane edges were
722
+ `boxborder[200]`, 1.00-1.07:1 against `surfaceRaised` in dark (zinc 1.07, the other eight under 1.03). They now use
723
+ `raisedRule`: 1.32-1.39:1 against the overlay and 1.64-1.73:1 where a recessed pane meets it. Section rules inside the
724
+ recessed rail use `ruleOn` against `backgroundColor.subtle` (1.31-1.36:1, was 1.17-1.26:1). Measured on all 9 brands;
725
+ light mode is pixel-identical, since both helpers return `boxborder[200]` there.
726
+ - **`NavLauncher` confirms a copy on screen.** Enter or a click on a copy-only answer swaps the hint on its card and in
727
+ the preview pane (`ENTER copy`) to `labels.copied` in `accentText` for 1.5 s, then restores it; only a visually hidden
728
+ live region announced a copy before. The swap reserves the longer label's width, so nothing shifts, and its fade is
729
+ off under `prefers-reduced-motion`. The live region still announces each copy once, focus stays in the field and a
730
+ blocked clipboard never shows "Copied". On touch (`hover: none`), where the hint is hidden, the label alone pins over
731
+ the card's right edge for the same 1.5 s.
732
+ - **`NavLauncher` drops the keyboard-hint row below `md`.** At 390px wide the legend wrapped to three rows (63.8px) and
733
+ made the footer 100px tall, over a footer note that needs 32px; the footer is now 32px there, so the scrolling area
734
+ (results, then the Pinned block) gains 68px. Touch devices already hid the legend at any width, and from `md` up it
735
+ is unchanged.
736
+ - **`Button` `outline` / `ghost` / `link` ink clears AA on the light page canvas too.** The ink was lifted against the
737
+ canvas, a card and an overlay but not `backgroundColor.base` (the canvas the example pages and any borderless-card layout
738
+ sit on, 1.09:1 under the card), where it measured 4.21-4.49:1. It now steps one rung darker in 21 brand/scheme pairs, light
739
+ mode only: zinc `gray` and `secondary` `#71717a` to `#52525b`, slate `primary` `#6b7280` to `#4b5563`, emerald and
740
+ storefront `gray` `#617474` to `#5e7070`, `purple` `#805ad5` to `#6b46c1` on 8 brands, `green` `#198341` to `#136533` on 7,
741
+ zinc `yellow` `#887425` to `#68591c`. Dark mode and every other `Button` pair are byte-identical.
742
+ - **`Tabs` selected ink clears AA on the light page canvas.** The selected `outline`, `ghost` and `line` ink was lifted
743
+ against the tab canvas only, not `backgroundColor.base`, where slate measured 4.43:1 (record detail). On slate, light
744
+ mode only, that ink, the `outline` border and the `line` indicator step from `#6b7280` to `#4b5563` (6.93:1). Every
745
+ other brand and mode is byte-identical.
746
+ - **`Tabs variant="ghost"` selected ink clears AA on its own tint.** The ink was lifted against the canvas, but a
747
+ selected ghost tab paints its own gray tint and the ink sits on that, where it measured 4.21-4.31:1 on radiant (light),
748
+ emerald (dark) and rosewood (dark). It now steps one rung: radiant light `#b84533` to `#983628`, emerald dark
749
+ `#0f9d8a` to `#14e3c7`, rosewood dark `#cb6b94` to `#ce91ab`. The other 15 brand and mode pairs are byte-identical.
750
+ - **`FilterSidebar`'s Clear control, range triggers and value rows, and rating rows draw the focus ring on keyboard focus
751
+ only.** The shared halo and ring (`focusVisibleRing`), drawn inset on the value and rating rows because their panel
752
+ clips overflow. Rest and mouse click look exactly as before.
753
+ - **`FilePreviewTrigger` shows its preview scrim and a focus ring on keyboard focus.** The eye-icon scrim that hover
754
+ reveals now also appears when the thumbnail takes keyboard focus, with the shared halo and ring (`focusVisibleRing`).
755
+ Rest, hover and mouse click look exactly as before.
756
+ - **`SelectSearch`'s `isBottomIcon` footer draws the focus ring on keyboard focus only.** The shared halo and ring
757
+ (`insetFocusRingShadow`), drawn inset because the popup panel clips overflow. Rest, hover and mouse click look
758
+ exactly as before.
759
+ - **`Editor`'s editing area joins the Tab order and its frame shows focus** (axe `scrollable-region-focusable`, WCAG
760
+ 2.1.1 and 2.4.7). Jodit ships the surface at `tabindex="-1"`, so a keyboard could not reach the text and a
761
+ scrollable read-only editor could not be scrolled. `Editor` now sets `tabIndex: 0` (a `config.tabIndex` you pass
762
+ wins), and while focus is inside it the Jodit frame takes the field focus look: a `primary[500]` border and the soft
763
+ bloom, light and dark. At rest nothing changes. Each editor adds one Tab stop between its toolbar and its status bar.
764
+ - **`OrganizationDetails`' header avatar is the library's own `Avatar`** (it rendered a raw Chakra one). Chakra picked
765
+ the initials ink by a brightness threshold: dark mode measured 1.98:1 (zinc 2.17:1) on all 9 brands and emerald and
766
+ storefront 4.26:1 in light, at 9.6px. The fill now follows the brand and mode like every other avatar and the ink
767
+ clears AA on all 9 brands in both modes. The avatar renders only with `userName`, since the owned `name` is required:
768
+ without it the grey placeholder icon is gone.
769
+ - **`Header`'s bar row is `min-height` 4.3rem instead of a fixed `height`**, so a nav that wraps (many items, or
770
+ `HeaderActions` labels in a narrow bar) grows the bar around it. The fixed height let the wrapped row hang off the
771
+ bar onto the page canvas, where its count badge measured 1.55-1.91:1 on all 9 brands in light (axe `color-contrast`,
772
+ `/header`). A bar whose nav fits on one row is pixel-identical, and 4.3rem is still its height.
773
+ - **`ScrollbarBox` is a keyboard stop while it scrolls.** A box whose content overflows a scrollable axis (more than
774
+ 1px) and holds nothing focusable now takes `tabIndex={0}`, so a keyboard user can scroll it, and draws the library
775
+ focus ring on `:focus-visible` only. A box that fits, scrolls `hidden`, or holds a button or link is unchanged, as
776
+ is a mouse click. The new optional `aria-label` names the stop as a `region`; without it the stop has no name.
777
+ Closes axe `scrollable-region-focusable` on `/scrollbarBox` (6 regions).
778
+ - **`StageProgress`'s strip is a keyboard stop while it scrolls with nothing focusable in it.** At phone width a
779
+ read-only strip (or one with every stage disabled) overflows and a keyboard user could not scroll it; it now takes
780
+ `tabIndex={0}` and draws the library focus ring on `:focus-visible` only. A strip with a stage button, or whose
781
+ stages fit, is unchanged, as is a mouse click. The new optional `aria-label` names the stop as a `region`, or names
782
+ the list when `variant="stepper"`. Closes axe `scrollable-region-focusable` on `/stageProgress` (`[data-stage-strip]`).
783
+ - **`SignInActivityTable`'s scroll area is a keyboard stop while the table scrolls.** At phone width the three columns
784
+ overflow the card and a keyboard user could not scroll them; the wrapper now takes `tabIndex={0}`, is a `region`
785
+ named by `labels.title`, and draws a 2px ring on `:focus-visible` only. The ring is an outline in `focusRing.ring`
786
+ (lifted until it clears 3:1 on the header band, on all 9 brands in both modes), because the library's inset shadow
787
+ hides under the opaque header. A table that fits, a mouse click and the rest state are unchanged. Closes axe
788
+ `scrollable-region-focusable` on `/signInActivityTable`.
789
+ - **`Menu` dividers keep their full weight in dark.** Chakra's stock divider carries `opacity: 0.6`, which pulled the
790
+ `NavigationBar` avatar menu and `ThemeSwitcher` rules down to 1.17-1.21:1 on the overlay; the `divider` part now
791
+ draws `raisedRule(colors)` at full opacity in dark (1.32-1.39:1) and stays at 0.6 in light, which is unchanged.
792
+ - **`Timeline` attachment-chip hover steps off the chip in dark.** The hover fill (`primary[100]`) sat 1.01-1.07:1 off
793
+ the resting chip on meadow, emerald and storefront and kept the resting ink, 3.82-4.29:1 on it; it now uses `bandOn`
794
+ (1.17-1.20:1 on those three) with an `accentTextOnCanvas` ink above 4.5:1 on every brand. Light is unchanged.
795
+ - **`Timeline` note box and "from" change pill step off the card in dark.** Both painted `gray[50]` on the event card
796
+ at 1.11:1; they now use `bandOn(gray[50], background[50])` (1.19:1), and the note's attachment chip, edit hover and
797
+ icon ink re-derive against the lifted box so they keep their step and AA ink. Light is unchanged.
798
+ - **`Timeline` rules inside the event card use the card rule in dark.** The note box outline and the divider above the
799
+ notes drew `boxborder[200]` at 1.13-1.16:1 on the card (1.08:1 on zinc); both now read `cardRule(colors)` (1.31-1.34:1).
800
+ The card's own outline and the date chips on the page canvas are unchanged. Light is unchanged.
801
+ - **`OrgSwitcher` search-header rule is visible in dark.** The rule under the search field was `gray[100]`, 1.11:1 on
802
+ the raised popover; it now reads `raisedRule(colors)` (1.32-1.39:1). Light keeps `gray[100]`.
803
+ - **`ProfilePhotoViewer` view-button hover steps off the button in dark.** The hover fill (`gray[50]`) sat 1.11:1 off
804
+ the resting `background[50]` button; it now uses `bandOn` (1.19:1) with the accent ink re-derived against it. The PDF
805
+ fallback tile (`gray[100]`, 1.27:1) already steps and is unchanged. Light is unchanged.
806
+ - **`RolesPermission` header band and in-card rules are visible in dark.** The table header band (`background[100]`) sat
807
+ 1.06:1 off the card and the rules inside the card (card header, table rows, footer divider) drew `boxborder[200]` at
808
+ 1.08-1.16:1; the band now uses `bandOn` (1.19:1) and the rules `cardRule(colors)` (1.31-1.34:1). The card's own
809
+ outline is unchanged. Light is unchanged.
810
+ - **`SearchSelect` `insideSelect` divider is visible in dark.** The rule between the nested picker and the input drew
811
+ `boxborder[200]` at 1.22-1.25:1 on the trigger (eight of nine brands); it now reads `ruleOn` that plane (1.31:1+).
812
+ The popup outlines are unchanged. Light is unchanged.
555
813
 
556
814
  ### Fixed
557
815
 
816
+ - **`FileUploader` revokes its `blob:` preview URLs on unmount.** Images still listed when the component unmounted kept their
817
+ object URLs alive for the life of the page; removal, `maxFiles` overflow and `maxTotalSize` rejection already revoked.
818
+ - **`SearchSelect`'s "Clear all" button no longer opens the menu.** Its click bubbled to the control, so Enter, Space or a
819
+ click on it cleared the value and then opened the list; the click is now stopped at the button, as the chip remove
820
+ button already did.
821
+ - **`DescriptionList` stacked values wrap long unbroken strings.** A token or URL with no break opportunity overflowed
822
+ its cell; stacked values now carry `overflow-wrap: anywhere`. Only strings that overflowed before change; the inline
823
+ layout keeps its single-line truncation.
824
+ - **`FilterSidebar`'s section Clear control is no longer nested inside the accordion header button** (axe
825
+ `nested-interactive`). `Accordion` items gain `headerAction` (a control beside the header button, which keeps the header
826
+ hover lit) and `customStyles.headerActionStyle`; rest, hover and focus render the same pixels. The header button's
827
+ accessible name is now the section label alone, and a click on Clear no longer reaches the header.
828
+ - **`FilterSidebar`'s maximum range picker is portalled like the minimum one.** Only the minimum picker was, so a host
829
+ that clips or stacks over the sidebar (a positioned `overflow` ancestor) could cut the maximum list off. Both now share one picker.
830
+ A range drag or an option toggle also re-renders only its own section instead of the whole sidebar.
831
+ - **`SelectSearch` popup keyboard and axe defects.** The sticky `isBottomIcon` footer no longer covers the row Arrow keys
832
+ focus last (the panel reserves its height as scroll padding). An empty or loading panel is no longer a `listbox` with
833
+ no options (axe `aria-required-children`); it keeps its text and drops the role. Tab out of the popup now closes it.
834
+ Picking an option with the keyboard returns focus to the input instead of dropping it to `body`, and Escape in the
835
+ input no longer swallows the next Tab-in open.
836
+ - **`NoteTextArea` Save stays disabled while either field is over its word cap.** Two effects each wrote the disabled
837
+ state, so whichever field was edited last decided it: a long title could be saved after editing the note, and a long
838
+ note after editing the title. Save is now derived from both counts.
839
+ - **`FormWrapper` forwards `id`, `data-*`, `aria-*`, `className` and handlers to its outer wrapper** instead of dropping
840
+ them, and `icon` accepts a rendered element (`<FiUser />`) as well as a component reference; an element used to throw
841
+ "Element type is invalid".
842
+ - **`VerifyEmailOtp` cells now offer one-time-code autofill.** `otp` is passed to the pin input, so the cells carry
843
+ `autocomplete="one-time-code"` instead of `"off"` and the browser or OS can suggest the emailed code. The resend link
844
+ is the owned `Button`.
845
+ - **`WorkspaceTrayPreview` no longer closes while the pointer sits on its trigger.** Moving from the card back onto the
846
+ trigger ran the card's own leave handler and closed the preview after the grace delay; the wrapper alone now owns
847
+ open and close.
848
+ - **`Select` `virtualizeAfter` now windows grouped lists.** It used to switch itself off whenever any option had a
849
+ `group`, rendering every row; headers now take part in the window.
850
+ - **`Select`: Enter and Space on the clear (x) or a chip's remove button did nothing from the keyboard.** The trigger
851
+ swallowed them to open the popup; keys from a nested button now reach the button.
852
+ - **The date, range and time picker popovers and `FilePreview` honour `prefers-reduced-motion`**: the popover slide/scale and the preview
853
+ scale-in are skipped when the user asks for reduced motion.
854
+
855
+ - **The required `*` is hidden from screen readers** in `FormField` and every `TextLabel` label (it was read as "star" and
856
+ became part of the field's accessible name). The control's own `aria-required` still announces it; sighted users see no change.
857
+
858
+ - **Legacy `DatePicker` (Table filter pane) no longer puts `aria-expanded` on a non-focusable wrapper `div`.** It anchors the
859
+ popover like `SingleDatePicker` and the input carries `aria-haspopup="dialog"`; Escape on the focused field now closes the
860
+ calendar. Looks and click behaviour are unchanged.
861
+
862
+ - **`Table` filter pane search box honours reduced motion.** The search field no longer slides in over 200 ms when the user prefers reduced motion; it appears in place.
863
+ - **`Table` notices when replaced rows gain or lose `content`, `onLink`, `onEdit` or `onDelete`.** The row-action and expand columns were decided from the row count and first id only, so a same-sized reload with the same first row kept a stale layout.
864
+ - **`ThemeSwitcher variant="segmented"`** is one tab stop, on the selected mode, like the radiogroup it declares.
865
+ All three modes were separate tab stops. Arrow keys still move focus and selection together; a Tab from outside
866
+ lands on the selected mode.
867
+ - **`LazyWrapper`** `fallback={null}` now renders nothing while loading, as written. `??` swapped the built-in
868
+ spinner in for an explicit `null`; only an omitted `fallback` (`undefined`) selects the spinner now.
558
869
  - **`WorkspaceTrayPreview`** reports `onOpenChange(false)` only after the card actually opened (it used to fire when
559
870
  the pointer left before the open delay).
560
871
  - **`FileUploader`** revokes the blob URL of an image the moment it is removed, and of images it rejects (over the total
@@ -571,8 +882,55 @@ next major.
571
882
  control. No visual change.
572
883
  - **`SearchSelect`'s open listbox and `Select`'s popup dialog have an accessible name**, from `label`, then
573
884
  `aria-label`, then `placeholder`.
885
+ - **Unnamed controls now have names, with no visual change.** `NoteTextArea`'s remove-attachment button is
886
+ named `Remove <file name>`; the legacy `DatePicker` that `Table`'s filter pane renders names its month buttons
887
+ (`Previous month`, `Next month`) and its two selects (`Month`, `Year`), as `CalendarPanel` does.
888
+ - **`FilterSidebar`'s Clear control, range triggers and value rows, and rating rows work from the keyboard.** They were
889
+ mouse-only. Each is now a named control that Enter and Space operate (`Clear <section>`, `<section> minimum: <value>`,
890
+ `<section>: N stars & up`), the open range picker is a named dialog, and the current value or rating reports
891
+ `aria-pressed`. A test that counts `getAllByRole("button")` inside a `FilterSidebar` sees more of them. Rest and
892
+ click look as before, except that opening a range picker with the mouse no longer paints a focus ring around the
893
+ popover: the trigger now takes focus first, so the popover's own focus move is no longer keyboard-visible.
894
+ - **`FilePreviewTrigger` is a real button, named `Preview <file name>`** (`Preview file` without one). It was a click-only
895
+ `role="group"` div the keyboard could not reach. Tab now lands on it, Enter and Space open the preview, and closing the
896
+ preview returns focus to it. A test that found it by `role="group"` must query the button. Rest, hover and a mouse
897
+ close look as before; opening the preview with the mouse no longer paints a stray focus ring on its first toolbar
898
+ button, because the thumbnail now takes focus first.
899
+ - **`SelectSearch`'s `isBottomIcon` footer works from the keyboard.** It was a click-only div. It is now the last
900
+ `option` of the listbox, named by its text: ArrowDown, ArrowUp, Home and End reach it, Enter and Space run
901
+ `handleBottomClick` with the popup left open, Escape closes the list, and it is the only stop while nothing matches or
902
+ the options load. `getByRole("listbox")` now contains the footer, and a test that counts `getAllByRole("option")`
903
+ with `isBottomIcon` sees one more. Rest and click look as before.
574
904
  - **`WorkspaceWindow`'s dialog is named by its visible title**; while a window is open the page behind it is
575
905
  `aria-hidden`, as for any modal.
906
+ - **`UpgradeButton`, `PlanPill` and `PlanBadge` are named by what they show** (WCAG 2.5.3, axe
907
+ `label-content-name-mismatch`). The fixed `aria-label` left out the subtitle, the status chip and, on phones, the
908
+ `mobileLabel`. Without an `ariaLabel` the name now comes from the content: `Pro 5d left`, where it was
909
+ `Pro — 5d left`. A passed `ariaLabel` still wins and should contain the visible text. A test that looks the
910
+ button up by the old dashed name needs the new one. Nothing changes visually.
911
+ - **`OrgSwitcher` names its trigger by what it shows** (WCAG 2.5.3, axe `label-content-name-mismatch`). The full
912
+ layout was named by `ariaLabel` alone (`Switch organization`) and the avatar layout by the name without its
913
+ initials, so neither held the visible text. Both now read `${ariaLabel}, ${shown organization}` (the placeholder
914
+ when none is active). The avatar initials are `aria-hidden` generated content (`data-initials`), no longer text,
915
+ which also takes them out of each dropdown row's name. A test that finds the initials with `getByText` must query
916
+ `[data-initials]`; one that looks the trigger up by the exact name `Switch organization` needs the longer name.
917
+ Nothing changes visually.
918
+ - **`CalendarGrid` day cells are named by what they show** (WCAG 2.5.3, axe `label-content-name-mismatch`). A
919
+ cell's `aria-label` (`Monday, October 5, 2026, 1 event`) left out the event chips and `renderDayCell` content it
920
+ displays. The cell now has no `aria-label`: a visually hidden date and count (`labels.eventCount`) come first and
921
+ the cell's own content follows, so the name reads `Monday, October 5, 2026, 1 event Payroll cut-off`. A test that
922
+ finds a cell by its old exact name needs a pattern or `data-date`. No layout change.
923
+ - **`FileUpload`'s progress bars are named** (axe `aria-progressbar-name`). Each `progress` entry rendered a
924
+ `progressbar` with no name; it is now `Upload progress for <file name>`.
925
+ - **`FileUpload`'s drop zone is named by what it shows** (WCAG 2.5.3, axe `label-content-name-mismatch`).
926
+ `label`, or `inputAriaLabel` (default `Upload files`), was the whole name, so it left out the visible `Drag and
927
+ drop files here` and the type and size limits. The name is now `${label ?? inputAriaLabel}, Drag and drop files
928
+ here .jpg, .png up to 5.00 MB`: a passed `inputAriaLabel` still leads. A test that looks the zone up by the old
929
+ exact name needs a pattern. No visual change.
930
+ - **`Editor`'s editing area is named** (axe `aria-input-field-name`). Without a visible `label` the
931
+ `role="textbox"` surface had no name at all; it is now `labels.editor` (default `Rich text editor`), and still
932
+ `label` when one is given. A read-only editor also exposes `aria-readonly`. Give each unlabelled editor on a page
933
+ its own `labels.editor`. No visual change.
576
934
  - **`CustomModulesTable`'s edit-module field is named** by `labels.moduleNamePlaceholder`.
577
935
  - **`StageProgress` no longer scrolls the page when it mounts**: the active stage was revealed with
578
936
  `scrollIntoView`, which also scrolled every ancestor, so a tracker below the fold pulled the page down
@@ -608,6 +966,11 @@ next major.
608
966
  - **`Table` column search shows the current search when reopened**, instead of stale text.
609
967
  - **`NavLauncher` search rows shorten the `· keyword` hint before the label**, so a long keyword list
610
968
  no longer cuts "Apply for leave" down to "Apply…".
969
+ - **`NavLauncher`'s preview pane says what Enter does on a copy-only answer**: for an answer with no `run` or `href` it
970
+ showed `labels.hintOpen` ("open here") while Enter copied the value; it now shows `labels.hintCopy`, as the answer card does.
971
+ - **`NavLauncher`'s footer legend says what Enter does**: it read `labels.hintOpen` ("open here") on every result, also while
972
+ Enter copied a copy-only answer. It now follows the active result and shows `labels.hintCopy` while Enter copies. The
973
+ other hints do not shift when it flips.
611
974
  - **`NavigationBar` right cluster no longer overflows onto the avatar at phone widths.** The title
612
975
  truncates first (overflow-only tooltip when it is a string); the `moreIcon` cluster can shrink, while
613
976
  the sidebar toggle, back button and avatar menu never do. (HRMS, beta.60 launcher trigger overflow)
@@ -850,11 +1213,46 @@ next major.
850
1213
  - `sidebar.hoverBg` no longer shares `sidebar.divider`'s value.
851
1214
  - `InputSwitch`'s `colorScheme` was destructured and discarded — every switch rendered `primary`
852
1215
  regardless of the prop. Now forwarded to `ToggleSwitch` and actually applied.
1216
+ - **The `NavLauncher` search engine no longer puts Indic characters in a consumer's minified bundle.** Tamil final-ma and
1217
+ the Devanagari anusvara are built from code points, so hrms's first-load budget gate (it counts Tamil and Devanagari
1218
+ characters) stops reading the engine as locale data. `src/index.indicLiterals.test.ts` bundles the package root with
1219
+ esbuild and fails on any code point in U+0900 to U+0DFF.
1220
+ - **`Table` / `KanbanBoard` saved preferences refetch when `orgId`, `authToken`, `page`, `key` or `name` change after mount.**
1221
+ The fetch depended on `baseUrl` alone, so a switched organisation kept the previous one's saved columns. A slow
1222
+ earlier response can no longer overwrite a newer one, the render a re-key lands is already `loading: true` with no
1223
+ stale data, and `useSavePreferences` clears `error` after a later success.
1224
+ - **`KanbanBoard` re-hydrates its collapsed columns when `orgId` or `token` changes.** The reset effect listed `baseurl`,
1225
+ `page`, `key` and `name` only, so after an organisation switch the previous one's collapsed columns stayed.
1226
+ - **`resolveFilledSurface` / `darkerFillRung`** no longer throw for a scale whose only white-carrying rung is `[50]`. The
1227
+ hover and active steps walked to rungs `150` and `250`, which do not exist; a step now moves along the rung table and
1228
+ clamps at both ends. Every scale that already worked resolves to the same rungs.
1229
+ - **Playground demos stop touching the network and clear their axe findings** (demo-only, nothing here ships in the
1230
+ package). `/charts`, `/avatar`, `/editor` and `/examples/template-editor` no longer request imgur, a dead host or cdnjs;
1231
+ `/contactForm` no longer POSTs to the dev API. `/switch` names its narrow-cell options, the `/chartTheme` legend and the
1232
+ `/wishlistToggle` glass caption clear AA, and `/notification`'s colour override follows dark mode. `visuallyHidden`,
1233
+ `skipLink` and `productDetails` gain a Playground.
1234
+
1235
+ ### Removed
1236
+
1237
+ Nothing exported from the package root. These files were never exported and nothing in the repo imported them; they are
1238
+ gone from `dist/`, so a deep import of one no longer resolves. Measured 2026-10-14: no file in hrms, crm-frontend,
1239
+ account-frontend, tickets, lfour, social-frontend or commerce deep-imports any of them.
1240
+
1241
+ - `services/feedback.ts` (use `FeedbackForm`), the legacy `Input/Input` field (`Input.tsx`, `InputProps.tsx`; use
1242
+ `TextInput`), `Common/ErrorComponent` (use `ErrorMessage` or `FieldMessage`), `Common/FormattedDescription`,
1243
+ `Common/Label` (use `TextLabel`) and `Buttons` (`Buttons.tsx`, `ButtonsProps.ts`; use `Button`).
853
1244
 
854
1245
  ### Deprecated
855
1246
 
856
- Nothing is removed yet — each of these still ships its full implementation.
1247
+ Each of these still ships its full implementation.
857
1248
 
1249
+ - **`OrganizationDetails` `uiInvite` is now optional and ignored.** The component never read it (active vs. invited is
1250
+ decided by which array an organization is in); callers that still pass it compile unchanged, and new ones can drop it.
1251
+ - **`TextInput` `onRightIconclick`** (lower-case `c`): use `onRightIconClick`. Behaviour is unchanged; tagged `@deprecated` in JSDoc.
1252
+ - **`NoteTextArea` callback arguments that are never passed**: `handleCancel`'s `isActive` (always `false`) and
1253
+ `handleSubmit`'s fourth `resetState`. Behaviour is unchanged; both are tagged `@deprecated` in JSDoc.
1254
+ - **`Skeletons` `alignSelf` and `flexShrink`** are marked `@deprecated` in the type: they have never been applied, and
1255
+ applying them now would move layout for anyone passing them. Wrap the skeleton in an element that sets them.
858
1256
  - `UploadedFile.type` (FileUploader) — never set; read the extension from `name`.
859
1257
  - `ProfileCard` `color` — no visual effect; Card styles never read a colour scheme.
860
1258
  - `NotificationData.status` — never read; the status dot colour comes from `dueDate`/`endDate`.
@@ -870,21 +1268,60 @@ Nothing is removed yet — each of these still ships its full implementation.
870
1268
  - `SelectV2` — use `Select` with `native={false}`; it is already a thin wrapper over it.
871
1269
  - `SearchSelect`, `SelectSearch` are **no longer `@deprecated`.** Both now say "prefer `Select`
872
1270
  for new work" instead: `@deprecated` claimed a migration that loses real capabilities
873
- (`insideSelect`, `isSelectAll`, `addNew`, field-level loading; and `SelectSearch`'s combobox is
874
- the text input itself, a different ARIA pattern). The marker returns once `Select` absorbs them.
1271
+ (`insideSelect`; and `SelectSearch`'s combobox is the text input itself, a different ARIA
1272
+ pattern). The marker returns once `Select` absorbs them.
875
1273
  - `Dropdown` is **no longer deprecated.** The marker was an artifact of the Select-consolidation
876
1274
  pass; `Dropdown` is a `role="menu"` action menu, never a value picker, and nothing replaces it.
877
1275
  - `Notification` is **no longer deprecated.** `NotificationItem` cannot replace it —
878
1276
  `formatRelativeTime` clamps every future date to "Just now", so a countdown card silently
879
1277
  renders wrong text through it.
1278
+ - `FilterSidebar` `onApply`, `headerPadding`, `sliderMode` and `FilterSection.checkboxes` — dead, never read.
1279
+ Every change is already live through `onChange`, the range slider is always native, and radio mode comes
1280
+ from `type: "radio"` or `radio`.
880
1281
  - Dead props now marked rather than silently ignored: `Checkbox.variant`, `ProgressBar.variant`,
881
1282
  `Table.isVisiblity` and its export props, `SideBar.selectedSubMenu`, `InputSwitch.variant`/
882
1283
  `.spacing`/`.isFocusable`, and nine native-only `Select` props that are inert under
883
1284
  `native={false}` (these now warn in dev).
884
- - `disabled` → `isDisabled` on `SideBar`, `Buttons`, `StageProgress`, `Input`, `DatePicker`. Both
1285
+ - `disabled` → `isDisabled` on `SideBar`, `StageProgress`, `DatePicker` and `TimePicker`. Both
885
1286
  are accepted; `isDisabled` wins.
886
1287
  - `MultiSelctOPtions` → `MultiSelectOption` (two typos in a shipped public type name).
887
1288
 
1289
+ Also tagged `@deprecated` in the JSDoc, by component; each tag names its replacement. None is removed in this release.
1290
+
1291
+ - `AlertDialog` `addRole`, `colorScheme`, `size`, `status`, `variant` and `key` — never read. The dialog is always
1292
+ `role="alertdialog"` at Chakra's default size; use `tone` for the colour props, and React strips `key`.
1293
+ - `ApexLineChart` `variant="realtime"` — does not animate the data it is given: it appends `Math.random()` values every
1294
+ second. No replacement ships; `"basic"`, the default, plots your `data`.
1295
+ - `Breadcrumbs` `isLastChild` — never read, no effect.
1296
+ - `ButtonGoupIconProps` (misspelled file path, a one-line re-export) — import `ButtonGroupIconProps`.
1297
+ - `Card` `colorScheme` and `color` — no visual effect, Card styles read no colour scheme. `dividercolor`,
1298
+ `dividersize` and `dividervariant` — never rendered, Card draws no divider.
1299
+ - `DatePicker` `placeholderText` — use `placeholder`; `placeholder` wins when both are set.
1300
+ - `Drawer` `vaiant` — typo of `variant`, kept as an alias; `variant` wins.
1301
+ - `Dropdown` `optionsSize` — use `size`.
1302
+ - `InputSwitch` and `ThemedSwitchProps` — use `ToggleSwitch`; `InputSwitch` is a thin wrapper around it.
1303
+ - `MediaViewerLabels` `photoCount`, `videoCount`, `documentCount`, `youtubeCount` and `shortcuts`, and the `loading`
1304
+ label of `MediaAudioPlayerLabels` and `MediaVideoPlayerLabels` — defined but never read.
1305
+ - `OrganizationDetails` `OrganizationItem.uiInvite` — never read (active vs. invited comes from which array an item is in)
1306
+ but still required, so keep passing it. `CreateOrgFormValues` `default` and `defaultOrg` — never populated by the
1307
+ built-in create modal.
1308
+ - `STATUS_INK` (`PlanPill`) — use `colors.white` from `useCustomTheme()`.
1309
+ - `ProfileCardVariantLegacy` (`variant="outlein"`) — misspelling kept for existing callers; use `"outline"`.
1310
+ - `ProgressBar` `color` — use `colorScheme`; `color` is still honoured while `colorScheme` is unset.
1311
+ - `Search` `onclose` — use `onClear`; same behaviour, consistent casing.
1312
+ - `SearchSelect` `onSelect` — use `onChange`, same payload. `virtualization` — not implemented, the list never
1313
+ virtualizes; page large datasets with `pagination`. `SelectSearch` `isSearchEnabled` and `BottomIconStyle` — never read.
1314
+ - `chakraSelectProps` — the deep-import name of `SelectProps`; import `SelectProps` from the package root.
1315
+ - `SelectV2SingleProps`, `SelectV2MultiProps` and `SelectV2Props` — use `SelectSingleProps`, `SelectMultiProps` and
1316
+ `SelectProps` with `native={false}`.
1317
+ - `Switch` and `SwitchProps` — two labelled choices; use `SegmentedControl`, or `ToggleSwitch` for a single on/off field.
1318
+ - `Table` `handleExportChange`, `exportOptions`, `exportLabel`, `headerBgColor`, `tableBorderColor`, `onColumnFilter`,
1319
+ `tableSettings` and the column-level `isSearch` — dead, never read.
1320
+ - `Timeline` `events` and its `TimelineEvent` type — use `timelineEvents`. `TimelineNote.logs_id` is never read;
1321
+ `TimelineEvents.primary_id` and `is_from` are never read but still required, so keep passing them.
1322
+ - `Toaster` `showToast({ children })` — never rendered; pass `description`.
1323
+ - `avatarFillFor` — use `resolveAvatarColorway(seed, colors)`; different arity, returns `{ bg, color }`.
1324
+
888
1325
  ### Breaking — staged for the next major, not yet released
889
1326
 
890
1327
  **`ProductCard` / `ProductDetails` props are replaced, and `ProductImageSlider` is gone.** Zero
@@ -916,9 +1353,8 @@ differ, so `tsc` names each site and nothing must be found by hand.
916
1353
  - `Avatar`/`AvatarGroup` keep their names but narrow their props: `name` is required, Chakra style
917
1354
  props are rejected, and `AvatarGroup` takes a `people` array instead of `Avatar` children.
918
1355
 
919
- **Blast radius concentrates in `hrms`, with a long tail in `social-frontend`, `tickets`,
920
- `account-frontend`, `spare-cart` and `lfour`.** `crm-frontend` and `commerce/frontend` import no
921
- affected name at all.
1356
+ **Blast radius is measured per consumer and stated once**, in the repository's `CLAUDE.md` section 7, rather
1357
+ than copied here where it can drift.
922
1358
 
923
1359
  Get the current number from `scripts/verify-consumers.sh check`, which typechecks every consumer
924
1360
  against a real build — **do not estimate it by grep.** A grep conflates names that were removed
@@ -936,8 +1372,6 @@ Consumers pin published versions, so none of this bites until a repo upgrades.
936
1372
 
937
1373
  Tracked in `.cursor/plans/deferred-breaking-changes.md` (repo-only). The ones a consumer can hit:
938
1374
 
939
- - `Select`'s search matches `label` only — no `searchFields` / `filterOption`.
940
- - `Select`'s `virtualizeAfter` silently disables itself when any option has a `group`.
941
1375
  - `Select`'s `onLoadMore` is zero-arg with no `hasMore` gate, unlike `SearchSelect.pagination`.
942
1376
  - Migrating `SearchSelect` → `Select` by hand: `SearchSelect.onSearch` debounces **1000 ms**;
943
1377
  `Select.searchDebounceMs` defaults to **0**. A mechanical rename starts firing the consumer's