pixelize-design-library 2.4.2-beta.60 → 2.4.2-beta.62

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 (527) hide show
  1. package/CHANGELOG.md +191 -10
  2. package/COMPONENT-GOTCHAS.md +160 -5
  3. package/DESIGN-GUIDE.md +9 -1
  4. package/dist/Components/Accordion/Accordion.js +2 -2
  5. package/dist/Components/AddressCard/AddressCard.js +2 -1
  6. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -1
  7. package/dist/Components/AppSwitcher/AppSwitcher.js +1 -1
  8. package/dist/Components/AppearanceSettings/AppearanceSettings.js +1 -1
  9. package/dist/Components/AudioRecorder/AudioRecorder.js +2 -1
  10. package/dist/Components/Avatar/Avatar.d.ts +2 -1
  11. package/dist/Components/Avatar/Avatar.js +5 -3
  12. package/dist/Components/Backdrop/Backdrop.js +1 -1
  13. package/dist/Components/BagBar/BagBar.js +2 -1
  14. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +1 -1
  15. package/dist/Components/CalendarGrid/CalendarGrid.js +5 -5
  16. package/dist/Components/CalendarGrid/calendarMath.js +18 -6
  17. package/dist/Components/Card/PaymentCard/PaymentCard.js +6 -5
  18. package/dist/Components/CartItem/CartItem.js +2 -1
  19. package/dist/Components/Checkbox/Checkbox.d.ts +18 -3
  20. package/dist/Components/Checkbox/Checkbox.js +9 -7
  21. package/dist/Components/CheckoutKit/selectable.js +1 -1
  22. package/dist/Components/ChoiceCard/ChoiceCard.d.ts +3 -0
  23. package/dist/Components/ChoiceCard/ChoiceCard.js +16 -0
  24. package/dist/Components/ChoiceCard/ChoiceCardGroup.d.ts +3 -0
  25. package/dist/Components/ChoiceCard/ChoiceCardGroup.js +6 -0
  26. package/dist/Components/ChoiceCard/ChoiceCardProps.d.ts +28 -0
  27. package/dist/Components/ChoiceCard/ChoiceCardProps.js +2 -0
  28. package/dist/Components/CircularProgress/CircularProgress.js +4 -8
  29. package/dist/Components/CircularProgress/CircularProgressProps.d.ts +5 -3
  30. package/dist/Components/CircularProgress/arc.d.ts +9 -1
  31. package/dist/Components/CircularProgress/arc.js +15 -1
  32. package/dist/Components/Common/FormLabel.js +1 -1
  33. package/dist/Components/Common/FormattedDescription.js +1 -1
  34. package/dist/Components/Common/HelperText.d.ts +5 -4
  35. package/dist/Components/Common/HelperText.js +10 -7
  36. package/dist/Components/Common/fieldStyles.d.ts +4 -4
  37. package/dist/Components/Common/fieldStyles.js +2 -1
  38. package/dist/Components/ContactForm/ContactForm.js +1 -1
  39. package/dist/Components/CopyButton/CopyButton.js +12 -5
  40. package/dist/Components/CouponField/CouponField.js +4 -3
  41. package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +18 -0
  42. package/dist/Components/CustomModulesTable/EditModuleModal.js +1 -1
  43. package/dist/Components/DatePicker/CalendarPanel.js +2 -2
  44. package/dist/Components/DatePicker/DatePicker.js +8 -2
  45. package/dist/Components/DatePicker/RangeDatePicker.d.ts +9 -3
  46. package/dist/Components/DatePicker/RangeDatePicker.js +6 -5
  47. package/dist/Components/DatePicker/SingleDatePicker.d.ts +9 -5
  48. package/dist/Components/DatePicker/SingleDatePicker.js +7 -4
  49. package/dist/Components/DatePicker/ThemeDatePicker.d.ts +8 -4
  50. package/dist/Components/DatePicker/ThemeDatePicker.js +9 -6
  51. package/dist/Components/DatePicker/TimeOnlyPicker.d.ts +9 -5
  52. package/dist/Components/DatePicker/TimeOnlyPicker.js +6 -4
  53. package/dist/Components/DatePicker/TimePickerInput.d.ts +2 -2
  54. package/dist/Components/DatePicker/TimePickerInput.js +6 -5
  55. package/dist/Components/DescriptionList/DescriptionList.d.ts +1 -1
  56. package/dist/Components/DescriptionList/DescriptionList.js +3 -3
  57. package/dist/Components/DescriptionList/DescriptionListProps.d.ts +3 -3
  58. package/dist/Components/Dropdown/DropDown.js +12 -4
  59. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -1
  60. package/dist/Components/EmptyState/EmptyState.js +2 -2
  61. package/dist/Components/EmptyState/EmptyStateProps.d.ts +3 -3
  62. package/dist/Components/FileUpload/FileUpload.js +21 -15
  63. package/dist/Components/FileUpload/useObjectUrl.d.ts +1 -0
  64. package/dist/Components/FileUpload/useObjectUrl.js +14 -0
  65. package/dist/Components/FileUploader/FileUploader.js +9 -3
  66. package/dist/Components/FileUploader/FileUploaderProps.d.ts +8 -0
  67. package/dist/Components/FilterBar/FilterBar.d.ts +1 -1
  68. package/dist/Components/FilterBar/FilterBar.js +2 -2
  69. package/dist/Components/FilterBar/FilterBarProps.d.ts +3 -3
  70. package/dist/Components/FilterSidebar/FilterSidebar.js +10 -6
  71. package/dist/Components/Form/FormWrapper.js +1 -1
  72. package/dist/Components/FormField/FormField.d.ts +3 -0
  73. package/dist/Components/FormField/FormField.js +57 -0
  74. package/dist/Components/FormField/FormFieldProps.d.ts +33 -0
  75. package/dist/Components/FormField/FormFieldProps.js +2 -0
  76. package/dist/Components/Header/HeaderActions.js +2 -2
  77. package/dist/Components/Header/components/mobileMenu.js +1 -1
  78. package/dist/Components/IconButton/IconButton.d.ts +5 -0
  79. package/dist/Components/IconButton/IconButton.js +24 -0
  80. package/dist/Components/IconButton/IconButtonProps.d.ts +10 -0
  81. package/dist/Components/IconButton/IconButtonProps.js +2 -0
  82. package/dist/Components/Input/PhoneNumberInput.js +14 -0
  83. package/dist/Components/Input/PhoneNumberInputProps.d.ts +1 -0
  84. package/dist/Components/KanbanBoard/AccountCard.js +3 -2
  85. package/dist/Components/KanbanBoard/AccountRow.js +1 -1
  86. package/dist/Components/KanbanBoard/KanbanBoard.js +56 -39
  87. package/dist/Components/KanbanBoard/MeasuredItem.js +6 -14
  88. package/dist/Components/KanbanBoard/boardStore.d.ts +8 -0
  89. package/dist/Components/KanbanBoard/boardStore.js +27 -0
  90. package/dist/Components/Kbd/Kbd.js +1 -1
  91. package/dist/Components/LimitReachedModal/LimitReachedModal.js +1 -1
  92. package/dist/Components/Loading/Loading.js +1 -1
  93. package/dist/Components/MediaGallery/MediaGallery.js +1 -1
  94. package/dist/Components/MediaGallery/MediaLightbox.js +2 -1
  95. package/dist/Components/MediaGallery/glass.js +2 -1
  96. package/dist/Components/MediaViewer/MediaViewer.js +1 -1
  97. package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +7 -7
  98. package/dist/Components/MediaViewer/components/MediaImageViewer.js +1 -1
  99. package/dist/Components/MediaViewer/components/MediaScrubber.js +5 -1
  100. package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +7 -7
  101. package/dist/Components/MediaViewer/components/PlaybackTimeline.d.ts +20 -0
  102. package/dist/Components/MediaViewer/components/PlaybackTimeline.js +47 -0
  103. package/dist/Components/MediaViewer/components/TileChip.js +1 -1
  104. package/dist/Components/Modal/Modal.js +1 -1
  105. package/dist/Components/MoreItems/MoreItems.js +2 -2
  106. package/dist/Components/NavLauncher/LauncherTabs.d.ts +18 -0
  107. package/dist/Components/NavLauncher/LauncherTabs.js +64 -0
  108. package/dist/Components/NavLauncher/NavLauncher.d.ts +1 -1
  109. package/dist/Components/NavLauncher/NavLauncher.js +203 -53
  110. package/dist/Components/NavLauncher/NavLauncherProps.d.ts +23 -4
  111. package/dist/Components/NavLauncher/NewTabLink.d.ts +2 -2
  112. package/dist/Components/NavLauncher/NewTabLink.js +7 -3
  113. package/dist/Components/NavLauncher/launcherParts.d.ts +4 -1
  114. package/dist/Components/NavLauncher/launcherParts.js +16 -8
  115. package/dist/Components/NavLauncher/resultNavigation.d.ts +3 -0
  116. package/dist/Components/NavLauncher/resultNavigation.js +65 -0
  117. package/dist/Components/NavLauncher/revealStyles.d.ts +1 -1
  118. package/dist/Components/NavLauncher/revealStyles.js +2 -2
  119. package/dist/Components/NavigationBar/NavigationBar.js +3 -2
  120. package/dist/Components/NavigationBar/NavigationBarProps.d.ts +1 -0
  121. package/dist/Components/NoteTextArea/NoteTextArea.js +18 -4
  122. package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +12 -0
  123. package/dist/Components/Notification/Notification.js +17 -3
  124. package/dist/Components/Notification/NotificationProps.d.ts +17 -1
  125. package/dist/Components/NotificationBell/NotificationBell.js +5 -1
  126. package/dist/Components/NotificationBell/NotificationItem.js +1 -1
  127. package/dist/Components/NotificationBell/NotificationList.js +1 -1
  128. package/dist/Components/OffersList/OffersList.js +2 -1
  129. package/dist/Components/OptionChip/OptionChip.js +3 -2
  130. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  131. package/dist/Components/OrderSummary/OrderSummary.js +5 -5
  132. package/dist/Components/OrgSwitcher/OrgSwitcher.js +18 -6
  133. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +4 -0
  134. package/dist/Components/OrganizationDetails/OrganizationDetails.js +7 -1
  135. package/dist/Components/PageHeader/PageHeader.d.ts +1 -1
  136. package/dist/Components/PageHeader/PageHeader.js +2 -2
  137. package/dist/Components/PageHeader/PageHeaderProps.d.ts +3 -3
  138. package/dist/Components/Pagination/Pagination.d.ts +5 -0
  139. package/dist/Components/Pagination/Pagination.js +48 -0
  140. package/dist/Components/Pagination/PaginationProps.d.ts +46 -0
  141. package/dist/Components/Pagination/PaginationProps.js +9 -0
  142. package/dist/Components/Pagination/pageWindow.d.ts +4 -0
  143. package/dist/Components/Pagination/pageWindow.js +22 -0
  144. package/dist/Components/PaymentOption/PaymentOption.js +1 -1
  145. package/dist/Components/PersonChip/PersonChip.js +2 -2
  146. package/dist/Components/PinInput/PinInput.d.ts +1 -1
  147. package/dist/Components/PinInput/PinInput.js +17 -2
  148. package/dist/Components/PinInput/PinInputProps.d.ts +9 -1
  149. package/dist/Components/PincodeChecker/PincodeChecker.js +4 -4
  150. package/dist/Components/PlanPill/PlanPill.js +2 -1
  151. package/dist/Components/PriceBlock/PriceBlock.js +3 -3
  152. package/dist/Components/Primitives/Primitives.d.ts +2 -2
  153. package/dist/Components/Primitives/Primitives.js +2 -3
  154. package/dist/Components/ProductBadges/ProductBadges.js +2 -1
  155. package/dist/Components/ProductCard/ProductCard.js +1 -1
  156. package/dist/Components/ProductCard/ProductCardAction.js +2 -2
  157. package/dist/Components/ProductCard/ProductCardSwatches.js +2 -1
  158. package/dist/Components/ProductCard/cardMetrics.d.ts +1 -1
  159. package/dist/Components/ProductCard/cardMetrics.js +5 -1
  160. package/dist/Components/ProfileCard/ProfileCardProps.d.ts +11 -0
  161. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +3 -2
  162. package/dist/Components/QuantityStepper/QuantityStepper.js +2 -1
  163. package/dist/Components/RadioButton/RadioButton.d.ts +11 -2
  164. package/dist/Components/RadioButton/RadioButton.js +9 -6
  165. package/dist/Components/RangeSlider/RangeSlider.js +3 -3
  166. package/dist/Components/Rating/Rating.js +2 -1
  167. package/dist/Components/Reorder/Reorder.js +3 -2
  168. package/dist/Components/ReviewList/ReviewList.js +3 -3
  169. package/dist/Components/ReviewSummary/ReviewSummary.js +3 -3
  170. package/dist/Components/SaveBar/SaveBar.d.ts +1 -1
  171. package/dist/Components/SaveBar/SaveBar.js +2 -2
  172. package/dist/Components/SaveBar/SaveBarProps.d.ts +3 -3
  173. package/dist/Components/Search/Search.js +2 -9
  174. package/dist/Components/Search/ctrlShortcut.d.ts +1 -0
  175. package/dist/Components/Search/ctrlShortcut.js +29 -0
  176. package/dist/Components/SearchSelect/SearchSelect.js +117 -30
  177. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +8 -2
  178. package/dist/Components/SegmentedControl/SegmentedControl.js +9 -5
  179. package/dist/Components/Select/SelectPopup.js +6 -4
  180. package/dist/Components/SelectSearch/SelectSearch.js +5 -4
  181. package/dist/Components/SettingRow/SettingRow.js +1 -1
  182. package/dist/Components/SideBar/SecondaryBar.js +2 -1
  183. package/dist/Components/SideBar/SideBar.js +82 -21
  184. package/dist/Components/SideBar/components/MenuItemBox.d.ts +2 -2
  185. package/dist/Components/SideBar/components/MenuItemBox.js +4 -3
  186. package/dist/Components/SideBar/components/MenuItems.d.ts +2 -2
  187. package/dist/Components/SideBar/components/MenuItems.js +3 -3
  188. package/dist/Components/SideBar/components/OtherApps.js +5 -1
  189. package/dist/Components/SideBar/components/OverflowTooltipText.js +4 -5
  190. package/dist/Components/SideBar/components/PinnedSection.js +2 -2
  191. package/dist/Components/SideBar/components/TextTruncation.js +11 -6
  192. package/dist/Components/SideBar/sidebarScale.d.ts +1 -1
  193. package/dist/Components/SideBar/sidebarScale.js +2 -1
  194. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +8 -0
  195. package/dist/Components/Skeletons/SkeletonProps.d.ts +5 -2
  196. package/dist/Components/Skeletons/Skeletons.d.ts +1 -1
  197. package/dist/Components/Skeletons/Skeletons.js +4 -2
  198. package/dist/Components/SkipLink/SkipLink.d.ts +4 -0
  199. package/dist/Components/SkipLink/SkipLink.js +54 -0
  200. package/dist/Components/SkipLink/SkipLinkProps.d.ts +8 -0
  201. package/dist/Components/SkipLink/SkipLinkProps.js +2 -0
  202. package/dist/Components/Slider/Slider.d.ts +2 -2
  203. package/dist/Components/Slider/Slider.js +11 -4
  204. package/dist/Components/SpecTable/SpecTable.js +2 -1
  205. package/dist/Components/StageProgress/StageItem.js +2 -5
  206. package/dist/Components/StageProgress/StageProgress.js +2 -1
  207. package/dist/Components/StageProgress/StageProgressProps.d.ts +1 -1
  208. package/dist/Components/StageProgress/StepperStage.js +2 -6
  209. package/dist/Components/StageProgress/centerInStrip.d.ts +2 -0
  210. package/dist/Components/StageProgress/centerInStrip.js +15 -0
  211. package/dist/Components/StatCard/StatCard.d.ts +1 -1
  212. package/dist/Components/StatCard/StatCard.js +5 -4
  213. package/dist/Components/StatCard/StatCardProps.d.ts +3 -3
  214. package/dist/Components/StickyBuyBar/StickyBuyBar.js +1 -1
  215. package/dist/Components/Table/components/TableActions.js +40 -24
  216. package/dist/Components/Table/components/TableBody.js +25 -40
  217. package/dist/Components/Table/components/rowMeasurer.d.ts +8 -0
  218. package/dist/Components/Table/components/rowMeasurer.js +71 -0
  219. package/dist/Components/Table/filters/TableFilters.js +2 -13
  220. package/dist/Components/Table/hooks/useTable.js +12 -9
  221. package/dist/Components/Tabs/components/CountBadge.js +3 -3
  222. package/dist/Components/Tabs/components/Tab.d.ts +2 -1
  223. package/dist/Components/Tabs/components/Tab.js +4 -3
  224. package/dist/Components/Tabs/components/TabList.js +16 -1
  225. package/dist/Components/Tag/Tag.d.ts +2 -2
  226. package/dist/Components/Tag/Tag.js +15 -12
  227. package/dist/Components/Tag/Tag.styles.js +6 -4
  228. package/dist/Components/TagInput/TagInput.d.ts +3 -0
  229. package/dist/Components/TagInput/TagInput.js +99 -0
  230. package/dist/Components/TagInput/TagInputProps.d.ts +46 -0
  231. package/dist/Components/TagInput/TagInputProps.js +2 -0
  232. package/dist/Components/TagInput/tagEntries.d.ts +15 -0
  233. package/dist/Components/TagInput/tagEntries.js +45 -0
  234. package/dist/Components/TimePicker/TimePicker.d.ts +3 -0
  235. package/dist/Components/TimePicker/TimePicker.js +50 -0
  236. package/dist/Components/TimePicker/TimePickerProps.d.ts +44 -0
  237. package/dist/Components/TimePicker/TimePickerProps.js +2 -0
  238. package/dist/Components/TimePicker/timeParts.d.ts +10 -0
  239. package/dist/Components/TimePicker/timeParts.js +36 -0
  240. package/dist/Components/Timeline/Timeline.js +11 -9
  241. package/dist/Components/Toaster/Toaster.js +2 -1
  242. package/dist/Components/Toggle/TableToggle.js +4 -3
  243. package/dist/Components/ToggleSwitch/ToggleSwitch.d.ts +3 -2
  244. package/dist/Components/ToggleSwitch/ToggleSwitch.js +6 -5
  245. package/dist/Components/ToolTip/ToolTip.js +86 -8
  246. package/dist/Components/UpgradeButton/UpgradeButton.js +4 -2
  247. package/dist/Components/UserDetails/UserDetails.js +7 -1
  248. package/dist/Components/VisuallyHidden/VisuallyHidden.d.ts +15 -0
  249. package/dist/Components/VisuallyHidden/VisuallyHidden.js +21 -0
  250. package/dist/Components/VisuallyHidden/VisuallyHiddenProps.d.ts +3 -0
  251. package/dist/Components/VisuallyHidden/VisuallyHiddenProps.js +2 -0
  252. package/dist/Components/WizardDialog/WizardDialog.js +10 -5
  253. package/dist/Components/WizardDialog/WizardDialogProps.d.ts +4 -0
  254. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +5 -1
  255. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +15 -2
  256. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +2 -1
  257. package/dist/Hooks/sharedResizeObserver.d.ts +6 -0
  258. package/dist/Hooks/sharedResizeObserver.js +77 -0
  259. package/dist/Hooks/useIsTruncated.js +3 -4
  260. package/dist/Theme/chakra/Menu.styles.d.ts +1 -1
  261. package/dist/Theme/chakra/common.web.d.ts +1 -0
  262. package/dist/Theme/chakra/componentStyles.d.ts +1 -1
  263. package/dist/Theme/chakra/createBrandTheme.d.ts +3 -0
  264. package/dist/Theme/chakra/createBrandTheme.js +34 -4
  265. package/dist/Theme/chakra/focusRing.styles.d.ts +2 -0
  266. package/dist/Theme/chakra/focusRing.styles.js +5 -1
  267. package/dist/Theme/chakra/fonts.web.d.ts +2 -0
  268. package/dist/Theme/chakra/motion.d.ts +14 -0
  269. package/dist/Theme/chakra/motion.js +26 -1
  270. package/dist/Theme/index.d.ts +2 -1
  271. package/dist/Theme/index.js +12 -9
  272. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +4 -1
  273. package/dist/Theme/provider/PixelizeThemeProvider.js +21 -12
  274. package/dist/Theme/provider/ThemeSwitcher.js +3 -2
  275. package/dist/Theme/themeProps.d.ts +3 -0
  276. package/dist/Theme/tokens/brands/emerald/palette.dark.js +2 -1
  277. package/dist/Theme/tokens/brands/index.d.ts +1 -1
  278. package/dist/Theme/tokens/brands/index.js +14 -13
  279. package/dist/Theme/tokens/brands/lavender/palette.dark.js +2 -1
  280. package/dist/Theme/tokens/brands/meadow/palette.dark.js +2 -1
  281. package/dist/Theme/tokens/brands/radiant/palette.dark.js +2 -1
  282. package/dist/Theme/tokens/brands/rosewood/palette.dark.js +2 -1
  283. package/dist/Theme/tokens/brands/skyline/palette.dark.js +2 -1
  284. package/dist/Theme/tokens/brands/slate/palette.dark.js +2 -1
  285. package/dist/Theme/tokens/brands/storefront/palette.dark.js +2 -1
  286. package/dist/Theme/tokens/brands/zinc/palette.dark.js +28 -24
  287. package/dist/Theme/tokens/builders/color.js +11 -7
  288. package/dist/Theme/tokens/builders/filledSurface.d.ts +3 -1
  289. package/dist/Theme/tokens/builders/filledSurface.js +7 -7
  290. package/dist/Theme/tokens/builders/lazy.d.ts +5 -0
  291. package/dist/Theme/tokens/builders/lazy.js +55 -0
  292. package/dist/Theme/tokens/builders/memo.d.ts +9 -0
  293. package/dist/Theme/tokens/builders/memo.js +28 -0
  294. package/dist/Theme/tokens/builders/memoByReads.d.ts +2 -0
  295. package/dist/Theme/tokens/builders/memoByReads.js +50 -0
  296. package/dist/Theme/tokens/builders/outlineRung.js +10 -2
  297. package/dist/Theme/tokens/builders/tone.js +5 -4
  298. package/dist/Theme/tokens/primitives/borderWidths.d.ts +6 -0
  299. package/dist/Theme/tokens/primitives/borderWidths.js +5 -0
  300. package/dist/Theme/tokens/primitives/index.d.ts +8 -3
  301. package/dist/Theme/tokens/primitives/index.js +8 -1
  302. package/dist/Theme/tokens/primitives/motion.d.ts +25 -2
  303. package/dist/Theme/tokens/primitives/motion.js +23 -5
  304. package/dist/Theme/tokens/primitives/optionRowSizes.d.ts +1 -1
  305. package/dist/Theme/tokens/primitives/optionRowSizes.js +2 -1
  306. package/dist/Theme/tokens/primitives/radii.d.ts +15 -0
  307. package/dist/Theme/tokens/primitives/radii.js +14 -0
  308. package/dist/Theme/tokens/primitives/shadows.d.ts +5 -1
  309. package/dist/Theme/tokens/primitives/shadows.js +5 -1
  310. package/dist/Theme/tokens/primitives/states.d.ts +1 -0
  311. package/dist/Theme/tokens/primitives/states.js +4 -0
  312. package/dist/Theme/tokens/primitives/typography.d.ts +17 -0
  313. package/dist/Theme/tokens/primitives/typography.js +21 -1
  314. package/dist/Theme/tokens/primitives/zIndices.d.ts +1 -0
  315. package/dist/Theme/tokens/primitives/zIndices.js +1 -0
  316. package/dist/Utils/formatDate.d.ts +25 -0
  317. package/dist/Utils/formatDate.js +144 -0
  318. package/dist/esm/Components/Accordion/Accordion.js +2 -2
  319. package/dist/esm/Components/AddressCard/AddressCard.js +2 -1
  320. package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -1
  321. package/dist/esm/Components/AppSwitcher/AppSwitcher.js +1 -1
  322. package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +1 -1
  323. package/dist/esm/Components/AudioRecorder/AudioRecorder.js +2 -1
  324. package/dist/esm/Components/Avatar/Avatar.js +6 -4
  325. package/dist/esm/Components/Backdrop/Backdrop.js +1 -1
  326. package/dist/esm/Components/BagBar/BagBar.js +2 -1
  327. package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +1 -1
  328. package/dist/esm/Components/CalendarGrid/CalendarGrid.js +6 -6
  329. package/dist/esm/Components/CalendarGrid/calendarMath.js +18 -6
  330. package/dist/esm/Components/Card/PaymentCard/PaymentCard.js +6 -5
  331. package/dist/esm/Components/CartItem/CartItem.js +2 -1
  332. package/dist/esm/Components/Checkbox/Checkbox.js +8 -5
  333. package/dist/esm/Components/CheckoutKit/selectable.js +1 -1
  334. package/dist/esm/Components/ChoiceCard/ChoiceCard.js +14 -0
  335. package/dist/esm/Components/ChoiceCard/ChoiceCardGroup.js +4 -0
  336. package/dist/esm/Components/ChoiceCard/ChoiceCardProps.js +1 -0
  337. package/dist/esm/Components/CircularProgress/CircularProgress.js +5 -9
  338. package/dist/esm/Components/CircularProgress/arc.js +13 -0
  339. package/dist/esm/Components/Common/FormLabel.js +1 -1
  340. package/dist/esm/Components/Common/FormattedDescription.js +1 -1
  341. package/dist/esm/Components/Common/HelperText.js +11 -8
  342. package/dist/esm/Components/Common/fieldStyles.js +2 -1
  343. package/dist/esm/Components/ContactForm/ContactForm.js +1 -1
  344. package/dist/esm/Components/CopyButton/CopyButton.js +14 -7
  345. package/dist/esm/Components/CouponField/CouponField.js +4 -3
  346. package/dist/esm/Components/CustomModulesTable/EditModuleModal.js +1 -1
  347. package/dist/esm/Components/DatePicker/CalendarPanel.js +2 -2
  348. package/dist/esm/Components/DatePicker/DatePicker.js +8 -2
  349. package/dist/esm/Components/DatePicker/RangeDatePicker.js +8 -6
  350. package/dist/esm/Components/DatePicker/SingleDatePicker.js +7 -4
  351. package/dist/esm/Components/DatePicker/ThemeDatePicker.js +7 -4
  352. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +5 -3
  353. package/dist/esm/Components/DatePicker/TimePickerInput.js +8 -6
  354. package/dist/esm/Components/DescriptionList/DescriptionList.js +3 -3
  355. package/dist/esm/Components/Dropdown/DropDown.js +12 -4
  356. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -1
  357. package/dist/esm/Components/EmptyState/EmptyState.js +2 -2
  358. package/dist/esm/Components/FileUpload/FileUpload.js +21 -15
  359. package/dist/esm/Components/FileUpload/useObjectUrl.js +10 -0
  360. package/dist/esm/Components/FileUploader/FileUploader.js +9 -3
  361. package/dist/esm/Components/FilterBar/FilterBar.js +2 -2
  362. package/dist/esm/Components/FilterSidebar/FilterSidebar.js +10 -6
  363. package/dist/esm/Components/Form/FormWrapper.js +1 -1
  364. package/dist/esm/Components/FormField/FormField.js +52 -0
  365. package/dist/esm/Components/FormField/FormFieldProps.js +1 -0
  366. package/dist/esm/Components/Header/HeaderActions.js +2 -2
  367. package/dist/esm/Components/Header/components/mobileMenu.js +1 -1
  368. package/dist/esm/Components/IconButton/IconButton.js +21 -0
  369. package/dist/esm/Components/IconButton/IconButtonProps.js +1 -0
  370. package/dist/esm/Components/Input/PhoneNumberInput.js +15 -1
  371. package/dist/esm/Components/KanbanBoard/AccountCard.js +3 -2
  372. package/dist/esm/Components/KanbanBoard/AccountRow.js +1 -1
  373. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +56 -39
  374. package/dist/esm/Components/KanbanBoard/MeasuredItem.js +6 -14
  375. package/dist/esm/Components/KanbanBoard/boardStore.js +22 -0
  376. package/dist/esm/Components/Kbd/Kbd.js +1 -1
  377. package/dist/esm/Components/LimitReachedModal/LimitReachedModal.js +1 -1
  378. package/dist/esm/Components/Loading/Loading.js +1 -1
  379. package/dist/esm/Components/MediaGallery/MediaGallery.js +2 -2
  380. package/dist/esm/Components/MediaGallery/MediaLightbox.js +2 -1
  381. package/dist/esm/Components/MediaGallery/glass.js +2 -1
  382. package/dist/esm/Components/MediaViewer/MediaViewer.js +1 -1
  383. package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +7 -7
  384. package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +1 -1
  385. package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +5 -1
  386. package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +7 -7
  387. package/dist/esm/Components/MediaViewer/components/PlaybackTimeline.js +38 -0
  388. package/dist/esm/Components/MediaViewer/components/TileChip.js +1 -1
  389. package/dist/esm/Components/Modal/Modal.js +1 -1
  390. package/dist/esm/Components/MoreItems/MoreItems.js +2 -2
  391. package/dist/esm/Components/NavLauncher/LauncherTabs.js +58 -0
  392. package/dist/esm/Components/NavLauncher/NavLauncher.js +204 -54
  393. package/dist/esm/Components/NavLauncher/NewTabLink.js +4 -3
  394. package/dist/esm/Components/NavLauncher/launcherParts.js +15 -8
  395. package/dist/esm/Components/NavLauncher/resultNavigation.js +61 -0
  396. package/dist/esm/Components/NavLauncher/revealStyles.js +2 -2
  397. package/dist/esm/Components/NavigationBar/NavigationBar.js +3 -2
  398. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +18 -4
  399. package/dist/esm/Components/Notification/Notification.js +17 -3
  400. package/dist/esm/Components/NotificationBell/NotificationBell.js +2 -1
  401. package/dist/esm/Components/NotificationBell/NotificationItem.js +1 -1
  402. package/dist/esm/Components/NotificationBell/NotificationList.js +1 -1
  403. package/dist/esm/Components/OffersList/OffersList.js +2 -1
  404. package/dist/esm/Components/OptionChip/OptionChip.js +3 -2
  405. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  406. package/dist/esm/Components/OrderSummary/OrderSummary.js +5 -5
  407. package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +16 -7
  408. package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +7 -1
  409. package/dist/esm/Components/PageHeader/PageHeader.js +2 -2
  410. package/dist/esm/Components/Pagination/Pagination.js +42 -0
  411. package/dist/esm/Components/Pagination/PaginationProps.js +6 -0
  412. package/dist/esm/Components/Pagination/pageWindow.js +16 -0
  413. package/dist/esm/Components/PaymentOption/PaymentOption.js +1 -1
  414. package/dist/esm/Components/PersonChip/PersonChip.js +2 -2
  415. package/dist/esm/Components/PinInput/PinInput.js +14 -2
  416. package/dist/esm/Components/PincodeChecker/PincodeChecker.js +4 -4
  417. package/dist/esm/Components/PlanPill/PlanPill.js +2 -1
  418. package/dist/esm/Components/PriceBlock/PriceBlock.js +3 -3
  419. package/dist/esm/Components/Primitives/Primitives.js +1 -1
  420. package/dist/esm/Components/ProductBadges/ProductBadges.js +2 -1
  421. package/dist/esm/Components/ProductCard/ProductCard.js +1 -1
  422. package/dist/esm/Components/ProductCard/ProductCardAction.js +3 -3
  423. package/dist/esm/Components/ProductCard/ProductCardSwatches.js +2 -1
  424. package/dist/esm/Components/ProductCard/cardMetrics.js +2 -1
  425. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +3 -2
  426. package/dist/esm/Components/QuantityStepper/QuantityStepper.js +2 -1
  427. package/dist/esm/Components/RadioButton/RadioButton.js +7 -4
  428. package/dist/esm/Components/RangeSlider/RangeSlider.js +3 -3
  429. package/dist/esm/Components/Rating/Rating.js +2 -1
  430. package/dist/esm/Components/Reorder/Reorder.js +3 -2
  431. package/dist/esm/Components/ReviewList/ReviewList.js +3 -3
  432. package/dist/esm/Components/ReviewSummary/ReviewSummary.js +3 -3
  433. package/dist/esm/Components/SaveBar/SaveBar.js +2 -2
  434. package/dist/esm/Components/Search/Search.js +2 -9
  435. package/dist/esm/Components/Search/ctrlShortcut.js +25 -0
  436. package/dist/esm/Components/SearchSelect/SearchSelect.js +120 -33
  437. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +11 -6
  438. package/dist/esm/Components/Select/SelectPopup.js +6 -4
  439. package/dist/esm/Components/SelectSearch/SelectSearch.js +5 -4
  440. package/dist/esm/Components/SettingRow/SettingRow.js +1 -1
  441. package/dist/esm/Components/SideBar/SecondaryBar.js +2 -1
  442. package/dist/esm/Components/SideBar/SideBar.js +83 -22
  443. package/dist/esm/Components/SideBar/components/MenuItemBox.js +4 -3
  444. package/dist/esm/Components/SideBar/components/MenuItems.js +4 -4
  445. package/dist/esm/Components/SideBar/components/OtherApps.js +2 -1
  446. package/dist/esm/Components/SideBar/components/OverflowTooltipText.js +4 -5
  447. package/dist/esm/Components/SideBar/components/PinnedSection.js +2 -2
  448. package/dist/esm/Components/SideBar/components/TextTruncation.js +9 -7
  449. package/dist/esm/Components/SideBar/sidebarScale.js +2 -1
  450. package/dist/esm/Components/Skeletons/Skeletons.js +4 -2
  451. package/dist/esm/Components/SkipLink/SkipLink.js +50 -0
  452. package/dist/esm/Components/SkipLink/SkipLinkProps.js +1 -0
  453. package/dist/esm/Components/Slider/Slider.js +11 -4
  454. package/dist/esm/Components/SpecTable/SpecTable.js +2 -1
  455. package/dist/esm/Components/StageProgress/StageItem.js +2 -5
  456. package/dist/esm/Components/StageProgress/StageProgress.js +2 -1
  457. package/dist/esm/Components/StageProgress/StepperStage.js +2 -6
  458. package/dist/esm/Components/StageProgress/centerInStrip.js +11 -0
  459. package/dist/esm/Components/StatCard/StatCard.js +5 -4
  460. package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +2 -2
  461. package/dist/esm/Components/Table/components/TableActions.js +42 -26
  462. package/dist/esm/Components/Table/components/TableBody.js +25 -40
  463. package/dist/esm/Components/Table/components/rowMeasurer.js +66 -0
  464. package/dist/esm/Components/Table/filters/TableFilters.js +3 -14
  465. package/dist/esm/Components/Table/hooks/useTable.js +12 -9
  466. package/dist/esm/Components/Tabs/components/CountBadge.js +3 -3
  467. package/dist/esm/Components/Tabs/components/Tab.js +5 -4
  468. package/dist/esm/Components/Tabs/components/TabList.js +16 -1
  469. package/dist/esm/Components/Tag/Tag.js +11 -8
  470. package/dist/esm/Components/Tag/Tag.styles.js +6 -4
  471. package/dist/esm/Components/TagInput/TagInput.js +94 -0
  472. package/dist/esm/Components/TagInput/TagInputProps.js +1 -0
  473. package/dist/esm/Components/TagInput/tagEntries.js +39 -0
  474. package/dist/esm/Components/TimePicker/TimePicker.js +45 -0
  475. package/dist/esm/Components/TimePicker/TimePickerProps.js +1 -0
  476. package/dist/esm/Components/TimePicker/timeParts.js +26 -0
  477. package/dist/esm/Components/Timeline/Timeline.js +11 -9
  478. package/dist/esm/Components/Toaster/Toaster.js +2 -1
  479. package/dist/esm/Components/Toggle/TableToggle.js +4 -3
  480. package/dist/esm/Components/ToggleSwitch/ToggleSwitch.js +7 -5
  481. package/dist/esm/Components/ToolTip/ToolTip.js +89 -11
  482. package/dist/esm/Components/UpgradeButton/UpgradeButton.js +4 -2
  483. package/dist/esm/Components/UserDetails/UserDetails.js +7 -1
  484. package/dist/esm/Components/VisuallyHidden/VisuallyHidden.js +18 -0
  485. package/dist/esm/Components/VisuallyHidden/VisuallyHiddenProps.js +1 -0
  486. package/dist/esm/Components/WizardDialog/WizardDialog.js +11 -6
  487. package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +2 -1
  488. package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +13 -3
  489. package/dist/esm/Hooks/sharedResizeObserver.js +73 -0
  490. package/dist/esm/Hooks/useIsTruncated.js +3 -4
  491. package/dist/esm/Theme/chakra/createBrandTheme.js +34 -4
  492. package/dist/esm/Theme/chakra/focusRing.styles.js +3 -0
  493. package/dist/esm/Theme/chakra/motion.js +25 -0
  494. package/dist/esm/Theme/index.js +12 -9
  495. package/dist/esm/Theme/provider/PixelizeThemeProvider.js +22 -13
  496. package/dist/esm/Theme/provider/ThemeSwitcher.js +3 -2
  497. package/dist/esm/Theme/tokens/brands/emerald/palette.dark.js +2 -1
  498. package/dist/esm/Theme/tokens/brands/index.js +14 -13
  499. package/dist/esm/Theme/tokens/brands/lavender/palette.dark.js +2 -1
  500. package/dist/esm/Theme/tokens/brands/meadow/palette.dark.js +2 -1
  501. package/dist/esm/Theme/tokens/brands/radiant/palette.dark.js +2 -1
  502. package/dist/esm/Theme/tokens/brands/rosewood/palette.dark.js +2 -1
  503. package/dist/esm/Theme/tokens/brands/skyline/palette.dark.js +2 -1
  504. package/dist/esm/Theme/tokens/brands/slate/palette.dark.js +2 -1
  505. package/dist/esm/Theme/tokens/brands/storefront/palette.dark.js +2 -1
  506. package/dist/esm/Theme/tokens/brands/zinc/palette.dark.js +28 -24
  507. package/dist/esm/Theme/tokens/builders/color.js +10 -6
  508. package/dist/esm/Theme/tokens/builders/filledSurface.js +7 -7
  509. package/dist/esm/Theme/tokens/builders/lazy.js +49 -0
  510. package/dist/esm/Theme/tokens/builders/memo.js +21 -0
  511. package/dist/esm/Theme/tokens/builders/memoByReads.js +46 -0
  512. package/dist/esm/Theme/tokens/builders/outlineRung.js +10 -2
  513. package/dist/esm/Theme/tokens/builders/tone.js +5 -4
  514. package/dist/esm/Theme/tokens/primitives/borderWidths.js +2 -0
  515. package/dist/esm/Theme/tokens/primitives/index.js +5 -3
  516. package/dist/esm/Theme/tokens/primitives/motion.js +20 -4
  517. package/dist/esm/Theme/tokens/primitives/optionRowSizes.js +2 -1
  518. package/dist/esm/Theme/tokens/primitives/radii.js +13 -0
  519. package/dist/esm/Theme/tokens/primitives/shadows.js +3 -1
  520. package/dist/esm/Theme/tokens/primitives/states.js +1 -0
  521. package/dist/esm/Theme/tokens/primitives/typography.js +20 -0
  522. package/dist/esm/Theme/tokens/primitives/zIndices.js +1 -0
  523. package/dist/esm/Utils/formatDate.js +138 -0
  524. package/dist/esm/index.js +18 -2
  525. package/dist/index.d.ts +34 -5
  526. package/dist/index.js +47 -4
  527. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -18,30 +18,109 @@ next major.
18
18
 
19
19
  ### Added
20
20
 
21
+ - **`formatDate` / `formatDateTime` / `formatDateRange`**: Intl-based date text, en-IN by default ("09 Oct 2026"),
22
+ with `locale`, `timeZone`, `year: "never"`, `time: "12h" | "24h"` and a `fallback` (default "—") for null or
23
+ invalid input instead of "Invalid Date". A bare `YYYY-MM-DD` is that calendar day in every zone; ranges write a
24
+ shared month and year once. Output is the same across browser and Node ICU versions (no "Sept", no thin or
25
+ narrow spaces).
26
+ - **`TimePicker`**: inline hour, minute and AM/PM selects as a field (label, required, error, helper), with
27
+ `use24Hour`, `minuteStep`, `baseDate` and `name`. Same look as DatePicker's time selects. `TimePickerProps` now
28
+ describes this component; the old `date`, `dateFormat` and `disabled` fields still type-check as deprecated
29
+ aliases.
30
+ - **`TagInput`**: free-text chips. Enter or comma adds, Backspace removes the last, a pasted list splits on commas
31
+ and new lines; optional `validate`, `maxTags` and `allowDuplicates`. Same look as `MultiSelect`, without its
32
+ email lock.
33
+ - **`IconButton`** is now owned: it renders exactly what the Chakra `IconButton` rendered (same props, theme,
34
+ sizes `xs 24 · sm 32 · md 40 · lg 48 · xl 56`, `isLoading` keeps the box) and, in development, warns once per
35
+ mount when it has neither `aria-label` nor `aria-labelledby`. `aria-label` is optional in its type.
36
+ - **`FormField`**: label, required asterisk, helper text and error message around any one control. A single
37
+ child element receives `id`, `aria-labelledby`, `aria-describedby`, `aria-invalid` and `aria-required`, or pass
38
+ a function that places them on a composite. `TextInput` inside inherits the error and required state.
39
+ `layout="horizontal"` puts the label in a `labelWidth` column (default 12rem) from `md` up. Root attributes
40
+ and `ref` land on the root `div`.
41
+ - **`VisuallyHidden`**: text for screen readers only, pinned to the viewport so a hidden live region can never
42
+ extend a scrolled page. It takes `as`, `ref`, every attribute and style prop.
43
+ - **`SkipLink`**: a "Skip to main content" link that paints nothing until keyboard focus, then shows top-left on
44
+ the `skipLink` layer. Activating it focuses `#targetId` (default `main-content`) without changing the URL hash.
45
+ - **`Pagination`**: standalone, controlled page navigation. Numbered pages collapse behind ellipses (first
46
+ and last always show, `siblingCount` defaults to 1), with previous and next buttons and an optional
47
+ rows-per-page picker (`pageSizeOptions` + `pageSize` + `onPageSizeChange`). `page` is 1-based; the count
48
+ comes from `pageCount` or from `totalItems` + `pageSize`. `size` follows the Button scale, `isDisabled`
49
+ disables the pager, `labels` overrides the names. It renders a named `nav` of real buttons and the
50
+ current page carries `aria-current="page"`. `Table` keeps its own pager unchanged.
51
+ - **`ChoiceCard` / `ChoiceCardGroup`**: radio cards for picking one of a few options that each need a line of
52
+ explanation. Group: `value` / `defaultValue` / `onValueChange`; card: `label`, `description`, `icon`,
53
+ `disabled`. One tab stop; arrows, Home and End move focus and selection. Same look as `PaymentOption`.
54
+ - **Plain HTML attributes on the page primitives**: `PageHeader`, `StatCard`, `SaveBar`, `EmptyState`,
55
+ `DescriptionList`, `FilterBar` and `Skeletons` pass `id`, `className`, `style`, `data-*`, `aria-*` and
56
+ event handlers to their root element; the component's own props still win and Chakra style props are
57
+ still not accepted.
58
+ - **`ref` forwarding**: `Checkbox`, `RadioButton`, `ToggleSwitch` and `DatePicker` (single, range and time,
59
+ including the deep-imported `SingleDatePicker` / `RangeDatePicker` / `TimeOnlyPicker`) forward to their
60
+ native `<input>`; `SegmentedControl` to its `role="radiogroup"` root; `Tab` to its `role="tab"` button;
61
+ `Avatar` and `Tag` to their root element.
62
+ - **`PinInput` `error`, `errorMessage`, `helperText` and `isDisabled`**: the message renders under the
63
+ cells and every digit gets `aria-invalid` / `aria-describedby`.
64
+ - **`WizardDialog` / `Wizard` `finishDisabled` and `finishBlockedReason`**: disable Finish on the last
65
+ step (a pending upload, say) and show why beside it; the reason is Finish's `aria-describedby`.
66
+ Back and the stepper keep working; nothing changes when they are not passed.
67
+ - **`CircularProgress` `size` takes a px number** (clamped to 24..160) as well as `sm | md | lg`; stroke
68
+ and label scale with it (`CircularProgressDiameter` type). The presets render exactly as before.
69
+ - **Token foundation** (web premium/perf campaign; nothing changes on screen until you use them):
70
+ `RADIUS_ROLE` (radius by surface role), `BORDER_WIDTHS` (px hairline), `DISABLED_OPACITY` (0.5),
71
+ `NUMERIC_TEXT` (tabular figures), `zIndices.popoverNested` (1510), `fontSizes["xs-minus"]` (11px) and
72
+ `fontSizes["xs-plus"]` (13px), and `TEXT_STYLES` bound as Chakra `textStyles` (`title`, `heading`,
73
+ `subheading`, `body`, `ui`, `label`, `caption`, `overline`). Motion: `MOTION_MS.enter` / `.exit`
74
+ (200ms), `MOTION_BEZIER`, `MOTION_EASE_OUT`, `MOTION_EASE_IN`, `MOTION_LOOP_MS`, `motionTransition()`;
75
+ `transitionFor` takes an optional curve. `shadowsFor(mode)` returns the shadow ramp a theme carries.
76
+ Opt-in `reducedMotion="global"` on `PixelizeThemeProvider` and `createBrandTheme` adds one
77
+ document-wide `prefers-reduced-motion` rule; `pz-motion-keep` (`MOTION_KEEP_CLASS`) opts an element out.
78
+ The default is unchanged. `CustomThemeProps` gains `zIndices.popoverNested` and the two font sizes, so
79
+ code that hand-builds a full `CustomThemeProps` needs those keys.
21
80
  - **HRMS library requests** — a navigation launcher, key caps, a merge-field `Editor`, a wizard and
22
81
  smaller gaps found by the HRMS migration:
23
82
  - `NavLauncher` — full-height navigation launcher (browse modules, pins, Frequent, Recent, search
24
83
  with actions and remote groups, optional suite-apps section below `md`), with `PinToggle`,
25
84
  `NewTabLink`, `searchLauncher`, `searchLauncherSections` (sectioned search: modules, then their
26
85
  screens, keyword-only hits get a `· keyword` hint) and `flattenScreens`. The pin control is a
27
- star, shown with the ↗ link on row hover/focus only (always on touch); pinned rail items are tiles. It binds no global chord. `LauncherTrigger`
86
+ star, shown with the ↗ link on row hover/focus only (always on touch); pinned rail items are tiles. It never opens itself or binds a global chord (Cmd/Ctrl+K and `/` only refocus its field while it is open). `LauncherTrigger`
28
87
  is the chip (10px radius, 36px, accent ink, one ⌘K hint) that opens an app-owned launcher (`aria-haspopup="dialog"`, `aria-expanded`,
29
88
  `aria-keyshortcuts`); `display="icon"` is a 36px icon-only variant for a nav bar's `moreIcon`
30
89
  (label is the accessible name, tooltip "Menu (⌘K)"). Types: `NavLauncherProps`, `LauncherScreen`, `LauncherModule`,
31
90
  `LauncherSection`, `LauncherSearchItem`, `LauncherLabels` and friends, `LauncherTriggerProps`.
32
- `NavLauncher` follows canvas `Launcher.dc.html`: stacked sections with "(n)" counts and a 1/2/3-column
33
- grid, a "Quick access" rail of `clamp(20rem, 30%, 26rem)` in a panel whose `maxWidth` defaults to
34
- 1080px (Pinned tiles, Frequently visited, Recent), "Pins follow your account" footer. The footer's
35
- key hints are key caps (ENTER, ⌘ ENTER / CTRL ENTER, ESC, four arrows) and are hidden on touch devices. New optional props `frequentLimit`, `suggestions` (no-results chips), `searchHint`,
91
+ `NavLauncher` follows canvas `Launcher.dc.html`: from `lg` up, stacked sections with "(n)" counts and a
92
+ 1/2/3-column grid beside a "Quick access" rail of `clamp(20rem, 30%, 26rem)` in a panel whose `maxWidth`
93
+ defaults to 1080px (Pinned tiles, Frequently visited, Recent). Below `lg` (phone and tablet) the body is a
94
+ Menu / Quick access / Apps tab bar (labels `tabsLabel`, `tabMenu`, `tabQuickAccess`, `tabApps`; Apps follows
95
+ `appsVisibility`) above one scrolling panel with only the selected panel mounted, rows are 44px, and search
96
+ keeps the stacked results plus rail with no tab bar. The header is the search field (fills the row; 44px at
97
+ `md`+, 40px below, 16px type), a muted live result count (`labels.resultsCount`, with a separate polite
98
+ announcement), optional `headerActions` (an app's own icon button) and close; there is no "Menu" pill and
99
+ `labels.title` names the dialog and the results list. "Pins follow your account" footer; its key hints
100
+ are key caps (arrows, ENTER, ⌘ ENTER / CTRL ENTER, ⌘ + click, P, ESC) and are hidden on touch devices
101
+ (`labels.hintClickNewTab`; the ↗ link's tooltip is `labels.newTabTip`, `NewTabLink` takes `tip`). New optional props `frequentLimit`, `suggestions` (no-results chips), `searchHint`,
36
102
  `LauncherModule.isNew`, and labels `quickAccess`, `newBadge`, `screens`, `pinShort`, `footerNote`,
37
103
  `suggestionsHint`, `found`, `pinTip`, `unpinTip`. The rail landmark is named "Quick access".
38
- Keyboard: ←/→ and ↑/↓ are grid-aware (row-major, ↑/↓ cross sections), and `P` pins or unpins the
39
- focused item (never while typing); ArrowUp from the first item returns to the search field and
40
- pinned tiles are a 2-column grid. The keyboard-active row highlights as a whole (soft fill plus
104
+ Keyboard: in the field, the first result is active as soon as there is a query, ↑/↓ follow the
105
+ visual rows of the result grid, → at the end of the text enters the grid and ←/→/Home/End then move
106
+ through results until the query changes, and PageUp/PageDown page; Esc clears the query first and
107
+ closes only when it is empty; Cmd/Ctrl+K and `/` focus the field. In lists ←/→ and ↑/↓ are grid-aware
108
+ (row-major, ↑/↓ cross sections), Home/End/PageUp/PageDown work, `P` pins or unpins the focused item
109
+ (never while typing) and typing anywhere else in the launcher refocuses the field; ArrowUp from the
110
+ first item returns to the search field (or the selected tab) and pinned tiles are a 2-column grid
111
+ (3 in the tablet Quick access tab). The keyboard-active row highlights as a whole (soft fill plus
41
112
  one 1px inset ring, at least 3:1), the whole row is the link target (Cmd/middle-click opens a new
42
113
  tab), and truncated titles, rail rows, pinned tiles, app names and search rows show a tooltip with
43
- the full text. New optional `openShortcutHint` (e.g. "⌘K or /", app-owned),
44
- labels `hintOpenMenu` and `hintPin`; hint label defaults are lowercase and follow the canvas order.
114
+ the full text. New label `hintPin`; hint label defaults are lowercase and follow the canvas order.
115
+ `LauncherLabels` gained required keys (`hintClickNewTab`, `newTabTip`, `resultsCount`, `tabsLabel`,
116
+ `tabMenu`, `tabQuickAccess`, `tabApps`): a consumer that types a full `LauncherLabels` object needs
117
+ them, while the `labels` prop (`Partial<LauncherLabels>`) is unaffected. Consumer tests: below `lg`
118
+ the Quick access and Apps sections are behind their tabs, and the dialog's accessible name now comes
119
+ from a visually hidden "Menu" heading.
120
+ - `OrgSwitcher` `display` (`"full"` default | `"avatar"` | `"auto"`) — `"avatar"` is a 36px avatar plus
121
+ chevron trigger whose accessible name is `Switch organization, <name>` with the name in a tooltip;
122
+ `"auto"` is avatar below `md` and full from `md` up. Types `OrgSwitcherProps`, `OrgSwitcherSize` and
123
+ `OrgSwitcherDisplay` are now exported from the package root.
45
124
  - `Kbd` / `KbdShortcut` — a key cap and a chord (`mod+k` renders ⌘ K or Ctrl K), in the
46
125
  `AppSwitcher` notation. `Search` and `AppSwitcher` render their shortcut hints with `Kbd`.
47
126
  - `NavigationBar` `leading` — a slot between the sidebar toggle/back button and the title, outside
@@ -185,6 +264,52 @@ next major.
185
264
 
186
265
  ### Changed
187
266
 
267
+ - **Performance, no visual change** (web premium/perf campaign):
268
+ - Theme colour math is memoised (`resolveFilledSurface`, `liftToContrast`, `softenToContrast`,
269
+ `resolveSoftTone`, luminance) in bounded, content-keyed caches: the hot calls are 5-20x faster and
270
+ restyling 50 `Button`s and 50 `Checkbox`es dropped from about 1.4 ms to 0.15 ms.
271
+ - Brand palettes (`lightPalettes`, `darkPalettes`, `palettes`, `<brand>Dark`) and the eight
272
+ non-default light themes are built on first read instead of at import; keys, key order, values and
273
+ object identity are unchanged, and importing the theme module is about 2x faster. The `ThemeSwitcher`
274
+ brand picker no longer builds every brand's Chakra theme when it mounts.
275
+ - Themes from `createBrandTheme` cache each component style function's output per theme, keyed on the
276
+ props that function reads: output is identical and style resolution per component render is about 2x
277
+ faster.
278
+ - Switching light/dark no longer blocks: the switcher repaints first and the app re-themes in an
279
+ interruptible render. Document `color-scheme`, `data-mode` and the `--color-*` variables follow the
280
+ new palette together, never ahead of it. `PixelizeThemeProvider` memoises its Chakra subtree, so the urgent
281
+ half of a switch re-renders only the switcher.
282
+ - `KanbanBoard` adopts a new `data` prop during render instead of in an effect, so a board whose data
283
+ follows the theme renders once per theme flip instead of twice.
284
+ - `Table`: passing an equal `columns` array again no longer re-renders every visible row; column
285
+ search popovers and row action menus mount their popover only while open (closed rows register no
286
+ global listeners); virtualised rows are measured through one shared `ResizeObserver` with no forced
287
+ layout read on mount.
288
+ - `ToolTip` mounts Chakra's tooltip only after the first hover or focus of its trigger; until then
289
+ (and while disabled or without a label) it renders just the child, with no document listeners.
290
+ - `SideBar`: the swipe-to-close drag no longer re-renders the sidebar or creates a CSS rule per
291
+ pointer move; row labels share one `ResizeObserver` and pause measuring while the rail width
292
+ animates, and their tooltips arm on first use. `useIsTruncated` uses a single shared
293
+ `ResizeObserver`; its signature is unchanged.
294
+ - `SearchSelect` option rows are memoised, so hovering, ArrowDown and toggling an option re-render only
295
+ the rows whose state changed (300 options: 300 row renders per hover to 1-2), and the menu's
296
+ scroll-driven position is an inline style instead of a new Emotion class per position.
297
+ - `KanbanBoard`: hovering a column and expanding a card no longer re-render the whole board (4 x 30
298
+ board, hover sweep: 960 card renders to 0); virtualized cards share one `ResizeObserver`.
299
+ - `Search` instances share one window `keydown` listener for Ctrl+K (it was one per instance);
300
+ with several on a page the last mounted still takes focus.
301
+ - `Dropdown` and `SelectSearch` add their outside-click `document` listener only while open, so closed
302
+ instances cost nothing on every page click.
303
+ - `MediaVideoPlayer` and `MediaAudioPlayer` no longer re-render the whole player on each `timeupdate`;
304
+ only the scrubber and the time readout update.
305
+ - `RangeSlider`, `MediaImageViewer` (pan/zoom), `FilterSidebar` (range slider), the media scrubber and
306
+ the `Dropdown` menu position apply per-frame values as inline styles, so dragging, panning and
307
+ scrolling no longer insert a CSS rule per value (40 slider moves used to leave 160 rules behind).
308
+ - `Notification` and `UpgradeButton`: the card and dismiss control transition named properties instead
309
+ of `all` (same 0.2s ease), and both drop their transitions, the shimmer sweep and the hover lift under
310
+ `prefers-reduced-motion`.
311
+ - `CalendarGrid` reuses `Intl.DateTimeFormat` instances per locale and options (was about 70 per
312
+ month render). `Toaster` cards no longer hold a permanent `will-change` layer.
188
313
  - **`PageHeader` `actionsLayout` defaults to `"auto"`**: at `md` and up the actions wrap below the
189
314
  title when they do not fit (before, they squeezed the title). Identical whenever title and
190
315
  actions fit on one row; pass `actionsLayout="inline"` for the old behaviour.
@@ -250,6 +375,55 @@ next major.
250
375
 
251
376
  ### Fixed
252
377
 
378
+ - **Field helper text no longer leaves a dangling `<id>-helptext` in `aria-describedby`** when a field with an
379
+ explicit `id` sits inside a consumer `FormControl` (`TextInput` and every field rendering
380
+ `FieldMessage`/`HelperText`).
381
+ - **`SearchSelect` and `Select` (`native={false}`) multi rows**: the decorative checkbox is no longer a focusable,
382
+ unnamed control nested in the option; the row's `role="option"` with `aria-selected` is the single accessible
383
+ control. No visual change.
384
+ - **`SearchSelect`'s open listbox and `Select`'s popup dialog have an accessible name**, from `label`, then
385
+ `aria-label`, then `placeholder`.
386
+ - **`WorkspaceWindow`'s dialog is named by its visible title**; while a window is open the page behind it is
387
+ `aria-hidden`, as for any modal.
388
+ - **`CustomModulesTable`'s edit-module field is named** by `labels.moduleNamePlaceholder`.
389
+ - **`StageProgress` no longer scrolls the page when it mounts**: the active stage was revealed with
390
+ `scrollIntoView`, which also scrolled every ancestor, so a tracker below the fold pulled the page down
391
+ to it. The active stage is now centred inside the stage strip only (`scrollActiveIntoView` still
392
+ turns that off).
393
+ - **`Tabs` no longer scrolls the page when it mounts**: the selected tab was revealed with
394
+ `scrollIntoView`, which also scrolled every scrolling ancestor, so a page with tabs below the fold
395
+ jumped to them on load. The first reveal now scrolls only the tab list; later focus and selection
396
+ moves behave as before.
397
+ - **The legacy `DatePicker` behind Table's filter pane opens from the keyboard**: Enter or ArrowDown on the
398
+ focused field opens the calendar (it was mouse-only).
399
+ - **Keyboard access for click-only elements** (WCAG 2.1.1): `NoteTextArea` (the collapsed placeholder and
400
+ the attach control, now a named button "Attach files"), `Notification` (the title when `onClick` is
401
+ passed; the dismiss control is announced as "Dismiss notification"), `OrganizationDetails` ("Set as
402
+ Default"), `UserDetails` (member rows, the selected one marked `aria-current`), `FileUploader` (the drop
403
+ target opens the picker from the keyboard; it was the only way to add files), `KanbanBoard` (both
404
+ add-column affordances) and the `SearchSelect` `insideSelect` prefix and menu (Enter/Space, arrow
405
+ keys, Home/End, Escape). Each takes Tab, activates on Enter and Space, and shows the library focus
406
+ ring on keyboard focus only; resting looks are unchanged.
407
+ - **`ProductCard` no longer throws "Rendered more hooks than during the previous render"** when `isLoading`
408
+ goes from `true` to `false` (a hook sat below the loading early return).
409
+ - **`KanbanBoard` no longer logs React's "Cannot update during an existing state transition"** when a
410
+ card is expanded in a virtualized column.
411
+ - **`PhoneNumberInput` follows a changed `value`.** It used to read `value` once on mount; a form reset
412
+ or a loaded record now updates the field, and a leading dial code (the `onChange` shape) is stripped,
413
+ so echoing `onChange` back into `value` is safe.
414
+ - **`CopyButton variant="menu-item"` is keyboard-operable** (focusable, Enter and Space copy, focus
415
+ ring), and every variant announces the copied label through a polite live region.
416
+ - **`Slider` no longer auto-advances while hovered or focused, nor under reduced motion** (WCAG 2.2.2);
417
+ the slide transition is instant under reduced motion. The default interval is unchanged.
418
+ - **`FileUpload` no longer leaks a blob URL per image thumbnail per render.** Each file gets one URL,
419
+ revoked when the file is removed or the component unmounts.
420
+ - **`Table` column search shows the current search when reopened**, instead of stale text.
421
+ - **`NavigationBar` right cluster no longer overflows onto the avatar at phone widths.** The title
422
+ truncates first (overflow-only tooltip when it is a string); the `moreIcon` cluster can shrink, while
423
+ the sidebar toggle, back button and avatar menu never do. (HRMS, beta.60 launcher trigger overflow)
424
+ - **`OrgSwitcher` trigger shrinks and its menu fits the screen.** The full trigger truncates its label
425
+ (avatar and chevron are kept) when its container is short, and the menu panel is capped at
426
+ `100vw - 32px`, so a long org name no longer causes horizontal page scroll on phones.
253
427
  - **`NavLauncher` keyboard and link fixes.** Arrow keys, typing and Backspace were dead on rail and
254
428
  apps rows while a search was active; Enter could throw when results shrank; Enter during IME
255
429
  composition opened a result; removing the focused row (e.g. an app dropped from `apps`) dropped
@@ -491,6 +665,13 @@ next major.
491
665
 
492
666
  Nothing is removed yet — each of these still ships its full implementation.
493
667
 
668
+ - `UploadedFile.type` (FileUploader) — never set; read the extension from `name`.
669
+ - `ProfileCard` `color` — no visual effect; Card styles never read a colour scheme.
670
+ - `NotificationData.status` — never read; the status dot colour comes from `dueDate`/`endDate`.
671
+ - `CustomModulesTableLabels.loading` — never rendered; the loading state shows skeleton bars only.
672
+ - `WorkspaceWindow` `onMedium` and `onMaximize` — never called; the window has no such controls.
673
+ - `NavLauncher` `openShortcutHint` and `LauncherLabels.hintOpenMenu` — no longer rendered (the launcher
674
+ is already open when its footer shows); bind the open chord in the app only.
494
675
  - `SelectV2` — use `Select` with `native={false}`; it is already a thin wrapper over it.
495
676
  - `SearchSelect`, `SelectSearch` are **no longer `@deprecated`.** Both now say "prefer `Select`
496
677
  for new work" instead: `@deprecated` claimed a migration that loses real capabilities
@@ -157,7 +157,8 @@ visible at the call site, or declare the handler with both parameters. Grep for
157
157
 
158
158
  ### `Slider` is an image carousel, not a numeric range input
159
159
 
160
- `Slider` auto-advances a set of images/content on a timer — no numeric value, min/max, or step. The
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
162
  range-input slider is a separate component named `RangeSlider`, because this library's `Slider`
162
163
  already owns the name. `RangeSlider` used to be a Chakra passthrough on the `Primitives` barrel; it
163
164
  is now the library's own themed component, with a real dual-thumb mode and a `marks` prop.
@@ -319,6 +320,53 @@ not enough when the overlay sits inside a transition wrapper — the wrapper kee
319
320
 
320
321
  ## Known gotchas (silent failures)
321
322
 
323
+ ### `withTheme` mounts a full provider stack per wrapped instance
324
+
325
+ Each wrapped component gets its own `ChakraProvider` (CSS reset, global styles, CSS variables), `ToasterProvider` and `ColorModeScript`. Wrap the app root once with `PixelizeThemeProvider`; never wrap list items or repeated rows.
326
+
327
+ ### `SearchSelect` with `insideSelect` shows a second `role="listbox"` while open
328
+
329
+ A test that finds the main dropdown with `getByRole("listbox")` must now pick it by id (`<id>-listbox`).
330
+
331
+ ### `ChoiceCardGroup`'s children must be `ChoiceCard` elements, and the prop is `disabled`
332
+
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.
337
+
338
+ ### `Pagination` never resets `page` for you
339
+
340
+ An out-of-range `page` (a filter shrank the result) is displayed clamped but never reported, and changing
341
+ rows per page does not reset `page` either. Reset it yourself, in `onPageSizeChange` and when the filters change.
342
+
343
+ ### Four components with a behaviour their props do not hint at
344
+
345
+ - `WorkspaceTrayPreview` `onOpenChange(false)` also fires when the pointer leaves before the card ever opened; track your own open state from `true`.
346
+ - `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".
347
+ - `NoteTextArea` checks `maxNoteWordCount` against the title only until the note is next edited, so a long title can be saved; `handleCancel` always receives `false`.
348
+ - `VerifyEmailOtp` fields set `autocomplete="off"`, so browser or OS one-time-code autofill never offers the code.
349
+
350
+ ### Where `ref` lands, and what does not take one
351
+
352
+ `Checkbox`, `RadioButton`, `ToggleSwitch` and `DatePicker` (every mode) forward to the native `<input>`.
353
+ `SegmentedControl` forwards to the radiogroup `<div>`, not a segment; `Tab` to its tab `<button>` (`Tabs`
354
+ itself takes no ref); `Avatar` to the outer box; `Tag` to its root, which is a `<button>` only for
355
+ `display="dot"` with `onTagClick`, so type that ref as `HTMLElement`. `PinInput`, `FileUpload`,
356
+ `SettingRow` and `Tabs` do not forward a ref.
357
+
358
+ ### Root attributes on the page primitives, and `Skeletons` props that are ignored
359
+
360
+ `PageHeader`, `StatCard`, `SaveBar`, `EmptyState`, `DescriptionList`, `FilterBar` and `Skeletons` put
361
+ `className`, `style`, `id`, `data-*` and `aria-*` on their outermost element. `StatCard` applies
362
+ `aria-label` only when `onClick` makes it a button; `DescriptionList`'s loading grid keeps its own
363
+ `aria-label="Loading"`. `Skeletons` still accepts `alignSelf` and `flexShrink` in its type but never
364
+ applies them; wrap it in a `Box` to position it.
365
+
366
+ ### `Table` `HeaderActions` item with `customComponent` and `onClick` is mouse-only unless the custom component is focusable
367
+
368
+ The wrapper is deliberately not a button; make the custom component a button, or the action cannot be reached from the keyboard.
369
+
322
370
  ### Defaults changed in 2.4.2-beta.44 — read this first when upgrading from beta.43
323
371
 
324
372
  | Component | beta.43 → beta.44 | Restore the old look |
@@ -465,6 +513,25 @@ so the two schemes were indistinguishable. It is now `primary`'s hue turned 60°
465
513
  which is near-grey and has almost no hue to turn — use a semantic scheme (`blue`, `teal`, `purple`)
466
514
  there if the two categories must read apart.
467
515
 
516
+ ### Brand palettes and non-default themes are lazy; library style functions may return cached objects
517
+
518
+ Before its first read, a brand palette or a non-default light theme is an object of getters. Reading
519
+ any key turns it into plain data; spread, `Object.keys`, JSON and assignment behave as before, but
520
+ `Object.getOwnPropertyDescriptor` reports an accessor until then. Style functions in a library
521
+ theme's `theme.components` receive props through a tracking Proxy and may return a cached object, so
522
+ never mutate what they return.
523
+
524
+ ### Reduced motion is per component unless the app passes `reducedMotion="global"`
525
+
526
+ The library's own animations honour `prefers-reduced-motion` one component at a time. For one
527
+ document-wide rule, pass `reducedMotion="global"` to `PixelizeThemeProvider` (or `createBrandTheme`);
528
+ transitions and animations then collapse to one near-instant pass. Add `pz-motion-keep`
529
+ (`MOTION_KEEP_CLASS`) to any loop that is essential feedback; Chakra spinners and progress bars are
530
+ kept automatically.
531
+
532
+ A popup opened inside another popup takes `zIndex="popoverNested"` (1510), never `skipLink` (1600).
533
+ `fontSize="xs-plus"` is 13px, the control size; use it instead of a `13px` literal.
534
+
468
535
  ### Your own overlay painted `background[50]` sinks into the dark canvas
469
536
 
470
537
  In dark mode `background[50]` equals the page canvas on 8 of 9 brands. Library dialogs, drawers,
@@ -961,6 +1028,13 @@ only-when-truncated (the opposite of the prop's contract).
961
1028
  **Apply:** give `overflowOnly`/`OverflowToolTip` exactly one real element as `children` (e.g. a
962
1029
  single `Text noOfLines`), never a Fragment or bare text.
963
1030
 
1031
+ ### `ToolTip` mounts Chakra's tooltip only after the first hover or focus
1032
+
1033
+ Until the trigger is hovered or focused (or `isOpen`/`defaultIsOpen` is set), `ToolTip` renders just the
1034
+ child, with no tooltip element and no document listeners. A test that mocks Chakra's `Tooltip` and
1035
+ expects it mounted at render time must hover or focus the trigger first
1036
+ (`fireEvent.pointerEnter(trigger)` or `userEvent.hover`).
1037
+
964
1038
  ### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
965
1039
 
966
1040
  `children` is `@deprecated` and never read — only `title`/`description`/`actions` render. The `onClose` you pass to `showToast` is wired to
@@ -1061,6 +1135,18 @@ reach it.
1061
1135
  **Apply:** don't depend on `onChange` firing for a repeat pick. There's no supported way to attach
1062
1136
  test hooks or a ref to the trigger.
1063
1137
 
1138
+ ### `OrgSwitcher display="full"` still squeezes the navbar title on phones — use `display="auto"`
1139
+
1140
+ Inside a `NavigationBar` `moreIcon` cluster, a full trigger needs about 88px (avatar + chevron) even
1141
+ when its label truncates to nothing, and the title is the first thing to give way. With a long org name
1142
+ the title is invisible on 320-375px bars, and a smaller `maxWidth` does not change that.
1143
+
1144
+ **Apply:** `display="auto"` (avatar + chevron below `md`, full from `md`) or `"avatar"`. In avatar mode
1145
+ the accessible name is `${ariaLabel}, ${org name}` and the name appears in a tooltip that wraps a
1146
+ `span` around the trigger, so don't pass the trigger a ref. `auto` falls back to `"full"` where
1147
+ `matchMedia` is missing (SSR, jsdom). `NavigationBar`'s `moreIcon` root is `min-width: 0`: give your
1148
+ own icon buttons `flexShrink={0}` and let any label truncate.
1149
+
1064
1150
  ### `UpgradeButton`'s gold icon accent silently falls back to the label color on low contrast
1065
1151
 
1066
1152
  The gold accent is only used when it clears AA contrast against both gradient stops; a custom
@@ -1134,6 +1220,9 @@ wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
1134
1220
 
1135
1221
  **Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
1136
1222
 
1223
+ Each image's `previewUrl` is a `blob:` URL that `FileUploader` never revokes. Call
1224
+ `URL.revokeObjectURL` when you drop the entry or unmount. (`FileUpload` revokes its own thumbnail URLs.)
1225
+
1137
1226
  ### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
1138
1227
 
1139
1228
  `RangeDatePicker` never reads `pickerType` — whether time inputs show is controlled entirely by
@@ -1270,7 +1359,8 @@ Each mounted `Search` registers its own `window` Ctrl+K listener, so two on one
1270
1359
  keypress. **Apply:** pass `shortcut={false}` on all but one. `showShortcutHint={false}` only hides
1271
1360
  the hint; the listener stays.
1272
1361
 
1273
- The same applies to a launcher: `NavLauncher` and `LauncherTrigger` bind no chord, and the library
1362
+ The same applies to a launcher: `NavLauncher` and `LauncherTrigger` bind no chord to *open* (once open,
1363
+ the launcher uses Cmd/Ctrl+K and `/` only to refocus its own field), and the library
1274
1364
  reserves `mod+k` for the app's own palette. The app must pass `shortcut={false}` on every page
1275
1365
  `Search`, or claim the chord in capture phase (`keydown` on `window` with `capture: true`) before
1276
1366
  the `Search` listeners see it — otherwise the first mounted `Search` takes Ctrl+K.
@@ -1288,12 +1378,36 @@ the `Search` listeners see it — otherwise the first mounted `Search` takes Ctr
1288
1378
  anchor is an `aria-hidden`, `tabIndex={-1}` overlay (so copy-link and mod-click work) and pin / ↗
1289
1379
  are `aria-hidden` siblings. Screen readers use Enter / mod+Enter. Do not nest links inside the
1290
1380
  option — axe `nested-interactive` fails.
1291
- - **The apps section decides "compact" with `matchMedia("(min-width: 48em)")`** and falls back to
1292
- desktop (hidden) where `matchMedia` is missing (SSR, jsdom). Tests must stub it to see the section.
1293
- - **`P` on a focused NavLauncher row pins it** instead of starting type-ahead; in the search field it types the letter. Rows without a star (Recent, key screens, apps) keep type-ahead.
1381
+ - **The apps section decides "compact" with `matchMedia("(min-width: 48em)")`, the layout with
1382
+ `(min-width: 62em)`** (`lg`). Both fall back to desktop (apps hidden, two panes) where `matchMedia`
1383
+ is missing (SSR, jsdom), so tests must stub both to see the apps section or the tab bar.
1384
+ - **Below `lg` only the selected tab's panel is mounted.** Pinned / Frequently visited / Recent
1385
+ (Quick access tab) and the apps list (Apps tab) are not in the DOM until their tab is clicked; the
1386
+ Quick access tab is omitted when it would be empty, and a single remaining tab hides the bar. The
1387
+ search view is different: no tab bar, stacked results plus the Quick access rail. A phone or tablet
1388
+ consumer test that looks for an app or a pin must click the tab first.
1389
+ - **`P` on a focused NavLauncher row pins it.** Any other printable key pressed on a row, tab or
1390
+ button (not Space, no modifier) is appended to the query and focuses the field; in the field `P`
1391
+ types the letter.
1392
+ - **Esc is handled by the launcher, not the Drawer** (`closeOnEsc` is off): it clears a non-empty
1393
+ query and keeps focus in the field, and closes only when the query is empty. The keydown is stopped inside
1394
+ the launcher, so a consumer `Escape` listener on `document` never sees it.
1395
+ - **`headerActions` text joins the dialog's accessible name** (header content becomes part of it,
1396
+ as the search value already does: "Menu leave"). Use icon-only buttons with an `aria-label`.
1397
+ - **The result count is `aria-hidden`; the announcement is a separate visually hidden `aria-live="polite"`
1398
+ node, deliberately not `role="status"`**, so `getByRole("status")` still matches only the no-results
1399
+ message and the loading skeleton.
1400
+ - **Left/Right/Home/End in the search field edit the caret** until a result has been navigated by
1401
+ arrow/Page keys (→ at the end of the text enters the grid); any change to the query hands them back
1402
+ to the caret. Do not "fix" this by binding them to results.
1294
1403
  - **`NavLauncher` `suggestions` empty falls back to `noResultsHint`** instead of showing chips.
1295
1404
  - **`PinToggle` / `NewTabLink` are opacity 0 until row hover or focus-within**, so a consumer's own row must carry `data-group` (or `role="group"`) to reveal them.
1296
1405
  - **`LauncherLabels.screensGroup` is unused** by search now (sections replaced the flat group); kept so label objects still type-check.
1406
+ - **`LauncherLabels` gained required keys** (`hintClickNewTab`, `newTabTip`, `resultsCount`, `tabsLabel`,
1407
+ `tabMenu`, `tabQuickAccess`, `tabApps`). The `labels` prop is `Partial<LauncherLabels>` and is fine;
1408
+ a consumer that annotates a *full* `LauncherLabels` object fails to compile.
1409
+ - **`openShortcutHint` and `labels.hintOpenMenu` are deprecated no-ops:** the open chord is no longer
1410
+ shown in the footer. Drop them; the footer's hints are arrows, ENTER, ⌘ ENTER, ⌘ + click, P, ESC.
1297
1411
  - **`apps` is data-driven.** Gate by plan by changing the array or setting `locked` / `lockedReason`;
1298
1412
  keep `id`s stable (hues and `key` derive from them), and pass `color` on an app whose mark must not
1299
1413
  shift when siblings are added or removed. Locked rows are not links, not focusable, `aria-disabled`,
@@ -1358,6 +1472,13 @@ It spreads after the built-in `bg`/`_hover` that encode `isExpanded` state — p
1358
1472
  **Apply:** style around the defaults via `customStyles` (merged through `sx`) when the highlight
1359
1473
  must survive.
1360
1474
 
1475
+ ### `Table`: memoise `columns` if users can hide or reorder columns without `savePreferences`
1476
+
1477
+ A new `columns` identity re-applies the column defaults and discards those local changes. Passing an
1478
+ equal array again no longer costs a re-render, but the reset still happens.
1479
+
1480
+ **Apply:** define `columns` at module level or in `useMemo`.
1481
+
1361
1482
  ### `Table`'s `LeftFilterPane` Clear All only re-applies filters in `"sidebar"` mode
1362
1483
 
1363
1484
  `handleClear` calls `onClear` unconditionally, but only calls `onApply(cleared)` when
@@ -1727,3 +1848,37 @@ text. Column widths come from the rendered DOM, never from label length, so sizi
1727
1848
 
1728
1849
  **Apply:** set `labelText` on every node label; put an `isTruncated` `Text` inside the node if it
1729
1850
  can outgrow the column.
1851
+
1852
+ ### `FormField`, `IconButton`, `SkipLink`: what their props do not hint at
1853
+
1854
+ - **`FormField` + library fields:** `TextInput` inherits FormField's `error` and `isRequired` because it checks
1855
+ for a parent `FormControl`. `InputTextArea`, `NumberInput`, `Select`, the date pickers and `PhoneNumberInput`
1856
+ wrap themselves in their own and do **not**: pass `error`/`isRequired` to those directly, and never give a
1857
+ wrapped field its own `label` as well, or it renders two.
1858
+ - **`FormField isRequired` sets native `required` on Chakra-based controls** (as Chakra's `FormControl` does), so
1859
+ the browser blocks an empty submit. Add `noValidate` to the `<form>` if you validate yourself. Native children
1860
+ get `aria-required` only.
1861
+ - **`FormField` children:** pass one element or a function. A Fragment is rendered untouched and gets no wiring.
1862
+ `id` is the control's id (the root takes none); a child's own `id` is adopted when FormField has none.
1863
+ - **`IconButton` warns once per mount in development without `aria-label`/`aria-labelledby`.** `title` does not
1864
+ count. Size the icon yourself (xs 12 · sm 14 · md 16 · lg 18): the button does not resize it.
1865
+ - **`SkipLink`** must be the first focusable element on the page. Its target gains `tabindex="-1"` if it is not
1866
+ focusable, and keeps it. A missing target falls back to the browser's hash jump (and warns in development).
1867
+
1868
+ ### `formatDate`, `TimePicker`, `TagInput`: what their props do not hint at
1869
+
1870
+ - `formatDate` reads a bare `YYYY-MM-DD` as that calendar day, not UTC midnight. Pass a `Date` only when you mean
1871
+ an instant. Epoch *seconds* are not detected: multiply by 1000 first.
1872
+ - `TimePicker` fires `onChange` with a `Date` on the day of `value` (else `baseDate`, else today). It never clears
1873
+ to `null`, so put a Clear action beside it if one is needed.
1874
+ - For free-text chips that are not email addresses use `TagInput`: same look as `MultiSelect`, any text, with
1875
+ your own `validate`.
1876
+
1877
+ ### `Select` / `SearchSelect` multi rows have no checkbox role
1878
+
1879
+ Query rows with `getAllByRole("option")` and check `aria-selected`. The row's checkbox is decorative and no longer
1880
+ exposes `role="checkbox"`, so `getByRole("checkbox")` finds nothing inside the popup.
1881
+
1882
+ ### Page behind an open `WorkspaceWindow` is `aria-hidden`
1883
+
1884
+ While a window is open (not minimized) role queries for background elements need `{ hidden: true }` or a test id.
package/DESIGN-GUIDE.md CHANGED
@@ -180,12 +180,20 @@ scrim `Box`. `Loading` is the older API and stays on the heavier house scrim by
180
180
  unknown, `linkAs` for the router link, and `extraResults` + `isSearching` for remote (entity) results.
181
181
  - Open the launcher with `<NavigationBar leading={<LauncherTrigger onClick isOpen />} />` — never inside
182
182
  `navigationBarText.text`. Neither component binds the chord: the app owns the `mod+k` listener
183
- (capture phase) and passes `shortcut={false}` to any page `Search`.
183
+ (capture phase) and passes `shortcut={false}` to any page `Search`. Bind it to *open* the launcher only:
184
+ once open, the launcher refocuses its own field on Cmd/Ctrl+K and `/`, and shows no open-chord hint
185
+ (`openShortcutHint` is deprecated).
184
186
  - Pins live in the app (server or local). Pass them to `NavLauncher` (`pinnedIds`, `onTogglePin`) *and*
185
187
  to `SideBar pinnedItems` + `onUnpin` so the rail shows what the launcher pinned. Persist collapse with
186
188
  `useSidebarPrefs`, and pass `autoCollapse={false}` if the app, not the rail, decides.
187
189
  - Replacing a 9-dot app switcher in a nav bar: `<LauncherTrigger display="icon" />` (36px) in `moreIcon`;
188
190
  keep the chip variant (`leading`) where there is room.
191
+ - In a phone-width app bar use `<OrgSwitcher display="auto" />` (avatar below `md`) next to the bell,
192
+ `LauncherTrigger display="icon"` and the avatar menu; keep every icon control 36px or less and
193
+ `flexShrink={0}`. The title truncates first.
194
+ - Below `lg` the launcher is a Menu / Quick access / Apps tab bar over one panel (search stays a single
195
+ stacked list), so design for phone and tablet with that structure, not a long scroll. Pass
196
+ `headerActions` for the app's own icon button (help, customise) with an `aria-label`.
189
197
  - Show the suite's apps with `appsVisibility="always"` and drive plan gating by editing `apps` /
190
198
  `locked`.
191
199
  - Show shortcut hints with `KbdShortcut`, never a hand-styled `<kbd>`.
@@ -22,13 +22,13 @@ const Accordion = ({ allowMultiple, allowToggle, index, onChange, reduceMotion,
22
22
  var _a;
23
23
  return ((0, jsx_runtime_1.jsx)(react_2.AccordionItem, { border: "1px solid", borderColor: border, borderRadius: "xl", bg: colors.background[50], boxShadow: "none", mb: 3, overflow: "hidden", _last: { mb: 0 }, ...item.itemProps, sx: (_a = item.customStyles) === null || _a === void 0 ? void 0 : _a.itemStyle, children: ({ isExpanded }) => {
24
24
  var _a, _b, _c;
25
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("h2", { children: (0, jsx_runtime_1.jsxs)(react_2.AccordionButton, { px: 4, py: 3, gap: 3, fontSize: "0.875rem", fontWeight: 600, color: headingColor, bg: isExpanded ? expandedBg : "transparent", transition: (0, motion_1.transitionFor)(["background-color"]), _hover: { bg: isExpanded ? expandedBg : softHover }, _focusVisible: focusRing, ...item.buttonProps, sx: {
25
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("h2", { children: (0, jsx_runtime_1.jsxs)(react_2.AccordionButton, { px: 4, py: 3, gap: 3, fontSize: "sm", fontWeight: 600, color: headingColor, bg: isExpanded ? expandedBg : "transparent", transition: (0, motion_1.transitionFor)(["background-color"]), _hover: { bg: isExpanded ? expandedBg : softHover }, _focusVisible: focusRing, ...item.buttonProps, sx: {
26
26
  ...(0, motion_2.reducedMotionSx)(),
27
27
  ...(_a = item.customStyles) === null || _a === void 0 ? void 0 : _a.buttonStyle,
28
28
  "&:hover": {
29
29
  ...(_b = item.customStyles) === null || _b === void 0 ? void 0 : _b.hoverbuttonStyle,
30
30
  },
31
- }, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", flex: "1", textAlign: "left", children: item.header }), (0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", boxSize: "1.5rem", flexShrink: 0, borderRadius: "lg", color: isExpanded ? colors.accentText : colors.textMuted, bg: isExpanded ? colors.primary.opacity[16] : "transparent", transform: isExpanded ? "rotate(180deg)" : "rotate(0deg)", transition: (0, motion_1.transitionFor)(["transform", "color", "background-color"], "base"), sx: (0, motion_2.reducedMotionSx)(), children: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 16 }) })] }) }), (0, jsx_runtime_1.jsx)(react_2.AccordionPanel, { px: 4, pt: 1, pb: 4, fontSize: "0.875rem", lineHeight: "1.5", color: bodyColor, ...item.panelProps, sx: (_c = item.customStyles) === null || _c === void 0 ? void 0 : _c.panelStyle, children: item.content })] }));
31
+ }, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", flex: "1", textAlign: "left", children: item.header }), (0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", boxSize: "1.5rem", flexShrink: 0, borderRadius: "lg", color: isExpanded ? colors.accentText : colors.textMuted, bg: isExpanded ? colors.primary.opacity[16] : "transparent", transform: isExpanded ? "rotate(180deg)" : "rotate(0deg)", transition: (0, motion_1.transitionFor)(["transform", "color", "background-color"], "base"), sx: (0, motion_2.reducedMotionSx)(), children: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 16 }) })] }) }), (0, jsx_runtime_1.jsx)(react_2.AccordionPanel, { px: 4, pt: 1, pb: 4, fontSize: "sm", lineHeight: "1.5", color: bodyColor, ...item.panelProps, sx: (_c = item.customStyles) === null || _c === void 0 ? void 0 : _c.panelStyle, children: item.content })] }));
32
32
  } }, idx));
33
33
  }) }));
34
34
  };
@@ -7,6 +7,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const react_2 = require("@chakra-ui/react");
9
9
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
10
+ const typography_1 = require("../../Theme/tokens/primitives/typography");
10
11
  const selectable_1 = require("../CheckoutKit/selectable");
11
12
  const Button_1 = __importDefault(require("../Button/Button"));
12
13
  const Tag_1 = __importDefault(require("../Tag/Tag"));
@@ -20,6 +21,6 @@ const AddressCard = ({ value, name, phone, lines, tag, isDefault = false, note,
20
21
  const copy = { ...DEFAULT_LABELS, ...labels };
21
22
  const { isSelected, interactive, inGroup, ringed, props } = (0, selectable_1.useSelectable)({ value, selected, disabled, onSelect });
22
23
  const selectable = inGroup || !!onSelect;
23
- return ((0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", "data-testid": testId, "data-selected": isSelected || undefined, ...(0, selectable_1.selectableSurface)(colors, { selected: isSelected && selectable, disabled, interactive, ringed }), children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { ...props, "data-radio": true, "aria-disabled": selectable && disabled ? true : undefined, "aria-labelledby": props.role ? nameId : undefined, "aria-describedby": props.role ? bodyId : undefined, gap: 3, p: 4, pb: onEdit || onRemove ? 2 : 4, borderRadius: "1rem", cursor: interactive ? "pointer" : "default", outline: "none", align: "flex-start", children: [selectable && ((0, jsx_runtime_1.jsx)(react_2.Box, { mt: 0.5, children: (0, jsx_runtime_1.jsx)(selectable_1.RadioIndicator, { selected: isSelected }) })), (0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", gap: 1, flex: 1, minW: 0, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, wrap: "wrap", children: [(0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", id: nameId, fontSize: "sm", fontWeight: 700, lineHeight: 1.4, color: colors.header[900], children: name }), tag && (0, jsx_runtime_1.jsx)(Tag_1.default, { label: tag, size: "xs", tone: "neutral" }), isDefault && (0, jsx_runtime_1.jsx)(Tag_1.default, { label: copy.default, size: "xs", tone: "neutral" })] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { id: bodyId, children: [lines.map((line) => ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", display: "block", fontSize: "sm", lineHeight: 1.5, color: colors.text[800], children: line }, line))), phone && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", display: "block", mt: 1, fontSize: "xs", lineHeight: 1.4, color: colors.textMuted, sx: { fontVariantNumeric: "tabular-nums" }, children: phone })), note && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", display: "block", mt: 1, fontSize: "xs", lineHeight: 1.4, color: colors.textMuted, children: note }))] })] })] }), (onEdit || onRemove) && ((0, jsx_runtime_1.jsxs)(react_2.Flex, { gap: 1, pl: selectable ? "2.75rem" : 1, pr: 2, pb: 2, children: [onEdit && ((0, jsx_runtime_1.jsx)(Button_1.default, { variant: "ghost", colorScheme: "gray", size: "sm", onClick: onEdit, "aria-label": `${copy.edit} address: ${name}`, children: copy.edit })), onRemove && ((0, jsx_runtime_1.jsx)(Button_1.default, { variant: "ghost", colorScheme: "gray", size: "sm", onClick: onRemove, "aria-label": `${copy.remove} address: ${name}`, children: copy.remove }))] }))] }));
24
+ return ((0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", "data-testid": testId, "data-selected": isSelected || undefined, ...(0, selectable_1.selectableSurface)(colors, { selected: isSelected && selectable, disabled, interactive, ringed }), children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { ...props, "data-radio": true, "aria-disabled": selectable && disabled ? true : undefined, "aria-labelledby": props.role ? nameId : undefined, "aria-describedby": props.role ? bodyId : undefined, gap: 3, p: 4, pb: onEdit || onRemove ? 2 : 4, borderRadius: "2xl", cursor: interactive ? "pointer" : "default", outline: "none", align: "flex-start", children: [selectable && ((0, jsx_runtime_1.jsx)(react_2.Box, { mt: 0.5, children: (0, jsx_runtime_1.jsx)(selectable_1.RadioIndicator, { selected: isSelected }) })), (0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", gap: 1, flex: 1, minW: 0, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, wrap: "wrap", children: [(0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", id: nameId, fontSize: "sm", fontWeight: 700, lineHeight: 1.4, color: colors.header[900], children: name }), tag && (0, jsx_runtime_1.jsx)(Tag_1.default, { label: tag, size: "xs", tone: "neutral" }), isDefault && (0, jsx_runtime_1.jsx)(Tag_1.default, { label: copy.default, size: "xs", tone: "neutral" })] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { id: bodyId, children: [lines.map((line) => ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", display: "block", fontSize: "sm", lineHeight: 1.5, color: colors.text[800], children: line }, line))), phone && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", display: "block", mt: 1, fontSize: "xs", lineHeight: 1.4, color: colors.textMuted, sx: typography_1.NUMERIC_TEXT, children: phone })), note && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", display: "block", mt: 1, fontSize: "xs", lineHeight: 1.4, color: colors.textMuted, children: note }))] })] })] }), (onEdit || onRemove) && ((0, jsx_runtime_1.jsxs)(react_2.Flex, { gap: 1, pl: selectable ? "2.75rem" : 1, pr: 2, pb: 2, children: [onEdit && ((0, jsx_runtime_1.jsx)(Button_1.default, { variant: "ghost", colorScheme: "gray", size: "sm", onClick: onEdit, "aria-label": `${copy.edit} address: ${name}`, children: copy.edit })), onRemove && ((0, jsx_runtime_1.jsx)(Button_1.default, { variant: "ghost", colorScheme: "gray", size: "sm", onClick: onRemove, "aria-label": `${copy.remove} address: ${name}`, children: copy.remove }))] }))] }));
24
25
  };
25
26
  exports.default = AddressCard;
@@ -137,7 +137,7 @@ const ApexLineChart = ({ data, labels, title, height, width, lineColors, titlePo
137
137
  showSeries,
138
138
  palette,
139
139
  ]);
140
- return ((0, jsx_runtime_1.jsxs)("div", { ref: wrapperRef, children: [title && isSmall && ((0, jsx_runtime_1.jsx)(ToolTip_1.default, { label: title, placement: "top", hasArrow: true, fontSize: "0.75rem", isDisabled: !isTruncated, children: (0, jsx_runtime_1.jsx)("div", { ref: titleRef, style: {
140
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: wrapperRef, children: [title && isSmall && ((0, jsx_runtime_1.jsx)(ToolTip_1.default, { label: title, placement: "top", hasArrow: true, fontSize: "xs", isDisabled: !isTruncated, children: (0, jsx_runtime_1.jsx)("div", { ref: titleRef, style: {
141
141
  textAlign: "left",
142
142
  color: resolvedTitleStyle === null || resolvedTitleStyle === void 0 ? void 0 : resolvedTitleStyle.color,
143
143
  fontSize: computedFontSize,
@@ -229,7 +229,7 @@ const AppSwitcher = ({ apps, currentAppId, onSelect, onOpenChange, isSearchable,
229
229
  return;
230
230
  }
231
231
  handlePanelKeyDown(e);
232
- }, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Grip, { size: s.icon + 1 }) }) }), (0, jsx_runtime_1.jsx)(react_2.PopoverContent, { w: width, maxW: "calc(100vw - 1.5rem)", textAlign: "start", onKeyDown: handlePanelKeyDown, bg: theme.colors.surfaceRaised, borderRadius: "xl", overflow: "hidden", boxShadow: `0 10px 30px ${theme.colors.boxShadow.default}`, _focus: { outline: "none", boxShadow: `0 10px 30px ${theme.colors.boxShadow.default}` }, children: (0, jsx_runtime_1.jsxs)(react_2.PopoverBody, { p: 0, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, px: 3, pt: 3, pb: showSearch ? 2 : 1, children: [(0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "0.6875rem", fontWeight: 600, letterSpacing: "0.08em", textTransform: "uppercase", color: theme.colors.textMuted, children: HEADING }), (0, jsx_runtime_1.jsx)(react_2.Box, { flex: "1" }), hint && (0, jsx_runtime_1.jsx)(Kbd_1.default, { size: "xs", children: hint })] }), showSearch && ((0, jsx_runtime_1.jsx)(react_2.Box, { px: 3, pb: 2, children: (0, jsx_runtime_1.jsxs)(react_2.InputGroup, { size: "sm", children: [(0, jsx_runtime_1.jsx)(react_2.InputLeftElement, { pointerEvents: "none", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Search, { size: 15, color: theme.colors.textMuted }) }), (0, jsx_runtime_1.jsx)(react_2.Input, { ref: searchRef, value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search apps", borderRadius: "lg", "aria-label": "Search apps", onKeyDown: (e) => {
232
+ }, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Grip, { size: s.icon + 1 }) }) }), (0, jsx_runtime_1.jsx)(react_2.PopoverContent, { w: width, maxW: "calc(100vw - 1.5rem)", textAlign: "start", onKeyDown: handlePanelKeyDown, bg: theme.colors.surfaceRaised, borderRadius: "xl", overflow: "hidden", boxShadow: `0 10px 30px ${theme.colors.boxShadow.default}`, _focus: { outline: "none", boxShadow: `0 10px 30px ${theme.colors.boxShadow.default}` }, children: (0, jsx_runtime_1.jsxs)(react_2.PopoverBody, { p: 0, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, px: 3, pt: 3, pb: showSearch ? 2 : 1, children: [(0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "xs-minus", fontWeight: 600, letterSpacing: "0.08em", textTransform: "uppercase", color: theme.colors.textMuted, children: HEADING }), (0, jsx_runtime_1.jsx)(react_2.Box, { flex: "1" }), hint && (0, jsx_runtime_1.jsx)(Kbd_1.default, { size: "xs", children: hint })] }), showSearch && ((0, jsx_runtime_1.jsx)(react_2.Box, { px: 3, pb: 2, children: (0, jsx_runtime_1.jsxs)(react_2.InputGroup, { size: "sm", children: [(0, jsx_runtime_1.jsx)(react_2.InputLeftElement, { pointerEvents: "none", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Search, { size: 15, color: theme.colors.textMuted }) }), (0, jsx_runtime_1.jsx)(react_2.Input, { ref: searchRef, value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search apps", borderRadius: "lg", "aria-label": "Search apps", onKeyDown: (e) => {
233
233
  if (e.key === "ArrowDown" && visible.length > 0) {
234
234
  e.preventDefault();
235
235
  focusItem(0);
@@ -16,7 +16,7 @@ const useCustomTheme_1 = require("../../Theme/useCustomTheme");
16
16
  const SelectV2_1 = __importDefault(require("../SelectV2/SelectV2"));
17
17
  const FieldLabel = ({ children }) => {
18
18
  const { colors } = (0, useCustomTheme_1.useCustomTheme)();
19
- return ((0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", fontWeight: "medium", color: colors.textMuted, mb: 2, children: children }));
19
+ return ((0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", fontWeight: 500, color: colors.textMuted, mb: 2, children: children }));
20
20
  };
21
21
  const brandSwatch = (name, colors) => ((0, jsx_runtime_1.jsx)(react_2.Box, { w: "14px", h: "14px", borderRadius: "full", bg: brands_1.lightPalettes[name].primary[500], border: "1px solid", borderColor: (0, outlineRung_1.ruleInk)(colors.boxborder[200], [colors.backgroundColor.light, colors.backgroundColor.tertiary], outlineRung_1.CHROME_RULE) }));
22
22
  const AppearanceSettings = ({ brand, fontSize, onBrandChange, onFontSizeChange, showBrand = true, showColorMode = true, showFontSize = true, size = "sm", labels, }) => {
@@ -9,6 +9,7 @@ const react_1 = require("react");
9
9
  const react_2 = require("@chakra-ui/react");
10
10
  const Button_1 = __importDefault(require("../Button/Button"));
11
11
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
12
+ const typography_1 = require("../../Theme/tokens/primitives/typography");
12
13
  const DEFAULT_LABELS = {
13
14
  start: "Start recording",
14
15
  stop: "Stop recording",
@@ -164,6 +165,6 @@ const AudioRecorder = ({ onRecorded, maxDurationSec, isDisabled = false, labels
164
165
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 3, children: [(0, jsx_runtime_1.jsx)(Button_1.default, { label: isRecording ? text.stop : text.start, size: "sm", colorScheme: isRecording ? "red" : undefined, variant: isRecording ? "solid" : "outline", "aria-pressed": isRecording, isDisabled: isRecording ? false : isDisabled || blocked, onClick: isRecording ? stop : () => void start() }), isRecording ? ((0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { "data-testid": "audio-recorder-dot", boxSize: "0.5rem", borderRadius: "full", bg: colors.semanticText.error, "aria-hidden": true, sx: {
165
166
  "@media (prefers-reduced-motion: no-preference)": { animation: "audio-recorder-pulse 1.2s ease-in-out infinite" },
166
167
  "@keyframes audio-recorder-pulse": { "0%, 100%": { opacity: 1 }, "50%": { opacity: 0.35 } },
167
- } }), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", role: "timer", fontSize: "0.875rem", color: colors.header[900], sx: { fontVariantNumeric: "tabular-nums" }, children: (0, exports.formatElapsed)(elapsedMs) })] })) : null] }), (0, jsx_runtime_1.jsx)(react_2.VisuallyHidden, { role: "status", "aria-live": "polite", children: announcement }), status === "denied" || status === "unsupported" ? ((0, jsx_runtime_1.jsx)(react_2.Text, { role: "alert", mt: 1, fontSize: "0.75rem", color: colors.semanticText.error, children: status === "denied" ? text.permissionDenied : text.unsupported })) : null] }));
168
+ } }), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", role: "timer", fontSize: "sm", color: colors.header[900], sx: typography_1.NUMERIC_TEXT, children: (0, exports.formatElapsed)(elapsedMs) })] })) : null] }), (0, jsx_runtime_1.jsx)(react_2.VisuallyHidden, { role: "status", "aria-live": "polite", children: announcement }), status === "denied" || status === "unsupported" ? ((0, jsx_runtime_1.jsx)(react_2.Text, { role: "alert", mt: 1, fontSize: "xs", color: colors.semanticText.error, children: status === "denied" ? text.permissionDenied : text.unsupported })) : null] }));
168
169
  };
169
170
  exports.default = AudioRecorder;