pixelize-design-library 2.4.2-beta.64 → 2.4.2-beta.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. package/CHANGELOG.md +520 -21
  2. package/COMPONENT-GOTCHAS.md +187 -95
  3. package/DESIGN-GUIDE.md +54 -10
  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 +4 -1
  56. package/dist/Components/CopyButton/CopyButton.js +5 -8
  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 +3 -1
  73. package/dist/Components/Drawer/Drawer.js +28 -26
  74. package/dist/Components/Drawer/DrawerProps.d.ts +4 -0
  75. package/dist/Components/Dropdown/DropDown.js +6 -21
  76. package/dist/Components/Editor/Editor.js +6 -2
  77. package/dist/Components/Editor/EditorProps.d.ts +17 -1
  78. package/dist/Components/Editor/editorLabels.js +1 -0
  79. package/dist/Components/Editor/editorTokenStyles.d.ts +8 -0
  80. package/dist/Components/Editor/editorTokenStyles.js +9 -1
  81. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -1
  82. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +9 -2
  83. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +15 -1
  84. package/dist/Components/EmptyState/EmptyStateProps.d.ts +21 -0
  85. package/dist/Components/EmptyState/FilteredEmptyState.d.ts +5 -0
  86. package/dist/Components/EmptyState/FilteredEmptyState.js +23 -0
  87. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +1 -0
  88. package/dist/Components/FilePreview/FilePreview.js +7 -3
  89. package/dist/Components/FilePreview/FilePreviewProps.d.ts +2 -1
  90. package/dist/Components/FileUpload/FileUpload.js +8 -9
  91. package/dist/Components/FileUpload/FileUploadProps.d.ts +2 -2
  92. package/dist/Components/FileUploader/FileUploader.js +5 -6
  93. package/dist/Components/FilterSidebar/FilterSidebar.d.ts +7 -9
  94. package/dist/Components/FilterSidebar/FilterSidebar.js +90 -233
  95. package/dist/Components/FilterSidebar/OptionsSection.d.ts +14 -0
  96. package/dist/Components/FilterSidebar/OptionsSection.js +46 -0
  97. package/dist/Components/FilterSidebar/RangeSection.d.ts +17 -0
  98. package/dist/Components/FilterSidebar/RangeSection.js +80 -0
  99. package/dist/Components/FilterSidebar/SectionHeader.d.ts +13 -0
  100. package/dist/Components/FilterSidebar/SectionHeader.js +29 -0
  101. package/dist/Components/FilterSidebar/useStableCallback.d.ts +1 -0
  102. package/dist/Components/FilterSidebar/useStableCallback.js +12 -0
  103. package/dist/Components/Form/FormWrapper.d.ts +7 -7
  104. package/dist/Components/Form/FormWrapper.js +5 -3
  105. package/dist/Components/FormDrawer/FormDrawer.d.ts +1 -1
  106. package/dist/Components/FormDrawer/FormDrawer.js +3 -3
  107. package/dist/Components/FormDrawer/FormDrawerProps.d.ts +2 -0
  108. package/dist/Components/FormField/FormField.js +1 -1
  109. package/dist/Components/Header/Header.js +1 -1
  110. package/dist/Components/Header/HeaderActions.js +4 -2
  111. package/dist/Components/IconButton/IconButtonProps.d.ts +2 -1
  112. package/dist/Components/Input/TextInput.js +2 -2
  113. package/dist/Components/Input/TextInputProps.d.ts +3 -1
  114. package/dist/Components/KanbanBoard/AccountCard.js +1 -1
  115. package/dist/Components/KanbanBoard/KanbanBoard.d.ts +1 -1
  116. package/dist/Components/KanbanBoard/KanbanBoard.js +11 -7
  117. package/dist/Components/LauncherTrigger/LauncherTrigger.js +1 -1
  118. package/dist/Components/LazyWrapper/LazyWrapper.d.ts +2 -1
  119. package/dist/Components/LazyWrapper/LazyWrapper.js +1 -1
  120. package/dist/Components/MediaViewer/MediaViewer.js +4 -3
  121. package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
  122. package/dist/Components/MediaViewer/components/MediaImageViewer.js +19 -8
  123. package/dist/Components/MediaViewer/components/MediaScrubber.js +7 -2
  124. package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
  125. package/dist/Components/MediaViewer/components/ViewerIconButton.js +3 -1
  126. package/dist/Components/MediaViewer/hooks/useFileViewer.d.ts +1 -0
  127. package/dist/Components/MediaViewer/mediaItems.d.ts +1 -0
  128. package/dist/Components/MediaViewer/mediaItems.js +5 -0
  129. package/dist/Components/Modal/Modal.d.ts +1 -0
  130. package/dist/Components/Modal/Modal.js +7 -25
  131. package/dist/Components/Modal/dialogNaming.d.ts +8 -0
  132. package/dist/Components/Modal/dialogNaming.js +21 -0
  133. package/dist/Components/Modal/warnDroppedSlotChildren.d.ts +1 -1
  134. package/dist/Components/Modal/warnDroppedSlotChildren.js +7 -3
  135. package/dist/Components/NavLauncher/LauncherTabs.js +4 -3
  136. package/dist/Components/NavLauncher/NavLauncher.d.ts +1 -1
  137. package/dist/Components/NavLauncher/NavLauncher.js +288 -56
  138. package/dist/Components/NavLauncher/NavLauncherProps.d.ts +83 -5
  139. package/dist/Components/NavLauncher/ScopeBar.d.ts +14 -0
  140. package/dist/Components/NavLauncher/ScopeBar.js +139 -0
  141. package/dist/Components/NavLauncher/engine/distance.d.ts +4 -0
  142. package/dist/Components/NavLauncher/engine/distance.js +41 -0
  143. package/dist/Components/NavLauncher/engine/engine.d.ts +84 -0
  144. package/dist/Components/NavLauncher/engine/engine.js +472 -0
  145. package/dist/Components/NavLauncher/engine/fold.d.ts +15 -0
  146. package/dist/Components/NavLauncher/engine/fold.js +84 -0
  147. package/dist/Components/NavLauncher/engine/index.d.ts +21 -0
  148. package/dist/Components/NavLauncher/engine/index.js +17 -0
  149. package/dist/Components/NavLauncher/launcherParts.d.ts +14 -0
  150. package/dist/Components/NavLauncher/launcherParts.js +51 -13
  151. package/dist/Components/NavLauncher/match.d.ts +13 -2
  152. package/dist/Components/NavLauncher/match.js +26 -12
  153. package/dist/Components/NavLauncher/searchLayout.d.ts +61 -0
  154. package/dist/Components/NavLauncher/searchLayout.js +110 -0
  155. package/dist/Components/NavLauncher/spotlight.d.ts +39 -0
  156. package/dist/Components/NavLauncher/spotlight.js +202 -0
  157. package/dist/Components/NavLauncher/spotlightParts.d.ts +53 -0
  158. package/dist/Components/NavLauncher/spotlightParts.js +121 -0
  159. package/dist/Components/NavLauncher/useCopiedFlash.d.ts +6 -0
  160. package/dist/Components/NavLauncher/useCopiedFlash.js +21 -0
  161. package/dist/Components/NavigationBar/NavigationBar.js +6 -5
  162. package/dist/Components/NoteTextArea/NoteTextArea.js +12 -17
  163. package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +5 -3
  164. package/dist/Components/Notification/Notification.js +19 -21
  165. package/dist/Components/Notification/NotificationProps.d.ts +1 -1
  166. package/dist/Components/NotificationBell/notificationHelpers.d.ts +16 -1
  167. package/dist/Components/NotificationBell/notificationHelpers.js +13 -7
  168. package/dist/Components/OffersList/OffersList.js +4 -2
  169. package/dist/Components/OptionChip/OptionChip.js +3 -2
  170. package/dist/Components/OptionChip/optionInk.js +4 -2
  171. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  172. package/dist/Components/OrgSwitcher/OrgSwitcher.js +13 -6
  173. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +1 -1
  174. package/dist/Components/OrganizationDetails/OrganizationDetails.js +4 -7
  175. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +4 -2
  176. package/dist/Components/PdfViewer/PdfViewer.d.ts +1 -0
  177. package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +1 -1
  178. package/dist/Components/PlanPill/PlanPill.js +4 -2
  179. package/dist/Components/PlanPill/PlanPillProps.d.ts +1 -1
  180. package/dist/Components/ProductCard/ProductCardAction.js +2 -1
  181. package/dist/Components/ProductCard/ProductCardSwatches.js +2 -1
  182. package/dist/Components/ProductDetails/ProductDetails.js +2 -1
  183. package/dist/Components/ProfileCard/ProfileCard.d.ts +1 -0
  184. package/dist/Components/ProfileCard/ProfileCard.js +12 -26
  185. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
  186. package/dist/Components/ProgressBar/ProgressBar.js +2 -1
  187. package/dist/Components/QuantityStepper/QuantityStepper.js +5 -2
  188. package/dist/Components/QueryState/QueryStateBoundary.d.ts +1 -1
  189. package/dist/Components/QueryState/QueryStateBoundary.js +5 -1
  190. package/dist/Components/QueryState/QueryStateProps.d.ts +6 -2
  191. package/dist/Components/RadioButton/RadioButton.js +2 -3
  192. package/dist/Components/RolesPermission/RolesPermission.js +12 -8
  193. package/dist/Components/ScrollToTop/ScrollToTop.d.ts +1 -0
  194. package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +4 -1
  195. package/dist/Components/ScrollbarBox/ScrollbarBox.js +10 -4
  196. package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -1
  197. package/dist/Components/SearchSelect/SearchSelect.js +8 -5
  198. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +3 -3
  199. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
  200. package/dist/Components/SegmentedControl/SegmentedControl.js +1 -1
  201. package/dist/Components/Select/Select.js +6 -0
  202. package/dist/Components/Select/SelectNative.d.ts +16 -0
  203. package/dist/Components/Select/SelectPopup.js +170 -63
  204. package/dist/Components/Select/SelectProps.d.ts +30 -2
  205. package/dist/Components/Select/groupedWindow.d.ts +21 -0
  206. package/dist/Components/Select/groupedWindow.js +50 -0
  207. package/dist/Components/SelectSearch/SelectSearch.d.ts +1 -1
  208. package/dist/Components/SelectSearch/SelectSearch.js +48 -38
  209. package/dist/Components/SelectSearch/SelectSearchProps.d.ts +3 -3
  210. package/dist/Components/SelectV2/SelectV2.d.ts +1 -1
  211. package/dist/Components/SelectV2/SelectV2.js +1 -1
  212. package/dist/Components/SelectV2/SelectV2Props.d.ts +3 -3
  213. package/dist/Components/SideBar/SecondaryBar.js +3 -2
  214. package/dist/Components/SideBar/components/MenuItemBox.js +3 -2
  215. package/dist/Components/SideBar/components/MenuItems.js +1 -1
  216. package/dist/Components/SideBar/components/OtherApps.js +2 -2
  217. package/dist/Components/SideBar/components/PinnedSection.js +1 -1
  218. package/dist/Components/SideBar/sidebarScale.d.ts +2 -2
  219. package/dist/Components/SideBar/sidebarScale.js +2 -2
  220. package/dist/Components/SignInActivityTable/SignInActivityTable.js +7 -2
  221. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +1 -1
  222. package/dist/Components/SignInActivityTable/scrollRegionRing.d.ts +10 -0
  223. package/dist/Components/SignInActivityTable/scrollRegionRing.js +14 -0
  224. package/dist/Components/Skeletons/SkeletonProps.d.ts +5 -1
  225. package/dist/Components/Slider/Slider.d.ts +2 -0
  226. package/dist/Components/Slider/Slider.js +5 -4
  227. package/dist/Components/StageProgress/StageItem.js +2 -1
  228. package/dist/Components/StageProgress/StageProgress.js +8 -2
  229. package/dist/Components/StageProgress/StageProgressProps.d.ts +2 -0
  230. package/dist/Components/StageProgress/StepperStage.js +2 -1
  231. package/dist/Components/StickyBuyBar/StickyBuyBar.js +2 -1
  232. package/dist/Components/Table/Table.js +5 -3
  233. package/dist/Components/Table/components/HeaderActions.js +5 -3
  234. package/dist/Components/Table/components/TableBody.js +13 -8
  235. package/dist/Components/Table/components/TableGroupRow.js +2 -1
  236. package/dist/Components/Table/components/TableHeader.js +17 -21
  237. package/dist/Components/Table/components/TableLoading.js +8 -2
  238. package/dist/Components/Table/components/rowDetail.js +3 -2
  239. package/dist/Components/Table/filters/ActiveFilters.js +6 -3
  240. package/dist/Components/Table/filters/CompactSelect.js +2 -1
  241. package/dist/Components/Table/filters/FilterDatePicker.d.ts +6 -0
  242. package/dist/Components/Table/filters/FilterDatePicker.js +61 -0
  243. package/dist/Components/Table/filters/LeftFilterPane.d.ts +1 -0
  244. package/dist/Components/Table/filters/LeftFilterPane.js +14 -6
  245. package/dist/Components/Table/hooks/useTable.js +11 -7
  246. package/dist/Components/Table/settings/ManageColumns.js +4 -3
  247. package/dist/Components/Table/settings/TableSettings.js +4 -4
  248. package/dist/Components/Tabs/Tabs.d.ts +1 -0
  249. package/dist/Components/Tabs/Tabs.js +1 -0
  250. package/dist/Components/Tabs/components/CountBadge.d.ts +1 -0
  251. package/dist/Components/Tabs/components/TabList.d.ts +1 -0
  252. package/dist/Components/Tabs/components/TabList.js +1 -0
  253. package/dist/Components/Tabs/components/TabPanel.d.ts +1 -0
  254. package/dist/Components/Tabs/components/TabPanel.js +1 -0
  255. package/dist/Components/Tabs/tabStyles.js +4 -2
  256. package/dist/Components/Tag/Tag.js +5 -4
  257. package/dist/Components/Tag/Tag.styles.js +5 -4
  258. package/dist/Components/Tag/TagProps.d.ts +4 -1
  259. package/dist/Components/Tag/tagDot.js +10 -3
  260. package/dist/Components/TagInput/TagInput.js +6 -5
  261. package/dist/Components/TagInput/TagInputProps.d.ts +15 -0
  262. package/dist/Components/TagInput/tagEntries.d.ts +7 -1
  263. package/dist/Components/TagInput/tagEntries.js +18 -5
  264. package/dist/Components/TimePicker/TimePicker.js +7 -3
  265. package/dist/Components/TimePicker/TimePickerProps.d.ts +2 -0
  266. package/dist/Components/Timeline/Timeline.js +13 -9
  267. package/dist/Components/Toaster/Toaster.js +2 -1
  268. package/dist/Components/Toggle/TableToggle.d.ts +1 -1
  269. package/dist/Components/Toggle/TableToggle.js +1 -1
  270. package/dist/Components/UpgradeButton/UpgradeButton.js +3 -2
  271. package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +1 -1
  272. package/dist/Components/UserDetails/UserDetails.js +5 -7
  273. package/dist/Components/WishlistToggle/WishlistToggle.js +2 -1
  274. package/dist/Components/WizardDialog/WizardDialog.d.ts +1 -1
  275. package/dist/Components/WizardDialog/WizardDialog.js +15 -3
  276. package/dist/Components/WizardDialog/WizardDialogProps.d.ts +5 -3
  277. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +11 -1
  278. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +6 -3
  279. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +16 -15
  280. package/dist/Hooks/useOutsideMouseDown.d.ts +11 -0
  281. package/dist/Hooks/useOutsideMouseDown.js +30 -0
  282. package/dist/Hooks/usePreferences.js +30 -12
  283. package/dist/Hooks/useScrollableRegion.d.ts +17 -0
  284. package/dist/Hooks/useScrollableRegion.js +36 -0
  285. package/dist/Hooks/useSidebarPrefs.d.ts +1 -0
  286. package/dist/Theme/chakra/Menu.styles.d.ts +4 -0
  287. package/dist/Theme/chakra/Menu.styles.js +6 -0
  288. package/dist/Theme/chakra/componentStyles.d.ts +4 -0
  289. package/dist/Theme/chakra/componentStyles.js +1 -1
  290. package/dist/Theme/chakra/createBrandTheme.d.ts +1 -0
  291. package/dist/Theme/chakra/focusRing.styles.d.ts +1 -1
  292. package/dist/Theme/chakra/focusRing.styles.js +3 -3
  293. package/dist/Theme/chakra/paletteFromTheme.d.ts +2 -1
  294. package/dist/Theme/chakra/paletteFromTheme.js +18 -4
  295. package/dist/Theme/chakra/ringShadow.d.ts +3 -0
  296. package/dist/Theme/chakra/ringShadow.js +7 -0
  297. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +1 -0
  298. package/dist/Theme/provider/ThemeSwitcher.d.ts +1 -0
  299. package/dist/Theme/provider/ThemeSwitcher.js +1 -1
  300. package/dist/Theme/testing/testPalette.d.ts +1 -0
  301. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +2 -1
  302. package/dist/Theme/tokens/builders/buildDarkPalette.js +5 -5
  303. package/dist/Theme/tokens/builders/filledSurface.js +3 -2
  304. package/dist/Theme/tokens/builders/focusRing.js +4 -1
  305. package/dist/Theme/tokens/builders/paletteScale.d.ts +2 -0
  306. package/dist/Theme/tokens/builders/paletteScale.js +10 -0
  307. package/dist/Theme/tokens/types.d.ts +1 -0
  308. package/dist/Utils/accountHandoff.d.ts +3 -0
  309. package/dist/Utils/price.d.ts +1 -0
  310. package/dist/Utils/tabular.d.ts +30 -0
  311. package/dist/Utils/tabular.js +61 -0
  312. package/dist/esm/Components/Accordion/Accordion.js +11 -8
  313. package/dist/esm/Components/Accordion/accordionColors.js +2 -3
  314. package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +2 -1
  315. package/dist/esm/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
  316. package/dist/esm/Components/Apexcharts/ApexPieChart/pieImageTexture.js +10 -0
  317. package/dist/esm/Components/AppSwitcher/AppSwitcher.js +6 -3
  318. package/dist/esm/Components/AppSwitcher/AppSwitcherProps.js +18 -11
  319. package/dist/esm/Components/AppSwitcher/pixelizeSuite.js +67 -0
  320. package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +3 -3
  321. package/dist/esm/Components/Avatar/avatarColorway.js +4 -4
  322. package/dist/esm/Components/Button/Button.styles.js +5 -2
  323. package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
  324. package/dist/esm/Components/CalendarGrid/CalendarGrid.js +5 -3
  325. package/dist/esm/Components/Card/Card.js +1 -0
  326. package/dist/esm/Components/Checkbox/Checkbox.styles.js +3 -1
  327. package/dist/esm/Components/CheckoutKit/selectable.js +10 -7
  328. package/dist/esm/Components/CheckoutKit/tonalHover.js +2 -0
  329. package/dist/esm/Components/ChoiceCard/ChoiceCard.js +2 -1
  330. package/dist/esm/Components/Common/FormLabel.js +4 -3
  331. package/dist/esm/Components/Common/HelperText.js +1 -2
  332. package/dist/esm/Components/Common/activationKey.js +7 -0
  333. package/dist/esm/Components/Common/fieldMessageStyles.js +2 -1
  334. package/dist/esm/Components/Common/findSlot.js +17 -0
  335. package/dist/esm/Components/Common/surfaceFocusRing.js +3 -0
  336. package/dist/esm/Components/ConfirmDialog/ConfirmDialog.js +18 -6
  337. package/dist/esm/Components/CopyButton/CopyButton.js +5 -8
  338. package/dist/esm/Components/CouponField/CouponField.js +5 -2
  339. package/dist/esm/Components/CustomModulesTable/CustomModulesTable.js +3 -1
  340. package/dist/esm/Components/DatePicker/CalendarPanel.js +3 -1
  341. package/dist/esm/Components/DatePicker/DatePicker.js +25 -27
  342. package/dist/esm/Components/DatePicker/PickerPortal.js +2 -2
  343. package/dist/esm/Components/DatePicker/RangeDatePicker.js +10 -29
  344. package/dist/esm/Components/DatePicker/SingleDatePicker.js +5 -21
  345. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +2 -20
  346. package/dist/esm/Components/DescriptionList/DescriptionList.js +1 -1
  347. package/dist/esm/Components/DetailSections/DetailSections.js +2 -1
  348. package/dist/esm/Components/Divider/Divider.js +3 -3
  349. package/dist/esm/Components/Drawer/Drawer.js +24 -19
  350. package/dist/esm/Components/Dropdown/DropDown.js +7 -22
  351. package/dist/esm/Components/Editor/Editor.js +7 -3
  352. package/dist/esm/Components/Editor/editorLabels.js +1 -0
  353. package/dist/esm/Components/Editor/editorTokenStyles.js +7 -0
  354. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +8 -4
  355. package/dist/esm/Components/EmptyState/FilteredEmptyState.js +18 -0
  356. package/dist/esm/Components/FilePreview/FilePreview.js +8 -4
  357. package/dist/esm/Components/FileUpload/FileUpload.js +8 -9
  358. package/dist/esm/Components/FileUploader/FileUploader.js +6 -7
  359. package/dist/esm/Components/FilterSidebar/FilterSidebar.js +94 -237
  360. package/dist/esm/Components/FilterSidebar/OptionsSection.js +41 -0
  361. package/dist/esm/Components/FilterSidebar/RangeSection.js +78 -0
  362. package/dist/esm/Components/FilterSidebar/SectionHeader.js +23 -0
  363. package/dist/esm/Components/FilterSidebar/useStableCallback.js +8 -0
  364. package/dist/esm/Components/Form/FormWrapper.js +5 -3
  365. package/dist/esm/Components/FormDrawer/FormDrawer.js +3 -3
  366. package/dist/esm/Components/FormField/FormField.js +1 -1
  367. package/dist/esm/Components/Header/Header.js +1 -1
  368. package/dist/esm/Components/Header/HeaderActions.js +6 -4
  369. package/dist/esm/Components/Input/TextInput.js +2 -2
  370. package/dist/esm/Components/KanbanBoard/AccountCard.js +1 -1
  371. package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
  372. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +11 -7
  373. package/dist/esm/Components/LauncherTrigger/LauncherTrigger.js +1 -1
  374. package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -1
  375. package/dist/esm/Components/MediaViewer/MediaViewer.js +5 -4
  376. package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
  377. package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +19 -8
  378. package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +7 -2
  379. package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
  380. package/dist/esm/Components/MediaViewer/components/ViewerIconButton.js +3 -1
  381. package/dist/esm/Components/MediaViewer/mediaItems.js +4 -0
  382. package/dist/esm/Components/Modal/Modal.js +2 -17
  383. package/dist/esm/Components/Modal/dialogNaming.js +18 -0
  384. package/dist/esm/Components/Modal/warnDroppedSlotChildren.js +7 -3
  385. package/dist/esm/Components/NavLauncher/LauncherTabs.js +4 -3
  386. package/dist/esm/Components/NavLauncher/NavLauncher.js +291 -59
  387. package/dist/esm/Components/NavLauncher/ScopeBar.js +136 -0
  388. package/dist/esm/Components/NavLauncher/engine/distance.js +37 -0
  389. package/dist/esm/Components/NavLauncher/engine/engine.js +459 -0
  390. package/dist/esm/Components/NavLauncher/engine/fold.js +75 -0
  391. package/dist/esm/Components/NavLauncher/engine/index.js +14 -0
  392. package/dist/esm/Components/NavLauncher/launcherParts.js +46 -10
  393. package/dist/esm/Components/NavLauncher/match.js +25 -12
  394. package/dist/esm/Components/NavLauncher/searchLayout.js +101 -0
  395. package/dist/esm/Components/NavLauncher/spotlight.js +194 -0
  396. package/dist/esm/Components/NavLauncher/spotlightParts.js +108 -0
  397. package/dist/esm/Components/NavLauncher/useCopiedFlash.js +17 -0
  398. package/dist/esm/Components/NavigationBar/NavigationBar.js +6 -5
  399. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +12 -17
  400. package/dist/esm/Components/Notification/Notification.js +20 -22
  401. package/dist/esm/Components/NotificationBell/notificationHelpers.js +12 -6
  402. package/dist/esm/Components/OffersList/OffersList.js +4 -2
  403. package/dist/esm/Components/OptionChip/OptionChip.js +3 -2
  404. package/dist/esm/Components/OptionChip/optionInk.js +4 -2
  405. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  406. package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +14 -7
  407. package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +5 -8
  408. package/dist/esm/Components/PlanPill/PlanPill.js +4 -2
  409. package/dist/esm/Components/ProductCard/ProductCardAction.js +2 -1
  410. package/dist/esm/Components/ProductCard/ProductCardSwatches.js +2 -1
  411. package/dist/esm/Components/ProductDetails/ProductDetails.js +2 -1
  412. package/dist/esm/Components/ProfileCard/ProfileCard.js +6 -17
  413. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
  414. package/dist/esm/Components/ProgressBar/ProgressBar.js +2 -1
  415. package/dist/esm/Components/QuantityStepper/QuantityStepper.js +5 -2
  416. package/dist/esm/Components/QueryState/QueryStateBoundary.js +5 -1
  417. package/dist/esm/Components/RadioButton/RadioButton.js +2 -3
  418. package/dist/esm/Components/RolesPermission/RolesPermission.js +12 -8
  419. package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +9 -3
  420. package/dist/esm/Components/SearchSelect/SearchSelect.js +8 -5
  421. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +1 -1
  422. package/dist/esm/Components/Select/Select.js +6 -0
  423. package/dist/esm/Components/Select/SelectPopup.js +171 -64
  424. package/dist/esm/Components/Select/groupedWindow.js +44 -0
  425. package/dist/esm/Components/SelectSearch/SelectSearch.js +49 -39
  426. package/dist/esm/Components/SelectV2/SelectV2.js +1 -1
  427. package/dist/esm/Components/SideBar/SecondaryBar.js +3 -2
  428. package/dist/esm/Components/SideBar/components/MenuItemBox.js +3 -2
  429. package/dist/esm/Components/SideBar/components/MenuItems.js +1 -1
  430. package/dist/esm/Components/SideBar/components/OtherApps.js +2 -2
  431. package/dist/esm/Components/SideBar/components/PinnedSection.js +1 -1
  432. package/dist/esm/Components/SideBar/sidebarScale.js +2 -2
  433. package/dist/esm/Components/SignInActivityTable/SignInActivityTable.js +8 -3
  434. package/dist/esm/Components/SignInActivityTable/scrollRegionRing.js +9 -0
  435. package/dist/esm/Components/Slider/Slider.js +6 -5
  436. package/dist/esm/Components/StageProgress/StageItem.js +2 -1
  437. package/dist/esm/Components/StageProgress/StageProgress.js +8 -2
  438. package/dist/esm/Components/StageProgress/StepperStage.js +2 -1
  439. package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +2 -1
  440. package/dist/esm/Components/Table/Table.js +8 -6
  441. package/dist/esm/Components/Table/components/HeaderActions.js +7 -5
  442. package/dist/esm/Components/Table/components/TableBody.js +13 -8
  443. package/dist/esm/Components/Table/components/TableGroupRow.js +2 -1
  444. package/dist/esm/Components/Table/components/TableHeader.js +19 -23
  445. package/dist/esm/Components/Table/components/TableLoading.js +6 -3
  446. package/dist/esm/Components/Table/components/rowDetail.js +3 -2
  447. package/dist/esm/Components/Table/filters/ActiveFilters.js +8 -5
  448. package/dist/esm/Components/Table/filters/CompactSelect.js +2 -1
  449. package/dist/esm/Components/Table/filters/FilterDatePicker.js +20 -0
  450. package/dist/esm/Components/Table/filters/LeftFilterPane.js +14 -6
  451. package/dist/esm/Components/Table/hooks/useTable.js +11 -7
  452. package/dist/esm/Components/Table/settings/ManageColumns.js +4 -3
  453. package/dist/esm/Components/Table/settings/TableSettings.js +4 -4
  454. package/dist/esm/Components/Tabs/Tabs.js +1 -0
  455. package/dist/esm/Components/Tabs/components/TabList.js +1 -0
  456. package/dist/esm/Components/Tabs/components/TabPanel.js +1 -0
  457. package/dist/esm/Components/Tabs/tabStyles.js +5 -3
  458. package/dist/esm/Components/Tag/Tag.js +5 -4
  459. package/dist/esm/Components/Tag/Tag.styles.js +5 -4
  460. package/dist/esm/Components/Tag/tagDot.js +10 -3
  461. package/dist/esm/Components/TagInput/TagInput.js +8 -7
  462. package/dist/esm/Components/TagInput/tagEntries.js +16 -4
  463. package/dist/esm/Components/TimePicker/TimePicker.js +7 -3
  464. package/dist/esm/Components/Timeline/Timeline.js +14 -10
  465. package/dist/esm/Components/Toaster/Toaster.js +2 -1
  466. package/dist/esm/Components/Toggle/TableToggle.js +1 -1
  467. package/dist/esm/Components/UpgradeButton/UpgradeButton.js +3 -2
  468. package/dist/esm/Components/UserDetails/UserDetails.js +5 -7
  469. package/dist/esm/Components/WishlistToggle/WishlistToggle.js +2 -1
  470. package/dist/esm/Components/WizardDialog/WizardDialog.js +15 -3
  471. package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +12 -2
  472. package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +7 -4
  473. package/dist/esm/Hooks/useOutsideMouseDown.js +26 -0
  474. package/dist/esm/Hooks/usePreferences.js +30 -12
  475. package/dist/esm/Hooks/useScrollableRegion.js +33 -0
  476. package/dist/esm/Theme/chakra/Menu.styles.js +6 -0
  477. package/dist/esm/Theme/chakra/componentStyles.js +1 -1
  478. package/dist/esm/Theme/chakra/focusRing.styles.js +3 -3
  479. package/dist/esm/Theme/chakra/paletteFromTheme.js +16 -3
  480. package/dist/esm/Theme/chakra/ringShadow.js +3 -0
  481. package/dist/esm/Theme/provider/ThemeSwitcher.js +1 -1
  482. package/dist/esm/Theme/tokens/builders/buildDarkPalette.js +5 -5
  483. package/dist/esm/Theme/tokens/builders/filledSurface.js +3 -2
  484. package/dist/esm/Theme/tokens/builders/focusRing.js +4 -1
  485. package/dist/esm/Theme/tokens/builders/paletteScale.js +6 -0
  486. package/dist/esm/Utils/tabular.js +56 -0
  487. package/dist/esm/index.js +18 -25
  488. package/dist/index.d.ts +59 -5
  489. package/dist/index.js +36 -29
  490. package/package.json +3 -1
  491. package/dist/Components/Buttons/Buttons.d.ts +0 -3
  492. package/dist/Components/Buttons/Buttons.js +0 -9
  493. package/dist/Components/Buttons/ButtonsProps.d.ts +0 -12
  494. package/dist/Components/Common/ErrorComponent.d.ts +0 -7
  495. package/dist/Components/Common/ErrorComponent.js +0 -16
  496. package/dist/Components/Common/FormattedDescription.d.ts +0 -7
  497. package/dist/Components/Common/FormattedDescription.js +0 -62
  498. package/dist/Components/Common/Label.d.ts +0 -9
  499. package/dist/Components/Common/Label.js +0 -12
  500. package/dist/Components/Input/Input/Input.d.ts +0 -4
  501. package/dist/Components/Input/Input/Input.js +0 -75
  502. package/dist/Components/Input/Input/InputProps.d.ts +0 -24
  503. package/dist/Components/Input/Input/InputProps.js +0 -2
  504. package/dist/Components/ProductCard/productCardFixtures.d.ts +0 -7
  505. package/dist/Components/ProductCard/productCardFixtures.js +0 -61
  506. package/dist/esm/Components/Buttons/Buttons.js +0 -4
  507. package/dist/esm/Components/Common/ErrorComponent.js +0 -14
  508. package/dist/esm/Components/Common/FormattedDescription.js +0 -60
  509. package/dist/esm/Components/Common/Label.js +0 -10
  510. package/dist/esm/Components/Input/Input/Input.js +0 -37
  511. package/dist/esm/Components/Input/Input/InputProps.js +0 -1
  512. package/dist/esm/Components/ProductCard/productCardFixtures.js +0 -58
  513. package/dist/esm/services/feedback.js +0 -15
  514. package/dist/services/feedback.d.ts +0 -12
  515. package/dist/services/feedback.js +0 -18
  516. /package/dist/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
  517. /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,12 +18,82 @@ 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`.
84
+ - **`WorkspaceTray` `renderItem` receives the built-in pill** as a third argument, `renderItem(item, api, pill)`: the pill
85
+ already carries the unsaved dot, subtitle and close button, so a consumer can return it or wrap it (in
86
+ `WorkspaceTrayPreview` for a hover preview, say) instead of rebuilding it. Two-argument callbacks and the default
87
+ pill are unchanged.
88
+ - **`FormDrawer` `isSubmitDisabled`**: disables the primary button and makes the form ignore Enter and any other submit,
89
+ so `onSubmit` never fires, not even from `requestSubmit()` or a dispatched submit event (the drawer is a real
90
+ `<form>`; the button alone does not guard those). Unlike `isSubmitting` it shows no spinner, and Cancel and every
91
+ close path stay live. Omitted, nothing changes.
92
+ - **`WizardDialog` `chrome="inline"`** (default `"modal"`): draws the wizard (title, stepper, step, review, footer) in place
93
+ with no Modal, for a host that is already the dialog, such as a `WorkspaceWindow`: no overlay, focus trap, close X,
94
+ Esc-to-close or `role="dialog"`. It renders nothing while `isOpen` is false, ignores `size`, and Cancel still calls
95
+ `onClose`. It reuses the same flow as the modal (`useWizardFlow`, `validate`, `finishDisabled`, `finishBlockedReason`,
96
+ `stepId`); test ids are `wizard-inline` / `${data-testid}-inline`. `Wizard` does not take the prop.
27
97
  - **`optionRowFill(rows, isActive)`** and **`optionRowCursorSx(rows)`** are exported from the package root: the one
28
98
  fill an option row paints (the cursor's), and its `:hover`/`:focus` form for roving-focus lists.
29
99
  - **`accentTextOnPlanes(scale, planes)`** is exported from the package root: the first accent rung clearing AA on every
@@ -95,6 +165,53 @@ next major.
95
165
  document-wide `prefers-reduced-motion` rule; `pz-motion-keep` (`MOTION_KEEP_CLASS`) opts an element out.
96
166
  The default is unchanged. `CustomThemeProps` gains `zIndices.popoverNested` and the two font sizes, so
97
167
  code that hand-builds a full `CustomThemeProps` needs those keys.
168
+ - **`LauncherSearchEngine.matches` and `.createMatcher`**: the boolean form of the engine for table and list filters.
169
+ `matches(query, ...texts)` is true when every query word hits some text (same folding, typo tolerance and `synonyms`
170
+ option as `search`, no ranking); `createMatcher(query)` compiles the query once for a loop over rows, and an empty query
171
+ matches every row. `LauncherMatcher` is exported as a type.
172
+ - **`LauncherSearchEngine` searches Hindi and Tamil by written letter**: Latin accents, the Devanagari nukta and
173
+ zero-width joiners are ignored, chandrabindu folds into anusvara, and every other combining mark stays part of its
174
+ letter, so a bare vowel sign never matches ("का" does not find "कमाई"). Typo length and distance count letters
175
+ ("कम्मचारी" finds "कर्मचारी"), and a Tamil word ending in ம் also finds titles that drop it ("நேரம்" finds "நேர அட்டவணை").
176
+ `editDistance` accepts arrays of letters. Latin results are unchanged. `engine/conformance.fixture.json` is the
177
+ behaviour contract shared with HRMS mobile search, asserted by `engine/conformance.test.ts`.
178
+ - **`NavLauncher` spotlight search** (all additive; an app passing none of these renders as before):
179
+ - `searchMode="spotlight"` ranks every row by relevance (exact > prefix > word > word-prefix >
180
+ initialism > substring > typo > subsequence, label > keyword > context), tolerates typos
181
+ (Damerau-Levenshtein 1 from 4 letters, 2 from 8), folds case and accents, expands `synonyms`
182
+ both ways, boosts `pinnedIds` / `frequentIds` / `recentIds`, and shows the best row first as a
183
+ **Top hit** card naming the keyword or fact that matched. Groups collapse to `groupLimit` rows
184
+ (default 5 in spotlight, unlimited in classic) behind a "Show N more" option.
185
+ - `scopes` + `activeScope` / `onScopeChange`: filter chips in the header row beside the field
186
+ (their own row below `md`), always shown so they say what can be searched; while typing each
187
+ chip shows its live match count and is named "People, 3 results". One Tab stop (radiogroup,
188
+ roving tabindex, arrows / Home / End); the strip scrolls sideways behind an edge fade with a
189
+ mouse page arrow and keeps the selected chip in view, so the field never drops below 15rem (or a
190
+ third of a wide row). "All" is prepended, `screens`
191
+ and `actions` are built in and `LauncherResultGroup.scope` (default its `id`) places any other
192
+ group. A chip other than All / Screens picked with an empty field lists that scope's items as
193
+ passed, with the facts pane; `LauncherScope.placeholder` narrows the field's placeholder.
194
+ - `quickActions`: up to 5 pill buttons at the top of the menu while the query is empty and the
195
+ scope is All.
196
+ - `LauncherSearchItem.facts` (`{ label, value, copyable? }`): a right preview pane at `lg`+ for the
197
+ highlighted row with Copy buttons (blocked clipboard selects the value instead), docked under the
198
+ list below `lg`. `answers` (items with `answer: { label, value, hint? }`) render as direct-answer
199
+ cards above every result; Enter copies an answer that has no `run` / `href`.
200
+ - `LauncherResultGroup.matchLocally`: the launcher filters and ranks a static group itself.
201
+ - `LauncherSearchEngine` — the framework-free engine behind it (`createIndex`, `search`,
202
+ `searchDocuments`, `highlightRanges`, `usageBoosts`, `foldText`, `tokenize`, `editDistance`; options
203
+ `synonyms`, `boosts`, `fuzzy`, `relativeCutoff`, `limit`) for any other list or palette; `highlightSegments` now exported, with an opt-in `{ fuzzy, synonyms }`.
204
+ - New optional `LauncherLabels` keys: `topHit`, `matchedOn`, `answers`, `hintCopy`, `scopes`,
205
+ `scopeAll`, `scopeChanged`, `scopeCount`, `scopeEmpty`, `quickActions`, `showMore`, `preview`,
206
+ `copy`, `copied`, `copySelected`.
207
+ - The dialog is now always named `labels.title`; the search value and `headerActions` no longer
208
+ join its accessible name.
209
+ - Types `LauncherFact`, `LauncherAnswer`, `LauncherScope`, `LauncherSearchMode`, `HighlightOptions`,
210
+ `LauncherSearch*` / `LauncherSynonyms` / `LauncherMatchKind` / `LauncherTokenMatch`.
211
+ - `CopyButton` `onCopyError` — fires when the clipboard is missing or denied, instead of failing silently.
212
+ - `Drawer` `aria-label` / `aria-labelledby` — name the dialog instead of its whole header (a header
213
+ holding a field or buttons otherwise becomes the name); `contentProps["aria-labelledby"]` never
214
+ worked.
98
215
  - **HRMS library requests** — a navigation launcher, key caps, a merge-field `Editor`, a wizard and
99
216
  smaller gaps found by the HRMS migration:
100
217
  - `NavLauncher` — full-height navigation launcher (browse modules, pins, Frequent, Recent, search
@@ -260,8 +377,9 @@ next major.
260
377
  library; bring your own.
261
378
 
262
379
  - **Dark mode.** `PixelizeThemeProvider` (defaults to `system`), `useThemeMode`, `ThemeSwitcher`.
263
- Dark palettes are derived per brand from that brand's own light palette, so brand hue carries
264
- through. `withTheme` stays light-only, so existing apps are visually unchanged — dark is opt-in.
380
+ Dark palettes are derived per brand from that brand's own light palette: surfaces are hue-neutral,
381
+ and the brand hue carries through on the accent, ink, rules and rail. `withTheme` stays light-only,
382
+ so existing apps are visually unchanged — dark is opt-in.
265
383
  - **`MediaViewer`** — a full-screen viewer for images, video, audio, PDF, Office documents, text
266
384
  and archives, with a filmstrip, keyboard navigation and per-kind fallbacks. `index` is optional:
267
385
  omit it and the viewer owns navigation itself.
@@ -279,9 +397,53 @@ next major.
279
397
  - **`RangeSlider`** as an owned dual/single-thumb component with a `marks` prop.
280
398
  - `resolveFilledSurface(scale, colors)` — picks readable ink for any filled surface.
281
399
  - `size="2xs"` (16px) on `Avatar`, and `getInitials` to override the built-in derivation.
400
+ - **`Drawer` / `FormDrawer` warn in development when an open drawer has no accessible name.** A drawer with no
401
+ `DrawerHeader`, `aria-label` or `aria-labelledby` is announced as an unnamed dialog; it now logs
402
+ `UNNAMED_DRAWER_WARNING` once per mount (production is silent and unchanged).
403
+ - **77 prop types now reach the package root**, so a consumer can type a wrapper without a deep import of `dist/`:
404
+ `AccordionProps`, the `Apex*ChartProps` and their variant unions, `PaymentCardProps` (+ `Plan` as `PaymentCardPlan`),
405
+ `DropdownProps`, `FilePreviewProps`, `NoteTextAreaProps`, `NotificationProps`, the `NotificationBell*` family,
406
+ `PhoneNumberInputProps`, `Reorder*`, `Select{Single,Multi,Field}Props`, `SelectV2{Single,Multi}Props`, the Drawer, Modal
407
+ and ProfileCard slot props, `UpgradeButtonProps`, `CustomThemeProps` and more (type-only, no runtime change).
408
+ `src/index.propTypes.test.ts` now fails when a prop type in a `*Props` file is neither exported nor marked internal.
409
+ - **`toCsv`, `downloadBlob`, `safeFileName` and the `TabularCell` / `TabularColumn` / `ToCsvOptions` types** (`Utils/tabular.ts`):
410
+ RFC 4180 CSV with a formula-injection guard (a leading `=`, `+`, `-`, `@` gets a `'`, plain signed numbers excepted) and an
411
+ optional BOM; a browser download that revokes its object URL; a file name safe on every OS. Port of the Mobile library's
412
+ `core/files/tabular.ts`. No `.xlsx` and no `Table` export button yet.
413
+ - **Editor token helpers on the root:** `fieldToken`, `extractTokens`, `unknownTokens`, `chipHtml`, `chipify`, `serializeChips`
414
+ and the `ChipContext` type, so an app no longer copies `chipHtml`. `EditorMergeField` gains optional `object`,
415
+ `objectDescription`, `description`, `example`, `source` and `image` for a field browser; `Editor` itself ignores them.
416
+ - **`DarkPaletteOptions` and `DarkPlanes` types** are exported, so the options of `buildDarkPalette` can be named.
417
+ - **README Exports index.** Every value the package root exports is listed in `README.md`, grouped as components,
418
+ hooks, constants and helpers, so a developer or LLM with only this package can find any export. It is generated
419
+ (`UPDATE_README_EXPORTS=1 npx jest src/readmeExportsIndex.test.ts`) and `readmeExportsIndex.test.ts` fails when it
420
+ drifts from `src/index.ts`. `DESIGN-GUIDE.md` gains the type ramp (`textStyle`, `NUMERIC_TEXT`), radius by role,
421
+ the `Table` studio default and a table of parts that belong to a parent (`DrawerBody`, `ProfileCardFooter`,
422
+ `StageItem`, `MediaScrubber`, `LazyWrapper`, `AppearanceSettings`, `ApexPolarChart` and the rest).
423
+ - **Repo tooling, no package change.** `mouseOnlyHandlers.test.ts` is a lower-only ratchet on click-only elements (host
424
+ elements and Chakra layout primitives with `onClick` and no `role`, `tabIndex` or key handler).
425
+ - **Repo tooling, no package change.** `npm run size:web` bundles the root barrel with esbuild and fails over the beta.65
426
+ size +3% (opt-in, not wired to CI).
427
+ - **Repo tooling, no package change.** `scripts/verify-consumers.sh` now covers `lfour/frontend`, finds consumers from a git
428
+ worktree (`CONSUMERS_ROOT`), writes nothing in a consumer, and exits non-zero when nothing was compared or `tsc` rejected
429
+ its own config, instead of printing a clean pass.
282
430
 
283
431
  ### Changed
284
432
 
433
+ - **`ProfileCard` shares the dropped-slot dev warning with `Modal` and `Drawer`.** The helper takes any owner name and
434
+ warns once per owner and type (previously one set across owners); `ProfileCard` keeps its own message text.
435
+ - **`MediaViewer` image pan no longer re-renders the viewer on every pointer move.** The pan offset is held in a ref and
436
+ written to the image's transform directly, so dragging a zoomed photo re-renders nothing (the toolbar and its five
437
+ tooltip-wrapped buttons used to re-render per move). Zooming out or resetting mid-drag now ends the drag.
438
+ - **`MediaViewer` no longer loads `date-fns`** for its one "Uploaded" date; `Intl.DateTimeFormat` prints the same
439
+ `Oct 12, 2026` text (-5.6 KB gzip for an app that does not also use `DatePicker`).
440
+ - **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.
441
+ - **`ProfileCard` warns in development when it drops a child**, once per dropped type, like `Drawer` and `Modal`: anything
442
+ that is not a `ProfileCardHeader`/`Body`/`Footer` (or a Fragment of them) never renders.
443
+ - **`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.
444
+ - **`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.
445
+ - **`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.
446
+ - **`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.
285
447
  - **Performance, no visual change** (web premium/perf campaign):
286
448
  - Theme colour math is memoised (`resolveFilledSurface`, `liftToContrast`, `softenToContrast`,
287
449
  `resolveSoftTone`, luminance) in bounded, content-keyed caches: the hot calls are 5-20x faster and
@@ -390,9 +552,71 @@ next major.
390
552
  `colorScheme` (any brand/global scale, via `resolveFilledSurface`), `isReadOnly` with real
391
553
  `aria-readonly`, and `m`/`mt`/`mb`/`ml`/`mr`/`mx`/`my` on the wrapper. `InputSwitch` is now a
392
554
  genuine thin wrapper — no prop it previously accepted is silently dropped.
555
+ - `jsdoc/require-jsdoc` now also covers exported `*Props` / `*Options` types outside `*Props` files; around 30 types gained a one-line doc.
393
556
 
394
557
  ### Changed (visual)
395
558
 
559
+ - **`NavLauncher` text snaps to the type scale.** The trigger, panel and spotlight (`NavLauncher`, `launcherParts`, `spotlightParts`) read
560
+ `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.
561
+ - **Disabled `Button` dims to the shared 0.5.** The base style drew `opacity: 0.6` while every other disabled control reads
562
+ `DISABLED_OPACITY` (0.5); disabled buttons, and the `IconButton`s that inherit them, now read slightly dimmer.
563
+ - **`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.
564
+ - **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.
565
+ - **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`.
566
+ - **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.
567
+ - **`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.
568
+ - **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.
569
+ - **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.
570
+ - **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".
571
+ - **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.
572
+ - **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.
573
+ - **Inset focus ring: ring on the outer edge, halo inside.** `insetFocusRingShadow` drew them the other way round, so a child
574
+ covering the inner band left only the surface-coloured halo. It now matches `Accordion` (unchanged). Affects NoteTextArea,
575
+ CalendarGrid, SearchSelect, SelectSearch, MediaGallery and the FilterSidebar range and options sections.
576
+ - **Focus ring settles against the table header band.** `focusRing.ring` is now also lifted to 3:1 on the table header band
577
+ (raw and as stepped): rosewood light and lavender, meadow, skyline and slate dark move one or two lightness steps from
578
+ 2.97-2.99:1; every other brand and mode keeps its ring.
579
+ - **`Timeline` attachment chip hover ink clears AA in light.** The hovered chip kept the rest ink on the darker
580
+ `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
581
+ both modes. Only light hover on brands whose rest ink fell short changes.
582
+ - **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.
583
+ - **`ApexPieChart` `variant="pie-with-image"` no longer calls imgur** (two hard-coded URLs that answered 403, so the slices
584
+ painted nothing). Each slice now gets an inline striped texture in its own colour, light and dark. New optional
585
+ `images?: string[]` supplies your own sources (one per slice; the first repeats past the end).
586
+ - **`ApexLineChart` toolbar and its "Download SVG/PNG/CSV" menu are themed in dark.** The chart never told ApexCharts the
587
+ 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.
588
+ - **`FilterSidebar`'s rules inside the card use the in-card weight** (`cardRule`): the section dividers, the Filters header rule,
589
+ the cards-variant section edge, the range track and the range value chips. Dark lifts them off the card; light is unchanged.
590
+ The outer container outline keeps `boxborder[200]`.
591
+ - **`SelectSearch`'s separator above the bottom action** uses the overlay rule (`raisedRule`) like the action row below it,
592
+ not Chakra's default border colour. Dark gets the in-card weight; light moves by a few channel values.
593
+ - **`SelectSearch` colour-option swatch** uses the `full` radius token instead of `50%`. The dot is the same circle; Chromium
594
+ anti-aliases its edge pixels slightly differently.
595
+ - **`Notification` countdown label keeps counting.** It was computed once at first render and stayed at "due in 5
596
+ hours" for the life of the card; it now refreshes every minute while a `dueDate` or `endDate` is set (no timer
597
+ otherwise, cleared on unmount).
598
+ - **`NoteTextArea` dark footer band separates from the note area.** In dark the active band under the note was 1.11:1
599
+ 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
600
+ hover follow so a chip keeps a visible step and its text stays above 4.5:1. Light mode is byte-identical.
601
+ - **`Notification` overdue label** reads "Task overdue by 3 hours", without the trailing "ago".
602
+ - **`Notification` dismiss control** shows the focus ring on keyboard focus, like the title button beside it. It was
603
+ focusable with no visible indicator.
604
+ - **`WorkspaceWindow` header and `WorkspaceTrayPreview` card rule in dark**: the header strip read 1.08:1 off the raised
605
+ 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.
606
+ The preview card's border takes the same rule. Light is unchanged.
607
+ - **`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.
608
+ - **`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.
609
+ - **`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.
610
+ - **`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.
611
+ - **`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.
612
+ - **Dark surfaces are hue-neutral on every brand.** The canvas, card, overlay, named `backgroundColor` ladder,
613
+ `background[50-900]` and `table.hover` no longer take a brand tint (`SURFACE_SAT` 14 to 0): all 9 brands share
614
+ canvas `#121212`, card `#212121` (1.163:1 over the canvas) and overlay `#2c2c2c` (1.153:1 over the card), so
615
+ switching brand no longer recolours the app background. The brand hue stays on the accent, ink, rules and the
616
+ sidebar rail. Light palettes are byte-identical to before (SHA-256 of all 9 resolved light palettes). Muted dark
617
+ text re-derives against the neutral surfaces and shifts a few hex values on lavender, rosewood, slate and zinc
618
+ (lavender `#9f92aa` to `#a498ae`); every muted token still passes the same AA gate. `planes: "flat"` keeps its
619
+ meaning (card = canvas) on the same canvas.
396
620
  - **`Table` loading state.** With `isLoading` and no rows, each row now draws one skeleton per column (a checkbox
397
621
  placeholder in the checkbox column, blank spacer cells) with the variant's row rule, instead of one bar spanning the
398
622
  table. If `columns` is still empty while loading, the header shows four placeholder cells and a disabled select-all
@@ -461,11 +685,10 @@ next major.
461
685
  2px on hover; the shadow still deepens.
462
686
  - **`Button` (solid, outline, ghost) and `IconButton` scale to 0.98 while pressed** (`MOTION_PRESS_SCALE`).
463
687
  Never when disabled or loading, nor under `prefers-reduced-motion`.
464
- - **Dark planes carry the brand hue and separate by lift.** The dark canvas takes a faint brand tint and cards
465
- (`background[50]`) sit one step (1.16:1) above it, with overlays (`surfaceRaised`) one step (1.15:1) above
466
- the card; every filled mark keeps 3:1 on all three. Light mode is unchanged. A brand opts out with
467
- `buildDarkPalette(light, { planes: "flat" })`. `meadow` and `rosewood` dark `accentText` move one rung
468
- lighter so they clear AA on selected list rows.
688
+ - **Dark planes separate by lift.** Cards (`background[50]`) sit one step (1.16:1) above the canvas, with
689
+ overlays (`surfaceRaised`) one step (1.15:1) above the card; every filled mark keeps 3:1 on all three. Light
690
+ mode is unchanged. A brand opts out of the lift with `buildDarkPalette(light, { planes: "flat" })`. `meadow`
691
+ and `rosewood` dark `accentText` move one rung lighter so they clear AA on selected list rows.
469
692
  - **`zinc`:** muted text in light mode is `#515157` (was `#27272a`, 14.9:1), settled under a new 8:1 muted
470
693
  ceiling; zinc's dark card is no longer darker than its canvas.
471
694
  - **A brand's primary never reads as danger.** `radiant`'s danger colour (`red` and `semantic.error`) is
@@ -484,9 +707,155 @@ next major.
484
707
  - **Light page canvas (`backgroundColor.base`) sits 1.09:1 below the card on all 9 brands**, so a borderless card keeps
485
708
  its top edge (zinc and slate `#fafafa` to `#f5f5f5`, lavender `#fbfafd` to `#f5f4f8`). `main` and every other token
486
709
  are unchanged.
710
+ - **`NavLauncher` outlines stay visible on the dark overlay.** Scope chips and arrows, the Top hit and answer cards,
711
+ suggestion chips, pinned tiles, the Pin buttons, the tab bar, section rules and the rail and preview-pane edges were
712
+ `boxborder[200]`, 1.00-1.07:1 against `surfaceRaised` in dark (zinc 1.07, the other eight under 1.03). They now use
713
+ `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
714
+ recessed rail use `ruleOn` against `backgroundColor.subtle` (1.31-1.36:1, was 1.17-1.26:1). Measured on all 9 brands;
715
+ light mode is pixel-identical, since both helpers return `boxborder[200]` there.
716
+ - **`NavLauncher` confirms a copy on screen.** Enter or a click on a copy-only answer swaps the hint on its card and in
717
+ the preview pane (`ENTER copy`) to `labels.copied` in `accentText` for 1.5 s, then restores it; only a visually hidden
718
+ live region announced a copy before. The swap reserves the longer label's width, so nothing shifts, and its fade is
719
+ off under `prefers-reduced-motion`. The live region still announces each copy once, focus stays in the field and a
720
+ blocked clipboard never shows "Copied". On touch (`hover: none`), where the hint is hidden, the label alone pins over
721
+ the card's right edge for the same 1.5 s.
722
+ - **`NavLauncher` drops the keyboard-hint row below `md`.** At 390px wide the legend wrapped to three rows (63.8px) and
723
+ made the footer 100px tall, over a footer note that needs 32px; the footer is now 32px there, so the scrolling area
724
+ (results, then the Pinned block) gains 68px. Touch devices already hid the legend at any width, and from `md` up it
725
+ is unchanged.
726
+ - **`Button` `outline` / `ghost` / `link` ink clears AA on the light page canvas too.** The ink was lifted against the
727
+ canvas, a card and an overlay but not `backgroundColor.base` (the canvas the example pages and any borderless-card layout
728
+ 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
729
+ mode only: zinc `gray` and `secondary` `#71717a` to `#52525b`, slate `primary` `#6b7280` to `#4b5563`, emerald and
730
+ storefront `gray` `#617474` to `#5e7070`, `purple` `#805ad5` to `#6b46c1` on 8 brands, `green` `#198341` to `#136533` on 7,
731
+ zinc `yellow` `#887425` to `#68591c`. Dark mode and every other `Button` pair are byte-identical.
732
+ - **`Tabs` selected ink clears AA on the light page canvas.** The selected `outline`, `ghost` and `line` ink was lifted
733
+ against the tab canvas only, not `backgroundColor.base`, where slate measured 4.43:1 (record detail). On slate, light
734
+ mode only, that ink, the `outline` border and the `line` indicator step from `#6b7280` to `#4b5563` (6.93:1). Every
735
+ other brand and mode is byte-identical.
736
+ - **`Tabs variant="ghost"` selected ink clears AA on its own tint.** The ink was lifted against the canvas, but a
737
+ 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),
738
+ emerald (dark) and rosewood (dark). It now steps one rung: radiant light `#b84533` to `#983628`, emerald dark
739
+ `#0f9d8a` to `#14e3c7`, rosewood dark `#cb6b94` to `#ce91ab`. The other 15 brand and mode pairs are byte-identical.
740
+ - **`FilterSidebar`'s Clear control, range triggers and value rows, and rating rows draw the focus ring on keyboard focus
741
+ only.** The shared halo and ring (`focusVisibleRing`), drawn inset on the value and rating rows because their panel
742
+ clips overflow. Rest and mouse click look exactly as before.
743
+ - **`FilePreviewTrigger` shows its preview scrim and a focus ring on keyboard focus.** The eye-icon scrim that hover
744
+ reveals now also appears when the thumbnail takes keyboard focus, with the shared halo and ring (`focusVisibleRing`).
745
+ Rest, hover and mouse click look exactly as before.
746
+ - **`SelectSearch`'s `isBottomIcon` footer draws the focus ring on keyboard focus only.** The shared halo and ring
747
+ (`insetFocusRingShadow`), drawn inset because the popup panel clips overflow. Rest, hover and mouse click look
748
+ exactly as before.
749
+ - **`Editor`'s editing area joins the Tab order and its frame shows focus** (axe `scrollable-region-focusable`, WCAG
750
+ 2.1.1 and 2.4.7). Jodit ships the surface at `tabindex="-1"`, so a keyboard could not reach the text and a
751
+ scrollable read-only editor could not be scrolled. `Editor` now sets `tabIndex: 0` (a `config.tabIndex` you pass
752
+ wins), and while focus is inside it the Jodit frame takes the field focus look: a `primary[500]` border and the soft
753
+ bloom, light and dark. At rest nothing changes. Each editor adds one Tab stop between its toolbar and its status bar.
754
+ - **`OrganizationDetails`' header avatar is the library's own `Avatar`** (it rendered a raw Chakra one). Chakra picked
755
+ the initials ink by a brightness threshold: dark mode measured 1.98:1 (zinc 2.17:1) on all 9 brands and emerald and
756
+ storefront 4.26:1 in light, at 9.6px. The fill now follows the brand and mode like every other avatar and the ink
757
+ clears AA on all 9 brands in both modes. The avatar renders only with `userName`, since the owned `name` is required:
758
+ without it the grey placeholder icon is gone.
759
+ - **`Header`'s bar row is `min-height` 4.3rem instead of a fixed `height`**, so a nav that wraps (many items, or
760
+ `HeaderActions` labels in a narrow bar) grows the bar around it. The fixed height let the wrapped row hang off the
761
+ bar onto the page canvas, where its count badge measured 1.55-1.91:1 on all 9 brands in light (axe `color-contrast`,
762
+ `/header`). A bar whose nav fits on one row is pixel-identical, and 4.3rem is still its height.
763
+ - **`ScrollbarBox` is a keyboard stop while it scrolls.** A box whose content overflows a scrollable axis (more than
764
+ 1px) and holds nothing focusable now takes `tabIndex={0}`, so a keyboard user can scroll it, and draws the library
765
+ focus ring on `:focus-visible` only. A box that fits, scrolls `hidden`, or holds a button or link is unchanged, as
766
+ is a mouse click. The new optional `aria-label` names the stop as a `region`; without it the stop has no name.
767
+ Closes axe `scrollable-region-focusable` on `/scrollbarBox` (6 regions).
768
+ - **`StageProgress`'s strip is a keyboard stop while it scrolls with nothing focusable in it.** At phone width a
769
+ read-only strip (or one with every stage disabled) overflows and a keyboard user could not scroll it; it now takes
770
+ `tabIndex={0}` and draws the library focus ring on `:focus-visible` only. A strip with a stage button, or whose
771
+ stages fit, is unchanged, as is a mouse click. The new optional `aria-label` names the stop as a `region`, or names
772
+ the list when `variant="stepper"`. Closes axe `scrollable-region-focusable` on `/stageProgress` (`[data-stage-strip]`).
773
+ - **`SignInActivityTable`'s scroll area is a keyboard stop while the table scrolls.** At phone width the three columns
774
+ overflow the card and a keyboard user could not scroll them; the wrapper now takes `tabIndex={0}`, is a `region`
775
+ named by `labels.title`, and draws a 2px ring on `:focus-visible` only. The ring is an outline in `focusRing.ring`
776
+ (lifted until it clears 3:1 on the header band, on all 9 brands in both modes), because the library's inset shadow
777
+ hides under the opaque header. A table that fits, a mouse click and the rest state are unchanged. Closes axe
778
+ `scrollable-region-focusable` on `/signInActivityTable`.
779
+ - **`Menu` dividers keep their full weight in dark.** Chakra's stock divider carries `opacity: 0.6`, which pulled the
780
+ `NavigationBar` avatar menu and `ThemeSwitcher` rules down to 1.17-1.21:1 on the overlay; the `divider` part now
781
+ draws `raisedRule(colors)` at full opacity in dark (1.32-1.39:1) and stays at 0.6 in light, which is unchanged.
782
+ - **`Timeline` attachment-chip hover steps off the chip in dark.** The hover fill (`primary[100]`) sat 1.01-1.07:1 off
783
+ the resting chip on meadow, emerald and storefront and kept the resting ink, 3.82-4.29:1 on it; it now uses `bandOn`
784
+ (1.17-1.20:1 on those three) with an `accentTextOnCanvas` ink above 4.5:1 on every brand. Light is unchanged.
785
+ - **`Timeline` note box and "from" change pill step off the card in dark.** Both painted `gray[50]` on the event card
786
+ at 1.11:1; they now use `bandOn(gray[50], background[50])` (1.19:1), and the note's attachment chip, edit hover and
787
+ icon ink re-derive against the lifted box so they keep their step and AA ink. Light is unchanged.
788
+ - **`Timeline` rules inside the event card use the card rule in dark.** The note box outline and the divider above the
789
+ 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).
790
+ The card's own outline and the date chips on the page canvas are unchanged. Light is unchanged.
791
+ - **`OrgSwitcher` search-header rule is visible in dark.** The rule under the search field was `gray[100]`, 1.11:1 on
792
+ the raised popover; it now reads `raisedRule(colors)` (1.32-1.39:1). Light keeps `gray[100]`.
793
+ - **`ProfilePhotoViewer` view-button hover steps off the button in dark.** The hover fill (`gray[50]`) sat 1.11:1 off
794
+ the resting `background[50]` button; it now uses `bandOn` (1.19:1) with the accent ink re-derived against it. The PDF
795
+ fallback tile (`gray[100]`, 1.27:1) already steps and is unchanged. Light is unchanged.
796
+ - **`RolesPermission` header band and in-card rules are visible in dark.** The table header band (`background[100]`) sat
797
+ 1.06:1 off the card and the rules inside the card (card header, table rows, footer divider) drew `boxborder[200]` at
798
+ 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
799
+ outline is unchanged. Light is unchanged.
800
+ - **`SearchSelect` `insideSelect` divider is visible in dark.** The rule between the nested picker and the input drew
801
+ `boxborder[200]` at 1.22-1.25:1 on the trigger (eight of nine brands); it now reads `ruleOn` that plane (1.31:1+).
802
+ The popup outlines are unchanged. Light is unchanged.
487
803
 
488
804
  ### Fixed
489
805
 
806
+ - **`FileUploader` revokes its `blob:` preview URLs on unmount.** Images still listed when the component unmounted kept their
807
+ object URLs alive for the life of the page; removal, `maxFiles` overflow and `maxTotalSize` rejection already revoked.
808
+ - **`SearchSelect`'s "Clear all" button no longer opens the menu.** Its click bubbled to the control, so Enter, Space or a
809
+ click on it cleared the value and then opened the list; the click is now stopped at the button, as the chip remove
810
+ button already did.
811
+ - **`DescriptionList` stacked values wrap long unbroken strings.** A token or URL with no break opportunity overflowed
812
+ its cell; stacked values now carry `overflow-wrap: anywhere`. Only strings that overflowed before change; the inline
813
+ layout keeps its single-line truncation.
814
+ - **`FilterSidebar`'s section Clear control is no longer nested inside the accordion header button** (axe
815
+ `nested-interactive`). `Accordion` items gain `headerAction` (a control beside the header button, which keeps the header
816
+ hover lit) and `customStyles.headerActionStyle`; rest, hover and focus render the same pixels. The header button's
817
+ accessible name is now the section label alone, and a click on Clear no longer reaches the header.
818
+ - **`FilterSidebar`'s maximum range picker is portalled like the minimum one.** Only the minimum picker was, so a host
819
+ that clips or stacks over the sidebar (a positioned `overflow` ancestor) could cut the maximum list off. Both now share one picker.
820
+ A range drag or an option toggle also re-renders only its own section instead of the whole sidebar.
821
+ - **`SelectSearch` popup keyboard and axe defects.** The sticky `isBottomIcon` footer no longer covers the row Arrow keys
822
+ focus last (the panel reserves its height as scroll padding). An empty or loading panel is no longer a `listbox` with
823
+ no options (axe `aria-required-children`); it keeps its text and drops the role. Tab out of the popup now closes it.
824
+ Picking an option with the keyboard returns focus to the input instead of dropping it to `body`, and Escape in the
825
+ input no longer swallows the next Tab-in open.
826
+ - **`NoteTextArea` Save stays disabled while either field is over its word cap.** Two effects each wrote the disabled
827
+ state, so whichever field was edited last decided it: a long title could be saved after editing the note, and a long
828
+ note after editing the title. Save is now derived from both counts.
829
+ - **`FormWrapper` forwards `id`, `data-*`, `aria-*`, `className` and handlers to its outer wrapper** instead of dropping
830
+ them, and `icon` accepts a rendered element (`<FiUser />`) as well as a component reference; an element used to throw
831
+ "Element type is invalid".
832
+ - **`VerifyEmailOtp` cells now offer one-time-code autofill.** `otp` is passed to the pin input, so the cells carry
833
+ `autocomplete="one-time-code"` instead of `"off"` and the browser or OS can suggest the emailed code. The resend link
834
+ is the owned `Button`.
835
+ - **`WorkspaceTrayPreview` no longer closes while the pointer sits on its trigger.** Moving from the card back onto the
836
+ trigger ran the card's own leave handler and closed the preview after the grace delay; the wrapper alone now owns
837
+ open and close.
838
+ - **`Select` `virtualizeAfter` now windows grouped lists.** It used to switch itself off whenever any option had a
839
+ `group`, rendering every row; headers now take part in the window.
840
+ - **`Select`: Enter and Space on the clear (x) or a chip's remove button did nothing from the keyboard.** The trigger
841
+ swallowed them to open the popup; keys from a nested button now reach the button.
842
+ - **The date, range and time picker popovers and `FilePreview` honour `prefers-reduced-motion`**: the popover slide/scale and the preview
843
+ scale-in are skipped when the user asks for reduced motion.
844
+
845
+ - **The required `*` is hidden from screen readers** in `FormField` and every `TextLabel` label (it was read as "star" and
846
+ became part of the field's accessible name). The control's own `aria-required` still announces it; sighted users see no change.
847
+
848
+ - **Legacy `DatePicker` (Table filter pane) no longer puts `aria-expanded` on a non-focusable wrapper `div`.** It anchors the
849
+ popover like `SingleDatePicker` and the input carries `aria-haspopup="dialog"`; Escape on the focused field now closes the
850
+ calendar. Looks and click behaviour are unchanged.
851
+
852
+ - **`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.
853
+ - **`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.
854
+ - **`ThemeSwitcher variant="segmented"`** is one tab stop, on the selected mode, like the radiogroup it declares.
855
+ All three modes were separate tab stops. Arrow keys still move focus and selection together; a Tab from outside
856
+ lands on the selected mode.
857
+ - **`LazyWrapper`** `fallback={null}` now renders nothing while loading, as written. `??` swapped the built-in
858
+ spinner in for an explicit `null`; only an omitted `fallback` (`undefined`) selects the spinner now.
490
859
  - **`WorkspaceTrayPreview`** reports `onOpenChange(false)` only after the card actually opened (it used to fire when
491
860
  the pointer left before the open delay).
492
861
  - **`FileUploader`** revokes the blob URL of an image the moment it is removed, and of images it rejects (over the total
@@ -503,8 +872,55 @@ next major.
503
872
  control. No visual change.
504
873
  - **`SearchSelect`'s open listbox and `Select`'s popup dialog have an accessible name**, from `label`, then
505
874
  `aria-label`, then `placeholder`.
875
+ - **Unnamed controls now have names, with no visual change.** `NoteTextArea`'s remove-attachment button is
876
+ named `Remove <file name>`; the legacy `DatePicker` that `Table`'s filter pane renders names its month buttons
877
+ (`Previous month`, `Next month`) and its two selects (`Month`, `Year`), as `CalendarPanel` does.
878
+ - **`FilterSidebar`'s Clear control, range triggers and value rows, and rating rows work from the keyboard.** They were
879
+ mouse-only. Each is now a named control that Enter and Space operate (`Clear <section>`, `<section> minimum: <value>`,
880
+ `<section>: N stars & up`), the open range picker is a named dialog, and the current value or rating reports
881
+ `aria-pressed`. A test that counts `getAllByRole("button")` inside a `FilterSidebar` sees more of them. Rest and
882
+ click look as before, except that opening a range picker with the mouse no longer paints a focus ring around the
883
+ popover: the trigger now takes focus first, so the popover's own focus move is no longer keyboard-visible.
884
+ - **`FilePreviewTrigger` is a real button, named `Preview <file name>`** (`Preview file` without one). It was a click-only
885
+ `role="group"` div the keyboard could not reach. Tab now lands on it, Enter and Space open the preview, and closing the
886
+ preview returns focus to it. A test that found it by `role="group"` must query the button. Rest, hover and a mouse
887
+ close look as before; opening the preview with the mouse no longer paints a stray focus ring on its first toolbar
888
+ button, because the thumbnail now takes focus first.
889
+ - **`SelectSearch`'s `isBottomIcon` footer works from the keyboard.** It was a click-only div. It is now the last
890
+ `option` of the listbox, named by its text: ArrowDown, ArrowUp, Home and End reach it, Enter and Space run
891
+ `handleBottomClick` with the popup left open, Escape closes the list, and it is the only stop while nothing matches or
892
+ the options load. `getByRole("listbox")` now contains the footer, and a test that counts `getAllByRole("option")`
893
+ with `isBottomIcon` sees one more. Rest and click look as before.
506
894
  - **`WorkspaceWindow`'s dialog is named by its visible title**; while a window is open the page behind it is
507
895
  `aria-hidden`, as for any modal.
896
+ - **`UpgradeButton`, `PlanPill` and `PlanBadge` are named by what they show** (WCAG 2.5.3, axe
897
+ `label-content-name-mismatch`). The fixed `aria-label` left out the subtitle, the status chip and, on phones, the
898
+ `mobileLabel`. Without an `ariaLabel` the name now comes from the content: `Pro 5d left`, where it was
899
+ `Pro — 5d left`. A passed `ariaLabel` still wins and should contain the visible text. A test that looks the
900
+ button up by the old dashed name needs the new one. Nothing changes visually.
901
+ - **`OrgSwitcher` names its trigger by what it shows** (WCAG 2.5.3, axe `label-content-name-mismatch`). The full
902
+ layout was named by `ariaLabel` alone (`Switch organization`) and the avatar layout by the name without its
903
+ initials, so neither held the visible text. Both now read `${ariaLabel}, ${shown organization}` (the placeholder
904
+ when none is active). The avatar initials are `aria-hidden` generated content (`data-initials`), no longer text,
905
+ which also takes them out of each dropdown row's name. A test that finds the initials with `getByText` must query
906
+ `[data-initials]`; one that looks the trigger up by the exact name `Switch organization` needs the longer name.
907
+ Nothing changes visually.
908
+ - **`CalendarGrid` day cells are named by what they show** (WCAG 2.5.3, axe `label-content-name-mismatch`). A
909
+ cell's `aria-label` (`Monday, October 5, 2026, 1 event`) left out the event chips and `renderDayCell` content it
910
+ displays. The cell now has no `aria-label`: a visually hidden date and count (`labels.eventCount`) come first and
911
+ the cell's own content follows, so the name reads `Monday, October 5, 2026, 1 event Payroll cut-off`. A test that
912
+ finds a cell by its old exact name needs a pattern or `data-date`. No layout change.
913
+ - **`FileUpload`'s progress bars are named** (axe `aria-progressbar-name`). Each `progress` entry rendered a
914
+ `progressbar` with no name; it is now `Upload progress for <file name>`.
915
+ - **`FileUpload`'s drop zone is named by what it shows** (WCAG 2.5.3, axe `label-content-name-mismatch`).
916
+ `label`, or `inputAriaLabel` (default `Upload files`), was the whole name, so it left out the visible `Drag and
917
+ drop files here` and the type and size limits. The name is now `${label ?? inputAriaLabel}, Drag and drop files
918
+ here .jpg, .png up to 5.00 MB`: a passed `inputAriaLabel` still leads. A test that looks the zone up by the old
919
+ exact name needs a pattern. No visual change.
920
+ - **`Editor`'s editing area is named** (axe `aria-input-field-name`). Without a visible `label` the
921
+ `role="textbox"` surface had no name at all; it is now `labels.editor` (default `Rich text editor`), and still
922
+ `label` when one is given. A read-only editor also exposes `aria-readonly`. Give each unlabelled editor on a page
923
+ its own `labels.editor`. No visual change.
508
924
  - **`CustomModulesTable`'s edit-module field is named** by `labels.moduleNamePlaceholder`.
509
925
  - **`StageProgress` no longer scrolls the page when it mounts**: the active stage was revealed with
510
926
  `scrollIntoView`, which also scrolled every ancestor, so a tracker below the fold pulled the page down
@@ -538,6 +954,13 @@ next major.
538
954
  - **`FileUpload` no longer leaks a blob URL per image thumbnail per render.** Each file gets one URL,
539
955
  revoked when the file is removed or the component unmounts.
540
956
  - **`Table` column search shows the current search when reopened**, instead of stale text.
957
+ - **`NavLauncher` search rows shorten the `· keyword` hint before the label**, so a long keyword list
958
+ no longer cuts "Apply for leave" down to "Apply…".
959
+ - **`NavLauncher`'s preview pane says what Enter does on a copy-only answer**: for an answer with no `run` or `href` it
960
+ showed `labels.hintOpen` ("open here") while Enter copied the value; it now shows `labels.hintCopy`, as the answer card does.
961
+ - **`NavLauncher`'s footer legend says what Enter does**: it read `labels.hintOpen` ("open here") on every result, also while
962
+ Enter copied a copy-only answer. It now follows the active result and shows `labels.hintCopy` while Enter copies. The
963
+ other hints do not shift when it flips.
541
964
  - **`NavigationBar` right cluster no longer overflows onto the avatar at phone widths.** The title
542
965
  truncates first (overflow-only tooltip when it is a string); the `moreIcon` cluster can shrink, while
543
966
  the sidebar toggle, back button and avatar menu never do. (HRMS, beta.60 launcher trigger overflow)
@@ -780,36 +1203,115 @@ next major.
780
1203
  - `sidebar.hoverBg` no longer shares `sidebar.divider`'s value.
781
1204
  - `InputSwitch`'s `colorScheme` was destructured and discarded — every switch rendered `primary`
782
1205
  regardless of the prop. Now forwarded to `ToggleSwitch` and actually applied.
1206
+ - **The `NavLauncher` search engine no longer puts Indic characters in a consumer's minified bundle.** Tamil final-ma and
1207
+ the Devanagari anusvara are built from code points, so hrms's first-load budget gate (it counts Tamil and Devanagari
1208
+ characters) stops reading the engine as locale data. `src/index.indicLiterals.test.ts` bundles the package root with
1209
+ esbuild and fails on any code point in U+0900 to U+0DFF.
1210
+ - **`Table` / `KanbanBoard` saved preferences refetch when `orgId`, `authToken`, `page`, `key` or `name` change after mount.**
1211
+ The fetch depended on `baseUrl` alone, so a switched organisation kept the previous one's saved columns. A slow
1212
+ earlier response can no longer overwrite a newer one, the render a re-key lands is already `loading: true` with no
1213
+ stale data, and `useSavePreferences` clears `error` after a later success.
1214
+ - **`KanbanBoard` re-hydrates its collapsed columns when `orgId` or `token` changes.** The reset effect listed `baseurl`,
1215
+ `page`, `key` and `name` only, so after an organisation switch the previous one's collapsed columns stayed.
1216
+ - **`resolveFilledSurface` / `darkerFillRung`** no longer throw for a scale whose only white-carrying rung is `[50]`. The
1217
+ hover and active steps walked to rungs `150` and `250`, which do not exist; a step now moves along the rung table and
1218
+ clamps at both ends. Every scale that already worked resolves to the same rungs.
1219
+ - **Playground demos stop touching the network and clear their axe findings** (demo-only, nothing here ships in the
1220
+ package). `/charts`, `/avatar`, `/editor` and `/examples/template-editor` no longer request imgur, a dead host or cdnjs;
1221
+ `/contactForm` no longer POSTs to the dev API. `/switch` names its narrow-cell options, the `/chartTheme` legend and the
1222
+ `/wishlistToggle` glass caption clear AA, and `/notification`'s colour override follows dark mode. `visuallyHidden`,
1223
+ `skipLink` and `productDetails` gain a Playground.
1224
+
1225
+ ### Removed
1226
+
1227
+ Nothing exported from the package root. These files were never exported and nothing in the repo imported them; they are
1228
+ gone from `dist/`, so a deep import of one no longer resolves. Measured 2026-10-14: no file in hrms, crm-frontend,
1229
+ account-frontend, tickets, lfour, social-frontend or commerce deep-imports any of them.
1230
+
1231
+ - `services/feedback.ts` (use `FeedbackForm`), the legacy `Input/Input` field (`Input.tsx`, `InputProps.tsx`; use
1232
+ `TextInput`), `Common/ErrorComponent` (use `ErrorMessage` or `FieldMessage`), `Common/FormattedDescription`,
1233
+ `Common/Label` (use `TextLabel`) and `Buttons` (`Buttons.tsx`, `ButtonsProps.ts`; use `Button`).
783
1234
 
784
1235
  ### Deprecated
785
1236
 
786
- Nothing is removed yet — each of these still ships its full implementation.
1237
+ Each of these still ships its full implementation.
787
1238
 
1239
+ - **`OrganizationDetails` `uiInvite` is now optional and ignored.** The component never read it (active vs. invited is
1240
+ decided by which array an organization is in); callers that still pass it compile unchanged, and new ones can drop it.
1241
+ - **`TextInput` `onRightIconclick`** (lower-case `c`): use `onRightIconClick`. Behaviour is unchanged; tagged `@deprecated` in JSDoc.
1242
+ - **`NoteTextArea` callback arguments that are never passed**: `handleCancel`'s `isActive` (always `false`) and
1243
+ `handleSubmit`'s fourth `resetState`. Behaviour is unchanged; both are tagged `@deprecated` in JSDoc.
1244
+ - **`Skeletons` `alignSelf` and `flexShrink`** are marked `@deprecated` in the type: they have never been applied, and
1245
+ applying them now would move layout for anyone passing them. Wrap the skeleton in an element that sets them.
788
1246
  - `UploadedFile.type` (FileUploader) — never set; read the extension from `name`.
789
1247
  - `ProfileCard` `color` — no visual effect; Card styles never read a colour scheme.
790
1248
  - `NotificationData.status` — never read; the status dot colour comes from `dueDate`/`endDate`.
791
1249
  - `CustomModulesTableLabels.loading` — never rendered; the loading state shows skeleton bars only.
792
1250
  - `WorkspaceWindow` `onMedium` and `onMaximize` — never called; the window has no such controls.
793
1251
  - `NavLauncher` `openShortcutHint` and `LauncherLabels.hintOpenMenu` — no longer rendered (the launcher
794
- is already open when its footer shows); bind the open chord in the app only.
1252
+ is already open when its footer shows); bind the open chord in the app only. `hintOpenMenu` is now
1253
+ optional, so a full `LauncherLabels` object type-checks without it.
1254
+ - `searchLauncher` — legacy flat search (one Screens group); `NavLauncher` never calls it. Classic mode
1255
+ runs `searchLauncherSections`, which matches a screen on its own label and keywords only ("leave
1256
+ balance" finds nothing unless one screen's keywords carry both words); `searchMode="spotlight"`
1257
+ ranks and also matches a screen on its module and section.
795
1258
  - `SelectV2` — use `Select` with `native={false}`; it is already a thin wrapper over it.
796
1259
  - `SearchSelect`, `SelectSearch` are **no longer `@deprecated`.** Both now say "prefer `Select`
797
1260
  for new work" instead: `@deprecated` claimed a migration that loses real capabilities
798
- (`insideSelect`, `isSelectAll`, `addNew`, field-level loading; and `SelectSearch`'s combobox is
799
- the text input itself, a different ARIA pattern). The marker returns once `Select` absorbs them.
1261
+ (`insideSelect`; and `SelectSearch`'s combobox is the text input itself, a different ARIA
1262
+ pattern). The marker returns once `Select` absorbs them.
800
1263
  - `Dropdown` is **no longer deprecated.** The marker was an artifact of the Select-consolidation
801
1264
  pass; `Dropdown` is a `role="menu"` action menu, never a value picker, and nothing replaces it.
802
1265
  - `Notification` is **no longer deprecated.** `NotificationItem` cannot replace it —
803
1266
  `formatRelativeTime` clamps every future date to "Just now", so a countdown card silently
804
1267
  renders wrong text through it.
1268
+ - `FilterSidebar` `onApply`, `headerPadding`, `sliderMode` and `FilterSection.checkboxes` — dead, never read.
1269
+ Every change is already live through `onChange`, the range slider is always native, and radio mode comes
1270
+ from `type: "radio"` or `radio`.
805
1271
  - Dead props now marked rather than silently ignored: `Checkbox.variant`, `ProgressBar.variant`,
806
1272
  `Table.isVisiblity` and its export props, `SideBar.selectedSubMenu`, `InputSwitch.variant`/
807
1273
  `.spacing`/`.isFocusable`, and nine native-only `Select` props that are inert under
808
1274
  `native={false}` (these now warn in dev).
809
- - `disabled` → `isDisabled` on `SideBar`, `Buttons`, `StageProgress`, `Input`, `DatePicker`. Both
1275
+ - `disabled` → `isDisabled` on `SideBar`, `StageProgress`, `DatePicker` and `TimePicker`. Both
810
1276
  are accepted; `isDisabled` wins.
811
1277
  - `MultiSelctOPtions` → `MultiSelectOption` (two typos in a shipped public type name).
812
1278
 
1279
+ Also tagged `@deprecated` in the JSDoc, by component; each tag names its replacement. None is removed in this release.
1280
+
1281
+ - `AlertDialog` `addRole`, `colorScheme`, `size`, `status`, `variant` and `key` — never read. The dialog is always
1282
+ `role="alertdialog"` at Chakra's default size; use `tone` for the colour props, and React strips `key`.
1283
+ - `ApexLineChart` `variant="realtime"` — does not animate the data it is given: it appends `Math.random()` values every
1284
+ second. No replacement ships; `"basic"`, the default, plots your `data`.
1285
+ - `Breadcrumbs` `isLastChild` — never read, no effect.
1286
+ - `ButtonGoupIconProps` (misspelled file path, a one-line re-export) — import `ButtonGroupIconProps`.
1287
+ - `Card` `colorScheme` and `color` — no visual effect, Card styles read no colour scheme. `dividercolor`,
1288
+ `dividersize` and `dividervariant` — never rendered, Card draws no divider.
1289
+ - `DatePicker` `placeholderText` — use `placeholder`; `placeholder` wins when both are set.
1290
+ - `Drawer` `vaiant` — typo of `variant`, kept as an alias; `variant` wins.
1291
+ - `Dropdown` `optionsSize` — use `size`.
1292
+ - `InputSwitch` and `ThemedSwitchProps` — use `ToggleSwitch`; `InputSwitch` is a thin wrapper around it.
1293
+ - `MediaViewerLabels` `photoCount`, `videoCount`, `documentCount`, `youtubeCount` and `shortcuts`, and the `loading`
1294
+ label of `MediaAudioPlayerLabels` and `MediaVideoPlayerLabels` — defined but never read.
1295
+ - `OrganizationDetails` `OrganizationItem.uiInvite` — never read (active vs. invited comes from which array an item is in)
1296
+ but still required, so keep passing it. `CreateOrgFormValues` `default` and `defaultOrg` — never populated by the
1297
+ built-in create modal.
1298
+ - `STATUS_INK` (`PlanPill`) — use `colors.white` from `useCustomTheme()`.
1299
+ - `ProfileCardVariantLegacy` (`variant="outlein"`) — misspelling kept for existing callers; use `"outline"`.
1300
+ - `ProgressBar` `color` — use `colorScheme`; `color` is still honoured while `colorScheme` is unset.
1301
+ - `Search` `onclose` — use `onClear`; same behaviour, consistent casing.
1302
+ - `SearchSelect` `onSelect` — use `onChange`, same payload. `virtualization` — not implemented, the list never
1303
+ virtualizes; page large datasets with `pagination`. `SelectSearch` `isSearchEnabled` and `BottomIconStyle` — never read.
1304
+ - `chakraSelectProps` — the deep-import name of `SelectProps`; import `SelectProps` from the package root.
1305
+ - `SelectV2SingleProps`, `SelectV2MultiProps` and `SelectV2Props` — use `SelectSingleProps`, `SelectMultiProps` and
1306
+ `SelectProps` with `native={false}`.
1307
+ - `Switch` and `SwitchProps` — two labelled choices; use `SegmentedControl`, or `ToggleSwitch` for a single on/off field.
1308
+ - `Table` `handleExportChange`, `exportOptions`, `exportLabel`, `headerBgColor`, `tableBorderColor`, `onColumnFilter`,
1309
+ `tableSettings` and the column-level `isSearch` — dead, never read.
1310
+ - `Timeline` `events` and its `TimelineEvent` type — use `timelineEvents`. `TimelineNote.logs_id` is never read;
1311
+ `TimelineEvents.primary_id` and `is_from` are never read but still required, so keep passing them.
1312
+ - `Toaster` `showToast({ children })` — never rendered; pass `description`.
1313
+ - `avatarFillFor` — use `resolveAvatarColorway(seed, colors)`; different arity, returns `{ bg, color }`.
1314
+
813
1315
  ### Breaking — staged for the next major, not yet released
814
1316
 
815
1317
  **`ProductCard` / `ProductDetails` props are replaced, and `ProductImageSlider` is gone.** Zero
@@ -841,9 +1343,8 @@ differ, so `tsc` names each site and nothing must be found by hand.
841
1343
  - `Avatar`/`AvatarGroup` keep their names but narrow their props: `name` is required, Chakra style
842
1344
  props are rejected, and `AvatarGroup` takes a `people` array instead of `Avatar` children.
843
1345
 
844
- **Blast radius concentrates in `hrms`, with a long tail in `social-frontend`, `tickets`,
845
- `account-frontend`, `spare-cart` and `lfour`.** `crm-frontend` and `commerce/frontend` import no
846
- affected name at all.
1346
+ **Blast radius is measured per consumer and stated once**, in the repository's `CLAUDE.md` section 7, rather
1347
+ than copied here where it can drift.
847
1348
 
848
1349
  Get the current number from `scripts/verify-consumers.sh check`, which typechecks every consumer
849
1350
  against a real build — **do not estimate it by grep.** A grep conflates names that were removed
@@ -861,8 +1362,6 @@ Consumers pin published versions, so none of this bites until a repo upgrades.
861
1362
 
862
1363
  Tracked in `.cursor/plans/deferred-breaking-changes.md` (repo-only). The ones a consumer can hit:
863
1364
 
864
- - `Select`'s search matches `label` only — no `searchFields` / `filterOption`.
865
- - `Select`'s `virtualizeAfter` silently disables itself when any option has a `group`.
866
1365
  - `Select`'s `onLoadMore` is zero-arg with no `hasMore` gate, unlike `SearchSelect.pagination`.
867
1366
  - Migrating `SearchSelect` → `Select` by hand: `SearchSelect.onSearch` debounces **1000 ms**;
868
1367
  `Select.searchDebounceMs` defaults to **0**. A mechanical rename starts firing the consumer's