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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +447 -13
  2. package/COMPONENT-GOTCHAS.md +150 -91
  3. package/DESIGN-GUIDE.md +47 -7
  4. package/README.md +37 -3
  5. package/dist/Components/Accordion/Accordion.js +11 -8
  6. package/dist/Components/Accordion/AccordionProps.d.ts +4 -0
  7. package/dist/Components/Accordion/accordionColors.js +1 -2
  8. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -0
  9. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChartProps.d.ts +2 -2
  10. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts +1 -1
  11. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
  12. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChartProps.d.ts +3 -1
  13. package/dist/Components/Apexcharts/ApexPieChart/pieImageTexture.d.ts +2 -0
  14. package/dist/Components/Apexcharts/ApexPieChart/pieImageTexture.js +13 -0
  15. package/dist/Components/AppSwitcher/AppSwitcher.js +6 -3
  16. package/dist/Components/AppSwitcher/AppSwitcherProps.d.ts +3 -1
  17. package/dist/Components/AppSwitcher/AppSwitcherProps.js +18 -11
  18. package/dist/Components/AppSwitcher/pixelizeSuite.d.ts +24 -0
  19. package/dist/Components/AppSwitcher/pixelizeSuite.js +71 -0
  20. package/dist/Components/AppearanceSettings/AppearanceSettings.js +3 -3
  21. package/dist/Components/AppearanceSettings/AppearanceSettingsProps.d.ts +2 -2
  22. package/dist/Components/Avatar/avatarColorway.d.ts +2 -2
  23. package/dist/Components/Avatar/avatarColorway.js +7 -6
  24. package/dist/Components/Breadcrumbs/BreadcrumbsProps.d.ts +1 -1
  25. package/dist/Components/Button/Button.styles.js +5 -2
  26. package/dist/Components/Button/ButtonProps.d.ts +2 -4
  27. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
  28. package/dist/Components/CalendarGrid/CalendarGrid.js +5 -3
  29. package/dist/Components/CalendarGrid/CalendarGridProps.d.ts +1 -1
  30. package/dist/Components/Card/Card.d.ts +1 -0
  31. package/dist/Components/Card/Card.js +1 -0
  32. package/dist/Components/Checkbox/Checkbox.styles.js +3 -1
  33. package/dist/Components/CheckoutKit/selectable.d.ts +3 -1
  34. package/dist/Components/CheckoutKit/selectable.js +10 -7
  35. package/dist/Components/CheckoutKit/tonalHover.d.ts +2 -0
  36. package/dist/Components/CheckoutKit/tonalHover.js +6 -0
  37. package/dist/Components/ChoiceCard/ChoiceCard.d.ts +1 -1
  38. package/dist/Components/ChoiceCard/ChoiceCard.js +2 -1
  39. package/dist/Components/ChoiceCard/ChoiceCardProps.d.ts +6 -0
  40. package/dist/Components/Common/FieldMessage.d.ts +1 -0
  41. package/dist/Components/Common/FormLabel.d.ts +1 -1
  42. package/dist/Components/Common/FormLabel.js +4 -3
  43. package/dist/Components/Common/HelperText.d.ts +2 -2
  44. package/dist/Components/Common/HelperText.js +1 -2
  45. package/dist/Components/Common/activationKey.d.ts +5 -0
  46. package/dist/Components/Common/activationKey.js +12 -0
  47. package/dist/Components/Common/dataAttributes.d.ts +4 -0
  48. package/dist/Components/Common/fieldMessageStyles.js +2 -1
  49. package/dist/Components/Common/findSlot.d.ts +2 -0
  50. package/dist/Components/Common/findSlot.js +24 -0
  51. package/dist/Components/Common/surfaceFocusRing.d.ts +1 -0
  52. package/dist/Components/Common/surfaceFocusRing.js +7 -0
  53. package/dist/Components/ConfirmDialog/ConfirmDialog.js +17 -5
  54. package/dist/Components/ConfirmDialog/ConfirmDialogProps.d.ts +38 -10
  55. package/dist/Components/CopyButton/CopyButton.d.ts +1 -0
  56. package/dist/Components/CopyButton/CopyButton.js +3 -6
  57. package/dist/Components/CouponField/CouponField.js +5 -2
  58. package/dist/Components/CustomModulesTable/CustomModulesTable.js +3 -1
  59. package/dist/Components/DatePicker/CalendarPanel.d.ts +1 -0
  60. package/dist/Components/DatePicker/CalendarPanel.js +3 -1
  61. package/dist/Components/DatePicker/DatePicker.js +24 -26
  62. package/dist/Components/DatePicker/DatePickerProps.d.ts +8 -0
  63. package/dist/Components/DatePicker/PickerPortal.js +1 -1
  64. package/dist/Components/DatePicker/RangeDatePicker.d.ts +7 -0
  65. package/dist/Components/DatePicker/RangeDatePicker.js +10 -29
  66. package/dist/Components/DatePicker/SingleDatePicker.js +5 -21
  67. package/dist/Components/DatePicker/TimeOnlyPicker.js +2 -20
  68. package/dist/Components/DescriptionList/DescriptionList.js +1 -1
  69. package/dist/Components/DetailSections/DetailSections.js +2 -1
  70. package/dist/Components/Divider/Divider.d.ts +3 -3
  71. package/dist/Components/Divider/Divider.js +3 -3
  72. package/dist/Components/Drawer/Drawer.d.ts +2 -0
  73. package/dist/Components/Drawer/Drawer.js +23 -25
  74. package/dist/Components/Dropdown/DropDown.js +6 -21
  75. package/dist/Components/Editor/Editor.js +6 -2
  76. package/dist/Components/Editor/EditorProps.d.ts +17 -1
  77. package/dist/Components/Editor/editorLabels.js +1 -0
  78. package/dist/Components/Editor/editorTokenStyles.d.ts +8 -0
  79. package/dist/Components/Editor/editorTokenStyles.js +9 -1
  80. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -1
  81. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +9 -2
  82. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +15 -1
  83. package/dist/Components/EmptyState/EmptyStateProps.d.ts +21 -0
  84. package/dist/Components/EmptyState/FilteredEmptyState.d.ts +5 -0
  85. package/dist/Components/EmptyState/FilteredEmptyState.js +23 -0
  86. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +1 -0
  87. package/dist/Components/FilePreview/FilePreview.js +7 -3
  88. package/dist/Components/FilePreview/FilePreviewProps.d.ts +2 -1
  89. package/dist/Components/FileUpload/FileUpload.js +8 -9
  90. package/dist/Components/FileUpload/FileUploadProps.d.ts +2 -2
  91. package/dist/Components/FileUploader/FileUploader.js +5 -6
  92. package/dist/Components/FilterSidebar/FilterSidebar.d.ts +7 -9
  93. package/dist/Components/FilterSidebar/FilterSidebar.js +90 -233
  94. package/dist/Components/FilterSidebar/OptionsSection.d.ts +14 -0
  95. package/dist/Components/FilterSidebar/OptionsSection.js +46 -0
  96. package/dist/Components/FilterSidebar/RangeSection.d.ts +17 -0
  97. package/dist/Components/FilterSidebar/RangeSection.js +80 -0
  98. package/dist/Components/FilterSidebar/SectionHeader.d.ts +13 -0
  99. package/dist/Components/FilterSidebar/SectionHeader.js +29 -0
  100. package/dist/Components/FilterSidebar/useStableCallback.d.ts +1 -0
  101. package/dist/Components/FilterSidebar/useStableCallback.js +12 -0
  102. package/dist/Components/Form/FormWrapper.d.ts +7 -7
  103. package/dist/Components/Form/FormWrapper.js +5 -3
  104. package/dist/Components/FormField/FormField.js +1 -1
  105. package/dist/Components/Header/Header.js +1 -1
  106. package/dist/Components/Header/HeaderActions.js +4 -2
  107. package/dist/Components/IconButton/IconButtonProps.d.ts +2 -1
  108. package/dist/Components/Input/TextInput.js +2 -2
  109. package/dist/Components/Input/TextInputProps.d.ts +3 -1
  110. package/dist/Components/KanbanBoard/AccountCard.js +1 -1
  111. package/dist/Components/KanbanBoard/KanbanBoard.d.ts +1 -1
  112. package/dist/Components/KanbanBoard/KanbanBoard.js +11 -7
  113. package/dist/Components/LauncherTrigger/LauncherTrigger.js +1 -1
  114. package/dist/Components/LazyWrapper/LazyWrapper.d.ts +2 -1
  115. package/dist/Components/LazyWrapper/LazyWrapper.js +1 -1
  116. package/dist/Components/MediaViewer/MediaViewer.js +4 -3
  117. package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
  118. package/dist/Components/MediaViewer/components/MediaImageViewer.js +19 -8
  119. package/dist/Components/MediaViewer/components/MediaScrubber.js +7 -2
  120. package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
  121. package/dist/Components/MediaViewer/components/ViewerIconButton.js +3 -1
  122. package/dist/Components/MediaViewer/hooks/useFileViewer.d.ts +1 -0
  123. package/dist/Components/MediaViewer/mediaItems.d.ts +1 -0
  124. package/dist/Components/MediaViewer/mediaItems.js +5 -0
  125. package/dist/Components/Modal/Modal.d.ts +1 -0
  126. package/dist/Components/Modal/Modal.js +7 -25
  127. package/dist/Components/Modal/warnDroppedSlotChildren.d.ts +1 -1
  128. package/dist/Components/Modal/warnDroppedSlotChildren.js +7 -3
  129. package/dist/Components/NavLauncher/LauncherTabs.js +2 -1
  130. package/dist/Components/NavLauncher/NavLauncher.js +47 -22
  131. package/dist/Components/NavLauncher/NavLauncherProps.d.ts +6 -4
  132. package/dist/Components/NavLauncher/ScopeBar.js +4 -2
  133. package/dist/Components/NavLauncher/engine/engine.js +2 -1
  134. package/dist/Components/NavLauncher/engine/fold.js +2 -1
  135. package/dist/Components/NavLauncher/launcherMotion.d.ts +19 -0
  136. package/dist/Components/NavLauncher/launcherMotion.js +15 -0
  137. package/dist/Components/NavLauncher/launcherParts.d.ts +12 -0
  138. package/dist/Components/NavLauncher/launcherParts.js +45 -11
  139. package/dist/Components/NavLauncher/searchLayout.d.ts +1 -0
  140. package/dist/Components/NavLauncher/searchLayout.js +3 -1
  141. package/dist/Components/NavLauncher/spotlightParts.d.ts +6 -2
  142. package/dist/Components/NavLauncher/spotlightParts.js +22 -9
  143. package/dist/Components/NavLauncher/useCopiedFlash.d.ts +6 -0
  144. package/dist/Components/NavLauncher/useCopiedFlash.js +21 -0
  145. package/dist/Components/NavigationBar/NavigationBar.js +6 -5
  146. package/dist/Components/NoteTextArea/NoteTextArea.js +12 -17
  147. package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +5 -3
  148. package/dist/Components/Notification/Notification.js +19 -21
  149. package/dist/Components/Notification/NotificationProps.d.ts +1 -1
  150. package/dist/Components/NotificationBell/notificationHelpers.d.ts +16 -1
  151. package/dist/Components/NotificationBell/notificationHelpers.js +13 -7
  152. package/dist/Components/OffersList/OffersList.js +4 -2
  153. package/dist/Components/OptionChip/OptionChip.js +3 -2
  154. package/dist/Components/OptionChip/optionInk.js +4 -2
  155. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  156. package/dist/Components/OrgSwitcher/OrgSwitcher.js +13 -6
  157. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +1 -1
  158. package/dist/Components/OrganizationDetails/OrganizationDetails.js +4 -7
  159. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +4 -2
  160. package/dist/Components/PdfViewer/PdfViewer.d.ts +1 -0
  161. package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +1 -1
  162. package/dist/Components/PlanPill/PlanPill.js +4 -2
  163. package/dist/Components/PlanPill/PlanPillProps.d.ts +1 -1
  164. package/dist/Components/ProductCard/ProductCardAction.js +2 -1
  165. package/dist/Components/ProductCard/ProductCardSwatches.js +2 -1
  166. package/dist/Components/ProductDetails/ProductDetails.js +2 -1
  167. package/dist/Components/ProfileCard/ProfileCard.d.ts +1 -0
  168. package/dist/Components/ProfileCard/ProfileCard.js +12 -26
  169. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
  170. package/dist/Components/ProgressBar/ProgressBar.js +2 -1
  171. package/dist/Components/QuantityStepper/QuantityStepper.js +5 -2
  172. package/dist/Components/QueryState/QueryStateBoundary.d.ts +1 -1
  173. package/dist/Components/QueryState/QueryStateBoundary.js +5 -1
  174. package/dist/Components/QueryState/QueryStateProps.d.ts +6 -2
  175. package/dist/Components/RadioButton/RadioButton.js +2 -3
  176. package/dist/Components/RolesPermission/RolesPermission.js +12 -8
  177. package/dist/Components/ScrollToTop/ScrollToTop.d.ts +1 -0
  178. package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +4 -1
  179. package/dist/Components/ScrollbarBox/ScrollbarBox.js +10 -4
  180. package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -1
  181. package/dist/Components/SearchSelect/SearchSelect.js +8 -5
  182. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +3 -3
  183. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
  184. package/dist/Components/SegmentedControl/SegmentedControl.js +1 -1
  185. package/dist/Components/Select/Select.js +6 -0
  186. package/dist/Components/Select/SelectNative.d.ts +16 -0
  187. package/dist/Components/Select/SelectPopup.js +170 -63
  188. package/dist/Components/Select/SelectProps.d.ts +30 -2
  189. package/dist/Components/Select/groupedWindow.d.ts +21 -0
  190. package/dist/Components/Select/groupedWindow.js +50 -0
  191. package/dist/Components/SelectSearch/SelectSearch.d.ts +1 -1
  192. package/dist/Components/SelectSearch/SelectSearch.js +48 -38
  193. package/dist/Components/SelectSearch/SelectSearchProps.d.ts +3 -3
  194. package/dist/Components/SelectV2/SelectV2.d.ts +1 -1
  195. package/dist/Components/SelectV2/SelectV2.js +1 -1
  196. package/dist/Components/SelectV2/SelectV2Props.d.ts +3 -3
  197. package/dist/Components/SideBar/SecondaryBar.js +3 -2
  198. package/dist/Components/SideBar/components/MenuItemBox.js +3 -2
  199. package/dist/Components/SideBar/components/MenuItems.js +1 -1
  200. package/dist/Components/SideBar/components/OtherApps.js +2 -2
  201. package/dist/Components/SideBar/components/PinnedSection.js +1 -1
  202. package/dist/Components/SideBar/sidebarScale.d.ts +2 -2
  203. package/dist/Components/SideBar/sidebarScale.js +2 -2
  204. package/dist/Components/SignInActivityTable/SignInActivityTable.js +7 -2
  205. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +1 -1
  206. package/dist/Components/SignInActivityTable/scrollRegionRing.d.ts +10 -0
  207. package/dist/Components/SignInActivityTable/scrollRegionRing.js +14 -0
  208. package/dist/Components/Skeletons/SkeletonProps.d.ts +5 -1
  209. package/dist/Components/Slider/Slider.d.ts +2 -0
  210. package/dist/Components/Slider/Slider.js +5 -4
  211. package/dist/Components/StageProgress/StageItem.js +2 -1
  212. package/dist/Components/StageProgress/StageProgress.js +8 -2
  213. package/dist/Components/StageProgress/StageProgressProps.d.ts +2 -0
  214. package/dist/Components/StageProgress/StepperStage.js +2 -1
  215. package/dist/Components/StickyBuyBar/StickyBuyBar.js +2 -1
  216. package/dist/Components/Table/Table.js +5 -3
  217. package/dist/Components/Table/TableProps.d.ts +1 -1
  218. package/dist/Components/Table/components/HeaderActions.js +5 -3
  219. package/dist/Components/Table/components/TableBody.js +22 -8
  220. package/dist/Components/Table/components/TableGroupRow.js +2 -1
  221. package/dist/Components/Table/components/TableHeader.js +14 -20
  222. package/dist/Components/Table/components/rowDetail.js +3 -2
  223. package/dist/Components/Table/components/rowFocusRing.d.ts +21 -0
  224. package/dist/Components/Table/components/rowFocusRing.js +20 -0
  225. package/dist/Components/Table/filters/ActiveFilters.js +6 -3
  226. package/dist/Components/Table/filters/CompactSelect.js +2 -1
  227. package/dist/Components/Table/filters/FilterDatePicker.d.ts +6 -0
  228. package/dist/Components/Table/filters/FilterDatePicker.js +61 -0
  229. package/dist/Components/Table/filters/LeftFilterPane.d.ts +1 -0
  230. package/dist/Components/Table/filters/LeftFilterPane.js +14 -6
  231. package/dist/Components/Table/hooks/useTable.js +11 -7
  232. package/dist/Components/Table/settings/ManageColumns.js +4 -3
  233. package/dist/Components/Table/settings/TableSettings.js +4 -4
  234. package/dist/Components/Tabs/Tabs.d.ts +1 -0
  235. package/dist/Components/Tabs/Tabs.js +1 -0
  236. package/dist/Components/Tabs/components/CountBadge.d.ts +1 -0
  237. package/dist/Components/Tabs/components/TabList.d.ts +1 -0
  238. package/dist/Components/Tabs/components/TabList.js +1 -0
  239. package/dist/Components/Tabs/components/TabPanel.d.ts +1 -0
  240. package/dist/Components/Tabs/components/TabPanel.js +1 -0
  241. package/dist/Components/Tabs/tabStyles.js +4 -2
  242. package/dist/Components/Tag/Tag.js +5 -4
  243. package/dist/Components/Tag/Tag.styles.js +5 -4
  244. package/dist/Components/Tag/TagProps.d.ts +4 -1
  245. package/dist/Components/Tag/tagDot.js +10 -3
  246. package/dist/Components/TagInput/TagInput.js +6 -5
  247. package/dist/Components/TagInput/TagInputProps.d.ts +15 -0
  248. package/dist/Components/TagInput/tagEntries.d.ts +7 -1
  249. package/dist/Components/TagInput/tagEntries.js +18 -5
  250. package/dist/Components/TimePicker/TimePicker.js +7 -3
  251. package/dist/Components/TimePicker/TimePickerProps.d.ts +2 -0
  252. package/dist/Components/Timeline/Timeline.js +13 -9
  253. package/dist/Components/Toaster/Toaster.js +2 -1
  254. package/dist/Components/Toggle/TableToggle.d.ts +1 -1
  255. package/dist/Components/Toggle/TableToggle.js +1 -1
  256. package/dist/Components/UpgradeButton/UpgradeButton.js +3 -2
  257. package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +1 -1
  258. package/dist/Components/UserDetails/UserDetails.js +5 -7
  259. package/dist/Components/WishlistToggle/WishlistToggle.js +2 -1
  260. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +11 -1
  261. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +3 -1
  262. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +14 -7
  263. package/dist/Hooks/useOutsideMouseDown.d.ts +11 -0
  264. package/dist/Hooks/useOutsideMouseDown.js +30 -0
  265. package/dist/Hooks/usePreferences.js +30 -12
  266. package/dist/Hooks/useScrollableRegion.d.ts +17 -0
  267. package/dist/Hooks/useScrollableRegion.js +36 -0
  268. package/dist/Hooks/useSidebarPrefs.d.ts +1 -0
  269. package/dist/Theme/chakra/Menu.styles.d.ts +4 -0
  270. package/dist/Theme/chakra/Menu.styles.js +6 -0
  271. package/dist/Theme/chakra/componentStyles.d.ts +4 -0
  272. package/dist/Theme/chakra/componentStyles.js +1 -1
  273. package/dist/Theme/chakra/createBrandTheme.d.ts +1 -0
  274. package/dist/Theme/chakra/focusRing.styles.d.ts +1 -1
  275. package/dist/Theme/chakra/focusRing.styles.js +3 -3
  276. package/dist/Theme/chakra/paletteFromTheme.d.ts +2 -1
  277. package/dist/Theme/chakra/paletteFromTheme.js +18 -4
  278. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +1 -0
  279. package/dist/Theme/provider/ThemeSwitcher.d.ts +1 -0
  280. package/dist/Theme/provider/ThemeSwitcher.js +1 -1
  281. package/dist/Theme/testing/testPalette.d.ts +1 -0
  282. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +1 -0
  283. package/dist/Theme/tokens/builders/filledSurface.js +3 -2
  284. package/dist/Theme/tokens/builders/focusRing.js +4 -1
  285. package/dist/Theme/tokens/builders/paletteScale.d.ts +2 -0
  286. package/dist/Theme/tokens/builders/paletteScale.js +10 -0
  287. package/dist/Theme/tokens/types.d.ts +1 -0
  288. package/dist/Utils/accountHandoff.d.ts +3 -0
  289. package/dist/Utils/price.d.ts +1 -0
  290. package/dist/Utils/tabular.d.ts +30 -0
  291. package/dist/Utils/tabular.js +61 -0
  292. package/dist/esm/Components/Accordion/Accordion.js +11 -8
  293. package/dist/esm/Components/Accordion/accordionColors.js +2 -3
  294. package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +2 -1
  295. package/dist/esm/Components/Apexcharts/ApexPieChart/ApexPieChart.js +6 -5
  296. package/dist/esm/Components/Apexcharts/ApexPieChart/pieImageTexture.js +10 -0
  297. package/dist/esm/Components/AppSwitcher/AppSwitcher.js +6 -3
  298. package/dist/esm/Components/AppSwitcher/AppSwitcherProps.js +18 -11
  299. package/dist/esm/Components/AppSwitcher/pixelizeSuite.js +67 -0
  300. package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +3 -3
  301. package/dist/esm/Components/Avatar/avatarColorway.js +4 -4
  302. package/dist/esm/Components/Button/Button.styles.js +5 -2
  303. package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +3 -1
  304. package/dist/esm/Components/CalendarGrid/CalendarGrid.js +5 -3
  305. package/dist/esm/Components/Card/Card.js +1 -0
  306. package/dist/esm/Components/Checkbox/Checkbox.styles.js +3 -1
  307. package/dist/esm/Components/CheckoutKit/selectable.js +10 -7
  308. package/dist/esm/Components/CheckoutKit/tonalHover.js +2 -0
  309. package/dist/esm/Components/ChoiceCard/ChoiceCard.js +2 -1
  310. package/dist/esm/Components/Common/FormLabel.js +4 -3
  311. package/dist/esm/Components/Common/HelperText.js +1 -2
  312. package/dist/esm/Components/Common/activationKey.js +7 -0
  313. package/dist/esm/Components/Common/fieldMessageStyles.js +2 -1
  314. package/dist/esm/Components/Common/findSlot.js +17 -0
  315. package/dist/esm/Components/Common/surfaceFocusRing.js +3 -0
  316. package/dist/esm/Components/ConfirmDialog/ConfirmDialog.js +18 -6
  317. package/dist/esm/Components/CopyButton/CopyButton.js +3 -6
  318. package/dist/esm/Components/CouponField/CouponField.js +5 -2
  319. package/dist/esm/Components/CustomModulesTable/CustomModulesTable.js +3 -1
  320. package/dist/esm/Components/DatePicker/CalendarPanel.js +3 -1
  321. package/dist/esm/Components/DatePicker/DatePicker.js +25 -27
  322. package/dist/esm/Components/DatePicker/PickerPortal.js +2 -2
  323. package/dist/esm/Components/DatePicker/RangeDatePicker.js +10 -29
  324. package/dist/esm/Components/DatePicker/SingleDatePicker.js +5 -21
  325. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +2 -20
  326. package/dist/esm/Components/DescriptionList/DescriptionList.js +1 -1
  327. package/dist/esm/Components/DetailSections/DetailSections.js +2 -1
  328. package/dist/esm/Components/Divider/Divider.js +3 -3
  329. package/dist/esm/Components/Drawer/Drawer.js +19 -18
  330. package/dist/esm/Components/Dropdown/DropDown.js +7 -22
  331. package/dist/esm/Components/Editor/Editor.js +7 -3
  332. package/dist/esm/Components/Editor/editorLabels.js +1 -0
  333. package/dist/esm/Components/Editor/editorTokenStyles.js +7 -0
  334. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +8 -4
  335. package/dist/esm/Components/EmptyState/FilteredEmptyState.js +18 -0
  336. package/dist/esm/Components/FilePreview/FilePreview.js +8 -4
  337. package/dist/esm/Components/FileUpload/FileUpload.js +8 -9
  338. package/dist/esm/Components/FileUploader/FileUploader.js +6 -7
  339. package/dist/esm/Components/FilterSidebar/FilterSidebar.js +94 -237
  340. package/dist/esm/Components/FilterSidebar/OptionsSection.js +41 -0
  341. package/dist/esm/Components/FilterSidebar/RangeSection.js +78 -0
  342. package/dist/esm/Components/FilterSidebar/SectionHeader.js +23 -0
  343. package/dist/esm/Components/FilterSidebar/useStableCallback.js +8 -0
  344. package/dist/esm/Components/Form/FormWrapper.js +5 -3
  345. package/dist/esm/Components/FormField/FormField.js +1 -1
  346. package/dist/esm/Components/Header/Header.js +1 -1
  347. package/dist/esm/Components/Header/HeaderActions.js +6 -4
  348. package/dist/esm/Components/Input/TextInput.js +2 -2
  349. package/dist/esm/Components/KanbanBoard/AccountCard.js +1 -1
  350. package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +2 -2
  351. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +11 -7
  352. package/dist/esm/Components/LauncherTrigger/LauncherTrigger.js +1 -1
  353. package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -1
  354. package/dist/esm/Components/MediaViewer/MediaViewer.js +5 -4
  355. package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +5 -1
  356. package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +19 -8
  357. package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +7 -2
  358. package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +3 -1
  359. package/dist/esm/Components/MediaViewer/components/ViewerIconButton.js +3 -1
  360. package/dist/esm/Components/MediaViewer/mediaItems.js +4 -0
  361. package/dist/esm/Components/Modal/Modal.js +2 -17
  362. package/dist/esm/Components/Modal/warnDroppedSlotChildren.js +7 -3
  363. package/dist/esm/Components/NavLauncher/LauncherTabs.js +2 -1
  364. package/dist/esm/Components/NavLauncher/NavLauncher.js +51 -26
  365. package/dist/esm/Components/NavLauncher/ScopeBar.js +4 -2
  366. package/dist/esm/Components/NavLauncher/engine/engine.js +2 -1
  367. package/dist/esm/Components/NavLauncher/engine/fold.js +2 -1
  368. package/dist/esm/Components/NavLauncher/launcherMotion.js +11 -0
  369. package/dist/esm/Components/NavLauncher/launcherParts.js +40 -8
  370. package/dist/esm/Components/NavLauncher/searchLayout.js +1 -0
  371. package/dist/esm/Components/NavLauncher/spotlightParts.js +23 -10
  372. package/dist/esm/Components/NavLauncher/useCopiedFlash.js +17 -0
  373. package/dist/esm/Components/NavigationBar/NavigationBar.js +6 -5
  374. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +12 -17
  375. package/dist/esm/Components/Notification/Notification.js +20 -22
  376. package/dist/esm/Components/NotificationBell/notificationHelpers.js +12 -6
  377. package/dist/esm/Components/OffersList/OffersList.js +4 -2
  378. package/dist/esm/Components/OptionChip/OptionChip.js +3 -2
  379. package/dist/esm/Components/OptionChip/optionInk.js +4 -2
  380. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  381. package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +14 -7
  382. package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +5 -8
  383. package/dist/esm/Components/PlanPill/PlanPill.js +4 -2
  384. package/dist/esm/Components/ProductCard/ProductCardAction.js +2 -1
  385. package/dist/esm/Components/ProductCard/ProductCardSwatches.js +2 -1
  386. package/dist/esm/Components/ProductDetails/ProductDetails.js +2 -1
  387. package/dist/esm/Components/ProfileCard/ProfileCard.js +6 -17
  388. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +4 -2
  389. package/dist/esm/Components/ProgressBar/ProgressBar.js +2 -1
  390. package/dist/esm/Components/QuantityStepper/QuantityStepper.js +5 -2
  391. package/dist/esm/Components/QueryState/QueryStateBoundary.js +5 -1
  392. package/dist/esm/Components/RadioButton/RadioButton.js +2 -3
  393. package/dist/esm/Components/RolesPermission/RolesPermission.js +12 -8
  394. package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +9 -3
  395. package/dist/esm/Components/SearchSelect/SearchSelect.js +8 -5
  396. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +1 -1
  397. package/dist/esm/Components/Select/Select.js +6 -0
  398. package/dist/esm/Components/Select/SelectPopup.js +171 -64
  399. package/dist/esm/Components/Select/groupedWindow.js +44 -0
  400. package/dist/esm/Components/SelectSearch/SelectSearch.js +49 -39
  401. package/dist/esm/Components/SelectV2/SelectV2.js +1 -1
  402. package/dist/esm/Components/SideBar/SecondaryBar.js +3 -2
  403. package/dist/esm/Components/SideBar/components/MenuItemBox.js +3 -2
  404. package/dist/esm/Components/SideBar/components/MenuItems.js +1 -1
  405. package/dist/esm/Components/SideBar/components/OtherApps.js +2 -2
  406. package/dist/esm/Components/SideBar/components/PinnedSection.js +1 -1
  407. package/dist/esm/Components/SideBar/sidebarScale.js +2 -2
  408. package/dist/esm/Components/SignInActivityTable/SignInActivityTable.js +8 -3
  409. package/dist/esm/Components/SignInActivityTable/scrollRegionRing.js +9 -0
  410. package/dist/esm/Components/Slider/Slider.js +6 -5
  411. package/dist/esm/Components/StageProgress/StageItem.js +2 -1
  412. package/dist/esm/Components/StageProgress/StageProgress.js +8 -2
  413. package/dist/esm/Components/StageProgress/StepperStage.js +2 -1
  414. package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +2 -1
  415. package/dist/esm/Components/Table/Table.js +8 -6
  416. package/dist/esm/Components/Table/components/HeaderActions.js +7 -5
  417. package/dist/esm/Components/Table/components/TableBody.js +22 -8
  418. package/dist/esm/Components/Table/components/TableGroupRow.js +2 -1
  419. package/dist/esm/Components/Table/components/TableHeader.js +15 -21
  420. package/dist/esm/Components/Table/components/rowDetail.js +3 -2
  421. package/dist/esm/Components/Table/components/rowFocusRing.js +16 -0
  422. package/dist/esm/Components/Table/filters/ActiveFilters.js +8 -5
  423. package/dist/esm/Components/Table/filters/CompactSelect.js +2 -1
  424. package/dist/esm/Components/Table/filters/FilterDatePicker.js +20 -0
  425. package/dist/esm/Components/Table/filters/LeftFilterPane.js +14 -6
  426. package/dist/esm/Components/Table/hooks/useTable.js +11 -7
  427. package/dist/esm/Components/Table/settings/ManageColumns.js +4 -3
  428. package/dist/esm/Components/Table/settings/TableSettings.js +4 -4
  429. package/dist/esm/Components/Tabs/Tabs.js +1 -0
  430. package/dist/esm/Components/Tabs/components/TabList.js +1 -0
  431. package/dist/esm/Components/Tabs/components/TabPanel.js +1 -0
  432. package/dist/esm/Components/Tabs/tabStyles.js +5 -3
  433. package/dist/esm/Components/Tag/Tag.js +5 -4
  434. package/dist/esm/Components/Tag/Tag.styles.js +5 -4
  435. package/dist/esm/Components/Tag/tagDot.js +10 -3
  436. package/dist/esm/Components/TagInput/TagInput.js +8 -7
  437. package/dist/esm/Components/TagInput/tagEntries.js +16 -4
  438. package/dist/esm/Components/TimePicker/TimePicker.js +7 -3
  439. package/dist/esm/Components/Timeline/Timeline.js +14 -10
  440. package/dist/esm/Components/Toaster/Toaster.js +2 -1
  441. package/dist/esm/Components/Toggle/TableToggle.js +1 -1
  442. package/dist/esm/Components/UpgradeButton/UpgradeButton.js +3 -2
  443. package/dist/esm/Components/UserDetails/UserDetails.js +5 -7
  444. package/dist/esm/Components/WishlistToggle/WishlistToggle.js +2 -1
  445. package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +12 -2
  446. package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +3 -1
  447. package/dist/esm/Hooks/useOutsideMouseDown.js +26 -0
  448. package/dist/esm/Hooks/usePreferences.js +30 -12
  449. package/dist/esm/Hooks/useScrollableRegion.js +33 -0
  450. package/dist/esm/Theme/chakra/Menu.styles.js +6 -0
  451. package/dist/esm/Theme/chakra/componentStyles.js +1 -1
  452. package/dist/esm/Theme/chakra/focusRing.styles.js +3 -3
  453. package/dist/esm/Theme/chakra/paletteFromTheme.js +16 -3
  454. package/dist/esm/Theme/provider/ThemeSwitcher.js +1 -1
  455. package/dist/esm/Theme/tokens/builders/filledSurface.js +3 -2
  456. package/dist/esm/Theme/tokens/builders/focusRing.js +4 -1
  457. package/dist/esm/Theme/tokens/builders/paletteScale.js +6 -0
  458. package/dist/esm/Utils/tabular.js +56 -0
  459. package/dist/esm/index.js +16 -24
  460. package/dist/index.d.ts +54 -2
  461. package/dist/index.js +33 -29
  462. package/package.json +3 -1
  463. package/dist/Components/Buttons/Buttons.d.ts +0 -3
  464. package/dist/Components/Buttons/Buttons.js +0 -9
  465. package/dist/Components/Buttons/ButtonsProps.d.ts +0 -12
  466. package/dist/Components/Common/ErrorComponent.d.ts +0 -7
  467. package/dist/Components/Common/ErrorComponent.js +0 -16
  468. package/dist/Components/Common/FormattedDescription.d.ts +0 -7
  469. package/dist/Components/Common/FormattedDescription.js +0 -62
  470. package/dist/Components/Common/Label.d.ts +0 -9
  471. package/dist/Components/Common/Label.js +0 -12
  472. package/dist/Components/Input/Input/Input.d.ts +0 -4
  473. package/dist/Components/Input/Input/Input.js +0 -75
  474. package/dist/Components/Input/Input/InputProps.d.ts +0 -24
  475. package/dist/Components/Input/Input/InputProps.js +0 -2
  476. package/dist/Components/ProductCard/productCardFixtures.d.ts +0 -7
  477. package/dist/Components/ProductCard/productCardFixtures.js +0 -61
  478. package/dist/esm/Components/Buttons/Buttons.js +0 -4
  479. package/dist/esm/Components/Common/ErrorComponent.js +0 -14
  480. package/dist/esm/Components/Common/FormattedDescription.js +0 -60
  481. package/dist/esm/Components/Common/Label.js +0 -10
  482. package/dist/esm/Components/Input/Input/Input.js +0 -37
  483. package/dist/esm/Components/Input/Input/InputProps.js +0 -1
  484. package/dist/esm/Components/ProductCard/productCardFixtures.js +0 -58
  485. package/dist/esm/services/feedback.js +0 -15
  486. package/dist/services/feedback.d.ts +0 -12
  487. package/dist/services/feedback.js +0 -18
  488. /package/dist/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
  489. /package/dist/esm/Components/{Buttons/ButtonsProps.js → Common/dataAttributes.js} +0 -0
@@ -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,6 +583,10 @@ 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
@@ -612,9 +619,19 @@ green. Pass `onClick` for a clickable card (it renders its own `<button>`); neve
612
619
  Unlike `Tag` and `StatCard`, where `info` is blue, the default `tone="info"` here paints the brand
613
620
  primary scale. `aria-label` is required — the ring has no visible caption.
614
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
+
615
632
  ### A clickable `TextInput` icon is a real button — give it a name
616
633
 
617
- With `onRightIconclick`/`onLeftIconClick` the icon renders as a `<button>`. Without
634
+ With `onRightIconClick`/`onLeftIconClick` the icon renders as a `<button>`. Without
618
635
  `rightIconAriaLabel`/`leftIconAriaLabel` it is announced as "{label}: right icon action".
619
636
 
620
637
  ### `SelectSearch`'s `isRequired` shows the asterisk but never announces "required"
@@ -626,7 +643,7 @@ undefined and stripped. Verified by DOM dump: the rendered `<input>` carries no
626
643
  even when `isRequired` is passed. The visible asterisk comes from a separate custom label, so the
627
644
  field *looks* required to sighted users and is silent to a screen reader.
628
645
 
629
- **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
630
647
  state on a plain `Box` combobox that Chakra does not rewrite. If you must stay on `SelectSearch`,
631
648
  set the required state on your own wrapping `FormControl`. Note the obvious one-line fix inside the
632
649
  component is not neutral: Chakra's `useFormControl` also emits native `required`, which would add
@@ -691,6 +708,15 @@ accepted, typed, never called.
691
708
  **Apply:** leave at least one column without a `node`, or put an explicit control inside a `node`
692
709
  renderer instead of relying on row click.
693
710
 
711
+ Setting `onRowClick` makes every row a tab stop: Enter or Space on the focused row (not on a checkbox,
712
+ button or link inside it) fires `onRowClick` with the first visible column that has no `node`. A table
713
+ without `onRowClick`, one whose every column has a `node`, and a table that is `isLoading` get no tab
714
+ stop. The column resize handle is a bare `div` with a `mousedown` handler and is unreachable by keyboard.
715
+
716
+ **Apply:** expect one extra Tab stop per row once you pass `onRowClick`, and update any tab-order test.
717
+ Controls inside a row keep their own keys; give a `node` column a real `Button` or link for the actions
718
+ that must not depend on the row.
719
+
694
720
  ### `Table.renderRowDetail` runs for every row on every render, and `expandedRows` ids match strictly
695
721
 
696
722
  It decides whether each row gets a chevron, so an inline function re-renders every row (defeating
@@ -723,15 +749,12 @@ const AppTable = ({ variant = 'classic', ...props }: TableProps) => <Table varia
723
749
  ```
724
750
  Applies to any library prop with a default value, not just `Table`'s `variant`.
725
751
 
726
- ### `FormWrapper` has a closed prop list — no `...rest`
752
+ ### `FormWrapper` forwards extra props to the outer wrapper only
727
753
 
728
- It destructures exactly `{ icon, text, children }` and forwards nothing else to either the outer
729
- wrapper or the bordered content `Box` — a `data-testid`, `id`, a margin override, or an `onClick` on
730
- the wrapper all silently disappear, and TypeScript won't catch it since excess-property checks don't
731
- 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.
732
756
 
733
- **Apply:** wrap `FormWrapper` in your own `Box` when you need margin, a test hook, or an id on the
734
- 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.
735
758
 
736
759
  ### `ContactForm`'s `apiKey` prop is a POST URL, not an auth token
737
760
 
@@ -754,15 +777,15 @@ blank email submits successfully with no error shown.
754
777
  **Apply:** if the parent needs to react to success, this component can't provide it. Don't rely on
755
778
  `email` being enforced as required — validate it yourself first if that matters.
756
779
 
757
- ### `VerifyEmailOtp` can't accept alphanumeric codes
780
+ ### `VerifyEmailOtp` can't accept alphanumeric codes, and appends "your new Pixel Account"
758
781
 
759
782
  It wraps Chakra's `PinInput` without forwarding a `type`, so Chakra's `type="number"` default
760
783
  applies — any letter typed is silently rejected (the character never appears, no error shown).
761
- `VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description` text also
762
- 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).
763
786
 
764
- **Apply:** only use this component for numeric-only OTPs with product copy that matches that exact
765
- 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`.
766
789
 
767
790
  ### `ApexLineChart` only ever renders one line, frozen at mount
768
791
 
@@ -873,23 +896,6 @@ the library (`TextInput`, `NumberInput`, `PhoneNumberInput`, `RadioButton`, `Pin
873
896
  **Apply:** always pass `isInformation` and `informationMessage` together; never treat
874
897
  `isInformation` alone as "use a default message."
875
898
 
876
- ### `ErrorComponent`'s `error` prop is the message text itself — the opposite of `error`+`errorMessage`
877
-
878
- Every other field in the library pairs a boolean `error` with a string `errorMessage`.
879
- `ErrorComponent` (used internally by `Input`) instead takes `error: string` directly as
880
- the message, with no internal truthy-check — passing `error=""` still draws the full icon next to
881
- blank text. It also has no `id`, so unlike `ErrorMessage` it can't be wired to `aria-describedby`.
882
-
883
- **Apply:** treat `ErrorComponent` as `Input`-specific, not a general error row; guard it
884
- with a truthy-message check yourself, and use `ErrorMessage` for any other field.
885
-
886
- ### `FormattedDescription`'s single-`*italic*` marker strips the asterisks but applies no italic style
887
-
888
- `**bold**` works; a lone `*word*` silently renders as plain text with the markers removed, reading
889
- as though the formatting was simply ignored.
890
-
891
- **Apply:** don't rely on single-asterisk emphasis in `content` strings — use `**bold**` or plain text.
892
-
893
899
  ### `Timeline`'s `onEditNote` editor doesn't auto-close without `editNoteLoading` — unlike add-note
894
900
 
895
901
  Add-note has a back-compat fallback that closes its editor immediately if `addNoteLoading` is never
@@ -970,13 +976,13 @@ props. Mixing plain and `customNode` items in one column produces inconsistent p
970
976
  **Apply:** don't expect board-wide card actions to reach a `customNode` card; wire them inside your
971
977
  custom render instead.
972
978
 
973
- ### `KanbanBoard`'s `AccountCard` only renders string-typed fields, and labels are the raw key
979
+ ### `KanbanBoard`'s `AccountCard` only renders string-typed fields
974
980
 
975
981
  A numeric field on an `Account` (allowed by its index signature) is never shown in the card's field
976
- list. The label is the key with only its first letter capitalised — `account_name` renders
977
- "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".
978
984
 
979
- **Apply:** keep numeric display values as strings; use keys that read acceptably as-is.
985
+ **Apply:** keep numeric display values as strings.
980
986
 
981
987
  ### `KanbanBoard`'s `onColumnDelete` receives the deleted column's **card** ids, not the column's id
982
988
 
@@ -989,7 +995,7 @@ before the click) if you need the column id itself.
989
995
 
990
996
  ### `isRequired` is decorative on some fields, native on others — same prop name, different behavior
991
997
 
992
- `NumberInput` and the internal `Input.tsx` set native `required` (browser bubble, blocks submit).
998
+ `NumberInput` sets native `required` (browser bubble, blocks submit).
993
999
  `TextInput` and `InputTextArea` set only `aria-required` — announced, but no native validation.
994
1000
  `PhoneNumberInput` and `PinInput` pass it only to the label (draws a `*`); the field gets nothing.
995
1001
 
@@ -1021,15 +1027,6 @@ change those queries to `getByRole("switch", …)`.
1021
1027
  Same shape of trap on `Tabs`: the owned `Tab` forwards no `data-testid`, so `getByTestId("…-tab-…")`
1022
1028
  queries must become `getByRole("tab", { name })`.
1023
1029
 
1024
- ### The internal `Input.tsx` silently ignores six declared props
1025
-
1026
- `disabled`, `autoComplete`, `autoFocus`, `inputClassName`, `labelClassName`, and `errorClassName`
1027
- are all typed on `InputProps` but never read — passing them, `disabled` especially, compiles cleanly
1028
- and does nothing. It also has no `id` field, so its label always renders as an unassociated `<span>`.
1029
-
1030
- **Apply:** this is an internal component (not exported) reachable only via deep import — prefer
1031
- `TextInput` for anything public-facing, which doesn't have this gap.
1032
-
1033
1030
  ### `AlertDialog`'s `colorScheme`/`size`/`status`/`variant`/`addRole` are dead props
1034
1031
 
1035
1032
  Typed but never read, and `@deprecated` as a group (editors may not strike each one through). Use
@@ -1057,6 +1054,17 @@ child, with no tooltip element and no document listeners. A test that mocks Chak
1057
1054
  expects it mounted at render time must hover or focus the trigger first
1058
1055
  (`fireEvent.pointerEnter(trigger)` or `userEvent.hover`).
1059
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
+
1060
1068
  ### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
1061
1069
 
1062
1070
  `children` is `@deprecated` and never read — only `title`/`description`/`actions` render. The `onClose` you pass to `showToast` is wired to
@@ -1077,14 +1085,6 @@ button, right icon/dropdown), not just a "clicked outside the buttons" signal.
1077
1085
  **Apply:** always set `rightIcon` + `rightIconDropdown={true}` together for the dropdown. Don't use
1078
1086
  `onButtongroupClick` to detect background clicks — inspect `event.target` if you need to distinguish.
1079
1087
 
1080
- ### `Buttons` (plural) is not a group wrapper
1081
-
1082
- Despite the plural name suggesting a group, `Buttons` is now a thin wrapper over one themed
1083
- `Button` (its `className` is `@deprecated`), and it isn't exported from the package root.
1084
-
1085
- **Apply:** use `Button` for a single themed button or `ButtonGroupIcon` for a themed group; there is
1086
- no good reason to reach for `Buttons`.
1087
-
1088
1088
  ### `Card` already wraps `children` in a padded `CardBody` — a nested one doubles the padding
1089
1089
 
1090
1090
  `header`/`footer` now render, and `children` sit in a flex `CardBody` laid out by `direction`/
@@ -1163,9 +1163,9 @@ Inside a `NavigationBar` `moreIcon` cluster, a full trigger needs about 88px (av
1163
1163
  when its label truncates to nothing, and the title is the first thing to give way. With a long org name
1164
1164
  the title is invisible on 320-375px bars, and a smaller `maxWidth` does not change that.
1165
1165
 
1166
- **Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`. In avatar mode
1167
- the accessible name is `${ariaLabel}, ${org name}` and the name appears in a tooltip that wraps a
1168
- `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
1169
1169
  `matchMedia` is missing (SSR, jsdom). `NavigationBar`'s `moreIcon` root is `min-width: 0`: give your
1170
1170
  own icon buttons `flexShrink={0}` and let any label truncate.
1171
1171
 
@@ -1242,8 +1242,10 @@ wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
1242
1242
 
1243
1243
  **Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
1244
1244
 
1245
- Each image's `previewUrl` is a `blob:` URL that `FileUploader` never revokes. Call
1246
- `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.)
1247
1249
 
1248
1250
  ### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
1249
1251
 
@@ -1280,6 +1282,15 @@ is also `null` until Jodit's lazy-loaded chunk resolves — a mount-time effect
1280
1282
  **Apply:** never set `theme`/`popupRoot` inside the `config` you pass to `Editor`. To force a
1281
1283
  remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key` prop.
1282
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
+
1283
1294
  ### `PdfViewer` `getBlob` — fetched on mount only; the toolbar already has Open and Download
1284
1295
 
1285
1296
  - **Swapping the file needs a new React `key`.** `getBlob` is read through a ref and fetched on mount,
@@ -1315,6 +1326,15 @@ test asserting the old single-row layout needs `actionsLayout="inline"`.
1315
1326
  Jodit is re-created (readonly or height change) a stable handler stops receiving events. `Editor`
1316
1327
  binds them itself per instance; don't copy the pattern when wrapping Jodit directly.
1317
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
+
1318
1338
  ### `Editor`'s Jodit toolbar is fixed for screen readers and keyboard, from our wrapper only
1319
1339
 
1320
1340
  Jodit's own markup (`node_modules/jodit`) put `aria-label` on each button's `role="listitem"`
@@ -1329,6 +1349,17 @@ above — a value you pass in `config` wins) and runs a `MutationObserver`-backe
1329
1349
  **Apply:** nothing — this is automatic. Set `config.allowTabNavigation: false` only if you
1330
1350
  deliberately want the toolbar out of the tab order; you'll reintroduce the keyboard-reachability gap.
1331
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
+
1332
1363
  ### `SelectV2`, `SearchSelect`, and `SelectSearch` all search `option.label` only
1333
1364
 
1334
1365
  None of the three checks a rendered secondary field (`option.description`, a custom `view` node,
@@ -1500,12 +1531,15 @@ control expecting `onMaximize` to fire.
1500
1531
 
1501
1532
  Passing `selected` alone (uncontrolled companion `onChange` omitted) computes the next filter state
1502
1533
  on every click and discards it — checkboxes visibly never check, forever, with no error. Separately,
1503
- `onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect —
1504
- `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
1505
1536
  `type === "radio" || section.radio`.
1506
1537
 
1507
1538
  **Apply:** always pass `selected` and `onChange` together, or omit `selected` and let `FilterSidebar`
1508
- 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` —
1509
1543
  none of them do anything.
1510
1544
 
1511
1545
  ### `Breadcrumbs`' `isLastChild` prop is accepted but never read
@@ -1595,7 +1629,8 @@ hidden and arrow keys stop at the edge of the visible range, so the grid looks s
1595
1629
  `start` / `end` are read as local calendar dates (`end` inclusive): a UTC-midnight `Date` shows the
1596
1630
  previous day in a negative-offset zone, so build date-only values with `new Date(y, m, d)`.
1597
1631
  `renderDayCell` replaces each cell's chips wholesale: a 3-day event is passed to it for all 3 days
1598
- 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.
1599
1634
 
1600
1635
  ### `AudioRecorder` needs a secure context, and `onRecorded` is not called after unmount
1601
1636
 
@@ -1613,6 +1648,17 @@ carries the previous image's zoom/rotation into the new one.
1613
1648
  **Apply:** keep the real extension on `fileName`, or pass `fileType` explicitly to skip inference.
1614
1649
  Remount via `key={fileUrl}` when swapping the file in place instead of just changing the prop.
1615
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
+
1616
1662
  ### `StageProgress`'s `tooltipThreshold`/`minStageWidth` no-op under `variant="stepper"`, and a stale `value` blanks the tracker
1617
1663
 
1618
1664
  Both props stop having any effect the moment a tracker switches to the stepper variant. Separately,
@@ -1625,6 +1671,16 @@ matches either, even when the "same" stage is clearly intended.
1625
1671
  current `stages` list whenever it's filtered, and keep `id`/`value` the same primitive type at every
1626
1672
  call site.
1627
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
+
1628
1684
  ### `Table`'s `isVisiblity`, `tableSettings`, `handleExportChange`/`exportOptions`/`exportLabel`, and `onColumnFilter` are dead props — now `@deprecated`
1629
1685
 
1630
1686
  Grepped account-frontend, tickets, crm-frontend, hrms and social-frontend: zero consumers set any of
@@ -1912,7 +1968,8 @@ A wide node header is also **clipped, not ellipsized** — the header's ellipsis
1912
1968
  text. Column widths come from the rendered DOM, never from label length, so sizing is unaffected.
1913
1969
 
1914
1970
  **Apply:** set `labelText` on every node label; put an `isTruncated` `Text` inside the node if it
1915
- 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).
1916
1973
 
1917
1974
  ### `FormField`, `IconButton`, `SkipLink`: what their props do not hint at
1918
1975
 
@@ -1935,9 +1992,11 @@ can outgrow the column.
1935
1992
  - `formatDate` reads a bare `YYYY-MM-DD` as that calendar day, not UTC midnight. Pass a `Date` only when you mean
1936
1993
  an instant. Epoch *seconds* are not detected: multiply by 1000 first.
1937
1994
  - `TimePicker` fires `onChange` with a `Date` on the day of `value` (else `baseDate`, else today). It never clears
1938
- 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`).
1939
1996
  - For free-text chips that are not email addresses use `TagInput`: same look as `MultiSelect`, any text, with
1940
- 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>`).
1941
2000
  - **Button press scale matches a real `:active` only.** A `MenuButton as={Button}` held open by Chakra's
1942
2001
  `data-active` keeps the darker pressed fill but does not stay at 0.98. A consumer `_active={{ transform }}`
1943
2002
  loses to the press rule while the pointer is down; use `variant="unstyled"` or an `sx` `&:active` with
package/DESIGN-GUIDE.md CHANGED
@@ -52,11 +52,31 @@ Borders are the one px value: `borderWidth="1px"`. Fixed widths (side panel, lis
52
52
  | Body | `Text fontSize="sm" color={colors.text[800]}` |
53
53
  | Label / meta / helper | `Text fontSize="xs" color={colors.textMuted}` |
54
54
  | KPI tile | `StatCard` — pass `trend` and `goodDirection`; the delta is green when the change is *good* (a shorter sales cycle is green); `iconTone` tints the icon chip (unset = brand primary) |
55
- | Numbers in tables/columns | `sx={{ fontVariantNumeric: "tabular-nums" }}` so digits align; `Table` columns take `align: "end"` |
56
- | Overline (rare) | `fontSize="xs" fontWeight={600} textTransform="uppercase" letterSpacing="0.06em"` |
55
+ | Numbers in tables/columns | `sx={NUMERIC_TEXT}` (root export, tabular figures) so digits align; `Table` columns take `align: "end"` |
56
+ | Code, ids, shortcuts | `fontFamily="mono"` (a real monospace stack); shortcut hints are `KbdShortcut`, never a hand-styled `<kbd>` |
57
+ | Overline (rare) | `textStyle="overline"` |
57
58
 
58
- Chakra size keys only (`xs sm md lg xl 2xl`) — never `fontSize="14px"`, never below `xs`.
59
- Weights: 400 body, 500 labels, 600 titles, 700 KPI numbers only.
59
+ **`textStyle` sets size, line height, weight and tracking in one prop.** Prefer it to hand-picking
60
+ the four: `<Text textStyle="label">`. The ramp (`TEXT_STYLES`, also a root export):
61
+
62
+ | `textStyle` | Use |
63
+ | --- | --- |
64
+ | `title` · `heading` · `subheading` | page / section / card titles (24 · 20 · 16px) |
65
+ | `body` | running text (14px) |
66
+ | `ui` · `label` | control and form text (13px, weight 500 · 600) |
67
+ | `caption` | helper and meta text (12px) |
68
+ | `overline` | small-caps eyebrow (11px, uppercase) |
69
+
70
+ Chakra size keys only (`xs-minus xs xs-plus sm md lg xl 2xl`) — never `fontSize="14px"`.
71
+ `xs-plus` (13px) is the control size; `xs-minus` (11px) is for chips, counts, keyboard hints and
72
+ overlines only; nothing is smaller. Weights: 400 body, 500 labels, 600 titles, 700 KPI numbers only.
73
+
74
+ **Radius and elevation come from the role, not the scale step.** `RADIUS_ROLE` (root export) names
75
+ the radius a surface plays: `control`, `field`, `tooltip` and `media` 8px · `option` 6px · `card`,
76
+ `float`, `dialog` and `sheet` 12px · `chip` full. Anchored popups (`Menu`, `Popover`, `Select`,
77
+ `Dropdown`) all take the 12px radius, and `Menu` and `Popover` the `md` (float) shadow, so a panel
78
+ you build yourself takes `borderRadius={RADIUS_ROLE.float}` and `boxShadow="md"`. A resting card is
79
+ `shadows.card`; heavier shadows belong to floating things only.
60
80
 
61
81
  ## 4. Color — pick by role
62
82
 
@@ -91,8 +111,9 @@ stay light in dark mode.
91
111
  | Must stand out (a status that needs attention) | `variant="solid"` |
92
112
  | Dense list, table cell, or an already-colored surface | `variant="outline"` — no fill to compete with the surface |
93
113
 
94
- `secondary` and `tertiary` render as the same hex on most brands (see `COMPONENT-GOTCHAS.md`) —
95
- don't lean on that pair to distinguish two categories; reach for a utility scheme instead.
114
+ `secondary` and `tertiary` are two distinct accents on every brand except `zinc`, which is
115
+ near-grey and has almost no hue to turn (see `COMPONENT-GOTCHAS.md`) — on `zinc`, reach for a
116
+ utility scheme to tell two categories apart.
96
117
 
97
118
  ## 5. Controls — two scales, `sm` by default
98
119
 
@@ -155,6 +176,7 @@ sections are `Card` with the title in `header`.
155
176
  | Multi-step flow (send, import, onboard) with validated Continue and a review step | `WizardDialog` (`Wizard` inline; `chrome="inline"` inside a `WorkspaceWindow` or other host that is already the dialog) — don't hand-roll Back / Continue / Finish around `StageProgress`; each step's `validate` returns its error messages, future steps stay locked until valid, each step's `summary` drives the review |
156
177
  | Rich-text template with `${field}` placeholders | `Editor mergeFields={…}` — not a `Select` + caret tracking + dialog beside it; use its `label` / `helperText` / `errorMessage` |
157
178
  | A PDF behind auth, shown inline | `PdfViewer getBlob={…}` — the toolbar's Open / Download then work with the token, so don't add your own buttons |
179
+ | Data grid | `Table` — defaults to `variant="studio"` (flat small-caps header, one row rule, the select slot resting on the row number, status as a pill). Pass `variant="classic"` for the banded header and per-column rules; don't restyle the header or rows by hand |
158
180
  | Toolbar: search · filters · active-filter chips · count · actions | `FilterBar` (`search`, children, `activeFilters` + `onRemoveFilter`/`onClearAll`, `summary`, `actions`) |
159
181
  | Read-only label/value grid (record details, key facts) | `DescriptionList` (`items`, `columns`, `layout="inline"` for a side panel, `copyable`, `isLoading`) |
160
182
  | Settings row (title + description left, control right) | `SettingRow` inside a `SettingsSection` (`isDanger` for the danger zone, `action` for a header-right button) |
@@ -177,6 +199,23 @@ sections are `Card` with the title in `header`.
177
199
  scrim `Box`. `Loading` is the older API and stays on the heavier house scrim by default; pass
178
200
  `variant="dim"` to route it through `Backdrop`, or just use `Backdrop` directly.
179
201
 
202
+ ### Parts you reach for through their parent
203
+
204
+ These are root exports, but each belongs to a parent component; start from the parent unless a row
205
+ here says otherwise.
206
+
207
+ | Part | Belongs to | Use it for |
208
+ | --- | --- | --- |
209
+ | `DrawerHeader` · `DrawerBody` · `DrawerFooter` | `Drawer` | the only children a `Drawer` renders; style props go straight on each slot. For a create / edit form use `FormDrawer` instead |
210
+ | `ProfileCardHeader` · `ProfileCardBody` · `ProfileCardFooter` | `ProfileCard` | the only children a `ProfileCard` renders; any other sibling is dropped |
211
+ | `StageItem` | `StageProgress` | one chevron, bar or pill stage; `StageProgress` renders it, so don't lay stages out by hand |
212
+ | `FilePreviewTrigger` | `FilePreview` | a thumbnail button that opens one file in a modal; for several attachments use `MediaViewer` |
213
+ | `MediaScrubber` · `MediaStatusPanel` · `MediaDocumentStage` | `MediaViewer` | building a custom media UI: a `role="slider"` seek bar (`onSeek`), the no-preview / error panel (`tone="warning"` for errors), and the document stage driven by a `resolveDocument` you supply |
214
+ | `LazyWrapper` | `React.lazy` | a `Suspense` boundary with the themed spinner; pass `fallback` to replace it |
215
+ | `ScrollbarBox` | any scrolling region | a themed scroll container; give it an `aria-label`, because it is a keyboard stop while it scrolls |
216
+ | `AppearanceSettings` | a settings page | the theme, colour-mode and font-size controls in one panel; brand and font size are controlled, the colour-mode switch reads the theme context |
217
+ | `ApexPolarChart` | `ApexPieChart` | independent magnitudes as wedges of equal angle and varying radius; values that add to a whole belong in `ApexPieChart` |
218
+
180
219
  ### Navigation shell
181
220
 
182
221
  `SideBar` is the rail, `NavigationBar` the top bar, `NavLauncher` the full-height "go anywhere" panel.
@@ -236,7 +275,8 @@ hides its primary; when only one section is empty on a populated page, that sect
236
275
  `Menu`…) come from `pixelize-design-library` too. Anything the library owns a component for
237
276
  (`Tabs`, `Accordion`, `Modal`, `Card`, `Select`, `TextInput`, `Skeletons`…) has no Chakra
238
277
  passthrough at all — the owned component is the only one.
239
- - Reaching for `SelectV2`, `SearchSelect`, `SelectSearch` in new work — all `@deprecated`.
278
+ - Reaching for `SelectV2` (`@deprecated`), `SearchSelect` or `SelectSearch` (not deprecated, but not the
279
+ preferred picker) in new work.
240
280
  One picker now: `Select` (`native={false}` for the themed, searchable, multi popup).
241
281
  `Dropdown` is the exception — it is an action menu, not a picker, and is not replaced.
242
282
  - A card inside a card; a border on a content `Card` (it is borderless by default), or any resting