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
@@ -127,7 +127,7 @@ also passed `native`.
127
127
  | Deprecated | Status | Migration |
128
128
  | --- | --- | --- |
129
129
  | `SelectV2` | Now a thin wrapper — literally `<Select {...props} native={false} />` | Drop-in. DOM, ARIA roles, keyboard and the `${listboxId}-option-${id}` id scheme are unchanged, so E2E selectors keyed to it still pass |
130
- | `SearchSelect` | **Not deprecated** — implementation untouched, not 1:1 replaceable yet | Hand-migrate. `insideSelect`, `isSelectAll`, `rightIcon`, a field-level loading slot and the paginated `pagination.onScroll` shape (1-based `startIndex`/`limit`/`query`) have **no** equivalent in `Select` today. Keep using it until they do |
130
+ | `SearchSelect` | **Not deprecated** — implementation untouched, not 1:1 replaceable yet | Hand-migrate. `insideSelect` and the paginated `pagination.onScroll` shape (1-based `startIndex`/`limit`/`query`) have **no** equivalent in `Select` today; `isSelectAll`, `rightIcon`, `isFieldLoading`, `chipMaxLength`, `isChipRemovable` and `footerAction` (closes the popup, unlike `addNew`) now do. Keep using it until they do |
131
131
  | `SelectSearch` | **Not deprecated** — implementation untouched | Hand-migrate. It is uncontrolled (`initialSelectedOption` seeds state once and never resyncs) and moves real DOM focus into rows; `Select` is controlled and uses `aria-activedescendant` |
132
132
  | `Dropdown` | **NOT deprecated** — the marker was wrong and was removed 2026-09-21 | Never "migrate" it to `Select`. It is a menu-button (`role="menu"`/`menuitem`, `aria-haspopup="menu"`), not a value picker (`role="combobox"`/`listbox`). Swapping it would be an accessibility regression, and nothing in this library replaces it |
133
133
 
@@ -158,7 +158,7 @@ visible at the call site, or declare the handler with both parameters. Grep for
158
158
  ### `Slider` is an image carousel, not a numeric range input
159
159
 
160
160
  `Slider` auto-advances a set of images/content on a timer (paused while hovered or focused, never
161
- under reduced motion) — no numeric value, min/max, or step. The
161
+ under reduced motion; `showPauseControl` adds a visible play/pause button) — no numeric value, min/max, or step. The
162
162
  range-input slider is a separate component named `RangeSlider`, because this library's `Slider`
163
163
  already owns the name. `RangeSlider` used to be a Chakra passthrough on the `Primitives` barrel; it
164
164
  is now the library's own themed component, with a real dual-thumb mode and a `marks` prop.
@@ -203,13 +203,18 @@ and wires `aria-controls` to them. Pick by that, never by the picture. A screen
203
203
  | Proportional share of a whole — slices sum to 100% | `ApexPieChart` | The default "part of a whole" chart; donut variants support a center total label |
204
204
  | Compare independent magnitudes on a shared radial grid — values need not sum to anything | `ApexPolarCharts` | Reads like a circular bar chart, not a pie; picking Pie here makes unrelated values look like they must add to 100% |
205
205
 
206
- ### Which "button" — `Button` / `ButtonGroupIcon` / `Buttons`
206
+ ### Which "button" — `Button` / `ButtonGroupIcon`
207
207
 
208
- | Need | Component | Why not the others |
208
+ | Need | Component | Why not the other |
209
209
  | --- | --- | --- |
210
- | A single themed, interactive button — any variant/size/colorScheme, dark-mode aware | `Button` | The only one of the three that reads design tokens at all |
211
- | A themed row of icon + text + icon, optionally a dropdown menu on the right | `ButtonGroupIcon` | The real "group" component despite `Buttons`' plural name suggesting otherwise |
212
- | *(avoid)* | `Buttons` (plural) | Legacy single-`Button` wrapper, not exported from the package root — see gotcha below |
210
+ | A single themed, interactive button — any variant/size/colorScheme, dark-mode aware | `Button` | `ButtonGroupIcon` is a fixed icon + text + icon row, not a general button |
211
+ | A themed row of icon + text + icon, optionally a dropdown menu on the right | `ButtonGroupIcon` | `Button` is one control; this row wires the left, center and right slots and the dropdown for you |
212
+
213
+ A gray `ghost` or `outline` `Button` is built for a card, a toolbar or a panel, where its hover step
214
+ reads. On the bare page canvas in light mode the hover fill measures only 1.076-1.124:1 against
215
+ the canvas across the nine brands (above 1.15:1 on a card), so the hover is faint there. A gray
216
+ ghost button that sits directly on `backgroundColor.base` should sit on a `Card` or panel surface
217
+ instead.
213
218
 
214
219
  ### Which "card" — `Card` / `ProductCard` / `StatCard` / `PaymentCard`
215
220
 
@@ -241,11 +246,11 @@ and wires `aria-controls` to them. Pick by that, never by the picture. A screen
241
246
  | Need | Component | Why not the others |
242
247
  | --- | --- | --- |
243
248
  | Top bar: back control + user-avatar profile/logout dropdown | `NavigationBar` | No page-nav links at all — `navMenu` is only the avatar dropdown's own items |
244
- | Top bar: horizontal page links with active-state highlighting + submenus | `Header` | Desktop submenus are hover-only, see gotcha below |
249
+ | Top bar: horizontal page links with active-state highlighting + submenus | `Header` | Desktop submenus are hover-only, see gotcha below; the bar is `min-height: 4.3rem` and grows when the nav wraps |
245
250
  | Collapsible/dockable left rail — primary in-app navigation + secondary panel | `SideBar` | The persistent nav shell, not for switching between whole apps |
246
251
  | In-app launcher: browse modules, pins, recents, search | `NavLauncher` opened by a `LauncherTrigger` in `NavigationBar`'s `leading` | An app-owned screen registry, not a cross-app switcher; pins can also surface in `SideBar` `pinnedItems` |
247
252
  | Key cap or chord hint (`mod+k`) | `Kbd` / `KbdShortcut` | Never hand-style a `<kbd>`; `Search` and `AppSwitcher` already use it |
248
- | Cross-app launcher (CRM/HRMS/Tickets/Billing/...) | `AppSwitcher` | Two-column popover grid of separate app origins — `SideBar`'s `otherApps` is the legacy predecessor; don't wire both into one shell |
253
+ | Cross-app launcher (CRM/HRMS/Tickets/Billing/...) | `AppSwitcher` (list from `resolveSuiteApps`; `buildSuiteApps` throws on plain `localhost` unless `devFallbackBaseUrl` is set) | Two-column popover grid of separate app origins — `SideBar`'s `otherApps` is the legacy predecessor; don't wire both into one shell |
249
254
  | Floating Jira-style dialog to view/edit one record without leaving the page | `WorkspaceWindow` | Modal-based floating panel, not page navigation; pairs with `WorkspaceTray` |
250
255
 
251
256
  ### File pickers — `FileUpload` vs `FileUploader`
@@ -255,7 +260,7 @@ and wires `aria-controls` to them. Pick by that, never by the picture. A screen
255
260
  | Real `File`/Blob objects to actually upload (FormData/API) | `FileUpload` | Controlled; `onFilesUploaded` carries real `File[]` and validates accept/size with rejection messages |
256
261
  | Self-contained "add photos, see thumbnails, remove" list with no server upload | `FileUploader` | Manages its own state; its `onFilesChange` metadata discards the real `File` — see gotcha below |
257
262
 
258
- Both export a type named `FileUploaderProps` — the one re-exported from the package root (`src/index.ts`) describes `FileUpload`, not `FileUploader`. Check which folder a type came from before trusting the name.
263
+ Both files declare a type named `FileUploaderProps`. The one at the package root describes `FileUpload` (`FileUpload/FileUploadProps.tsx`); `FileUploader`'s own props type (`FileUploader/FileUploaderProps.tsx`) is not exported, only its `UploadedFile`. Check which folder a type came from before trusting the name.
259
264
 
260
265
  ### Viewing files — `MediaViewer` / `FilePreview` / `PdfViewer` / `ProfilePhotoViewer`
261
266
 
@@ -290,7 +295,7 @@ The value `HeaderActions` comes from `Components/Header/HeaderActions.tsx`, whic
290
295
 
291
296
  **`ConfirmDialog.onConfirm` does not close the dialog.** It fires and nothing else; you call `onClose` yourself. That is deliberate — it lets you keep the dialog open while an async delete is in flight — but a handler that only calls your delete function leaves the dialog on screen with no error.
292
297
 
293
- `iconBg` and `iconColor` are **required** and take raw colour strings, so the caller resolves the tone. Read them from `useCustomTheme()` — a hardcoded hex there is stuck in light mode.
298
+ `iconBg` and `iconColor` are optional and derive a soft tint from `tone`; if you pass them, read them from `useCustomTheme()` — a hardcoded hex is stuck in light mode. For a delete that names the record, pass `entityName` (+ `entityKind`, `dependents`, `consequence`, `alternative`) instead of hand-building the body; focus opens on Cancel, never the destructive button, and `focusCancelOnOpen={false}` moves it to the close button, not Confirm.
294
299
 
295
300
  ### Busy indicators — `Spinner` vs `Backdrop` vs `Loading`
296
301
 
@@ -313,6 +318,7 @@ not enough when the overlay sits inside a transition wrapper — the wrapper kee
313
318
  | Need | Component | Why |
314
319
  | --- | --- | --- |
315
320
  | "Nothing here yet" with an optional action | `EmptyState` | Neutral placeholder |
321
+ | "Nothing matches your filters" | `FilteredEmptyState` | Names the filters, offers Clear and Remove-last; in a boundary use `isEmpty` + `isFiltered` |
316
322
  | A failed load with retry | `ErrorState` | `role="alert"`, `onRetry`/`isRetrying` built in |
317
323
  | One fetch that can be loading, forbidden, failed, empty or ready | `QueryStateBoundary` | Picks for you: loading > forbidden > error > empty > `children` |
318
324
 
@@ -328,23 +334,21 @@ Each wrapped component gets its own `ChakraProvider` (CSS reset, global styles,
328
334
 
329
335
  A test that finds the main dropdown with `getByRole("listbox")` must now pick it by id (`<id>-listbox`).
330
336
 
331
- ### `ChoiceCardGroup`'s children must be `ChoiceCard` elements, and the prop is `disabled`
337
+ ### `ChoiceCardGroup`'s children must be `ChoiceCard` elements
332
338
 
333
- A wrapper component hides each card's `value` and `disabled` from the roving tab stop, so with nothing
334
- selected the group has no Tab stop at all (same rule as `PaymentOptionGroup` / `AddressCardGroup`). The
335
- card's prop is `disabled`, not `isDisabled`: the shared machinery reads `disabled` off the child element.
336
- The group is a column only.
339
+ A wrapper component hides each card's `value` and `disabled` / `isDisabled` from the roving tab stop, so with
340
+ nothing selected the group has no Tab stop at all (same rule as `PaymentOptionGroup` / `AddressCardGroup`).
341
+ `ChoiceCard` takes `disabled` or its `isDisabled` alias; `AddressCard` and `PaymentOption` still take
342
+ `disabled` only. The group is a column; `columns={n}` (n above 1) lays it out as an n-column grid.
337
343
 
338
344
  ### `Pagination` never resets `page` for you
339
345
 
340
346
  An out-of-range `page` (a filter shrank the result) is displayed clamped but never reported, and changing
341
347
  rows per page does not reset `page` either. Reset it yourself, in `onPageSizeChange` and when the filters change.
342
348
 
343
- ### Four components with a behaviour their props do not hint at
349
+ ### A component with a behaviour its props do not hint at
344
350
 
345
- - `Notification`'s countdown is computed when its dates change and never ticks; remount or change a date to refresh it. Overdue labels read "overdue by N hours ago".
346
- - `NoteTextArea` checks `maxNoteWordCount` against the title only until the note is next edited, so a long title can be saved; `handleCancel` always receives `false`.
347
- - `VerifyEmailOtp` fields set `autocomplete="off"`, so browser or OS one-time-code autofill never offers the code.
351
+ - `NoteTextArea`'s `handleCancel` always receives `false`, and `handleSubmit` is called with three arguments although its type declares a fourth (both tagged `@deprecated`).
348
352
 
349
353
  ### Where `ref` lands, and what does not take one
350
354
 
@@ -359,7 +363,7 @@ itself takes no ref); `Avatar` to the outer box; `Tag` to its root, which is a `
359
363
  `PageHeader`, `StatCard`, `SaveBar`, `EmptyState`, `DescriptionList`, `FilterBar` and `Skeletons` put
360
364
  `className`, `style`, `id`, `data-*` and `aria-*` on their outermost element. `StatCard` applies
361
365
  `aria-label` only when `onClick` makes it a button; `DescriptionList`'s loading grid keeps its own
362
- `aria-label="Loading"`. `Skeletons` still accepts `alignSelf` and `flexShrink` in its type but never
366
+ `aria-label="Loading"`. `Skeletons` still accepts `alignSelf` and `flexShrink`, now `@deprecated`, but never
363
367
  applies them; wrap it in a `Box` to position it.
364
368
 
365
369
  ### `Table` `HeaderActions` item with `customComponent` and `onClick` is mouse-only unless the custom component is focusable
@@ -386,7 +390,7 @@ The wrapper is deliberately not a button; make the custom component a button, or
386
390
  | Chakra passthroughs | 34 barrel value exports (and 12 type exports) that duplicated an owned component were removed: `Input`, `Textarea`, `Progress`, `Radio`, `RadioGroup`, `Skeleton`, `ModalOverlay`, `ModalContent`, `ModalCloseButton`, `CardBody`, `ChakraCard`, `ChakraSelect`, `ChakraModal`(+`Body`/`Header`/`Footer`) the `Tabs`/`Accordion` families, and the Chakra slider sub-parts. `Tabs`, `Accordion` and `RangeSlider` now resolve to the library's own themed components (`RangeSlider` gained a real dual-thumb mode and a `marks` prop). Each removal is a compile error, never a silent swap | use the owned component — `TextInput`, `InputTextArea`, `ProgressBar`, `RadioButton`, `Skeletons`, `Modal`, `Card`, `Select` |
387
391
  | `Avatar` / `AvatarGroup` | Now the library's own components, not Chakra passthroughs. `AvatarProps` is a closed list (`name`, `src`, `size` `2xs`–`xl`, `status`, `ariaLabel`, `getInitials`, `data-testid`) — Chakra style props and `2xl` no longer compile, and **`name` is now required `string`**, so a `user.name?: string` call site fails. The fill is derived from `name`, so stop passing `bg`/`color`; it follows brand and dark mode on its own. `AvatarGroup` takes `people=[{name, src}]`, not `<Avatar>` children, so it can build one accurate group label. Measured by typecheck: 13 of 18 consumer files break | wrap in a `Box` for placement/shadow; resolve `name` at the call site |
388
392
  | `SettingsSection` | New optional `action` slot, right of the title/description on the header row — additive, nothing changes without it | — |
389
- | `Button` / `Buttons` | Icon-only buttons are square. `Buttons` (plural) is themed instead of hardcoded purple | — |
393
+ | `Button` | Icon-only buttons are square | — |
390
394
  | `ProgressBar` | Fill lifted to ≥ 3:1 on its track — green/orange/blue/cyan are visibly darker in light mode | — |
391
395
  | `PhoneNumberInput` | Default `size` `md` → `sm`, so it matches the `TextInput`s beside it | `size="md"` |
392
396
  | `PhoneNumberInput` / `PinInput` / `NoteTextArea` | `ref` now attaches; labels bound; PIN digits grouped and named | — |
@@ -565,11 +569,10 @@ For an accent icon on the gradient, use `resolved.ink` unless the accent clears
565
569
  All three match children by exact type (`child.type === XHeader/XBody/XFooter`) and render only
566
570
  those matches — nothing else in `children` is ever read. A sibling among the slots (a nested
567
571
  `Modal`, `AlertDialog`, a confirm dialog, a live region) silently never mounts; `Drawer` and `Modal`
568
- now warn once per dropped child type in development, `ProfileCard` still says nothing. All three
569
- unwrap **one** `<>...</>` level around a slot (so `<>{cond && <DrawerFooter>...}</>` still renders)
572
+ `ProfileCard` now warn once per dropped child type in development. All three
573
+ look through `<>...</>` Fragments around a slot, at any depth (so `<>{cond && <DrawerFooter>...}</>` still renders)
570
574
  and spread styling props (`padding`, `borderBottom`, `sx`, …) from the matched slot onto the real
571
- header/body/footer — a second nested fragment, or any other wrapper element, still drops the slot
572
- silently.
575
+ header/body/footer — any other wrapper element still drops the slot.
573
576
 
574
577
  **Apply:** pass a nested confirm dialog, toast host or live region to `Drawer` / `Modal` as
575
578
  `portalChildren`. It renders **inside** the dialog content after the slots (a sibling in the portal
@@ -580,13 +583,18 @@ as a sibling in a wrapping fragment. When a ternary picks between bodies, branch
580
583
  rendered inside one body slot, rather than returning fragment-wrapped slots per branch. `Drawer`'s
581
584
  misspelled `vaiant` is `@deprecated` — use `variant`.
582
585
 
586
+ A `Drawer` with no `DrawerHeader` is an unnamed dialog (axe `aria-dialog-name`) unless you pass its own
587
+ `aria-label` or `aria-labelledby`; dev builds warn once when it opens. `contentProps["aria-labelledby"]` is
588
+ overwritten, so it never names the drawer (`contentProps["aria-label"]` is kept).
589
+
583
590
  ### `FormDrawer` has no browser validation, and its submit button sits outside the `<form>`
584
591
 
585
592
  It sets `noValidate`: validate in `onSubmit` and pass messages via `errors`. Error-summary focus
586
593
  fires only after a submit; if validation is async, set `isSubmitting` synchronously in `onSubmit` so
587
594
  focus waits for the result, otherwise errors that arrive later are not focused. The footer submit
588
595
  button is tied to the form with the `form` attribute — Enter-to-submit works in browsers, but
589
- jsdom / user-event does not simulate it, so use `fireEvent.submit(form)` in tests.
596
+ jsdom / user-event only simulates it for a form with exactly one text field, so use
597
+ `fireEvent.submit(form)` in tests. `isSubmitDisabled` swallows both: `onSubmit` is not called while it is true.
590
598
 
591
599
  ### `QueryStateBoundary` evaluates JSX `children` even while loading
592
600
 
@@ -611,9 +619,19 @@ green. Pass `onClick` for a clickable card (it renders its own `<button>`); neve
611
619
  Unlike `Tag` and `StatCard`, where `info` is blue, the default `tone="info"` here paints the brand
612
620
  primary scale. `aria-label` is required — the ring has no visible caption.
613
621
 
622
+ ### `TextInput variant="filled"` has no border, only a fill that barely separates it
623
+
624
+ `filled` draws no resting border (`borderColor: "transparent"`), so the field's edge is the fill
625
+ alone. That fill measures 1.01-1.06:1 against a card in light mode on the nine brands, well under
626
+ the 3:1 that WCAG 1.4.11 asks of a control boundary, and about 1.19:1 in dark mode. The focus ring
627
+ and the invalid border still show, but a resting empty field can be hard to find.
628
+
629
+ **Apply:** use the default `variant="outline"` for any form a person must find and fill in. Keep
630
+ `filled` for fields whose position is already obvious from the layout.
631
+
614
632
  ### A clickable `TextInput` icon is a real button — give it a name
615
633
 
616
- With `onRightIconclick`/`onLeftIconClick` the icon renders as a `<button>`. Without
634
+ With `onRightIconClick`/`onLeftIconClick` the icon renders as a `<button>`. Without
617
635
  `rightIconAriaLabel`/`leftIconAriaLabel` it is announced as "{label}: right icon action".
618
636
 
619
637
  ### `SelectSearch`'s `isRequired` shows the asterisk but never announces "required"
@@ -625,7 +643,7 @@ undefined and stripped. Verified by DOM dump: the rendered `<input>` carries no
625
643
  even when `isRequired` is passed. The visible asterisk comes from a separate custom label, so the
626
644
  field *looks* required to sighted users and is silent to a screen reader.
627
645
 
628
- **Apply:** `SelectSearch` is `@deprecated` — use `Select` (`native={false}`), which marks required
646
+ **Apply:** prefer `Select` (`native={false}`) for new work — `SelectSearch` is not deprecated, but `Select` marks required
629
647
  state on a plain `Box` combobox that Chakra does not rewrite. If you must stay on `SelectSearch`,
630
648
  set the required state on your own wrapping `FormControl`. Note the obvious one-line fix inside the
631
649
  component is not neutral: Chakra's `useFormControl` also emits native `required`, which would add
@@ -690,6 +708,15 @@ accepted, typed, never called.
690
708
  **Apply:** leave at least one column without a `node`, or put an explicit control inside a `node`
691
709
  renderer instead of relying on row click.
692
710
 
711
+ Row click is also mouse-only: a `Table` row has no `tabIndex`, `role` or key handler, so a keyboard
712
+ user can never activate `onRowClick`. The column resize handle is a bare `div` with a
713
+ `mousedown` handler and is likewise unreachable by keyboard. Neither is a bug to work around inside
714
+ the `Table`; making every row a tab stop would add a focus ring to every consumer.
715
+
716
+ **Apply:** whatever `onRowClick` does must also be reachable through a real control, such as a
717
+ `Button` or link in a `node` column (the name or an actions cell), so keyboard and
718
+ screen-reader users have the same path.
719
+
693
720
  ### `Table.renderRowDetail` runs for every row on every render, and `expandedRows` ids match strictly
694
721
 
695
722
  It decides whether each row gets a chevron, so an inline function re-renders every row (defeating
@@ -722,15 +749,12 @@ const AppTable = ({ variant = 'classic', ...props }: TableProps) => <Table varia
722
749
  ```
723
750
  Applies to any library prop with a default value, not just `Table`'s `variant`.
724
751
 
725
- ### `FormWrapper` has a closed prop list — no `...rest`
752
+ ### `FormWrapper` forwards extra props to the outer wrapper only
726
753
 
727
- It destructures exactly `{ icon, text, children }` and forwards nothing else to either the outer
728
- wrapper or the bordered content `Box` — a `data-testid`, `id`, a margin override, or an `onClick` on
729
- the wrapper all silently disappear, and TypeScript won't catch it since excess-property checks don't
730
- apply to spreads.
754
+ `id`, `data-*`, `aria-*`, `className`, `style` and handlers land on the outermost `Box`; the bordered content `Box`
755
+ receives nothing, and `children` is not type-matched.
731
756
 
732
- **Apply:** wrap `FormWrapper` in your own `Box` when you need margin, a test hook, or an id on the
733
- section — don't expect anything but `icon`/`text`/`children` to reach the DOM.
757
+ **Apply:** put a margin override on `FormWrapper` itself (`className`/`style`); there is no prop for the content box's padding or border.
734
758
 
735
759
  ### `ContactForm`'s `apiKey` prop is a POST URL, not an auth token
736
760
 
@@ -753,15 +777,15 @@ blank email submits successfully with no error shown.
753
777
  **Apply:** if the parent needs to react to success, this component can't provide it. Don't rely on
754
778
  `email` being enforced as required — validate it yourself first if that matters.
755
779
 
756
- ### `VerifyEmailOtp` can't accept alphanumeric codes
780
+ ### `VerifyEmailOtp` can't accept alphanumeric codes, and appends "your new Pixel Account"
757
781
 
758
782
  It wraps Chakra's `PinInput` without forwarding a `type`, so Chakra's `type="number"` default
759
783
  applies — any letter typed is silently rejected (the character never appears, no error shown).
760
- `VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description` text also
761
- always gets a hardcoded second line appended — "your new Pixel Account" — with no prop to remove it.
784
+ `VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description` also gets
785
+ a second line, "your new Pixel Account", unless you pass `subtitle` (`""` drops it).
762
786
 
763
- **Apply:** only use this component for numeric-only OTPs with product copy that matches that exact
764
- trailing phrase. Otherwise build the card from `PinInput` plus your own text.
787
+ **Apply:** only use this component for numeric-only OTPs. Always pass `subtitle` outside the Pixel Account
788
+ product; for a non-English UI pass `labels`. For an alphanumeric code build the card from `PinInput`.
765
789
 
766
790
  ### `ApexLineChart` only ever renders one line, frozen at mount
767
791
 
@@ -872,23 +896,6 @@ the library (`TextInput`, `NumberInput`, `PhoneNumberInput`, `RadioButton`, `Pin
872
896
  **Apply:** always pass `isInformation` and `informationMessage` together; never treat
873
897
  `isInformation` alone as "use a default message."
874
898
 
875
- ### `ErrorComponent`'s `error` prop is the message text itself — the opposite of `error`+`errorMessage`
876
-
877
- Every other field in the library pairs a boolean `error` with a string `errorMessage`.
878
- `ErrorComponent` (used internally by `Input`) instead takes `error: string` directly as
879
- the message, with no internal truthy-check — passing `error=""` still draws the full icon next to
880
- blank text. It also has no `id`, so unlike `ErrorMessage` it can't be wired to `aria-describedby`.
881
-
882
- **Apply:** treat `ErrorComponent` as `Input`-specific, not a general error row; guard it
883
- with a truthy-message check yourself, and use `ErrorMessage` for any other field.
884
-
885
- ### `FormattedDescription`'s single-`*italic*` marker strips the asterisks but applies no italic style
886
-
887
- `**bold**` works; a lone `*word*` silently renders as plain text with the markers removed, reading
888
- as though the formatting was simply ignored.
889
-
890
- **Apply:** don't rely on single-asterisk emphasis in `content` strings — use `**bold**` or plain text.
891
-
892
899
  ### `Timeline`'s `onEditNote` editor doesn't auto-close without `editNoteLoading` — unlike add-note
893
900
 
894
901
  Add-note has a back-compat fallback that closes its editor immediately if `addNoteLoading` is never
@@ -969,13 +976,13 @@ props. Mixing plain and `customNode` items in one column produces inconsistent p
969
976
  **Apply:** don't expect board-wide card actions to reach a `customNode` card; wire them inside your
970
977
  custom render instead.
971
978
 
972
- ### `KanbanBoard`'s `AccountCard` only renders string-typed fields, and labels are the raw key
979
+ ### `KanbanBoard`'s `AccountCard` only renders string-typed fields
973
980
 
974
981
  A numeric field on an `Account` (allowed by its index signature) is never shown in the card's field
975
- list. The label is the key with only its first letter capitalised — `account_name` renders
976
- "Account_name", `nextFollowUp` renders "NextFollowUp"; nothing splits words.
982
+ list. The label is the key run through `toWords`, which splits snake_case, kebab-case and camelCase:
983
+ `account_name` renders "Account Name" and `nextFollowUp` renders "Next Follow Up".
977
984
 
978
- **Apply:** keep numeric display values as strings; use keys that read acceptably as-is.
985
+ **Apply:** keep numeric display values as strings.
979
986
 
980
987
  ### `KanbanBoard`'s `onColumnDelete` receives the deleted column's **card** ids, not the column's id
981
988
 
@@ -988,7 +995,7 @@ before the click) if you need the column id itself.
988
995
 
989
996
  ### `isRequired` is decorative on some fields, native on others — same prop name, different behavior
990
997
 
991
- `NumberInput` and the internal `Input.tsx` set native `required` (browser bubble, blocks submit).
998
+ `NumberInput` sets native `required` (browser bubble, blocks submit).
992
999
  `TextInput` and `InputTextArea` set only `aria-required` — announced, but no native validation.
993
1000
  `PhoneNumberInput` and `PinInput` pass it only to the label (draws a `*`); the field gets nothing.
994
1001
 
@@ -1020,15 +1027,6 @@ change those queries to `getByRole("switch", …)`.
1020
1027
  Same shape of trap on `Tabs`: the owned `Tab` forwards no `data-testid`, so `getByTestId("…-tab-…")`
1021
1028
  queries must become `getByRole("tab", { name })`.
1022
1029
 
1023
- ### The internal `Input.tsx` silently ignores six declared props
1024
-
1025
- `disabled`, `autoComplete`, `autoFocus`, `inputClassName`, `labelClassName`, and `errorClassName`
1026
- are all typed on `InputProps` but never read — passing them, `disabled` especially, compiles cleanly
1027
- and does nothing. It also has no `id` field, so its label always renders as an unassociated `<span>`.
1028
-
1029
- **Apply:** this is an internal component (not exported) reachable only via deep import — prefer
1030
- `TextInput` for anything public-facing, which doesn't have this gap.
1031
-
1032
1030
  ### `AlertDialog`'s `colorScheme`/`size`/`status`/`variant`/`addRole` are dead props
1033
1031
 
1034
1032
  Typed but never read, and `@deprecated` as a group (editors may not strike each one through). Use
@@ -1056,6 +1054,17 @@ child, with no tooltip element and no document listeners. A test that mocks Chak
1056
1054
  expects it mounted at render time must hover or focus the trigger first
1057
1055
  (`fireEvent.pointerEnter(trigger)` or `userEvent.hover`).
1058
1056
 
1057
+ ### A keyboard-focusable `ToolTip` trigger must be a native control — never a `span` with `aria-label`
1058
+
1059
+ `ToolTip` adds `aria-describedby` to its trigger but no role and no name. An icon-only trigger written
1060
+ `<Box as="span" tabIndex={0} aria-label={hint}>` (a column-header hint, an info icon) fails axe
1061
+ `aria-prohibited-attr`: `aria-label` is not allowed on a role-less span, so a conforming screen reader may drop
1062
+ it and announce a nameless generic element (Chrome's tree still shows the name).
1063
+
1064
+ **Apply:** use `<Box as="button" type="button" aria-label={hint} bg="transparent" border="0" p={0}
1065
+ cursor="default">`. It is still a Tab stop and the tooltip still opens on focus; measured pixel-identical to
1066
+ the span, closed and focused. `role="img"` on the span also passes axe but changes the focused state.
1067
+
1059
1068
  ### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
1060
1069
 
1061
1070
  `children` is `@deprecated` and never read — only `title`/`description`/`actions` render. The `onClose` you pass to `showToast` is wired to
@@ -1076,14 +1085,6 @@ button, right icon/dropdown), not just a "clicked outside the buttons" signal.
1076
1085
  **Apply:** always set `rightIcon` + `rightIconDropdown={true}` together for the dropdown. Don't use
1077
1086
  `onButtongroupClick` to detect background clicks — inspect `event.target` if you need to distinguish.
1078
1087
 
1079
- ### `Buttons` (plural) is not a group wrapper
1080
-
1081
- Despite the plural name suggesting a group, `Buttons` is now a thin wrapper over one themed
1082
- `Button` (its `className` is `@deprecated`), and it isn't exported from the package root.
1083
-
1084
- **Apply:** use `Button` for a single themed button or `ButtonGroupIcon` for a themed group; there is
1085
- no good reason to reach for `Buttons`.
1086
-
1087
1088
  ### `Card` already wraps `children` in a padded `CardBody` — a nested one doubles the padding
1088
1089
 
1089
1090
  `header`/`footer` now render, and `children` sit in a flex `CardBody` laid out by `direction`/
@@ -1162,9 +1163,9 @@ Inside a `NavigationBar` `moreIcon` cluster, a full trigger needs about 88px (av
1162
1163
  when its label truncates to nothing, and the title is the first thing to give way. With a long org name
1163
1164
  the title is invisible on 320-375px bars, and a smaller `maxWidth` does not change that.
1164
1165
 
1165
- **Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`. In avatar mode
1166
- the accessible name is `${ariaLabel}, ${org name}` and the name appears in a tooltip that wraps a
1167
- `span` around the trigger, so don't pass the trigger a ref. `auto` falls back to `"full"` where
1166
+ **Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`. Both layouts
1167
+ name the trigger `${ariaLabel}, ${org name}` (the placeholder when no org is active), and in avatar mode
1168
+ the name appears in a tooltip that wraps a `span` around the trigger, so don't pass the trigger a ref. `auto` falls back to `"full"` where
1168
1169
  `matchMedia` is missing (SSR, jsdom). `NavigationBar`'s `moreIcon` root is `min-width: 0`: give your
1169
1170
  own icon buttons `flexShrink={0}` and let any label truncate.
1170
1171
 
@@ -1241,8 +1242,10 @@ wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
1241
1242
 
1242
1243
  **Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
1243
1244
 
1244
- Each image's `previewUrl` is a `blob:` URL that `FileUploader` never revokes. Call
1245
- `URL.revokeObjectURL` when you drop the entry or unmount. (`FileUpload` revokes its own thumbnail URLs.)
1245
+ Each image's `previewUrl` is a `blob:` URL. `FileUploader` revokes it when the image is removed,
1246
+ truncated by `maxFiles`, rejected by `maxTotalSize` or still listed when it unmounts. Do not
1247
+ reuse a `previewUrl` from `onFilesChange` after the component is gone. (`FileUpload` revokes its own
1248
+ thumbnail URLs.)
1246
1249
 
1247
1250
  ### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
1248
1251
 
@@ -1279,6 +1282,15 @@ is also `null` until Jodit's lazy-loaded chunk resolves — a mount-time effect
1279
1282
  **Apply:** never set `theme`/`popupRoot` inside the `config` you pass to `Editor`. To force a
1280
1283
  remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key` prop.
1281
1284
 
1285
+ `Editor` keeps Jodit's defaults for the source view, and those defaults (`sourceEditor: "ace"`,
1286
+ `beautifyHTML: true`) load Ace and js-beautify from `cdnjs.cloudflare.com` when the editor mounts.
1287
+ Under a strict Content-Security-Policy, offline, or in a privacy review, those requests are blocked
1288
+ or are an outbound call you did not ask for.
1289
+
1290
+ **Apply:** pass `config={{ sourceEditor: "area", beautifyHTML: false }}` to drop both calls (source
1291
+ mode becomes a plain textarea), or point Jodit's `sourceEditorCDNUrlsJS` and `beautifyHTMLCDNUrlsJS`
1292
+ at copies you host.
1293
+
1282
1294
  ### `PdfViewer` `getBlob` — fetched on mount only; the toolbar already has Open and Download
1283
1295
 
1284
1296
  - **Swapping the file needs a new React `key`.** `getBlob` is read through a ref and fetched on mount,
@@ -1292,7 +1304,9 @@ remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key`
1292
1304
 
1293
1305
  `validate` runs on Continue, on Finish, and again for every step on Finish. Passing `stepId` controls
1294
1306
  the visible step only: stages past the furthest valid step stay disabled. Esc, close, Back and Cancel
1295
- are disabled while `isFinishing`.
1307
+ are disabled while `isFinishing`. With `chrome="inline"` there is no Modal at all: no focus trap, no Esc,
1308
+ no close X and no `role="dialog"` (the host window supplies them), `size` is ignored, and nothing renders
1309
+ while `isOpen` is false; Cancel still calls `onClose`, so the host must close itself there.
1296
1310
 
1297
1311
  ### `PageHeader` actions wrap by default
1298
1312
 
@@ -1312,6 +1326,15 @@ test asserting the old single-row layout needs `actionsLayout="inline"`.
1312
1326
  Jodit is re-created (readonly or height change) a stable handler stops receiving events. `Editor`
1313
1327
  binds them itself per instance; don't copy the pattern when wrapping Jodit directly.
1314
1328
 
1329
+ - **`EditorMergeField` `object`, `objectDescription`, `description`, `example`, `source` and `image` do nothing inside
1330
+ `Editor`.** They are metadata for a field browser you build; only `path`, `label`, `group` and `sample` are read.
1331
+
1332
+ ### `toCsv` — no BOM by default, and formula-like text gains a `'`
1333
+
1334
+ Excel reads a BOM-less CSV as ANSI and garbles non-ASCII text: pass `{ bom: true }` when the file is for Excel. A cell
1335
+ starting with `=`, `+`, `-` or `@` (a signed plain number excepted) is written with a leading `'`; set
1336
+ `escapeFormulas: false` on a column such as phone numbers (`+91 ...`) only when you control every value in it.
1337
+
1315
1338
  ### `Editor`'s Jodit toolbar is fixed for screen readers and keyboard, from our wrapper only
1316
1339
 
1317
1340
  Jodit's own markup (`node_modules/jodit`) put `aria-label` on each button's `role="listitem"`
@@ -1326,6 +1349,17 @@ above — a value you pass in `config` wins) and runs a `MutationObserver`-backe
1326
1349
  **Apply:** nothing — this is automatic. Set `config.allowTabNavigation: false` only if you
1327
1350
  deliberately want the toolbar out of the tab order; you'll reintroduce the keyboard-reachability gap.
1328
1351
 
1352
+ The editing area is a `role="textbox"` that Jodit leaves nameless. `Editor` names it from `label` when
1353
+ there is one, else from `labels.editor` (default `Rich text editor`), and sets `aria-readonly` while
1354
+ `config.readonly` is on. Two unlabelled editors on one page announce identically unless each gets its own
1355
+ `labels.editor`.
1356
+
1357
+ Jodit also ships the editing area at `tabindex="-1"`, so no keyboard could reach the text and a scrollable
1358
+ read-only editor could not be scrolled. `Editor` sets `tabIndex: 0` (a `config.tabIndex` you pass wins) and
1359
+ lights the Jodit frame while focus is inside it. Tab then walks toolbar, editing area, Jodit's status-bar
1360
+ buttons (`config.statusbar: false` drops those). Inside a table cell Tab and Shift+Tab stay with Jodit (next
1361
+ cell, a new row after the last, a new row above the first): arrow out of the table before tabbing away.
1362
+
1329
1363
  ### `SelectV2`, `SearchSelect`, and `SelectSearch` all search `option.label` only
1330
1364
 
1331
1365
  None of the three checks a rendered secondary field (`option.description`, a custom `view` node,
@@ -1413,8 +1447,9 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
1413
1447
  - **Esc is handled by the launcher, not the Drawer** (`closeOnEsc` is off): it clears a non-empty
1414
1448
  query and keeps focus in the field, and closes only when the query is empty. The keydown is stopped inside
1415
1449
  the launcher, so a consumer `Escape` listener on `document` never sees it.
1416
- - **`headerActions` text joins the dialog's accessible name** (header content becomes part of it,
1417
- as the search value already does: "Menu leave"). Use icon-only buttons with an `aria-label`.
1450
+ - **The dialog's accessible name is always `labels.title`** (a hidden heading, through `Drawer`'s
1451
+ `aria-labelledby`); the search value, scope chips and `headerActions` no longer join it. A consumer
1452
+ test asserting the old "Menu leave" style name must assert `labels.title` instead.
1418
1453
  - **The result count is `aria-hidden`; the announcement is a separate visually hidden `aria-live="polite"`
1419
1454
  node, deliberately not `role="status"`**, so `getByRole("status")` still matches only the no-results
1420
1455
  message and the loading skeleton.
@@ -1429,6 +1464,7 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
1429
1464
  a consumer that annotates a *full* `LauncherLabels` object fails to compile.
1430
1465
  - **`openShortcutHint` and `labels.hintOpenMenu` are deprecated no-ops:** the open chord is no longer
1431
1466
  shown in the footer. Drop them; the footer's hints are arrows, ENTER, ⌘ ENTER, ⌘ + click, P, ESC.
1467
+ Both are optional, so a full `LauncherLabels` object needs no `Omit<LauncherLabels, "hintOpenMenu">`.
1432
1468
  - **`apps` is data-driven.** Gate by plan by changing the array or setting `locked` / `lockedReason`;
1433
1469
  keep `id`s stable (hues and `key` derive from them), and pass `color` on an app whose mark must not
1434
1470
  shift when siblings are added or removed. Locked rows are not links, not focusable, `aria-disabled`,
@@ -1441,6 +1477,34 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
1441
1477
  stylesheet.
1442
1478
  - **A search row without `href` (an action with `run`) cannot open in a new tab:** any click, with or
1443
1479
  without Cmd/Ctrl, runs it and closes the launcher, same as Enter.
1480
+ - **Spotlight search is opt-in (`searchMode="spotlight"`).** Without it matching, ranking and row
1481
+ order are exactly as before; `scopes`, `quickActions`, `answers`, `facts` and `groupLimit` work in
1482
+ both modes. Facts are searchable in spotlight only.
1483
+ - **Two search models, and classic never matches a screen on its module.** Classic (the default) runs
1484
+ `searchLauncherSections`: registry order, no ranking, and every query word must appear in one row's
1485
+ own label or keywords. "leave balance" therefore finds nothing unless one screen's keywords carry
1486
+ both words. Spotlight ranks and also matches a screen on its module and section labels, so the same
1487
+ query finds Leave › Balances. The exported `searchLauncher` (one flat Screens group) is legacy and
1488
+ `@deprecated`; the component never calls it.
1489
+ - **Scope chips live in the header row and are always shown** (their own header row below `md`);
1490
+ while a query is active each chip's name carries its count ("People, 3 results"), so a test that
1491
+ types first must match `getByRole("radio", { name: /^People/ })`, not the bare label.
1492
+ - **Picking a chip other than All or Screens with an empty field lists that scope** exactly as
1493
+ passed: its `actions` or `extraResults` groups, so a remote group with nothing loaded yet shows
1494
+ `labels.scopeEmpty`. Load the scope's items when `onScopeChange` fires if it should list them.
1495
+ - **Quick actions show only under All with an empty query, as the first block of the menu** (not
1496
+ while `isLoading`); only the first 5 render.
1497
+ - **Closing resets the scope to "all"** and calls `onScopeChange("all")`; a controlled `activeScope`
1498
+ must apply it, like `onQueryChange("")`.
1499
+ - **`facts` swap the Quick access rail for a Preview pane at `lg`** whenever any visible result has
1500
+ facts; below `lg` the active result's facts dock under the list. Copy buttons are never inside an
1501
+ `option` or the listbox (axe `nested-interactive`, `aria-required-children`).
1502
+ - **An answer without `run` or `href` copies `answer.value` on Enter/click**; answers show in the
1503
+ All scope only.
1504
+ - **`extraResults` groups are not filtered** unless `matchLocally: true`; remote rows the query does not
1505
+ match stay listed (score 0) and can never be the Top hit.
1506
+ - **`LauncherSearchEngine` searches what it is given.** It has no React, DOM or network; build the
1507
+ index with `createIndex` once per data change, not per keystroke.
1444
1508
  - **`LauncherTrigger` does not bind its shortcut**; `shortcut={null}` removes the hint and
1445
1509
  `aria-keyshortcuts`. An explicit `aria-label` hides the visible label from assistive tech, so keep
1446
1510
  the visible text inside the label (WCAG 2.5.3). `display="icon"` has no visible text: the label is
@@ -1467,12 +1531,15 @@ control expecting `onMaximize` to fire.
1467
1531
 
1468
1532
  Passing `selected` alone (uncontrolled companion `onChange` omitted) computes the next filter state
1469
1533
  on every click and discards it — checkboxes visibly never check, forever, with no error. Separately,
1470
- `onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect —
1471
- `FilterSection.checkboxes` doesn't exist either; radio-vs-checkbox mode is actually decided by
1534
+ `onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect, as is
1535
+ `FilterSection.checkboxes` (all four are `@deprecated`); radio-vs-checkbox mode is actually decided by
1472
1536
  `type === "radio" || section.radio`.
1473
1537
 
1474
1538
  **Apply:** always pass `selected` and `onChange` together, or omit `selected` and let `FilterSidebar`
1475
- own its state. Don't reach for `onApply`/`headerPadding`/`sliderMode`/`FilterSection.checkboxes` —
1539
+ own its state.
1540
+
1541
+ Separately, `FilterSidebar` skips re-rendering sections whose `section` object is unchanged, so build `sidebarOptions`
1542
+ once (module constant or `useMemo`); fresh section objects every render re-render every section on each range drag. Don't reach for `onApply`/`headerPadding`/`sliderMode`/`FilterSection.checkboxes` —
1476
1543
  none of them do anything.
1477
1544
 
1478
1545
  ### `Breadcrumbs`' `isLastChild` prop is accepted but never read
@@ -1562,7 +1629,8 @@ hidden and arrow keys stop at the edge of the visible range, so the grid looks s
1562
1629
  `start` / `end` are read as local calendar dates (`end` inclusive): a UTC-midnight `Date` shows the
1563
1630
  previous day in a negative-offset zone, so build date-only values with `new Date(y, m, d)`.
1564
1631
  `renderDayCell` replaces each cell's chips wholesale: a 3-day event is passed to it for all 3 days
1565
- but is no longer drawn as one bar, and `onEventClick` never fires from your own content.
1632
+ but is no longer drawn as one bar, and `onEventClick` never fires from your own content. A cell is named by
1633
+ its date and count followed by everything inside it, your content included, so keep that content short.
1566
1634
 
1567
1635
  ### `AudioRecorder` needs a secure context, and `onRecorded` is not called after unmount
1568
1636
 
@@ -1580,6 +1648,17 @@ carries the previous image's zoom/rotation into the new one.
1580
1648
  **Apply:** keep the real extension on `fileName`, or pass `fileType` explicitly to skip inference.
1581
1649
  Remount via `key={fileUrl}` when swapping the file in place instead of just changing the prop.
1582
1650
 
1651
+ ### An overflowing `ScrollbarBox` is a tab stop — give it an `aria-label`
1652
+
1653
+ While its content overflows a scrollable axis (more than 1px) and holds no button, link or field, the
1654
+ box takes `tabIndex={0}` so a keyboard user can scroll it, and rings on `:focus-visible` only. A box that
1655
+ fits, scrolls `hidden`, or already holds something focusable gets no stop, and a mouse click shows no ring.
1656
+ Without `aria-label` the stop is unnamed (no `role="region"` either), so a screen reader announces nothing
1657
+ useful at it.
1658
+
1659
+ **Apply:** pass `aria-label` ("Recent deals") on every `ScrollbarBox` that can overflow, and don't wrap one
1660
+ around a list of controls just to get a stop.
1661
+
1583
1662
  ### `StageProgress`'s `tooltipThreshold`/`minStageWidth` no-op under `variant="stepper"`, and a stale `value` blanks the tracker
1584
1663
 
1585
1664
  Both props stop having any effect the moment a tracker switches to the stepper variant. Separately,
@@ -1592,6 +1671,16 @@ matches either, even when the "same" stage is clearly intended.
1592
1671
  current `stages` list whenever it's filtered, and keep `id`/`value` the same primitive type at every
1593
1672
  call site.
1594
1673
 
1674
+ ### A `StageProgress` strip is a tab stop only when no stage is a button — name it with `aria-label`
1675
+
1676
+ At a narrow width the strip scrolls sideways. Stage buttons already let a keyboard user reach every stage,
1677
+ so an interactive strip gets no extra stop. A strip with nothing focusable (`isReadOnly`, or every stage
1678
+ disabled) takes `tabIndex={0}` while it overflows and rings on `:focus-visible` only; nothing changes at
1679
+ rest, on a mouse click, or while the stages fit. Without `aria-label` the stop is unnamed. A `stepper`
1680
+ keeps its `ol` role, so its `aria-label` names the list rather than a region.
1681
+
1682
+ **Apply:** pass `aria-label` ("Deal stages") on every read-only `StageProgress` that can overflow.
1683
+
1595
1684
  ### `Table`'s `isVisiblity`, `tableSettings`, `handleExportChange`/`exportOptions`/`exportLabel`, and `onColumnFilter` are dead props — now `@deprecated`
1596
1685
 
1597
1686
  Grepped account-frontend, tickets, crm-frontend, hrms and social-frontend: zero consumers set any of
@@ -1879,7 +1968,8 @@ A wide node header is also **clipped, not ellipsized** — the header's ellipsis
1879
1968
  text. Column widths come from the rendered DOM, never from label length, so sizing is unaffected.
1880
1969
 
1881
1970
  **Apply:** set `labelText` on every node label; put an `isTruncated` `Text` inside the node if it
1882
- can outgrow the column.
1971
+ can outgrow the column. An icon-only tooltip trigger inside the node is a native `button`, not a `span`
1972
+ with `aria-label` (see the `ToolTip` gotcha above).
1883
1973
 
1884
1974
  ### `FormField`, `IconButton`, `SkipLink`: what their props do not hint at
1885
1975
 
@@ -1902,9 +1992,11 @@ can outgrow the column.
1902
1992
  - `formatDate` reads a bare `YYYY-MM-DD` as that calendar day, not UTC midnight. Pass a `Date` only when you mean
1903
1993
  an instant. Epoch *seconds* are not detected: multiply by 1000 first.
1904
1994
  - `TimePicker` fires `onChange` with a `Date` on the day of `value` (else `baseDate`, else today). It never clears
1905
- to `null`, so put a Clear action beside it if one is needed.
1995
+ to `null` on its own: pass `onClear` to make "--" pickable once a time is set (it then fires instead of `onChange`).
1906
1996
  - For free-text chips that are not email addresses use `TagInput`: same look as `MultiSelect`, any text, with
1907
- your own `validate`.
1997
+ your own `validate`. Its rejection messages and add/remove announcements are English by default; translate them
1998
+ with `labels` (functions, e.g. `duplicate: (entry) => ...`), including `labels.remove` for each chip's remove button
1999
+ (default `Remove <tag>`).
1908
2000
  - **Button press scale matches a real `:active` only.** A `MenuButton as={Button}` held open by Chakra's
1909
2001
  `data-active` keeps the darker pressed fill but does not stay at 0.98. A consumer `_active={{ transform }}`
1910
2002
  loses to the press rule while the pointer is down; use `variant="unstyled"` or an `sx` `&:active` with