pixelize-design-library 2.4.2-beta.61 → 2.4.2-beta.63

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 (582) hide show
  1. package/CHANGELOG.md +228 -2
  2. package/COMPONENT-GOTCHAS.md +144 -7
  3. package/DESIGN-GUIDE.md +12 -5
  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/Button/Button.styles.js +51 -21
  15. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +1 -1
  16. package/dist/Components/CalendarGrid/CalendarGrid.js +5 -5
  17. package/dist/Components/CalendarGrid/calendarMath.js +18 -6
  18. package/dist/Components/Card/CardProps.d.ts +2 -2
  19. package/dist/Components/Card/PaymentCard/PaymentCard.js +6 -5
  20. package/dist/Components/CartItem/CartItem.js +2 -1
  21. package/dist/Components/Checkbox/Checkbox.d.ts +18 -3
  22. package/dist/Components/Checkbox/Checkbox.js +9 -7
  23. package/dist/Components/CheckoutKit/selectable.js +1 -1
  24. package/dist/Components/ChoiceCard/ChoiceCard.d.ts +3 -0
  25. package/dist/Components/ChoiceCard/ChoiceCard.js +16 -0
  26. package/dist/Components/ChoiceCard/ChoiceCardGroup.d.ts +3 -0
  27. package/dist/Components/ChoiceCard/ChoiceCardGroup.js +6 -0
  28. package/dist/Components/ChoiceCard/ChoiceCardProps.d.ts +28 -0
  29. package/dist/Components/ChoiceCard/ChoiceCardProps.js +2 -0
  30. package/dist/Components/CircularProgress/CircularProgress.js +4 -8
  31. package/dist/Components/CircularProgress/CircularProgressProps.d.ts +5 -3
  32. package/dist/Components/CircularProgress/arc.d.ts +9 -1
  33. package/dist/Components/CircularProgress/arc.js +15 -1
  34. package/dist/Components/Common/FormLabel.js +1 -1
  35. package/dist/Components/Common/FormattedDescription.js +1 -1
  36. package/dist/Components/Common/HelperText.d.ts +5 -4
  37. package/dist/Components/Common/HelperText.js +10 -7
  38. package/dist/Components/Common/fieldStyles.d.ts +4 -4
  39. package/dist/Components/Common/fieldStyles.js +2 -1
  40. package/dist/Components/ConfirmDialog/ConfirmDialog.js +2 -1
  41. package/dist/Components/ContactForm/ContactForm.js +1 -1
  42. package/dist/Components/CopyButton/CopyButton.js +12 -5
  43. package/dist/Components/CouponField/CouponField.js +4 -3
  44. package/dist/Components/CustomModulesTable/CustomModulesTable.js +6 -4
  45. package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +18 -0
  46. package/dist/Components/CustomModulesTable/EditModuleModal.js +2 -1
  47. package/dist/Components/DatePicker/CalendarPanel.js +2 -2
  48. package/dist/Components/DatePicker/DatePicker.js +8 -2
  49. package/dist/Components/DatePicker/RangeDatePicker.d.ts +9 -3
  50. package/dist/Components/DatePicker/RangeDatePicker.js +8 -6
  51. package/dist/Components/DatePicker/SingleDatePicker.d.ts +9 -5
  52. package/dist/Components/DatePicker/SingleDatePicker.js +9 -5
  53. package/dist/Components/DatePicker/ThemeDatePicker.d.ts +8 -4
  54. package/dist/Components/DatePicker/ThemeDatePicker.js +9 -6
  55. package/dist/Components/DatePicker/TimeOnlyPicker.d.ts +9 -5
  56. package/dist/Components/DatePicker/TimeOnlyPicker.js +8 -5
  57. package/dist/Components/DatePicker/TimePickerInput.d.ts +2 -2
  58. package/dist/Components/DatePicker/TimePickerInput.js +6 -5
  59. package/dist/Components/DatePicker/dayStates.js +2 -1
  60. package/dist/Components/DescriptionList/DescriptionList.d.ts +1 -1
  61. package/dist/Components/DescriptionList/DescriptionList.js +3 -3
  62. package/dist/Components/DescriptionList/DescriptionListProps.d.ts +3 -3
  63. package/dist/Components/Drawer/Drawer.js +2 -1
  64. package/dist/Components/Dropdown/DropDown.js +13 -4
  65. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -1
  66. package/dist/Components/EmptyState/EmptyState.js +2 -2
  67. package/dist/Components/EmptyState/EmptyStateProps.d.ts +3 -3
  68. package/dist/Components/FileUpload/FileUpload.js +28 -15
  69. package/dist/Components/FileUpload/useObjectUrl.d.ts +1 -0
  70. package/dist/Components/FileUpload/useObjectUrl.js +14 -0
  71. package/dist/Components/FileUploader/FileUploader.js +9 -3
  72. package/dist/Components/FileUploader/FileUploaderProps.d.ts +8 -0
  73. package/dist/Components/FilterBar/FilterBar.d.ts +1 -1
  74. package/dist/Components/FilterBar/FilterBar.js +2 -2
  75. package/dist/Components/FilterBar/FilterBarProps.d.ts +3 -3
  76. package/dist/Components/FilterSidebar/FilterSidebar.js +15 -8
  77. package/dist/Components/Form/FormWrapper.js +1 -1
  78. package/dist/Components/FormField/FormField.d.ts +3 -0
  79. package/dist/Components/FormField/FormField.js +57 -0
  80. package/dist/Components/FormField/FormFieldProps.d.ts +33 -0
  81. package/dist/Components/FormField/FormFieldProps.js +2 -0
  82. package/dist/Components/Header/HeaderActions.js +2 -2
  83. package/dist/Components/Header/components/mobileMenu.js +1 -1
  84. package/dist/Components/IconButton/IconButton.d.ts +5 -0
  85. package/dist/Components/IconButton/IconButton.js +24 -0
  86. package/dist/Components/IconButton/IconButtonProps.d.ts +10 -0
  87. package/dist/Components/IconButton/IconButtonProps.js +2 -0
  88. package/dist/Components/Input/PhoneNumberInput.js +14 -0
  89. package/dist/Components/Input/PhoneNumberInputProps.d.ts +1 -0
  90. package/dist/Components/KanbanBoard/AccountCard.js +7 -4
  91. package/dist/Components/KanbanBoard/AccountRow.js +1 -1
  92. package/dist/Components/KanbanBoard/KanbanBoard.js +56 -39
  93. package/dist/Components/KanbanBoard/MeasuredItem.js +6 -14
  94. package/dist/Components/KanbanBoard/boardStore.d.ts +8 -0
  95. package/dist/Components/KanbanBoard/boardStore.js +27 -0
  96. package/dist/Components/Kbd/Kbd.js +1 -1
  97. package/dist/Components/LimitReachedModal/LimitReachedModal.js +1 -1
  98. package/dist/Components/Loading/Loading.js +1 -1
  99. package/dist/Components/MediaGallery/MediaGallery.js +1 -1
  100. package/dist/Components/MediaGallery/MediaLightbox.js +2 -1
  101. package/dist/Components/MediaGallery/glass.js +2 -1
  102. package/dist/Components/MediaViewer/MediaViewer.js +1 -1
  103. package/dist/Components/MediaViewer/components/MediaAudioPlayer.js +7 -7
  104. package/dist/Components/MediaViewer/components/MediaImageViewer.js +1 -1
  105. package/dist/Components/MediaViewer/components/MediaScrubber.js +5 -1
  106. package/dist/Components/MediaViewer/components/MediaVideoPlayer.js +7 -7
  107. package/dist/Components/MediaViewer/components/PlaybackTimeline.d.ts +20 -0
  108. package/dist/Components/MediaViewer/components/PlaybackTimeline.js +47 -0
  109. package/dist/Components/MediaViewer/components/TileChip.js +1 -1
  110. package/dist/Components/Modal/Modal.js +1 -1
  111. package/dist/Components/MoreItems/MoreItems.js +2 -2
  112. package/dist/Components/NavigationBar/NavigationBar.js +5 -4
  113. package/dist/Components/NoteTextArea/NoteTextArea.js +18 -4
  114. package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +12 -0
  115. package/dist/Components/Notification/Notification.js +18 -3
  116. package/dist/Components/Notification/NotificationProps.d.ts +17 -1
  117. package/dist/Components/NotificationBell/NotificationBell.js +5 -1
  118. package/dist/Components/NotificationBell/NotificationItem.js +1 -1
  119. package/dist/Components/NotificationBell/NotificationList.js +1 -1
  120. package/dist/Components/NotificationBell/NotificationPanel.js +4 -3
  121. package/dist/Components/OffersList/OffersList.js +2 -1
  122. package/dist/Components/OptionChip/OptionChip.js +3 -2
  123. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  124. package/dist/Components/OrderSummary/OrderSummary.js +5 -5
  125. package/dist/Components/OrganizationDetails/CreateOrgModal.js +2 -1
  126. package/dist/Components/OrganizationDetails/OrganizationDetails.js +10 -2
  127. package/dist/Components/PageHeader/PageHeader.d.ts +1 -1
  128. package/dist/Components/PageHeader/PageHeader.js +2 -2
  129. package/dist/Components/PageHeader/PageHeaderProps.d.ts +3 -3
  130. package/dist/Components/Pagination/Pagination.d.ts +5 -0
  131. package/dist/Components/Pagination/Pagination.js +48 -0
  132. package/dist/Components/Pagination/PaginationProps.d.ts +46 -0
  133. package/dist/Components/Pagination/PaginationProps.js +9 -0
  134. package/dist/Components/Pagination/pageWindow.d.ts +4 -0
  135. package/dist/Components/Pagination/pageWindow.js +22 -0
  136. package/dist/Components/PaymentOption/PaymentOption.js +1 -1
  137. package/dist/Components/PersonChip/PersonChip.js +2 -2
  138. package/dist/Components/PinInput/PinInput.d.ts +1 -1
  139. package/dist/Components/PinInput/PinInput.js +17 -2
  140. package/dist/Components/PinInput/PinInputProps.d.ts +9 -1
  141. package/dist/Components/PincodeChecker/PincodeChecker.js +4 -4
  142. package/dist/Components/PlanPill/PlanPill.js +2 -1
  143. package/dist/Components/PriceBlock/PriceBlock.js +3 -3
  144. package/dist/Components/Primitives/Primitives.d.ts +2 -2
  145. package/dist/Components/Primitives/Primitives.js +2 -3
  146. package/dist/Components/ProductBadges/ProductBadges.js +2 -1
  147. package/dist/Components/ProductCard/ProductCard.js +1 -1
  148. package/dist/Components/ProductCard/ProductCardAction.js +2 -2
  149. package/dist/Components/ProductCard/ProductCardSwatches.js +2 -1
  150. package/dist/Components/ProductCard/cardMetrics.d.ts +1 -1
  151. package/dist/Components/ProductCard/cardMetrics.js +5 -1
  152. package/dist/Components/ProfileCard/ProfileCardProps.d.ts +11 -0
  153. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +9 -4
  154. package/dist/Components/QuantityStepper/QuantityStepper.js +2 -1
  155. package/dist/Components/RadioButton/RadioButton.d.ts +11 -2
  156. package/dist/Components/RadioButton/RadioButton.js +9 -6
  157. package/dist/Components/RangeSlider/RangeSlider.js +3 -3
  158. package/dist/Components/Rating/Rating.js +2 -1
  159. package/dist/Components/Reorder/Reorder.js +3 -2
  160. package/dist/Components/ReviewList/ReviewList.js +3 -3
  161. package/dist/Components/ReviewSummary/ReviewSummary.js +3 -3
  162. package/dist/Components/SaveBar/SaveBar.d.ts +1 -1
  163. package/dist/Components/SaveBar/SaveBar.js +2 -2
  164. package/dist/Components/SaveBar/SaveBarProps.d.ts +3 -3
  165. package/dist/Components/Search/Search.js +2 -9
  166. package/dist/Components/Search/ctrlShortcut.d.ts +1 -0
  167. package/dist/Components/Search/ctrlShortcut.js +29 -0
  168. package/dist/Components/SearchSelect/SearchSelect.js +157 -49
  169. package/dist/Components/SearchSelect/searchSelectNav.d.ts +13 -0
  170. package/dist/Components/SearchSelect/searchSelectNav.js +40 -0
  171. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +8 -2
  172. package/dist/Components/SegmentedControl/SegmentedControl.js +9 -5
  173. package/dist/Components/Select/SelectPopup.js +7 -4
  174. package/dist/Components/SelectSearch/SelectSearch.js +6 -4
  175. package/dist/Components/SettingRow/SettingRow.js +2 -1
  176. package/dist/Components/SettingRow/SettingsSection.js +2 -1
  177. package/dist/Components/SideBar/SecondaryBar.js +5 -3
  178. package/dist/Components/SideBar/SideBar.js +96 -32
  179. package/dist/Components/SideBar/SideBarProps.d.ts +1 -1
  180. package/dist/Components/SideBar/components/MenuItemBox.d.ts +2 -2
  181. package/dist/Components/SideBar/components/MenuItemBox.js +11 -7
  182. package/dist/Components/SideBar/components/MenuItems.d.ts +2 -2
  183. package/dist/Components/SideBar/components/MenuItems.js +3 -3
  184. package/dist/Components/SideBar/components/MenuPopoverContent.js +2 -1
  185. package/dist/Components/SideBar/components/OtherApps.js +7 -2
  186. package/dist/Components/SideBar/components/OverflowTooltipText.js +4 -5
  187. package/dist/Components/SideBar/components/PinnedSection.js +8 -5
  188. package/dist/Components/SideBar/components/TextTruncation.js +11 -6
  189. package/dist/Components/SideBar/sidebarMotion.d.ts +2 -0
  190. package/dist/Components/SideBar/sidebarMotion.js +6 -0
  191. package/dist/Components/SideBar/sidebarScale.d.ts +1 -1
  192. package/dist/Components/SideBar/sidebarScale.js +2 -1
  193. package/dist/Components/SignInActivityTable/SignInActivityTable.js +6 -4
  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 +7 -7
  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 +4 -8
  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 +6 -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/Table.js +6 -2
  216. package/dist/Components/Table/components/TableActions.js +41 -24
  217. package/dist/Components/Table/components/TableBody.js +25 -40
  218. package/dist/Components/Table/components/rowMeasurer.d.ts +8 -0
  219. package/dist/Components/Table/components/rowMeasurer.js +71 -0
  220. package/dist/Components/Table/filters/CompactSelect.js +2 -1
  221. package/dist/Components/Table/filters/TableFilters.js +2 -13
  222. package/dist/Components/Table/hooks/useTable.js +12 -9
  223. package/dist/Components/Table/settings/TableSettings.js +7 -2
  224. package/dist/Components/Table/variants/classic.js +3 -2
  225. package/dist/Components/Tabs/components/CountBadge.js +3 -3
  226. package/dist/Components/Tabs/components/Tab.d.ts +2 -1
  227. package/dist/Components/Tabs/components/Tab.js +4 -3
  228. package/dist/Components/Tabs/components/TabList.js +16 -1
  229. package/dist/Components/Tag/Tag.d.ts +2 -2
  230. package/dist/Components/Tag/Tag.js +15 -12
  231. package/dist/Components/Tag/Tag.styles.js +6 -4
  232. package/dist/Components/TagInput/TagInput.d.ts +3 -0
  233. package/dist/Components/TagInput/TagInput.js +99 -0
  234. package/dist/Components/TagInput/TagInputProps.d.ts +46 -0
  235. package/dist/Components/TagInput/TagInputProps.js +2 -0
  236. package/dist/Components/TagInput/tagEntries.d.ts +15 -0
  237. package/dist/Components/TagInput/tagEntries.js +45 -0
  238. package/dist/Components/TimePicker/TimePicker.d.ts +3 -0
  239. package/dist/Components/TimePicker/TimePicker.js +50 -0
  240. package/dist/Components/TimePicker/TimePickerProps.d.ts +44 -0
  241. package/dist/Components/TimePicker/TimePickerProps.js +2 -0
  242. package/dist/Components/TimePicker/timeParts.d.ts +10 -0
  243. package/dist/Components/TimePicker/timeParts.js +36 -0
  244. package/dist/Components/Timeline/Timeline.js +21 -12
  245. package/dist/Components/Toaster/Toaster.js +20 -8
  246. package/dist/Components/Toggle/TableToggle.js +8 -4
  247. package/dist/Components/ToggleSwitch/ToggleSwitch.d.ts +3 -2
  248. package/dist/Components/ToggleSwitch/ToggleSwitch.js +6 -5
  249. package/dist/Components/ToolTip/ToolTip.js +86 -8
  250. package/dist/Components/UpgradeButton/UpgradeButton.js +4 -2
  251. package/dist/Components/UserDetails/AddUserModal.js +2 -1
  252. package/dist/Components/UserDetails/ChangeRoleModal.js +2 -1
  253. package/dist/Components/UserDetails/UserDetails.js +10 -2
  254. package/dist/Components/VisuallyHidden/VisuallyHidden.d.ts +15 -0
  255. package/dist/Components/VisuallyHidden/VisuallyHidden.js +21 -0
  256. package/dist/Components/VisuallyHidden/VisuallyHiddenProps.d.ts +3 -0
  257. package/dist/Components/VisuallyHidden/VisuallyHiddenProps.js +2 -0
  258. package/dist/Components/WizardDialog/WizardDialog.js +10 -5
  259. package/dist/Components/WizardDialog/WizardDialogProps.d.ts +4 -0
  260. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +5 -1
  261. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +15 -2
  262. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +2 -1
  263. package/dist/Hooks/sharedResizeObserver.d.ts +6 -0
  264. package/dist/Hooks/sharedResizeObserver.js +77 -0
  265. package/dist/Hooks/useIsTruncated.js +3 -4
  266. package/dist/Theme/chakra/Card.styles.d.ts +7 -1
  267. package/dist/Theme/chakra/Card.styles.js +4 -1
  268. package/dist/Theme/chakra/Menu.styles.d.ts +4 -6
  269. package/dist/Theme/chakra/Menu.styles.js +3 -0
  270. package/dist/Theme/chakra/Popover.styles.d.ts +2 -11
  271. package/dist/Theme/chakra/Popover.styles.js +2 -0
  272. package/dist/Theme/chakra/common.web.d.ts +5 -0
  273. package/dist/Theme/chakra/componentStyles.d.ts +12 -4
  274. package/dist/Theme/chakra/componentStyles.js +10 -6
  275. package/dist/Theme/chakra/createBrandTheme.d.ts +3 -0
  276. package/dist/Theme/chakra/createBrandTheme.js +34 -4
  277. package/dist/Theme/chakra/focusRing.styles.d.ts +2 -0
  278. package/dist/Theme/chakra/focusRing.styles.js +5 -1
  279. package/dist/Theme/chakra/fonts.web.d.ts +2 -0
  280. package/dist/Theme/chakra/motion.d.ts +15 -0
  281. package/dist/Theme/chakra/motion.js +27 -1
  282. package/dist/Theme/chakra/overlay.styles.d.ts +5 -0
  283. package/dist/Theme/chakra/overlay.styles.js +4 -1
  284. package/dist/Theme/index.d.ts +2 -1
  285. package/dist/Theme/index.js +12 -9
  286. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +4 -1
  287. package/dist/Theme/provider/PixelizeThemeProvider.js +21 -12
  288. package/dist/Theme/provider/ThemeSwitcher.js +3 -2
  289. package/dist/Theme/themeProps.d.ts +7 -0
  290. package/dist/Theme/tokens/brands/emerald/palette.dark.js +2 -1
  291. package/dist/Theme/tokens/brands/index.d.ts +2 -1
  292. package/dist/Theme/tokens/brands/index.js +31 -14
  293. package/dist/Theme/tokens/brands/lavender/palette.dark.js +2 -1
  294. package/dist/Theme/tokens/brands/meadow/palette.dark.js +2 -1
  295. package/dist/Theme/tokens/brands/radiant/palette.dark.js +2 -1
  296. package/dist/Theme/tokens/brands/radiant/palette.light.js +15 -0
  297. package/dist/Theme/tokens/brands/rosewood/palette.dark.js +2 -1
  298. package/dist/Theme/tokens/brands/rosewood/palette.light.js +10 -10
  299. package/dist/Theme/tokens/brands/skyline/palette.dark.js +2 -1
  300. package/dist/Theme/tokens/brands/slate/palette.dark.js +2 -1
  301. package/dist/Theme/tokens/brands/storefront/palette.dark.js +2 -1
  302. package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts +7 -29
  303. package/dist/Theme/tokens/brands/zinc/palette.dark.js +27 -55
  304. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +6 -1
  305. package/dist/Theme/tokens/builders/buildDarkPalette.js +37 -8
  306. package/dist/Theme/tokens/builders/color.js +11 -7
  307. package/dist/Theme/tokens/builders/filledSurface.d.ts +3 -1
  308. package/dist/Theme/tokens/builders/filledSurface.js +7 -7
  309. package/dist/Theme/tokens/builders/lazy.d.ts +5 -0
  310. package/dist/Theme/tokens/builders/lazy.js +55 -0
  311. package/dist/Theme/tokens/builders/memo.d.ts +9 -0
  312. package/dist/Theme/tokens/builders/memo.js +28 -0
  313. package/dist/Theme/tokens/builders/memoByReads.d.ts +2 -0
  314. package/dist/Theme/tokens/builders/memoByReads.js +50 -0
  315. package/dist/Theme/tokens/builders/mutedText.d.ts +1 -1
  316. package/dist/Theme/tokens/builders/mutedText.js +13 -3
  317. package/dist/Theme/tokens/builders/outlineRung.js +10 -2
  318. package/dist/Theme/tokens/builders/planeStep.d.ts +4 -0
  319. package/dist/Theme/tokens/builders/planeStep.js +20 -0
  320. package/dist/Theme/tokens/builders/planes.d.ts +4 -0
  321. package/dist/Theme/tokens/builders/planes.js +33 -0
  322. package/dist/Theme/tokens/builders/skeletonShimmer.d.ts +9 -0
  323. package/dist/Theme/tokens/builders/skeletonShimmer.js +25 -0
  324. package/dist/Theme/tokens/builders/surfaceRaised.d.ts +3 -1
  325. package/dist/Theme/tokens/builders/surfaceRaised.js +18 -8
  326. package/dist/Theme/tokens/builders/surfaceRungs.js +3 -1
  327. package/dist/Theme/tokens/builders/tone.js +5 -4
  328. package/dist/Theme/tokens/primitives/borderWidths.d.ts +6 -0
  329. package/dist/Theme/tokens/primitives/borderWidths.js +5 -0
  330. package/dist/Theme/tokens/primitives/index.d.ts +8 -3
  331. package/dist/Theme/tokens/primitives/index.js +11 -1
  332. package/dist/Theme/tokens/primitives/motion.d.ts +26 -2
  333. package/dist/Theme/tokens/primitives/motion.js +24 -5
  334. package/dist/Theme/tokens/primitives/optionRowSizes.d.ts +1 -1
  335. package/dist/Theme/tokens/primitives/optionRowSizes.js +2 -1
  336. package/dist/Theme/tokens/primitives/radii.d.ts +15 -0
  337. package/dist/Theme/tokens/primitives/radii.js +14 -0
  338. package/dist/Theme/tokens/primitives/shadows.d.ts +21 -1
  339. package/dist/Theme/tokens/primitives/shadows.js +59 -5
  340. package/dist/Theme/tokens/primitives/states.d.ts +1 -0
  341. package/dist/Theme/tokens/primitives/states.js +4 -0
  342. package/dist/Theme/tokens/primitives/typography.d.ts +17 -0
  343. package/dist/Theme/tokens/primitives/typography.js +22 -2
  344. package/dist/Theme/tokens/primitives/zIndices.d.ts +1 -0
  345. package/dist/Theme/tokens/primitives/zIndices.js +1 -0
  346. package/dist/Utils/formatDate.d.ts +25 -0
  347. package/dist/Utils/formatDate.js +144 -0
  348. package/dist/esm/Components/Accordion/Accordion.js +2 -2
  349. package/dist/esm/Components/AddressCard/AddressCard.js +2 -1
  350. package/dist/esm/Components/Apexcharts/ApexLineChart/ApexLineChart.js +1 -1
  351. package/dist/esm/Components/AppSwitcher/AppSwitcher.js +1 -1
  352. package/dist/esm/Components/AppearanceSettings/AppearanceSettings.js +1 -1
  353. package/dist/esm/Components/AudioRecorder/AudioRecorder.js +2 -1
  354. package/dist/esm/Components/Avatar/Avatar.js +6 -4
  355. package/dist/esm/Components/Backdrop/Backdrop.js +1 -1
  356. package/dist/esm/Components/BagBar/BagBar.js +2 -1
  357. package/dist/esm/Components/Button/Button.styles.js +54 -24
  358. package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +1 -1
  359. package/dist/esm/Components/CalendarGrid/CalendarGrid.js +6 -6
  360. package/dist/esm/Components/CalendarGrid/calendarMath.js +18 -6
  361. package/dist/esm/Components/Card/PaymentCard/PaymentCard.js +6 -5
  362. package/dist/esm/Components/CartItem/CartItem.js +2 -1
  363. package/dist/esm/Components/Checkbox/Checkbox.js +8 -5
  364. package/dist/esm/Components/CheckoutKit/selectable.js +1 -1
  365. package/dist/esm/Components/ChoiceCard/ChoiceCard.js +14 -0
  366. package/dist/esm/Components/ChoiceCard/ChoiceCardGroup.js +4 -0
  367. package/dist/esm/Components/ChoiceCard/ChoiceCardProps.js +1 -0
  368. package/dist/esm/Components/CircularProgress/CircularProgress.js +5 -9
  369. package/dist/esm/Components/CircularProgress/arc.js +13 -0
  370. package/dist/esm/Components/Common/FormLabel.js +1 -1
  371. package/dist/esm/Components/Common/FormattedDescription.js +1 -1
  372. package/dist/esm/Components/Common/HelperText.js +11 -8
  373. package/dist/esm/Components/Common/fieldStyles.js +2 -1
  374. package/dist/esm/Components/ConfirmDialog/ConfirmDialog.js +2 -1
  375. package/dist/esm/Components/ContactForm/ContactForm.js +1 -1
  376. package/dist/esm/Components/CopyButton/CopyButton.js +14 -7
  377. package/dist/esm/Components/CouponField/CouponField.js +4 -3
  378. package/dist/esm/Components/CustomModulesTable/CustomModulesTable.js +6 -4
  379. package/dist/esm/Components/CustomModulesTable/EditModuleModal.js +2 -1
  380. package/dist/esm/Components/DatePicker/CalendarPanel.js +2 -2
  381. package/dist/esm/Components/DatePicker/DatePicker.js +8 -2
  382. package/dist/esm/Components/DatePicker/RangeDatePicker.js +10 -7
  383. package/dist/esm/Components/DatePicker/SingleDatePicker.js +9 -5
  384. package/dist/esm/Components/DatePicker/ThemeDatePicker.js +7 -4
  385. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +7 -4
  386. package/dist/esm/Components/DatePicker/TimePickerInput.js +8 -6
  387. package/dist/esm/Components/DatePicker/dayStates.js +2 -1
  388. package/dist/esm/Components/DescriptionList/DescriptionList.js +3 -3
  389. package/dist/esm/Components/Drawer/Drawer.js +2 -1
  390. package/dist/esm/Components/Dropdown/DropDown.js +13 -4
  391. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -1
  392. package/dist/esm/Components/EmptyState/EmptyState.js +2 -2
  393. package/dist/esm/Components/FileUpload/FileUpload.js +29 -16
  394. package/dist/esm/Components/FileUpload/useObjectUrl.js +10 -0
  395. package/dist/esm/Components/FileUploader/FileUploader.js +9 -3
  396. package/dist/esm/Components/FilterBar/FilterBar.js +2 -2
  397. package/dist/esm/Components/FilterSidebar/FilterSidebar.js +15 -8
  398. package/dist/esm/Components/Form/FormWrapper.js +1 -1
  399. package/dist/esm/Components/FormField/FormField.js +52 -0
  400. package/dist/esm/Components/FormField/FormFieldProps.js +1 -0
  401. package/dist/esm/Components/Header/HeaderActions.js +2 -2
  402. package/dist/esm/Components/Header/components/mobileMenu.js +1 -1
  403. package/dist/esm/Components/IconButton/IconButton.js +21 -0
  404. package/dist/esm/Components/IconButton/IconButtonProps.js +1 -0
  405. package/dist/esm/Components/Input/PhoneNumberInput.js +15 -1
  406. package/dist/esm/Components/KanbanBoard/AccountCard.js +7 -4
  407. package/dist/esm/Components/KanbanBoard/AccountRow.js +1 -1
  408. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +56 -39
  409. package/dist/esm/Components/KanbanBoard/MeasuredItem.js +6 -14
  410. package/dist/esm/Components/KanbanBoard/boardStore.js +22 -0
  411. package/dist/esm/Components/Kbd/Kbd.js +1 -1
  412. package/dist/esm/Components/LimitReachedModal/LimitReachedModal.js +1 -1
  413. package/dist/esm/Components/Loading/Loading.js +1 -1
  414. package/dist/esm/Components/MediaGallery/MediaGallery.js +2 -2
  415. package/dist/esm/Components/MediaGallery/MediaLightbox.js +2 -1
  416. package/dist/esm/Components/MediaGallery/glass.js +2 -1
  417. package/dist/esm/Components/MediaViewer/MediaViewer.js +1 -1
  418. package/dist/esm/Components/MediaViewer/components/MediaAudioPlayer.js +7 -7
  419. package/dist/esm/Components/MediaViewer/components/MediaImageViewer.js +1 -1
  420. package/dist/esm/Components/MediaViewer/components/MediaScrubber.js +5 -1
  421. package/dist/esm/Components/MediaViewer/components/MediaVideoPlayer.js +7 -7
  422. package/dist/esm/Components/MediaViewer/components/PlaybackTimeline.js +38 -0
  423. package/dist/esm/Components/MediaViewer/components/TileChip.js +1 -1
  424. package/dist/esm/Components/Modal/Modal.js +1 -1
  425. package/dist/esm/Components/MoreItems/MoreItems.js +2 -2
  426. package/dist/esm/Components/NavigationBar/NavigationBar.js +5 -4
  427. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +18 -4
  428. package/dist/esm/Components/Notification/Notification.js +18 -3
  429. package/dist/esm/Components/NotificationBell/NotificationBell.js +2 -1
  430. package/dist/esm/Components/NotificationBell/NotificationItem.js +1 -1
  431. package/dist/esm/Components/NotificationBell/NotificationList.js +1 -1
  432. package/dist/esm/Components/NotificationBell/NotificationPanel.js +4 -3
  433. package/dist/esm/Components/OffersList/OffersList.js +2 -1
  434. package/dist/esm/Components/OptionChip/OptionChip.js +3 -2
  435. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +2 -1
  436. package/dist/esm/Components/OrderSummary/OrderSummary.js +5 -5
  437. package/dist/esm/Components/OrganizationDetails/CreateOrgModal.js +2 -1
  438. package/dist/esm/Components/OrganizationDetails/OrganizationDetails.js +10 -2
  439. package/dist/esm/Components/PageHeader/PageHeader.js +2 -2
  440. package/dist/esm/Components/Pagination/Pagination.js +42 -0
  441. package/dist/esm/Components/Pagination/PaginationProps.js +6 -0
  442. package/dist/esm/Components/Pagination/pageWindow.js +16 -0
  443. package/dist/esm/Components/PaymentOption/PaymentOption.js +1 -1
  444. package/dist/esm/Components/PersonChip/PersonChip.js +2 -2
  445. package/dist/esm/Components/PinInput/PinInput.js +14 -2
  446. package/dist/esm/Components/PincodeChecker/PincodeChecker.js +4 -4
  447. package/dist/esm/Components/PlanPill/PlanPill.js +2 -1
  448. package/dist/esm/Components/PriceBlock/PriceBlock.js +3 -3
  449. package/dist/esm/Components/Primitives/Primitives.js +1 -1
  450. package/dist/esm/Components/ProductBadges/ProductBadges.js +2 -1
  451. package/dist/esm/Components/ProductCard/ProductCard.js +1 -1
  452. package/dist/esm/Components/ProductCard/ProductCardAction.js +3 -3
  453. package/dist/esm/Components/ProductCard/ProductCardSwatches.js +2 -1
  454. package/dist/esm/Components/ProductCard/cardMetrics.js +2 -1
  455. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +9 -4
  456. package/dist/esm/Components/QuantityStepper/QuantityStepper.js +2 -1
  457. package/dist/esm/Components/RadioButton/RadioButton.js +7 -4
  458. package/dist/esm/Components/RangeSlider/RangeSlider.js +3 -3
  459. package/dist/esm/Components/Rating/Rating.js +2 -1
  460. package/dist/esm/Components/Reorder/Reorder.js +3 -2
  461. package/dist/esm/Components/ReviewList/ReviewList.js +3 -3
  462. package/dist/esm/Components/ReviewSummary/ReviewSummary.js +3 -3
  463. package/dist/esm/Components/SaveBar/SaveBar.js +2 -2
  464. package/dist/esm/Components/Search/Search.js +2 -9
  465. package/dist/esm/Components/Search/ctrlShortcut.js +25 -0
  466. package/dist/esm/Components/SearchSelect/SearchSelect.js +160 -52
  467. package/dist/esm/Components/SearchSelect/searchSelectNav.js +32 -0
  468. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +11 -6
  469. package/dist/esm/Components/Select/SelectPopup.js +7 -4
  470. package/dist/esm/Components/SelectSearch/SelectSearch.js +6 -4
  471. package/dist/esm/Components/SettingRow/SettingRow.js +2 -1
  472. package/dist/esm/Components/SettingRow/SettingsSection.js +2 -1
  473. package/dist/esm/Components/SideBar/SecondaryBar.js +5 -3
  474. package/dist/esm/Components/SideBar/SideBar.js +98 -34
  475. package/dist/esm/Components/SideBar/components/MenuItemBox.js +11 -7
  476. package/dist/esm/Components/SideBar/components/MenuItems.js +4 -4
  477. package/dist/esm/Components/SideBar/components/MenuPopoverContent.js +2 -1
  478. package/dist/esm/Components/SideBar/components/OtherApps.js +4 -2
  479. package/dist/esm/Components/SideBar/components/OverflowTooltipText.js +4 -5
  480. package/dist/esm/Components/SideBar/components/PinnedSection.js +8 -5
  481. package/dist/esm/Components/SideBar/components/TextTruncation.js +9 -7
  482. package/dist/esm/Components/SideBar/sidebarMotion.js +3 -0
  483. package/dist/esm/Components/SideBar/sidebarScale.js +2 -1
  484. package/dist/esm/Components/SignInActivityTable/SignInActivityTable.js +6 -4
  485. package/dist/esm/Components/Skeletons/Skeletons.js +4 -2
  486. package/dist/esm/Components/SkipLink/SkipLink.js +50 -0
  487. package/dist/esm/Components/SkipLink/SkipLinkProps.js +1 -0
  488. package/dist/esm/Components/Slider/Slider.js +11 -4
  489. package/dist/esm/Components/SpecTable/SpecTable.js +2 -1
  490. package/dist/esm/Components/StageProgress/StageItem.js +7 -7
  491. package/dist/esm/Components/StageProgress/StageProgress.js +2 -1
  492. package/dist/esm/Components/StageProgress/StepperStage.js +4 -8
  493. package/dist/esm/Components/StageProgress/centerInStrip.js +11 -0
  494. package/dist/esm/Components/StatCard/StatCard.js +6 -4
  495. package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +2 -2
  496. package/dist/esm/Components/Table/Table.js +8 -4
  497. package/dist/esm/Components/Table/components/TableActions.js +43 -26
  498. package/dist/esm/Components/Table/components/TableBody.js +25 -40
  499. package/dist/esm/Components/Table/components/rowMeasurer.js +66 -0
  500. package/dist/esm/Components/Table/filters/CompactSelect.js +2 -1
  501. package/dist/esm/Components/Table/filters/TableFilters.js +3 -14
  502. package/dist/esm/Components/Table/hooks/useTable.js +12 -9
  503. package/dist/esm/Components/Table/settings/TableSettings.js +8 -3
  504. package/dist/esm/Components/Table/variants/classic.js +3 -2
  505. package/dist/esm/Components/Tabs/components/CountBadge.js +3 -3
  506. package/dist/esm/Components/Tabs/components/Tab.js +5 -4
  507. package/dist/esm/Components/Tabs/components/TabList.js +16 -1
  508. package/dist/esm/Components/Tag/Tag.js +11 -8
  509. package/dist/esm/Components/Tag/Tag.styles.js +6 -4
  510. package/dist/esm/Components/TagInput/TagInput.js +94 -0
  511. package/dist/esm/Components/TagInput/TagInputProps.js +1 -0
  512. package/dist/esm/Components/TagInput/tagEntries.js +39 -0
  513. package/dist/esm/Components/TimePicker/TimePicker.js +45 -0
  514. package/dist/esm/Components/TimePicker/TimePickerProps.js +1 -0
  515. package/dist/esm/Components/TimePicker/timeParts.js +26 -0
  516. package/dist/esm/Components/Timeline/Timeline.js +21 -12
  517. package/dist/esm/Components/Toaster/Toaster.js +21 -9
  518. package/dist/esm/Components/Toggle/TableToggle.js +8 -4
  519. package/dist/esm/Components/ToggleSwitch/ToggleSwitch.js +7 -5
  520. package/dist/esm/Components/ToolTip/ToolTip.js +89 -11
  521. package/dist/esm/Components/UpgradeButton/UpgradeButton.js +4 -2
  522. package/dist/esm/Components/UserDetails/AddUserModal.js +2 -1
  523. package/dist/esm/Components/UserDetails/ChangeRoleModal.js +2 -1
  524. package/dist/esm/Components/UserDetails/UserDetails.js +10 -2
  525. package/dist/esm/Components/VisuallyHidden/VisuallyHidden.js +18 -0
  526. package/dist/esm/Components/VisuallyHidden/VisuallyHiddenProps.js +1 -0
  527. package/dist/esm/Components/WizardDialog/WizardDialog.js +11 -6
  528. package/dist/esm/Components/WorkspaceWindow/WorkspaceTrayPreview.js +2 -1
  529. package/dist/esm/Components/WorkspaceWindow/WorkspaceWindow.js +13 -3
  530. package/dist/esm/Hooks/sharedResizeObserver.js +73 -0
  531. package/dist/esm/Hooks/useIsTruncated.js +3 -4
  532. package/dist/esm/Theme/chakra/Card.styles.js +4 -1
  533. package/dist/esm/Theme/chakra/Menu.styles.js +3 -0
  534. package/dist/esm/Theme/chakra/Popover.styles.js +2 -0
  535. package/dist/esm/Theme/chakra/componentStyles.js +10 -6
  536. package/dist/esm/Theme/chakra/createBrandTheme.js +34 -4
  537. package/dist/esm/Theme/chakra/focusRing.styles.js +3 -0
  538. package/dist/esm/Theme/chakra/motion.js +26 -0
  539. package/dist/esm/Theme/chakra/overlay.styles.js +3 -0
  540. package/dist/esm/Theme/index.js +12 -9
  541. package/dist/esm/Theme/provider/PixelizeThemeProvider.js +22 -13
  542. package/dist/esm/Theme/provider/ThemeSwitcher.js +3 -2
  543. package/dist/esm/Theme/tokens/brands/emerald/palette.dark.js +2 -1
  544. package/dist/esm/Theme/tokens/brands/index.js +30 -13
  545. package/dist/esm/Theme/tokens/brands/lavender/palette.dark.js +2 -1
  546. package/dist/esm/Theme/tokens/brands/meadow/palette.dark.js +2 -1
  547. package/dist/esm/Theme/tokens/brands/radiant/palette.dark.js +2 -1
  548. package/dist/esm/Theme/tokens/brands/radiant/palette.light.js +15 -0
  549. package/dist/esm/Theme/tokens/brands/rosewood/palette.dark.js +2 -1
  550. package/dist/esm/Theme/tokens/brands/rosewood/palette.light.js +10 -10
  551. package/dist/esm/Theme/tokens/brands/skyline/palette.dark.js +2 -1
  552. package/dist/esm/Theme/tokens/brands/slate/palette.dark.js +2 -1
  553. package/dist/esm/Theme/tokens/brands/storefront/palette.dark.js +2 -1
  554. package/dist/esm/Theme/tokens/brands/zinc/palette.dark.js +27 -55
  555. package/dist/esm/Theme/tokens/builders/buildDarkPalette.js +38 -9
  556. package/dist/esm/Theme/tokens/builders/color.js +10 -6
  557. package/dist/esm/Theme/tokens/builders/filledSurface.js +7 -7
  558. package/dist/esm/Theme/tokens/builders/lazy.js +49 -0
  559. package/dist/esm/Theme/tokens/builders/memo.js +21 -0
  560. package/dist/esm/Theme/tokens/builders/memoByReads.js +46 -0
  561. package/dist/esm/Theme/tokens/builders/mutedText.js +12 -2
  562. package/dist/esm/Theme/tokens/builders/outlineRung.js +10 -2
  563. package/dist/esm/Theme/tokens/builders/planeStep.js +14 -0
  564. package/dist/esm/Theme/tokens/builders/planes.js +28 -0
  565. package/dist/esm/Theme/tokens/builders/skeletonShimmer.js +21 -0
  566. package/dist/esm/Theme/tokens/builders/surfaceRaised.js +16 -7
  567. package/dist/esm/Theme/tokens/builders/surfaceRungs.js +3 -1
  568. package/dist/esm/Theme/tokens/builders/tone.js +5 -4
  569. package/dist/esm/Theme/tokens/primitives/borderWidths.js +2 -0
  570. package/dist/esm/Theme/tokens/primitives/index.js +5 -3
  571. package/dist/esm/Theme/tokens/primitives/motion.js +21 -4
  572. package/dist/esm/Theme/tokens/primitives/optionRowSizes.js +2 -1
  573. package/dist/esm/Theme/tokens/primitives/radii.js +13 -0
  574. package/dist/esm/Theme/tokens/primitives/shadows.js +56 -5
  575. package/dist/esm/Theme/tokens/primitives/states.js +1 -0
  576. package/dist/esm/Theme/tokens/primitives/typography.js +21 -1
  577. package/dist/esm/Theme/tokens/primitives/zIndices.js +1 -0
  578. package/dist/esm/Utils/formatDate.js +138 -0
  579. package/dist/esm/index.js +19 -2
  580. package/dist/index.d.ts +34 -5
  581. package/dist/index.js +51 -4
  582. package/package.json +1 -1
@@ -45,6 +45,7 @@ const react_window_1 = require("react-window");
45
45
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
46
46
  const scrollbar_1 = require("../../Theme/tokens/builders/scrollbar");
47
47
  const motion_1 = require("../../Theme/tokens/primitives/motion");
48
+ const borderWidths_1 = require("../../Theme/tokens/primitives/borderWidths");
48
49
  const motion_2 = require("../../Theme/chakra/motion");
49
50
  const focusRing_styles_1 = require("../../Theme/chakra/focusRing.styles");
50
51
  const usePreferences_1 = require("../../Hooks/usePreferences");
@@ -54,6 +55,7 @@ const MeasuredItem_1 = __importDefault(require("./MeasuredItem"));
54
55
  const OverflowTooltipText_1 = __importDefault(require("../SideBar/components/OverflowTooltipText"));
55
56
  const Button_1 = __importDefault(require("../Button/Button"));
56
57
  const rafThrottle_1 = require("../../Utils/rafThrottle");
58
+ const boardStore_1 = require("./boardStore");
57
59
  /** Narrow rail width when a column is horizontally collapsed. */
58
60
  const COLLAPSED_KANBAN_COLUMN_WIDTH = "2.75rem";
59
61
  const CARD_LABEL_EXCLUDE = ["id", "details"];
@@ -71,21 +73,31 @@ const MIN_LIST_HEIGHT = 120;
71
73
  const KANBAN_VIRTUALIZE_THRESHOLD = 30;
72
74
  const COLUMN_TRANSITION = `${(0, motion_1.transitionFor)(["background-color", "border-color"])}, ${(0, motion_1.transitionFor)(["width"], "base")}`;
73
75
  const SKELETON_ROWS = [3, 4, 3];
74
- const CardSkeleton = ({ colors, rows }) => ((0, jsx_runtime_1.jsx)(react_2.Box, { "data-testid": "kanban-card-skeleton", borderRadius: "lg", bg: colors.background[50], border: `0.063rem solid ${colors.boxborder[200]}`, p: 3, minH: "5rem", children: (0, jsx_runtime_1.jsx)(react_2.Flex, { direction: "column", gap: 2.5, children: Array.from({ length: rows }).map((_, i) => ((0, jsx_runtime_1.jsxs)(react_2.Flex, { gap: 2, align: "center", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 2.5, w: "30%", borderRadius: "sm" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 2.5, flex: "1", maxW: i % 2 ? "40%" : "55%", borderRadius: "sm" })] }, i))) }) }));
76
+ const CardSkeleton = ({ colors, rows }) => ((0, jsx_runtime_1.jsx)(react_2.Box, { "data-testid": "kanban-card-skeleton", borderRadius: "lg", bg: colors.background[50], border: `${borderWidths_1.BORDER_WIDTHS.hairline} solid ${colors.boxborder[200]}`, p: 3, minH: "5rem", children: (0, jsx_runtime_1.jsx)(react_2.Flex, { direction: "column", gap: 2.5, children: Array.from({ length: rows }).map((_, i) => ((0, jsx_runtime_1.jsxs)(react_2.Flex, { gap: 2, align: "center", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 2.5, w: "30%", borderRadius: "sm" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 2.5, flex: "1", maxW: i % 2 ? "40%" : "55%", borderRadius: "sm" })] }, i))) }) }));
75
77
  // Top buffer above the first card so its border + hover lift aren't clipped by the
76
78
  // scroll/virtualized list's top edge.
77
79
  const KANBAN_LIST_TOP_PAD = 6;
80
+ const KanbanCardBody = ({ account, index, colId, canDelete, onDelete, onOpen, expandedStore, toggleExpand, }) => {
81
+ const isExpanded = (0, boardStore_1.useBoardStore)(expandedStore, (expanded) => expanded[account.id]);
82
+ const onToggleExpand = (0, react_1.useCallback)(() => toggleExpand(account.id, colId, index), [toggleExpand, account.id, colId, index]);
83
+ if (account.customNode)
84
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: account.customNode() });
85
+ return ((0, jsx_runtime_1.jsx)(AccountCard_1.default, { account: account, index: index, onDelete: onDelete, onOpen: onOpen, isExpanded: isExpanded, onToggleExpand: onToggleExpand, isDeletable: canDelete }));
86
+ };
87
+ const ColumnDeleteAll = ({ colId, title, hoveredColumn, colors, onDelete }) => {
88
+ const isHovered = (0, boardStore_1.useBoardStore)(hoveredColumn, (hovered) => hovered === colId);
89
+ if (!isHovered)
90
+ return (0, jsx_runtime_1.jsx)(react_2.Box, { boxSize: 4, flexShrink: 0 });
91
+ return ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "button", type: "button", "aria-label": `Delete all cards in ${title}`, display: "inline-flex", alignItems: "center", justifyContent: "center", boxSize: 4, borderRadius: "sm", cursor: "pointer", color: colors.text[600], _hover: { color: colors.semanticText.error }, onClick: () => onDelete(colId), transition: (0, motion_1.transitionFor)(["color"]), sx: { ...(0, focusRing_styles_1.focusVisibleStyles)(colors), ...(0, motion_2.reducedMotionSx)() }, flexShrink: 0, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Trash2, { size: 16 }) }));
92
+ };
78
93
  const KanbanRow = react_1.default.memo(({ index, style, data }) => {
79
94
  const { colors: rowColors } = (0, useCustomTheme_1.useCustomTheme)();
80
- const { items, colId, canDrag, expanded, onDelete, onOpen, canDelete, setSize, toggleExpand } = data;
95
+ const { items, colId, canDrag, expandedStore, onDelete, onOpen, canDelete, setSize, toggleExpand } = data;
81
96
  const account = items[index];
82
97
  if (!account) {
83
98
  return (0, jsx_runtime_1.jsx)("div", { style: style });
84
99
  }
85
- return ((0, jsx_runtime_1.jsx)("div", { style: style, children: (0, jsx_runtime_1.jsx)("div", { style: { paddingBottom: KANBAN_CARD_GAP, paddingTop: index === 0 ? KANBAN_LIST_TOP_PAD : 0 }, children: (0, jsx_runtime_1.jsx)(MeasuredItem_1.default, { index: index, setSize: (i, h) => setSize(i, h, colId), children: (0, jsx_runtime_1.jsx)(dnd_1.Draggable, { draggableId: account.id.toString(), index: index, isDragDisabled: !canDrag, children: (provided) => {
86
- var _a;
87
- return ((0, jsx_runtime_1.jsx)(react_2.Box, { ref: provided.innerRef, ...provided.draggableProps, ...provided.dragHandleProps, "aria-label": getCardAccessibleName(account), style: provided.draggableProps.style, borderRadius: "lg", sx: (0, focusRing_styles_1.focusVisibleStyles)(rowColors), children: (account === null || account === void 0 ? void 0 : account.customNode) ? (_a = account === null || account === void 0 ? void 0 : account.customNode) === null || _a === void 0 ? void 0 : _a.call(account) : ((0, jsx_runtime_1.jsx)(AccountCard_1.default, { account: account, index: index, onDelete: onDelete, onOpen: onOpen, isExpanded: expanded[account.id], onToggleExpand: () => toggleExpand(account.id, colId, index), isDeletable: canDelete }, account.id)) }));
88
- } }, account.id) }) }) }));
100
+ return ((0, jsx_runtime_1.jsx)("div", { style: style, children: (0, jsx_runtime_1.jsx)("div", { style: { paddingBottom: KANBAN_CARD_GAP, paddingTop: index === 0 ? KANBAN_LIST_TOP_PAD : 0 }, children: (0, jsx_runtime_1.jsx)(MeasuredItem_1.default, { index: index, setSize: (i, h) => setSize(i, h, colId), children: (0, jsx_runtime_1.jsx)(dnd_1.Draggable, { draggableId: account.id.toString(), index: index, isDragDisabled: !canDrag, children: (provided) => ((0, jsx_runtime_1.jsx)(react_2.Box, { ref: provided.innerRef, ...provided.draggableProps, ...provided.dragHandleProps, "aria-label": getCardAccessibleName(account), style: provided.draggableProps.style, borderRadius: "lg", sx: (0, focusRing_styles_1.focusVisibleStyles)(rowColors), children: (0, jsx_runtime_1.jsx)(KanbanCardBody, { account: account, index: index, colId: colId, canDelete: canDelete, onDelete: onDelete, onOpen: onOpen, expandedStore: expandedStore, toggleExpand: toggleExpand }) })) }, account.id) }) }) }));
89
101
  });
90
102
  const NoItemsTemplate = react_1.default.memo(({ column, noItems, colors }) => ((0, jsx_runtime_1.jsx)(react_2.Box, { children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { flexDirection: "column", alignItems: "center", justifyContent: "center", gap: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", color: colors.text[600], textAlign: "center", mt: 4, children: (noItems === null || noItems === void 0 ? void 0 : noItems.text) || "No items in this column" }), !(noItems === null || noItems === void 0 ? void 0 : noItems.isEmptyTextOnly) && ((0, jsx_runtime_1.jsx)(Button_1.default, { onClick: () => { var _a; return (_a = noItems === null || noItems === void 0 ? void 0 : noItems.onClick) === null || _a === void 0 ? void 0 : _a.call(noItems, column); }, size: "xs", children: (noItems === null || noItems === void 0 ? void 0 : noItems.buttonText) || "Add Item" }))] }) })));
91
103
  function reorderColumnEntries(entries, startIndex, endIndex) {
@@ -135,20 +147,21 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
135
147
  kanbanPreferencesJsonRef.current = kanbanPreferencesJson;
136
148
  const isBoardLoading = isLoading || (Boolean(preferences.baseurl) && preferencesLoading);
137
149
  const [columns, setColumns] = (0, react_1.useState)(mergedColumns);
150
+ const [adoptedColumns, setAdoptedColumns] = (0, react_1.useState)(mergedColumns);
138
151
  const [viewportHeight, setViewportHeight] = (0, react_1.useState)(600);
139
152
  const [measuredHeight, setMeasuredHeight] = (0, react_1.useState)(0);
140
- const [hoveredColumn, setHoveredColumn] = (0, react_1.useState)(null);
141
- (0, react_1.useEffect)(() => {
153
+ const [hoveredColumn] = (0, react_1.useState)(() => (0, boardStore_1.createBoardStore)(null));
154
+ if (adoptedColumns !== mergedColumns) {
155
+ setAdoptedColumns(mergedColumns);
142
156
  setColumns(mergedColumns);
143
- }, [mergedColumns]);
157
+ }
144
158
  // Responsive column width
145
159
  const columnWidth = (0, react_2.useBreakpointValue)({
146
160
  base: "16rem",
147
161
  md: "17.5rem",
148
162
  lg: "19rem",
149
163
  });
150
- // track expanded cards
151
- const [expanded, setExpanded] = (0, react_1.useState)({});
164
+ const [expandedStore] = (0, react_1.useState)(() => (0, boardStore_1.createBoardStore)({}));
152
165
  /** When true, column id maps to collapsed (body hidden). */
153
166
  const [collapsedColumns, setCollapsedColumns] = (0, react_1.useState)(() => ({ ...defaultCollapsedColumns }));
154
167
  const hasHydratedCollapsedFromPrefs = (0, react_1.useRef)(false);
@@ -329,14 +342,12 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
329
342
  // toggle expand/collapse — memoized so it doesn't bust `rowBaseProps`/itemData
330
343
  // every render (which would re-render every virtualized row).
331
344
  const toggleExpand = (0, react_1.useCallback)((id, colId, index) => {
332
- setExpanded((prev) => {
333
- const newExpanded = { ...prev, [id]: !prev[id] };
334
- if (listRefs.current[colId]) {
335
- listRefs.current[colId].resetAfterIndex(index);
336
- }
337
- return newExpanded;
338
- });
339
- }, []);
345
+ const expanded = expandedStore.get();
346
+ expandedStore.set({ ...expanded, [id]: !expanded[id] });
347
+ if (listRefs.current[colId]) {
348
+ listRefs.current[colId].resetAfterIndex(index);
349
+ }
350
+ }, [expandedStore]);
340
351
  // drag handler
341
352
  const onDragEnd = (0, react_1.useCallback)((result) => {
342
353
  const { source, destination, type } = result;
@@ -403,15 +414,14 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
403
414
  }, [columns, onColumnDelete]);
404
415
  const rowBaseProps = (0, react_1.useMemo)(() => ({
405
416
  canDrag,
406
- expanded,
417
+ expandedStore,
407
418
  onDelete,
408
419
  onOpen,
409
420
  canDelete,
410
421
  setSize,
411
422
  toggleExpand,
412
- }), [canDrag, expanded, onDelete, onOpen, canDelete, setSize, toggleExpand]);
413
- // Stable per-column itemData so unrelated board re-renders (e.g. column hover)
414
- // don't change the reference react-window hands to every row → no row re-renders.
423
+ }), [canDrag, expandedStore, onDelete, onOpen, canDelete, setSize, toggleExpand]);
424
+ // Stable per-column itemData, so unrelated board re-renders don't re-render every virtualized row.
415
425
  const itemDataByCol = (0, react_1.useMemo)(() => {
416
426
  const map = {};
417
427
  for (const [colId, column] of Object.entries(columns)) {
@@ -422,28 +432,25 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
422
432
  const renderColumnDroppable = (colId, column, columnDragHandleProps, isColCollapsed) => {
423
433
  const shouldVirtualize = virtualization !== null && virtualization !== void 0 ? virtualization : column.items.length > KANBAN_VIRTUALIZE_THRESHOLD;
424
434
  return ((0, jsx_runtime_1.jsx)(dnd_1.Droppable, { droppableId: colId, mode: shouldVirtualize ? "virtual" : "standard", renderClone: (provided, _snapshot, rubric) => {
425
- var _a;
426
435
  const item = column.items[rubric.source.index];
427
436
  return ((0, jsx_runtime_1.jsx)(react_2.Box, { ref: provided.innerRef, ...provided.draggableProps, ...provided.dragHandleProps, "aria-label": item ? getCardAccessibleName(item) : undefined, style: {
428
437
  ...provided.draggableProps.style,
429
438
  width: columnWidth,
430
439
  paddingBottom: KANBAN_CARD_GAP,
431
- }, borderRadius: "lg", sx: (0, focusRing_styles_1.focusVisibleStyles)(colors), children: (item === null || item === void 0 ? void 0 : item.customNode) ? (_a = item === null || item === void 0 ? void 0 : item.customNode) === null || _a === void 0 ? void 0 : _a.call(item) : ((0, jsx_runtime_1.jsx)(AccountCard_1.default, { account: item, index: rubric.source.index, onDelete: onDelete, onOpen: onOpen, isExpanded: expanded[item.id], onToggleExpand: () => toggleExpand(item.id, colId, rubric.source.index), isDeletable: canDelete }, item.id)) }));
440
+ }, borderRadius: "lg", sx: (0, focusRing_styles_1.focusVisibleStyles)(colors), children: (0, jsx_runtime_1.jsx)(KanbanCardBody, { account: item, index: rubric.source.index, colId: colId, canDelete: canDelete, onDelete: onDelete, onOpen: onOpen, expandedStore: expandedStore, toggleExpand: toggleExpand }) }));
432
441
  }, children: (provided, snapshot) => {
433
442
  var _a, _b, _c, _d, _e, _f, _g;
434
443
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { ref: provided.innerRef, ...provided.droppableProps, width: isColCollapsed ? COLLAPSED_KANBAN_COLUMN_WIDTH : columnWidth, borderRadius: "xl", background: snapshot.isDraggingOver
435
444
  ? colors.primary[50]
436
- : colors.background[100], border: `0.063rem ${snapshot.isDraggingOver ? "dashed" : "solid"} ${snapshot.isDraggingOver
445
+ : colors.background[100], border: `${borderWidths_1.BORDER_WIDTHS.hairline} ${snapshot.isDraggingOver ? "dashed" : "solid"} ${snapshot.isDraggingOver
437
446
  ? colors.primary[300]
438
- : colors.boxborder[200]}`, transition: COLUMN_TRANSITION, display: "flex", flexDirection: "column", flexShrink: 0, overflow: isColCollapsed ? "visible" : "hidden", height: COLUMN_HEIGHT, sx: (0, motion_2.reducedMotionSx)(), onMouseEnter: () => setHoveredColumn(colId), onMouseLeave: () => setHoveredColumn(null), onFocus: () => setHoveredColumn(colId), onBlur: (e) => {
447
+ : colors.boxborder[200]}`, transition: COLUMN_TRANSITION, display: "flex", flexDirection: "column", flexShrink: 0, overflow: isColCollapsed ? "visible" : "hidden", height: COLUMN_HEIGHT, sx: (0, motion_2.reducedMotionSx)(), onMouseEnter: () => hoveredColumn.set(colId), onMouseLeave: () => hoveredColumn.set(null), onFocus: () => hoveredColumn.set(colId), onBlur: (e) => {
439
448
  if (!e.currentTarget.contains(e.relatedTarget))
440
- setHoveredColumn(null);
441
- }, children: [isColCollapsed ? ((0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "stretch", flex: "1", width: "100%", minH: 0, overflow: "visible", position: "relative", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { as: "header", direction: "column", align: "center", flexShrink: 0, width: "100%", py: 3, px: 1, gap: 3, borderTop: "0.25rem solid", borderTopColor: (_a = column.color) !== null && _a !== void 0 ? _a : colors.primary[500], bg: colors.background[100], position: "relative", zIndex: 1, children: [enableColumnReorder && columnDragHandleProps ? ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", flexShrink: 0, cursor: "grab", ...columnDragHandleProps, "aria-label": `Reorder ${column.title} column`, children: (0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.GripVertical, size: 14, color: colors.textMuted }) })) : null, enableColumnCollapse && ((0, jsx_runtime_1.jsx)(react_2.Flex, { flexShrink: 0, w: "100%", justify: "center", bg: colors.background[100], position: "relative", zIndex: 3, children: (0, jsx_runtime_1.jsx)(react_2.IconButton, { "aria-label": "Expand column", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 14 }), variant: "ghost", size: "xs", minW: "1.5rem", h: "1.75rem", onClick: () => toggleColumnCollapsed(colId) }) })), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", fontWeight: "700", fontSize: "0.75rem", color: colors.text[700], sx: {
449
+ hoveredColumn.set(null);
450
+ }, children: [isColCollapsed ? ((0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "stretch", flex: "1", width: "100%", minH: 0, overflow: "visible", position: "relative", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { as: "header", direction: "column", align: "center", flexShrink: 0, width: "100%", py: 3, px: 1, gap: 3, borderTop: "0.25rem solid", borderTopColor: (_a = column.color) !== null && _a !== void 0 ? _a : colors.primary[500], bg: colors.background[100], position: "relative", zIndex: 1, children: [enableColumnReorder && columnDragHandleProps ? ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", flexShrink: 0, cursor: "grab", ...columnDragHandleProps, "aria-label": `Reorder ${column.title} column`, children: (0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.GripVertical, size: 14, color: colors.textMuted }) })) : null, enableColumnCollapse && ((0, jsx_runtime_1.jsx)(react_2.Flex, { flexShrink: 0, w: "100%", justify: "center", bg: colors.background[100], position: "relative", zIndex: 3, children: (0, jsx_runtime_1.jsx)(react_2.IconButton, { "aria-label": "Expand column", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 14 }), variant: "ghost", size: "xs", minW: "1.5rem", h: "1.75rem", onClick: () => toggleColumnCollapsed(colId) }) })), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", fontWeight: "700", fontSize: "xs", color: colors.text[700], sx: {
442
451
  writingMode: "vertical-rl",
443
452
  textOrientation: "mixed",
444
- }, maxH: `${Math.max(120, containerHeight - 200)}px`, overflow: "hidden", lineHeight: "1.2", title: column.title, children: column.title }), (0, jsx_runtime_1.jsx)(react_2.Badge, { minW: 5, h: 5, borderRadius: "full", border: "0.063rem solid", borderColor: colors.boxborder[200], display: "flex", backgroundColor: colors.background[100], alignItems: "center", justifyContent: "center", color: colors.text[900], fontWeight: 600, fontSize: "xs", children: (_b = column === null || column === void 0 ? void 0 : column.items) === null || _b === void 0 ? void 0 : _b.length })] }), column.customNode ? ((0, jsx_runtime_1.jsx)(react_2.Box, { flexShrink: 0, minH: COLLAPSED_CUSTOM_NODE_TOP_RESERVE, w: "100%", bg: colors.background[100], "aria-hidden": true })) : null, column.customNode ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "section", "aria-label": "Column summary", flex: "1", minH: 0, w: "100%", overflow: "visible", py: 2, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "flex-start", bg: colors.background[100], position: "relative", zIndex: 2, children: (0, jsx_runtime_1.jsx)(react_2.Box, { position: "relative", transform: "rotate(90deg)", transformOrigin: "center center", marginTop: '1rem', children: (0, jsx_runtime_1.jsx)(react_2.VStack, { align: "stretch", spacing: 1, minW: "max-content", fontSize: "xs", color: colors.text[600], children: column.customNode() }) }) })) : ((0, jsx_runtime_1.jsx)(react_2.Box, { flex: "1", minH: 0 }))] })) : ((0, jsx_runtime_1.jsxs)(react_2.Flex, { width: "100%", h: !isColCollapsed && !!((_c = column.customNode) === null || _c === void 0 ? void 0 : _c.call(column)) ? "auto" : "2.75rem", align: !isColCollapsed && !!((_d = column.customNode) === null || _d === void 0 ? void 0 : _d.call(column)) ? "flex-start" : "center", px: 3, py: 2, flexShrink: 0, justifyContent: "space-between", position: "relative", gap: 2, borderBottom: `0.063rem solid ${colors.boxborder[200]}`, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", gap: 1, minW: 0, flex: "1", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, minW: 0, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { boxSize: 2.5, borderRadius: "full", bg: (_e = column.color) !== null && _e !== void 0 ? _e : colors.primary[500], flexShrink: 0 }), enableColumnReorder && columnDragHandleProps ? ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", flexShrink: 0, cursor: "grab", ...columnDragHandleProps, "aria-label": `Reorder ${column.title} column`, children: (0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.GripVertical, size: 14, color: colors.textMuted }) })) : null, (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", fontWeight: "600", fontSize: "0.875rem", color: colors.text[700], noOfLines: 1, minW: 0, children: (0, jsx_runtime_1.jsx)(OverflowTooltipText_1.default, { placement: "top", children: column.title }) })] }), column.customNode ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "section", "aria-label": "Column summary", width: "100%", flexShrink: 0, fontSize: "xs", color: colors.text[600], children: (_f = column.customNode) === null || _f === void 0 ? void 0 : _f.call(column) })) : null] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { display: "flex", alignItems: "center", gap: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Badge, { minW: 6, h: 6, px: 2, borderRadius: "full", backgroundColor: colors.backgroundColor.subtle, display: "flex", alignItems: "center", justifyContent: "center", color: colors.text[500], fontWeight: 600, fontSize: "xs", children: (_g = column === null || column === void 0 ? void 0 : column.items) === null || _g === void 0 ? void 0 : _g.length }), enableColumnCollapse && ((0, jsx_runtime_1.jsx)(react_2.IconButton, { "aria-label": "Collapse column", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { size: 14 }), variant: "ghost", size: "xs", minW: "1.5rem", h: "1.75rem", flexShrink: 0, onClick: () => toggleColumnCollapsed(colId) })), canDelete &&
445
- hoveredColumn === colId &&
446
- column.items.length > 0 ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "button", type: "button", "aria-label": `Delete all cards in ${column.title}`, display: "inline-flex", alignItems: "center", justifyContent: "center", boxSize: 4, borderRadius: "sm", cursor: "pointer", color: colors.text[600], _hover: { color: colors.semanticText.error }, onClick: () => handleColumnDelete(colId), transition: (0, motion_1.transitionFor)(["color"]), sx: { ...(0, focusRing_styles_1.focusVisibleStyles)(colors), ...(0, motion_2.reducedMotionSx)() }, flexShrink: 0, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Trash2, { size: 16 }) })) : ((0, jsx_runtime_1.jsx)(react_2.Box, { boxSize: 4, flexShrink: 0 }))] })] })), !isColCollapsed && ((0, jsx_runtime_1.jsxs)(react_2.Box, { px: 2, flex: "1", overflowY: "auto", width: "100%", sx: {
453
+ }, maxH: `${Math.max(120, containerHeight - 200)}px`, overflow: "hidden", lineHeight: "1.2", title: column.title, children: column.title }), (0, jsx_runtime_1.jsx)(react_2.Badge, { minW: 5, h: 5, borderRadius: "full", border: `${borderWidths_1.BORDER_WIDTHS.hairline} solid`, borderColor: colors.boxborder[200], display: "flex", backgroundColor: colors.background[100], alignItems: "center", justifyContent: "center", color: colors.text[900], fontWeight: 600, fontSize: "xs", children: (_b = column === null || column === void 0 ? void 0 : column.items) === null || _b === void 0 ? void 0 : _b.length })] }), column.customNode ? ((0, jsx_runtime_1.jsx)(react_2.Box, { flexShrink: 0, minH: COLLAPSED_CUSTOM_NODE_TOP_RESERVE, w: "100%", bg: colors.background[100], "aria-hidden": true })) : null, column.customNode ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "section", "aria-label": "Column summary", flex: "1", minH: 0, w: "100%", overflow: "visible", py: 2, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "flex-start", bg: colors.background[100], position: "relative", zIndex: 2, children: (0, jsx_runtime_1.jsx)(react_2.Box, { position: "relative", transform: "rotate(90deg)", transformOrigin: "center center", marginTop: '1rem', children: (0, jsx_runtime_1.jsx)(react_2.VStack, { align: "stretch", spacing: 1, minW: "max-content", fontSize: "xs", color: colors.text[600], children: column.customNode() }) }) })) : ((0, jsx_runtime_1.jsx)(react_2.Box, { flex: "1", minH: 0 }))] })) : ((0, jsx_runtime_1.jsxs)(react_2.Flex, { width: "100%", h: !isColCollapsed && !!((_c = column.customNode) === null || _c === void 0 ? void 0 : _c.call(column)) ? "auto" : "2.75rem", align: !isColCollapsed && !!((_d = column.customNode) === null || _d === void 0 ? void 0 : _d.call(column)) ? "flex-start" : "center", px: 3, py: 2, flexShrink: 0, justifyContent: "space-between", position: "relative", gap: 2, borderBottom: `${borderWidths_1.BORDER_WIDTHS.hairline} solid ${colors.boxborder[200]}`, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", gap: 1, minW: 0, flex: "1", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, minW: 0, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { boxSize: 2.5, borderRadius: "full", bg: (_e = column.color) !== null && _e !== void 0 ? _e : colors.primary[500], flexShrink: 0 }), enableColumnReorder && columnDragHandleProps ? ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", flexShrink: 0, cursor: "grab", ...columnDragHandleProps, "aria-label": `Reorder ${column.title} column`, children: (0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.GripVertical, size: 14, color: colors.textMuted }) })) : null, (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", fontWeight: "600", fontSize: "sm", color: colors.text[700], noOfLines: 1, minW: 0, children: (0, jsx_runtime_1.jsx)(OverflowTooltipText_1.default, { placement: "top", children: column.title }) })] }), column.customNode ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "section", "aria-label": "Column summary", width: "100%", flexShrink: 0, fontSize: "xs", color: colors.text[600], children: (_f = column.customNode) === null || _f === void 0 ? void 0 : _f.call(column) })) : null] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { display: "flex", alignItems: "center", gap: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Badge, { minW: 6, h: 6, px: 2, borderRadius: "full", backgroundColor: colors.backgroundColor.subtle, display: "flex", alignItems: "center", justifyContent: "center", color: colors.text[500], fontWeight: 600, fontSize: "xs", children: (_g = column === null || column === void 0 ? void 0 : column.items) === null || _g === void 0 ? void 0 : _g.length }), enableColumnCollapse && ((0, jsx_runtime_1.jsx)(react_2.IconButton, { "aria-label": "Collapse column", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { size: 14 }), variant: "ghost", size: "xs", minW: "1.5rem", h: "1.75rem", flexShrink: 0, onClick: () => toggleColumnCollapsed(colId) })), canDelete && column.items.length > 0 ? ((0, jsx_runtime_1.jsx)(ColumnDeleteAll, { colId: colId, title: column.title, hoveredColumn: hoveredColumn, colors: colors, onDelete: handleColumnDelete })) : ((0, jsx_runtime_1.jsx)(react_2.Box, { boxSize: 4, flexShrink: 0 }))] })] })), !isColCollapsed && ((0, jsx_runtime_1.jsxs)(react_2.Box, { px: 2, flex: "1", overflowY: "auto", width: "100%", sx: {
447
454
  ...(0, scrollbar_1.scrollbarStyles)(colors),
448
455
  overflowY: "auto",
449
456
  overflowX: "hidden",
@@ -453,10 +460,7 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
453
460
  if (el)
454
461
  listRefs.current[colId] = el;
455
462
  }, height: Math.max(MIN_LIST_HEIGHT, containerHeight - 150), itemCount: column.items.length +
456
- (snapshot.isUsingPlaceholder ? 1 : 0), itemSize: (index) => getItemSize(index, column.items, colId), width: "100%", itemData: itemDataByCol[colId], children: KanbanRow })) : ((0, jsx_runtime_1.jsxs)(react_2.Box, { children: [column.items.map((account, index) => ((0, jsx_runtime_1.jsx)("div", { style: { paddingBottom: KANBAN_CARD_GAP, paddingTop: index === 0 ? KANBAN_LIST_TOP_PAD : 0 }, children: (0, jsx_runtime_1.jsx)(dnd_1.Draggable, { draggableId: account.id.toString(), index: index, isDragDisabled: !canDrag, children: (dragProvided) => {
457
- var _a;
458
- return ((0, jsx_runtime_1.jsx)(react_2.Box, { ref: dragProvided.innerRef, ...dragProvided.draggableProps, ...dragProvided.dragHandleProps, "aria-label": getCardAccessibleName(account), style: dragProvided.draggableProps.style, borderRadius: "lg", sx: (0, focusRing_styles_1.focusVisibleStyles)(colors), children: (account === null || account === void 0 ? void 0 : account.customNode) ? (_a = account === null || account === void 0 ? void 0 : account.customNode) === null || _a === void 0 ? void 0 : _a.call(account) : ((0, jsx_runtime_1.jsx)(AccountCard_1.default, { account: account, index: index, onDelete: onDelete, onOpen: onOpen, isExpanded: expanded[account.id], onToggleExpand: () => toggleExpand(account.id, colId, index), isDeletable: canDelete })) }));
459
- } }, account.id) }, account.id))), provided.placeholder] }))] }))] }));
463
+ (snapshot.isUsingPlaceholder ? 1 : 0), itemSize: (index) => getItemSize(index, column.items, colId), width: "100%", itemData: itemDataByCol[colId], children: KanbanRow })) : ((0, jsx_runtime_1.jsxs)(react_2.Box, { children: [column.items.map((account, index) => ((0, jsx_runtime_1.jsx)("div", { style: { paddingBottom: KANBAN_CARD_GAP, paddingTop: index === 0 ? KANBAN_LIST_TOP_PAD : 0 }, children: (0, jsx_runtime_1.jsx)(dnd_1.Draggable, { draggableId: account.id.toString(), index: index, isDragDisabled: !canDrag, children: (dragProvided) => ((0, jsx_runtime_1.jsx)(react_2.Box, { ref: dragProvided.innerRef, ...dragProvided.draggableProps, ...dragProvided.dragHandleProps, "aria-label": getCardAccessibleName(account), style: dragProvided.draggableProps.style, borderRadius: "lg", sx: (0, focusRing_styles_1.focusVisibleStyles)(colors), children: (0, jsx_runtime_1.jsx)(KanbanCardBody, { account: account, index: index, colId: colId, canDelete: canDelete, onDelete: onDelete, onOpen: onOpen, expandedStore: expandedStore, toggleExpand: toggleExpand }) })) }, account.id) }, account.id))), provided.placeholder] }))] }))] }));
460
464
  } }, colId));
461
465
  };
462
466
  if (!canView)
@@ -464,7 +468,20 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
464
468
  const showAddColumn = Boolean(customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.isVisible);
465
469
  const hasAnyColumns = Object.keys(columns).length > 0;
466
470
  const flexScrollSx = (0, scrollbar_1.scrollbarStyles)(colors);
467
- const addColumnBox = !isBoardLoading && showAddColumn && hasAnyColumns && ((0, jsx_runtime_1.jsx)(react_2.Box, { width: columnWidth, borderRadius: "lg", border: `0.125rem dashed ${colors.boxborder[500]}`, bg: colors.background[100], flexShrink: 0, height: COLUMN_HEIGHT, display: "flex", alignItems: "center", justifyContent: "center", cursor: "pointer", _hover: { borderColor: colors.primary[500] }, onClick: () => { var _a; return (_a = customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.onAddColumn) === null || _a === void 0 ? void 0 : _a.call(customizeColumn); }, children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "center", gap: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.Plus, size: 20, color: colors.text[700] }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", color: colors.text[600], children: (customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.buttonText) || "Add column" })] }) }));
471
+ const addColumn = () => { var _a; return (_a = customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.onAddColumn) === null || _a === void 0 ? void 0 : _a.call(customizeColumn); };
472
+ const addColumnKeyboard = {
473
+ role: "button",
474
+ tabIndex: 0,
475
+ sx: (0, focusRing_styles_1.focusVisibleStyles)(colors),
476
+ onClick: addColumn,
477
+ onKeyDown: (e) => {
478
+ if (e.key !== "Enter" && e.key !== " ")
479
+ return;
480
+ e.preventDefault();
481
+ addColumn();
482
+ },
483
+ };
484
+ const addColumnBox = !isBoardLoading && showAddColumn && hasAnyColumns && ((0, jsx_runtime_1.jsx)(react_2.Box, { width: columnWidth, borderRadius: "lg", border: `0.125rem dashed ${colors.boxborder[500]}`, bg: colors.background[100], flexShrink: 0, height: COLUMN_HEIGHT, display: "flex", alignItems: "center", justifyContent: "center", cursor: "pointer", _hover: { borderColor: colors.primary[500] }, ...addColumnKeyboard, children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "center", gap: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.Plus, size: 20, color: colors.text[700] }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", color: colors.text[600], children: (customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.buttonText) || "Add column" })] }) }));
468
485
  const columnsList = Object.entries(columns).map(([colId, column], colIndex) => {
469
486
  const isColCollapsed = enableColumnCollapse && Boolean(collapsedColumns[colId]);
470
487
  if (enableColumnReorder) {
@@ -475,7 +492,7 @@ const KanbanBoard = ({ data, customColumns, customizeColumn, onDrag, onDelete, o
475
492
  }
476
493
  return renderColumnDroppable(colId, column, null, isColCollapsed);
477
494
  });
478
- const loadingSkeletonRow = Array.from({ length: 4 }).map((_, idx) => ((0, jsx_runtime_1.jsxs)(react_2.Box, { "aria-hidden": true, width: columnWidth, borderRadius: "xl", bg: colors.background[100], border: `0.063rem solid ${colors.boxborder[200]}`, flexShrink: 0, alignSelf: "flex-start", overflow: "hidden", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { h: "2.75rem", align: "center", gap: 2, px: 3, borderBottom: `0.063rem solid ${colors.boxborder[200]}`, children: [(0, jsx_runtime_1.jsx)(react_2.SkeletonCircle, { size: "2.5" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 3, w: "40%", borderRadius: "sm" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 6, w: 6, ml: "auto", borderRadius: "full" })] }), (0, jsx_runtime_1.jsx)(react_2.Flex, { direction: "column", gap: 3, px: 2, pt: 1.5, pb: 3, children: SKELETON_ROWS.slice(0, 3 - (idx % 2)).map((rows, i) => ((0, jsx_runtime_1.jsx)(CardSkeleton, { colors: colors, rows: rows }, i))) })] }, idx)));
479
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(HeaderActions_1.default, { select: kanbanSelect, edit: canDrag ? kanbanEdit : undefined, create: canCreate ? kanbanCreate : undefined }), (0, jsx_runtime_1.jsx)(dnd_1.DragDropContext, { onDragEnd: onDragEnd, children: (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: containerRef, "data-testid": "kanban-board", "aria-busy": isBoardLoading || undefined, bg: colors.backgroundColor.main, h: height !== null && height !== void 0 ? height : `${viewportHeight}px`, maxH: maxH, position: "relative", overflow: "hidden", mt: 2, children: [showAddColumn && !isBoardLoading && !hasAnyColumns && ((0, jsx_runtime_1.jsx)(react_2.Flex, { position: "absolute", inset: 0, align: "center", justify: "center", pointerEvents: "none", zIndex: 1, children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "center", justify: "center", gap: 2, pointerEvents: "auto", cursor: "pointer", px: 6, py: 5, borderRadius: "lg", bg: colors.background[100], border: `0.125rem dashed ${colors.boxborder[500]}`, _hover: { borderColor: colors.primary[500] }, onClick: () => { var _a; return (_a = customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.onAddColumn) === null || _a === void 0 ? void 0 : _a.call(customizeColumn); }, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.Plus, size: 20, color: colors.text[700] }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", color: colors.text[600], children: (customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.buttonText) || "Add column" })] }) })), isBoardLoading ? ((0, jsx_runtime_1.jsx)(react_2.Flex, { role: "status", "aria-label": "Loading board", gap: 4, p: 4, pb: 6, overflowX: "auto", overflowY: "hidden", height: "100%", sx: flexScrollSx, children: loadingSkeletonRow })) : enableColumnReorder ? ((0, jsx_runtime_1.jsx)(dnd_1.Droppable, { droppableId: "COLUMN_REORDER", direction: "horizontal", type: "COLUMN", children: (colReorderProvided) => ((0, jsx_runtime_1.jsxs)(react_2.Flex, { ref: colReorderProvided.innerRef, ...colReorderProvided.droppableProps, gap: 4, p: 4, pb: 6, overflowX: "auto", overflowY: "hidden", height: "100%", sx: flexScrollSx, children: [columnsList, colReorderProvided.placeholder, addColumnBox] })) })) : ((0, jsx_runtime_1.jsxs)(react_2.Flex, { gap: 4, p: 4, pb: 6, overflowX: "auto", overflowY: "hidden", height: "100%", sx: flexScrollSx, children: [columnsList, addColumnBox] }))] }) })] }));
495
+ const loadingSkeletonRow = Array.from({ length: 4 }).map((_, idx) => ((0, jsx_runtime_1.jsxs)(react_2.Box, { "aria-hidden": true, width: columnWidth, borderRadius: "xl", bg: colors.background[100], border: `${borderWidths_1.BORDER_WIDTHS.hairline} solid ${colors.boxborder[200]}`, flexShrink: 0, alignSelf: "flex-start", overflow: "hidden", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { h: "2.75rem", align: "center", gap: 2, px: 3, borderBottom: `${borderWidths_1.BORDER_WIDTHS.hairline} solid ${colors.boxborder[200]}`, children: [(0, jsx_runtime_1.jsx)(react_2.SkeletonCircle, { size: "2.5" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 3, w: "40%", borderRadius: "sm" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { h: 6, w: 6, ml: "auto", borderRadius: "full" })] }), (0, jsx_runtime_1.jsx)(react_2.Flex, { direction: "column", gap: 3, px: 2, pt: 1.5, pb: 3, children: SKELETON_ROWS.slice(0, 3 - (idx % 2)).map((rows, i) => ((0, jsx_runtime_1.jsx)(CardSkeleton, { colors: colors, rows: rows }, i))) })] }, idx)));
496
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(HeaderActions_1.default, { select: kanbanSelect, edit: canDrag ? kanbanEdit : undefined, create: canCreate ? kanbanCreate : undefined }), (0, jsx_runtime_1.jsx)(dnd_1.DragDropContext, { onDragEnd: onDragEnd, children: (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: containerRef, "data-testid": "kanban-board", "aria-busy": isBoardLoading || undefined, bg: colors.backgroundColor.main, h: height !== null && height !== void 0 ? height : `${viewportHeight}px`, maxH: maxH, position: "relative", overflow: "hidden", mt: 2, children: [showAddColumn && !isBoardLoading && !hasAnyColumns && ((0, jsx_runtime_1.jsx)(react_2.Flex, { position: "absolute", inset: 0, align: "center", justify: "center", pointerEvents: "none", zIndex: 1, children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "center", justify: "center", gap: 2, pointerEvents: "auto", cursor: "pointer", px: 6, py: 5, borderRadius: "lg", bg: colors.background[100], border: `0.125rem dashed ${colors.boxborder[500]}`, _hover: { borderColor: colors.primary[500] }, ...addColumnKeyboard, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: lucide_react_1.Plus, size: 20, color: colors.text[700] }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", color: colors.text[600], children: (customizeColumn === null || customizeColumn === void 0 ? void 0 : customizeColumn.buttonText) || "Add column" })] }) })), isBoardLoading ? ((0, jsx_runtime_1.jsx)(react_2.Flex, { role: "status", "aria-label": "Loading board", gap: 4, p: 4, pb: 6, overflowX: "auto", overflowY: "hidden", height: "100%", sx: flexScrollSx, children: loadingSkeletonRow })) : enableColumnReorder ? ((0, jsx_runtime_1.jsx)(dnd_1.Droppable, { droppableId: "COLUMN_REORDER", direction: "horizontal", type: "COLUMN", children: (colReorderProvided) => ((0, jsx_runtime_1.jsxs)(react_2.Flex, { ref: colReorderProvided.innerRef, ...colReorderProvided.droppableProps, gap: 4, p: 4, pb: 6, overflowX: "auto", overflowY: "hidden", height: "100%", sx: flexScrollSx, children: [columnsList, colReorderProvided.placeholder, addColumnBox] })) })) : ((0, jsx_runtime_1.jsxs)(react_2.Flex, { gap: 4, p: 4, pb: 6, overflowX: "auto", overflowY: "hidden", height: "100%", sx: flexScrollSx, children: [columnsList, addColumnBox] }))] }) })] }));
480
497
  };
481
498
  exports.default = KanbanBoard;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const react_1 = require("react");
5
+ const sharedResizeObserver_1 = require("../../Hooks/sharedResizeObserver");
5
6
  /** Wraps one virtualized row to report its rendered height to KanbanBoard's row-size cache; not exported, virtualization-only. */
6
7
  const MeasuredItem = ({ index, setSize, children, }) => {
7
8
  const ref = (0, react_1.useRef)(null);
@@ -26,23 +27,14 @@ const MeasuredItem = ({ index, setSize, children, }) => {
26
27
  measure();
27
28
  // A second measure after paint catches any layout that finishes after the synchronous tick (font loads, async CSS, etc).
28
29
  const raf = requestAnimationFrame(measure);
29
- let ro;
30
- if (typeof ResizeObserver !== "undefined" && element) {
31
- ro = new ResizeObserver(() => {
32
- measure();
33
- });
34
- ro.observe(element);
35
- }
36
- else {
30
+ const unobserve = typeof ResizeObserver !== "undefined" && element ? (0, sharedResizeObserver_1.observeResize)(element, measure) : undefined;
31
+ if (!unobserve)
37
32
  window.addEventListener("resize", measure);
38
- }
39
33
  return () => {
40
34
  cancelAnimationFrame(raf);
41
- // disconnect, not unobserve — the observer itself has to be released, or a board that
42
- // remounts cards as it scrolls leaves one behind per card.
43
- if (ro)
44
- ro.disconnect();
45
- if (!ro)
35
+ if (unobserve)
36
+ unobserve();
37
+ else
46
38
  window.removeEventListener("resize", measure);
47
39
  };
48
40
  }, []);
@@ -0,0 +1,8 @@
1
+ export type BoardStore<T> = {
2
+ get: () => T;
3
+ set: (next: T) => void;
4
+ subscribe: (listener: () => void) => () => void;
5
+ };
6
+ /** Board-local state that only the components selecting a changed slice re-render for. */
7
+ export declare const createBoardStore: <T>(initial: T) => BoardStore<T>;
8
+ export declare const useBoardStore: <T, S>(store: BoardStore<T>, select: (value: T) => S) => S;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBoardStore = exports.createBoardStore = void 0;
4
+ const react_1 = require("react");
5
+ /** Board-local state that only the components selecting a changed slice re-render for. */
6
+ const createBoardStore = (initial) => {
7
+ let value = initial;
8
+ const listeners = new Set();
9
+ return {
10
+ get: () => value,
11
+ set: (next) => {
12
+ if (Object.is(next, value))
13
+ return;
14
+ value = next;
15
+ listeners.forEach((listener) => listener());
16
+ },
17
+ subscribe: (listener) => {
18
+ listeners.add(listener);
19
+ return () => {
20
+ listeners.delete(listener);
21
+ };
22
+ },
23
+ };
24
+ };
25
+ exports.createBoardStore = createBoardStore;
26
+ const useBoardStore = (store, select) => (0, react_1.useSyncExternalStore)(store.subscribe, () => select(store.get()));
27
+ exports.useBoardStore = useBoardStore;
@@ -20,7 +20,7 @@ exports.detectApple = detectApple;
20
20
  /** One keyboard key cap; decorative hint rows should wrap it in `aria-hidden`. */
21
21
  const Kbd = ({ children, size = "sm", "data-testid": testId }) => {
22
22
  const { colors } = (0, useCustomTheme_1.useCustomTheme)();
23
- return ((0, jsx_runtime_1.jsx)(react_1.Box, { as: "kbd", "data-testid": testId, display: "inline-flex", alignItems: "center", justifyContent: "center", minW: HEIGHT[size], h: HEIGHT[size], px: 1.5, fontFamily: "inherit", fontSize: "0.6875rem", fontWeight: 600, lineHeight: 1, whiteSpace: "nowrap", borderWidth: "1px", borderColor: colors.boxborder[200], borderRadius: "base", bg: colors.backgroundColor.subtle, color: colors.textMuted, children: children }));
23
+ return ((0, jsx_runtime_1.jsx)(react_1.Box, { as: "kbd", "data-testid": testId, display: "inline-flex", alignItems: "center", justifyContent: "center", minW: HEIGHT[size], h: HEIGHT[size], px: 1.5, fontFamily: "inherit", fontSize: "xs-minus", fontWeight: 600, lineHeight: 1, whiteSpace: "nowrap", borderWidth: "1px", borderColor: colors.boxborder[200], borderRadius: "base", bg: colors.backgroundColor.subtle, color: colors.textMuted, children: children }));
24
24
  };
25
25
  const KbdShortcut = ({ shortcut, size, isApple, "data-testid": testId }) => {
26
26
  const parts = shortcut.split("+").map((p) => p.trim()).filter(Boolean);
@@ -27,6 +27,6 @@ const LimitReachedModal = ({ isOpen, onClose, kind, limit = null, used = null, c
27
27
  // Header banner uses the brand gradient so it reads correctly across all 9 brands.
28
28
  const gradient = (0, gradientInk_1.resolveGradient)(colors.gradient, colors.white, colors.black);
29
29
  const ink = gradient.ink;
30
- return ((0, jsx_runtime_1.jsxs)(react_1.Modal, { isOpen: isOpen, onClose: onClose, isCentered: true, size: "lg", motionPreset: "slideInBottom", children: [(0, jsx_runtime_1.jsx)(react_1.ModalOverlay, {}), (0, jsx_runtime_1.jsxs)(react_1.ModalContent, { overflow: "hidden", boxShadow: "2xl", mx: 4, children: [(0, jsx_runtime_1.jsxs)(react_1.Box, { bgGradient: `linear(to-r, ${gradient.from}, ${gradient.to})`, color: ink, children: [(0, jsx_runtime_1.jsx)(react_1.ModalHeader, { color: "inherit", borderBottomWidth: 0, children: (0, jsx_runtime_1.jsxs)(react_1.Flex, { align: "center", children: [(0, jsx_runtime_1.jsx)(react_1.Icon, { as: KindIcon, boxSize: "24px", mr: "12px" }), (0, jsx_runtime_1.jsx)(react_1.Text, { fontSize: "xl", fontWeight: "bold", children: title !== null && title !== void 0 ? title : copy.title })] }) }), (0, jsx_runtime_1.jsx)(react_1.ModalCloseButton, { "aria-label": "Dismiss", color: ink, _hover: { opacity: 0.7 } })] }), (0, jsx_runtime_1.jsxs)(react_1.ModalBody, { py: 6, children: [(0, jsx_runtime_1.jsx)(react_1.Text, { textAlign: "center", fontSize: "md", fontWeight: 600, color: colors.text[700], children: message !== null && message !== void 0 ? message : copy.message }), usage && ((0, jsx_runtime_1.jsx)(react_1.Text, { textAlign: "center", fontSize: "sm", color: colors.textMuted, mt: 2, children: usage })), features && features.length > 0 && ((0, jsx_runtime_1.jsx)(react_1.List, { spacing: 2, mt: 5, children: features.map((feature) => ((0, jsx_runtime_1.jsxs)(react_1.ListItem, { display: "flex", alignItems: "center", fontSize: "sm", color: colors.text[600], children: [(0, jsx_runtime_1.jsx)(react_1.ListIcon, { as: lucide_react_1.CheckCircle, color: colors.semanticText.success }), feature] }, feature))) }))] }), (0, jsx_runtime_1.jsx)(react_1.ModalFooter, { children: (0, jsx_runtime_1.jsxs)(react_1.HStack, { spacing: 3, children: [(0, jsx_runtime_1.jsx)(Button_1.default, { label: canManageBilling ? "Maybe later" : "Close", variant: "outline", colorScheme: "gray", size: "md", onClick: onClose }), canManageBilling && ((0, jsx_runtime_1.jsx)(UpgradeButton_1.default, { label: "Upgrade plan", size: "md", onClick: () => onUpgrade === null || onUpgrade === void 0 ? void 0 : onUpgrade() }))] }) })] })] }));
30
+ return ((0, jsx_runtime_1.jsxs)(react_1.Modal, { isOpen: isOpen, onClose: onClose, isCentered: true, size: "lg", motionPreset: "slideInBottom", children: [(0, jsx_runtime_1.jsx)(react_1.ModalOverlay, {}), (0, jsx_runtime_1.jsxs)(react_1.ModalContent, { overflow: "hidden", boxShadow: "2xl", mx: 4, children: [(0, jsx_runtime_1.jsxs)(react_1.Box, { bgGradient: `linear(to-r, ${gradient.from}, ${gradient.to})`, color: ink, children: [(0, jsx_runtime_1.jsx)(react_1.ModalHeader, { color: "inherit", borderBottomWidth: 0, children: (0, jsx_runtime_1.jsxs)(react_1.Flex, { align: "center", children: [(0, jsx_runtime_1.jsx)(react_1.Icon, { as: KindIcon, boxSize: "24px", mr: "12px" }), (0, jsx_runtime_1.jsx)(react_1.Text, { fontSize: "xl", fontWeight: 700, children: title !== null && title !== void 0 ? title : copy.title })] }) }), (0, jsx_runtime_1.jsx)(react_1.ModalCloseButton, { "aria-label": "Dismiss", color: ink, _hover: { opacity: 0.7 } })] }), (0, jsx_runtime_1.jsxs)(react_1.ModalBody, { py: 6, children: [(0, jsx_runtime_1.jsx)(react_1.Text, { textAlign: "center", fontSize: "md", fontWeight: 600, color: colors.text[700], children: message !== null && message !== void 0 ? message : copy.message }), usage && ((0, jsx_runtime_1.jsx)(react_1.Text, { textAlign: "center", fontSize: "sm", color: colors.textMuted, mt: 2, children: usage })), features && features.length > 0 && ((0, jsx_runtime_1.jsx)(react_1.List, { spacing: 2, mt: 5, children: features.map((feature) => ((0, jsx_runtime_1.jsxs)(react_1.ListItem, { display: "flex", alignItems: "center", fontSize: "sm", color: colors.text[600], children: [(0, jsx_runtime_1.jsx)(react_1.ListIcon, { as: lucide_react_1.CheckCircle, color: colors.semanticText.success }), feature] }, feature))) }))] }), (0, jsx_runtime_1.jsx)(react_1.ModalFooter, { children: (0, jsx_runtime_1.jsxs)(react_1.HStack, { spacing: 3, children: [(0, jsx_runtime_1.jsx)(Button_1.default, { label: canManageBilling ? "Maybe later" : "Close", variant: "outline", colorScheme: "gray", size: "md", onClick: onClose }), canManageBilling && ((0, jsx_runtime_1.jsx)(UpgradeButton_1.default, { label: "Upgrade plan", size: "md", onClick: () => onUpgrade === null || onUpgrade === void 0 ? void 0 : onUpgrade() }))] }) })] })] }));
31
31
  };
32
32
  exports.default = LimitReachedModal;
@@ -25,5 +25,5 @@ function Loading({ text, isLoading, onlytext, container, variant = "frosted", al
25
25
  if (!isLoading) {
26
26
  return null;
27
27
  }
28
- return ((0, jsx_runtime_1.jsx)(react_1.Box, { role: "status", "aria-live": "polite", "aria-busy": true, position: container ? "absolute" : "fixed", inset: "0", ...(0, overlay_styles_1.overlayScrimStyles)(colors), color: colors.white, display: "flex", alignItems: "center", justifyContent: "center", flexDirection: "column", gap: 3, zIndex: container ? "10" : "9999", children: onlytext ? ((0, jsx_runtime_1.jsx)(react_1.Text, { fontSize: "3.125rem", textTransform: "uppercase", fontWeight: 500, animation: `${pulse} 2s ease-in-out infinite`, sx: (0, motion_1.reducedMotionSx)(), children: text })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Spinner_1.default, { size: "lg", color: colors.white, label: text ? "" : "Loading" }), text && (0, jsx_runtime_1.jsx)(react_1.Text, { fontSize: "0.875rem", children: text })] })) }));
28
+ return ((0, jsx_runtime_1.jsx)(react_1.Box, { role: "status", "aria-live": "polite", "aria-busy": true, position: container ? "absolute" : "fixed", inset: "0", ...(0, overlay_styles_1.overlayScrimStyles)(colors), color: colors.white, display: "flex", alignItems: "center", justifyContent: "center", flexDirection: "column", gap: 3, zIndex: container ? "10" : "9999", children: onlytext ? ((0, jsx_runtime_1.jsx)(react_1.Text, { fontSize: "3.125rem", textTransform: "uppercase", fontWeight: 500, animation: `${pulse} 2s ease-in-out infinite`, sx: (0, motion_1.reducedMotionSx)(), children: text })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Spinner_1.default, { size: "lg", color: colors.white, label: text ? "" : "Loading" }), text && (0, jsx_runtime_1.jsx)(react_1.Text, { fontSize: "sm", children: text })] })) }));
29
29
  }
@@ -179,7 +179,7 @@ const MediaGallery = ({ media, layout = "auto", aspectRatio = "4/5", zoom = "lig
179
179
  const thumbRing = { gap: colors.background[50], ink: colors.header[900] };
180
180
  const thumbs = (width, height) => frames.map((frame, position) => ((0, jsx_runtime_1.jsx)(MediaThumb_1.default, { media: frame, label: labels.frame(position + 1, count, frame.alt), selected: position === current, onSelect: () => commit(position), width: width, height: height, ring: thumbRing }, frame.id)));
181
181
  const glassDots = (0, glass_1.glassStyles)(colors);
182
- const focusInset = { outline: "2px solid transparent", boxShadow: `inset 0 0 0 2px ${colors.focusRing.halo}, inset 0 0 0 4px ${colors.focusRing.ring}` };
182
+ const focusInset = { outline: "2px solid transparent", boxShadow: (0, focusRing_styles_1.insetFocusRingShadow)(colors) };
183
183
  const well = ((0, jsx_runtime_1.jsxs)(react_2.Box, { position: "relative", flex: 1, minW: 0, overflow: "hidden", isolation: "isolate", borderRadius: radius, bg: colors.background[100], sx: { aspectRatio: ratio }, "data-testid": "media-gallery-well", children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { ref: trackRef, position: "absolute", inset: 0, tabIndex: 0, role: "group", "aria-label": labels.region, overflowX: "auto", overflowY: "hidden", animation: fadeKey > 0 ? (0, motion_3.fadeIn)(motion_3.CROSSFADE_MS) : undefined, onScroll: onScroll, onPointerDown: () => {
184
184
  settling.current = null;
185
185
  }, outline: "none", _focusVisible: focusInset, sx: {
@@ -47,6 +47,7 @@ const useCustomTheme_1 = require("../../Theme/useCustomTheme");
47
47
  const scrim_1 = require("../../Theme/tokens/builders/scrim");
48
48
  const viewportHeight_1 = require("../../Theme/tokens/builders/viewportHeight");
49
49
  const motion_1 = require("../../Theme/chakra/motion");
50
+ const typography_1 = require("../../Theme/tokens/primitives/typography");
50
51
  const MediaFrame_1 = __importDefault(require("./MediaFrame"));
51
52
  const MediaThumb_1 = __importDefault(require("./MediaThumb"));
52
53
  const motion_2 = require("./motion");
@@ -109,7 +110,7 @@ const MediaLightbox = ({ isOpen, onClose, items, index, defaultIndex = 0, onInde
109
110
  return null;
110
111
  const alt = (_a = item.alt) !== null && _a !== void 0 ? _a : labels.image(current + 1, total);
111
112
  const bar = { bg: (0, scrim_1.overlayScrim)(colors), color: chrome.ink };
112
- return ((0, jsx_runtime_1.jsx)(Modal_1.default, { isOpen: isOpen, onClose: onClose, size: "full", hideCloseButton: true, motionPreset: reduced ? "none" : "scale", initialFocusRef: stageRef, finalFocusRef: finalFocusRef, overlaybg: (0, scrim_1.overlayScrim)(colors), contentProps: { bg: chrome.stage, m: 0, borderRadius: 0, "aria-label": labels.dialog }, children: (0, jsx_runtime_1.jsxs)(Modal_1.ModalBody, { p: 0, display: "flex", flexDirection: "column", sx: viewportHeight_1.fullViewportHeight, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", justify: "space-between", gap: 2, px: 4, py: 2, ...bar, "data-testid": "media-lightbox-bar", children: [(0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", fontSize: "sm", fontWeight: 600, "aria-live": "polite", sx: { fontVariantNumeric: "tabular-nums" }, children: labels.counter(current + 1, total) }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.close, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 20, "aria-hidden": true }), onClick: onClose, testId: "media-lightbox-close" })] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: stageRef, tabIndex: -1, flex: 1, minH: 0, position: "relative", outline: "none", onKeyDown: onKeyDown, onTouchStart: (event) => {
113
+ return ((0, jsx_runtime_1.jsx)(Modal_1.default, { isOpen: isOpen, onClose: onClose, size: "full", hideCloseButton: true, motionPreset: reduced ? "none" : "scale", initialFocusRef: stageRef, finalFocusRef: finalFocusRef, overlaybg: (0, scrim_1.overlayScrim)(colors), contentProps: { bg: chrome.stage, m: 0, borderRadius: 0, "aria-label": labels.dialog }, children: (0, jsx_runtime_1.jsxs)(Modal_1.ModalBody, { p: 0, display: "flex", flexDirection: "column", sx: viewportHeight_1.fullViewportHeight, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", justify: "space-between", gap: 2, px: 4, py: 2, ...bar, "data-testid": "media-lightbox-bar", children: [(0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", fontSize: "sm", fontWeight: 600, "aria-live": "polite", sx: typography_1.NUMERIC_TEXT, children: labels.counter(current + 1, total) }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.close, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 20, "aria-hidden": true }), onClick: onClose, testId: "media-lightbox-close" })] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: stageRef, tabIndex: -1, flex: 1, minH: 0, position: "relative", outline: "none", onKeyDown: onKeyDown, onTouchStart: (event) => {
113
114
  touchStartX.current = event.touches.length === 1 ? event.touches[0].clientX : null;
114
115
  }, onTouchEnd: onTouchEnd, "data-testid": "media-lightbox-stage", children: [(0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", inset: { base: 0, md: 6 }, animation: (0, motion_2.fadeIn)(), sx: (0, motion_1.reducedMotionSx)(), children: (0, jsx_runtime_1.jsx)(MediaFrame_1.default, { media: item, alt: alt, fit: "contain", autoPlay: true, surface: "transparent", playLabel: labels.playVideo, unavailableLabel: labels.imageUnavailable }) }, item.id), total > 1 && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", left: { base: 2, md: 4 }, top: "calc(50% - 20px)", zIndex: 2, children: (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.previous, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { size: 24, "aria-hidden": true }), onClick: () => go(current - 1), isDisabled: current === 0, round: true, testId: "media-lightbox-prev" }) }), (0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", right: { base: 2, md: 4 }, top: "calc(50% - 20px)", zIndex: 2, children: (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.next, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 24, "aria-hidden": true }), onClick: () => go(current + 1), isDisabled: current === total - 1, round: true, testId: "media-lightbox-next" }) })] }))] }), total > 1 && ((0, jsx_runtime_1.jsx)(react_2.Flex, { as: "nav", "aria-label": labels.thumbnails, ...bar, py: 3, px: 4, justify: "center", children: (0, jsx_runtime_1.jsx)(react_2.Flex, { ref: stripRef, gap: 3, p: "4px", maxW: "100%", overflowX: "auto", onKeyDown: onKeyDown, "data-testid": "media-lightbox-thumbs", children: items.map((frame, position) => ((0, jsx_runtime_1.jsx)(MediaThumb_1.default, { media: frame, label: labels.frame(position + 1, total, frame.alt), selected: position === current, onSelect: () => go(position), width: 56, height: 70, ring: { gap: chrome.stage, ink: chrome.ink }, surface: chrome.raised }, frame.id))) }) }))] }) }));
115
116
  };
@@ -7,6 +7,7 @@ const react_2 = require("@chakra-ui/react");
7
7
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
8
8
  const color_1 = require("../../Theme/tokens/builders/color");
9
9
  const motion_1 = require("../../Theme/tokens/primitives/motion");
10
+ const typography_1 = require("../../Theme/tokens/primitives/typography");
10
11
  const motion_2 = require("../../Theme/chakra/motion");
11
12
  const focusRing_styles_1 = require("../../Theme/chakra/focusRing.styles");
12
13
  const GLASS_ALPHA = 0.72;
@@ -42,6 +43,6 @@ exports.GlassIconButton.displayName = "GlassIconButton";
42
43
  const GlassPill = ({ children, height = 28, ...placement }) => {
43
44
  const { colors } = (0, useCustomTheme_1.useCustomTheme)();
44
45
  const glass = (0, exports.glassStyles)(colors);
45
- return ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", gap: 1.5, h: `${height}px`, px: 3, borderRadius: "full", position: "absolute", fontSize: "xs", fontWeight: 600, pointerEvents: "none", whiteSpace: "nowrap", ...glass, sx: { ...glass.sx, fontVariantNumeric: "tabular-nums" }, ...placement, children: children }));
46
+ return ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", gap: 1.5, h: `${height}px`, px: 3, borderRadius: "full", position: "absolute", fontSize: "xs", fontWeight: 600, pointerEvents: "none", whiteSpace: "nowrap", ...glass, sx: { ...glass.sx, ...typography_1.NUMERIC_TEXT }, ...placement, children: children }));
46
47
  };
47
48
  exports.GlassPill = GlassPill;
@@ -221,7 +221,7 @@ const MediaViewer = ({ isOpen, onClose, items, index, onIndexChange, defaultInde
221
221
  const uploaded = item.uploadedAt ? labels.uploadedOn((0, date_fns_1.format)(new Date(item.uploadedAt), "MMM d, yyyy")) : null;
222
222
  return [parts.join(" · "), uploaded].filter(Boolean).join(" — ");
223
223
  })();
224
- return ((0, jsx_runtime_1.jsx)(Modal_1.default, { isOpen: isOpen, onClose: onClose, size: "full", hideCloseButton: true, initialFocusRef: stageRef, contentProps: { bg: chrome.stage, m: 0, borderRadius: 0 }, children: (0, jsx_runtime_1.jsxs)(Modal_1.ModalBody, { p: 0, display: "flex", flexDirection: "column", sx: viewportHeight_1.fullViewportHeight, children: [total > 1 && ((0, jsx_runtime_1.jsx)(react_2.VisuallyHidden, { "aria-live": "polite", children: labels.nowShowing(safeIndex + 1, total) })), (0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, px: 4, py: 3, bg: chrome.raised, color: chrome.ink, "data-testid": "media-viewer-header", children: [(0, jsx_runtime_1.jsx)(react_2.Heading, { as: "h2", size: "sm", noOfLines: 1, color: chrome.ink, children: title }), total > 1 && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", color: chrome.muted, fontSize: "sm", "data-testid": "media-viewer-counter", children: labels.counter(safeIndex + 1, total) })), kindLabelKey && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", px: 2, py: 0.5, borderRadius: "4px", bg: chrome.hover, color: chrome.ink, fontSize: "xs", fontWeight: 600, children: labels[kindLabelKey] })), (0, jsx_runtime_1.jsx)(react_2.Flex, { flex: 1 }), item.kind === "youtube" ? ((0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.openOnYoutube, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ExternalLink, { size: 16 }), href: (0, mediaItems_1.youtubeWatch)(item.src) })) : ((0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.download, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 16 }), href: item.src })), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: copied ? labels.copied : labels.copyLink, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { size: 16 }), onClick: copyLink, testId: "media-viewer-copy-link" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.close, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 18 }), onClick: onClose, testId: "media-viewer-close" })] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: stageRef, tabIndex: -1, flex: 1, position: "relative", minH: 0, onTouchStart: onTouchStart, onTouchMove: onTouchMove, onTouchEnd: onTouchEnd, "data-testid": "media-viewer-stage", children: [renderStage(), total > 1 && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", top: "50%", left: { base: 2, md: 4 }, transform: "translateY(-50%)", zIndex: 2, children: (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.previous, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { size: 24 }), onClick: () => go.current(-1), round: true, testId: "media-viewer-prev" }) }), (0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", top: "50%", right: { base: 2, md: 4 }, transform: "translateY(-50%)", zIndex: 2, children: (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.next, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 24 }), onClick: () => go.current(1), round: true, testId: "media-viewer-next" }) })] }))] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { bg: chrome.raised, py: 3, minW: 0, children: [meta && ((0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "xs", color: chrome.muted, mb: 2, px: 4, overflow: "hidden", whiteSpace: "nowrap", textOverflow: "ellipsis", title: meta, children: meta })), total > 1 && ((0, jsx_runtime_1.jsx)(react_2.Flex, { as: "nav", "aria-label": labels.filmstrip, ref: stripRef, gap: 2, px: 4, overflowX: "auto", justifyContent: filmstripOverflows ? "flex-start" : "center", "data-testid": "media-viewer-filmstrip", children: items.map((tile, i) => {
224
+ return ((0, jsx_runtime_1.jsx)(Modal_1.default, { isOpen: isOpen, onClose: onClose, size: "full", hideCloseButton: true, initialFocusRef: stageRef, contentProps: { bg: chrome.stage, m: 0, borderRadius: 0 }, children: (0, jsx_runtime_1.jsxs)(Modal_1.ModalBody, { p: 0, display: "flex", flexDirection: "column", sx: viewportHeight_1.fullViewportHeight, children: [total > 1 && ((0, jsx_runtime_1.jsx)(react_2.VisuallyHidden, { "aria-live": "polite", children: labels.nowShowing(safeIndex + 1, total) })), (0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 2, px: 4, py: 3, bg: chrome.raised, color: chrome.ink, "data-testid": "media-viewer-header", children: [(0, jsx_runtime_1.jsx)(react_2.Heading, { as: "h2", size: "sm", noOfLines: 1, color: chrome.ink, children: title }), total > 1 && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", color: chrome.muted, fontSize: "sm", "data-testid": "media-viewer-counter", children: labels.counter(safeIndex + 1, total) })), kindLabelKey && ((0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", px: 2, py: 0.5, borderRadius: "base", bg: chrome.hover, color: chrome.ink, fontSize: "xs", fontWeight: 600, children: labels[kindLabelKey] })), (0, jsx_runtime_1.jsx)(react_2.Flex, { flex: 1 }), item.kind === "youtube" ? ((0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.openOnYoutube, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ExternalLink, { size: 16 }), href: (0, mediaItems_1.youtubeWatch)(item.src) })) : ((0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.download, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 16 }), href: item.src })), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: copied ? labels.copied : labels.copyLink, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { size: 16 }), onClick: copyLink, testId: "media-viewer-copy-link" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.close, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 18 }), onClick: onClose, testId: "media-viewer-close" })] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: stageRef, tabIndex: -1, flex: 1, position: "relative", minH: 0, onTouchStart: onTouchStart, onTouchMove: onTouchMove, onTouchEnd: onTouchEnd, "data-testid": "media-viewer-stage", children: [renderStage(), total > 1 && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", top: "50%", left: { base: 2, md: 4 }, transform: "translateY(-50%)", zIndex: 2, children: (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.previous, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { size: 24 }), onClick: () => go.current(-1), round: true, testId: "media-viewer-prev" }) }), (0, jsx_runtime_1.jsx)(react_2.Box, { position: "absolute", top: "50%", right: { base: 2, md: 4 }, transform: "translateY(-50%)", zIndex: 2, children: (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.next, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 24 }), onClick: () => go.current(1), round: true, testId: "media-viewer-next" }) })] }))] }), (0, jsx_runtime_1.jsxs)(react_2.Box, { bg: chrome.raised, py: 3, minW: 0, children: [meta && ((0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "xs", color: chrome.muted, mb: 2, px: 4, overflow: "hidden", whiteSpace: "nowrap", textOverflow: "ellipsis", title: meta, children: meta })), total > 1 && ((0, jsx_runtime_1.jsx)(react_2.Flex, { as: "nav", "aria-label": labels.filmstrip, ref: stripRef, gap: 2, px: 4, overflowX: "auto", justifyContent: filmstripOverflows ? "flex-start" : "center", "data-testid": "media-viewer-filmstrip", children: items.map((tile, i) => {
225
225
  const isSelected = i === safeIndex;
226
226
  const showPoster = tile.kind === "video" && !(0, mediaItems_1.isUnsupportedVideoSrc)(tile.src);
227
227
  const showThumb = !showPoster && tile.thumb && !(tile.kind === "image" && (0, mediaItems_1.isUnsupportedImageSrc)(tile.src));
@@ -10,7 +10,7 @@ const lucide_react_1 = require("lucide-react");
10
10
  const focusRing_1 = require("../../../Theme/tokens/builders/focusRing");
11
11
  const mediaItems_1 = require("../mediaItems");
12
12
  const useViewerChrome_1 = require("../useViewerChrome");
13
- const MediaScrubber_1 = __importDefault(require("./MediaScrubber"));
13
+ const PlaybackTimeline_1 = require("./PlaybackTimeline");
14
14
  const MediaStatusPanel_1 = __importDefault(require("./MediaStatusPanel"));
15
15
  const ViewerIconButton_1 = __importDefault(require("./ViewerIconButton"));
16
16
  const MediaAudioPlayerProps_1 = require("./MediaAudioPlayerProps");
@@ -22,7 +22,7 @@ const MediaAudioPlayer = ({ item, label, onTimeChange, labels: labelOverrides })
22
22
  const shellRef = (0, react_1.useRef)(null);
23
23
  const audioRef = (0, react_1.useRef)(null);
24
24
  const [playing, setPlaying] = (0, react_1.useState)(false);
25
- const [current, setCurrent] = (0, react_1.useState)(0);
25
+ const timeline = (0, PlaybackTimeline_1.usePlaybackTimeline)();
26
26
  const [duration, setDuration] = (0, react_1.useState)(0);
27
27
  const [volume, setVolume] = (0, react_1.useState)(1);
28
28
  const [muted, setMuted] = (0, react_1.useState)(false);
@@ -47,7 +47,7 @@ const MediaAudioPlayer = ({ item, label, onTimeChange, labels: labelOverrides })
47
47
  return;
48
48
  const max = Number.isFinite(a.duration) ? a.duration : seconds;
49
49
  a.currentTime = Math.min(max, Math.max(0, seconds));
50
- setCurrent(a.currentTime);
50
+ timeline.set(a.currentTime);
51
51
  };
52
52
  const seekBy = (delta) => { var _a, _b; return seekTo(((_b = (_a = audio()) === null || _a === void 0 ? void 0 : _a.currentTime) !== null && _b !== void 0 ? _b : 0) + delta); };
53
53
  const toggleMute = () => {
@@ -114,25 +114,25 @@ const MediaAudioPlayer = ({ item, label, onTimeChange, labels: labelOverrides })
114
114
  }, []);
115
115
  (0, react_1.useEffect)(() => {
116
116
  setPlaying(false);
117
- setCurrent(0);
117
+ timeline.set(0);
118
118
  setDuration(0);
119
119
  setRate(1);
120
120
  setFailed(false);
121
121
  setBuffered([]);
122
122
  if (audioRef.current)
123
123
  audioRef.current.playbackRate = 1;
124
- }, [item.key]);
124
+ }, [item.key, timeline]);
125
125
  const clock = (seconds) => (0, mediaItems_1.formatClock)(seconds);
126
126
  const effectiveVolume = muted ? 0 : Math.round(volume * 100);
127
127
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { ref: shellRef, as: "section", "aria-label": `${labels.audioPlayer}: ${label}`, position: "absolute", inset: 0, bg: chrome.stage, children: [(0, jsx_runtime_1.jsx)("audio", { ref: audioRef, src: item.src, preload: "metadata", onPlay: () => setPlaying(true), onPause: () => setPlaying(false), onEnded: () => setPlaying(false), onError: () => setFailed(true), onProgress: (e) => {
128
128
  const ranges = e.currentTarget.buffered;
129
129
  setBuffered(Array.from({ length: ranges.length }, (_, i) => ({ start: ranges.start(i), end: ranges.end(i) })));
130
130
  }, onTimeUpdate: (e) => {
131
- setCurrent(e.currentTarget.currentTime);
131
+ timeline.set(e.currentTarget.currentTime);
132
132
  onTimeChange === null || onTimeChange === void 0 ? void 0 : onTimeChange(e.currentTarget.currentTime);
133
133
  }, onLoadedMetadata: (e) => setDuration(e.currentTarget.duration), onDurationChange: (e) => setDuration(e.currentTarget.duration), onVolumeChange: (e) => {
134
134
  setVolume(e.currentTarget.volume);
135
135
  setMuted(e.currentTarget.muted);
136
- }, "data-testid": "media-audio" }), failed ? ((0, jsx_runtime_1.jsx)(MediaStatusPanel_1.default, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.VolumeX, {}), label: label, message: labels.audioError, downloadHref: item.src, downloadLabel: labels.download, tone: "warning", testId: "media-audio-error" })) : ((0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "center", justify: "center", h: "100%", px: { base: 4, md: 10 }, gap: 6, children: [(0, jsx_runtime_1.jsx)(react_2.Flex, { boxSize: { base: "96px", md: "140px" }, borderRadius: "full", bg: chrome.raised, align: "center", justify: "center", color: chrome.accent, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Music, { size: 48, "aria-hidden": true }) }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", fontWeight: 600, color: chrome.ink, noOfLines: 1, maxW: "480px", textAlign: "center", children: label }), (0, jsx_runtime_1.jsxs)(react_2.Box, { w: "100%", maxW: "480px", children: [(0, jsx_runtime_1.jsx)(MediaScrubber_1.default, { value: Math.min(current, duration || current), max: duration > 0 ? duration : 0, buffered: buffered, onSeek: seekTo, ariaLabel: labels.seek, ariaValueText: (v) => labels.seekValue(clock(v), clock(duration)), formatTime: clock, isDisabled: duration <= 0, testId: "media-audio-seek" }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { role: "toolbar", "aria-label": labels.audioControls, align: "center", justify: "space-between", gap: 2, wrap: "wrap", mt: 1, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 1, wrap: "wrap", children: [(0, jsx_runtime_1.jsx)(react_2.IconButton, { "aria-label": playing ? labels.pause : labels.play, icon: playing ? (0, jsx_runtime_1.jsx)(lucide_react_1.Pause, { size: 20 }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Play, { size: 20 }), onClick: togglePlay, isRound: true, variant: "ghost", bg: chrome.raised, color: chrome.accent, _hover: { bg: chrome.hover }, _focusVisible: { boxShadow: `0 0 0 2px ${ring}` }, "data-testid": "media-audio-toggle" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.rewind, hint: "J", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.SkipBack, { size: 16 }), onClick: () => seekBy(-mediaItems_1.SEEK_STEP_SECONDS), testId: "media-audio-rewind" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.forward, hint: "L", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.SkipForward, { size: 16 }), onClick: () => seekBy(mediaItems_1.SEEK_STEP_SECONDS), testId: "media-audio-forward" }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", onMouseEnter: () => setVolumeHover(true), onMouseLeave: () => setVolumeHover(false), sx: { "&:focus-within": { "--volume-w": "88px" } }, children: [(0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: muted || volume === 0 ? labels.unmute : labels.mute, hint: "M", icon: muted || volume === 0 ? (0, jsx_runtime_1.jsx)(lucide_react_1.VolumeX, { size: 18 }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Volume2, { size: 18 }), onClick: toggleMute, pressed: muted, testId: "media-audio-mute" }), (0, jsx_runtime_1.jsx)(react_2.Box, { w: volumeHover ? "88px" : "0px", overflow: "hidden", px: volumeHover ? 1 : 0, transition: "width 0.2s ease-out", sx: { "&:focus-within": { width: "88px", paddingInline: "4px" } }, children: (0, jsx_runtime_1.jsxs)(react_2.Slider, { "aria-label": labels.volume, min: 0, max: 100, step: 5, value: effectiveVolume, onChange: changeVolume, focusThumbOnChange: false, getAriaValueText: (v) => `${v}%`, children: [(0, jsx_runtime_1.jsx)(react_2.SliderTrack, { bg: chrome.track, h: "4px", borderRadius: "full", children: (0, jsx_runtime_1.jsx)(react_2.SliderFilledTrack, { bg: chrome.ink }) }), (0, jsx_runtime_1.jsx)(react_2.SliderThumb, { bg: chrome.ink, boxSize: "12px", _focusVisible: { boxShadow: `0 0 0 2px ${ring}` } })] }) })] }), (0, jsx_runtime_1.jsxs)(react_2.Text, { as: "span", ml: 2, fontSize: "sm", fontWeight: 500, color: chrome.ink, sx: { fontVariantNumeric: "tabular-nums" }, "data-testid": "media-audio-time", children: [clock(current), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "span", color: chrome.muted, children: ` / ${clock(duration)}` })] })] }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 1, children: [(0, jsx_runtime_1.jsxs)(react_2.Menu, { placement: "top-end", children: [(0, jsx_runtime_1.jsx)(react_2.MenuButton, { "aria-label": labels.speed, h: "32px", px: 3, borderRadius: "full", borderWidth: "1px", borderColor: chrome.track, bg: chrome.raised, color: chrome.ink, fontSize: "sm", fontWeight: 600, _hover: { bg: chrome.hover }, _focusVisible: { boxShadow: `0 0 0 2px ${ring}` }, "data-testid": "media-audio-speed", children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { as: "span", align: "center", gap: 1, children: [`${rate}x`, (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 14, "aria-hidden": true })] }) }), (0, jsx_runtime_1.jsx)(react_2.MenuList, { minW: "160px", bg: chrome.raised, zIndex: 1500, children: (0, jsx_runtime_1.jsx)(react_2.MenuOptionGroup, { type: "radio", title: labels.speed, value: String(rate), onChange: (value) => changeRate(Number(value)), children: mediaItems_1.PLAYBACK_SPEEDS.map((speed) => ((0, jsx_runtime_1.jsx)(react_2.MenuItemOption, { value: String(speed), bg: chrome.raised, color: chrome.ink, _hover: { bg: chrome.hover }, _focus: { bg: chrome.hover }, children: speed === 1 ? `1x - ${labels.normalSpeed}` : `${speed}x` }, speed))) }) })] }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.download, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 18 }), href: item.src, testId: "media-audio-download" })] })] })] })] }))] }));
136
+ }, "data-testid": "media-audio" }), failed ? ((0, jsx_runtime_1.jsx)(MediaStatusPanel_1.default, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.VolumeX, {}), label: label, message: labels.audioError, downloadHref: item.src, downloadLabel: labels.download, tone: "warning", testId: "media-audio-error" })) : ((0, jsx_runtime_1.jsxs)(react_2.Flex, { direction: "column", align: "center", justify: "center", h: "100%", px: { base: 4, md: 10 }, gap: 6, children: [(0, jsx_runtime_1.jsx)(react_2.Flex, { boxSize: { base: "96px", md: "140px" }, borderRadius: "full", bg: chrome.raised, align: "center", justify: "center", color: chrome.accent, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Music, { size: 48, "aria-hidden": true }) }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: "sm", fontWeight: 600, color: chrome.ink, noOfLines: 1, maxW: "480px", textAlign: "center", children: label }), (0, jsx_runtime_1.jsxs)(react_2.Box, { w: "100%", maxW: "480px", children: [(0, jsx_runtime_1.jsx)(PlaybackTimeline_1.TimelineScrubber, { timeline: timeline, duration: duration, buffered: buffered, onSeek: seekTo, ariaLabel: labels.seek, ariaValueText: (v) => labels.seekValue(clock(v), clock(duration)), formatTime: clock, isDisabled: duration <= 0, testId: "media-audio-seek" }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { role: "toolbar", "aria-label": labels.audioControls, align: "center", justify: "space-between", gap: 2, wrap: "wrap", mt: 1, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 1, wrap: "wrap", children: [(0, jsx_runtime_1.jsx)(react_2.IconButton, { "aria-label": playing ? labels.pause : labels.play, icon: playing ? (0, jsx_runtime_1.jsx)(lucide_react_1.Pause, { size: 20 }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Play, { size: 20 }), onClick: togglePlay, isRound: true, variant: "ghost", bg: chrome.raised, color: chrome.accent, _hover: { bg: chrome.hover }, _focusVisible: { boxShadow: `0 0 0 2px ${ring}` }, "data-testid": "media-audio-toggle" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.rewind, hint: "J", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.SkipBack, { size: 16 }), onClick: () => seekBy(-mediaItems_1.SEEK_STEP_SECONDS), testId: "media-audio-rewind" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.forward, hint: "L", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.SkipForward, { size: 16 }), onClick: () => seekBy(mediaItems_1.SEEK_STEP_SECONDS), testId: "media-audio-forward" }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", onMouseEnter: () => setVolumeHover(true), onMouseLeave: () => setVolumeHover(false), sx: { "&:focus-within": { "--volume-w": "88px" } }, children: [(0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: muted || volume === 0 ? labels.unmute : labels.mute, hint: "M", icon: muted || volume === 0 ? (0, jsx_runtime_1.jsx)(lucide_react_1.VolumeX, { size: 18 }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Volume2, { size: 18 }), onClick: toggleMute, pressed: muted, testId: "media-audio-mute" }), (0, jsx_runtime_1.jsx)(react_2.Box, { w: volumeHover ? "88px" : "0px", overflow: "hidden", px: volumeHover ? 1 : 0, transition: "width 0.2s ease-out", sx: { "&:focus-within": { width: "88px", paddingInline: "4px" } }, children: (0, jsx_runtime_1.jsxs)(react_2.Slider, { "aria-label": labels.volume, min: 0, max: 100, step: 5, value: effectiveVolume, onChange: changeVolume, focusThumbOnChange: false, getAriaValueText: (v) => `${v}%`, children: [(0, jsx_runtime_1.jsx)(react_2.SliderTrack, { bg: chrome.track, h: "4px", borderRadius: "full", children: (0, jsx_runtime_1.jsx)(react_2.SliderFilledTrack, { bg: chrome.ink }) }), (0, jsx_runtime_1.jsx)(react_2.SliderThumb, { bg: chrome.ink, boxSize: "12px", _focusVisible: { boxShadow: `0 0 0 2px ${ring}` } })] }) })] }), (0, jsx_runtime_1.jsx)(PlaybackTimeline_1.TimelineClock, { timeline: timeline, duration: duration, testId: "media-audio-time" })] }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", gap: 1, children: [(0, jsx_runtime_1.jsxs)(react_2.Menu, { placement: "top-end", children: [(0, jsx_runtime_1.jsx)(react_2.MenuButton, { "aria-label": labels.speed, h: "32px", px: 3, borderRadius: "full", borderWidth: "1px", borderColor: chrome.track, bg: chrome.raised, color: chrome.ink, fontSize: "sm", fontWeight: 600, _hover: { bg: chrome.hover }, _focusVisible: { boxShadow: `0 0 0 2px ${ring}` }, "data-testid": "media-audio-speed", children: (0, jsx_runtime_1.jsxs)(react_2.Flex, { as: "span", align: "center", gap: 1, children: [`${rate}x`, (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 14, "aria-hidden": true })] }) }), (0, jsx_runtime_1.jsx)(react_2.MenuList, { minW: "160px", bg: chrome.raised, zIndex: "popover", children: (0, jsx_runtime_1.jsx)(react_2.MenuOptionGroup, { type: "radio", title: labels.speed, value: String(rate), onChange: (value) => changeRate(Number(value)), children: mediaItems_1.PLAYBACK_SPEEDS.map((speed) => ((0, jsx_runtime_1.jsx)(react_2.MenuItemOption, { value: String(speed), bg: chrome.raised, color: chrome.ink, _hover: { bg: chrome.hover }, _focus: { bg: chrome.hover }, children: speed === 1 ? `1x - ${labels.normalSpeed}` : `${speed}x` }, speed))) }) })] }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.download, icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 18 }), href: item.src, testId: "media-audio-download" })] })] })] })] }))] }));
137
137
  };
138
138
  exports.default = MediaAudioPlayer;
@@ -98,6 +98,6 @@ const MediaImageViewer = ({ item, label, onZoomChange, onNaturalSize, labels: la
98
98
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { ref: stageRef, position: "absolute", inset: 0, bg: chrome.stage, overflow: "hidden", children: [(0, jsx_runtime_1.jsx)(react_2.Flex, { position: "absolute", inset: 0, align: "center", justify: "center", p: { base: 2, md: 6 }, pb: { base: 20, md: 24 }, cursor: zoom > 100 ? (dragging ? "grabbing" : "grab") : "default", onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: endDrag, onPointerCancel: endDrag, sx: { touchAction: zoom > 100 ? "none" : "pan-y" }, children: failed ? ((0, jsx_runtime_1.jsx)(MediaStatusPanel_1.default, { icon: (0, mediaKindIcon_1.warningIcon)(), label: label, message: labels.imageError, downloadLabel: labels.download, downloadHref: item.src, tone: "warning", testId: "media-image-error" })) : ((0, jsx_runtime_1.jsx)(react_2.Image, { src: item.src, alt: label, maxW: "100%", maxH: "100%", objectFit: "contain", draggable: false, userSelect: "none", onError: () => setFailed(true), onLoad: (event) => onNaturalSize === null || onNaturalSize === void 0 ? void 0 : onNaturalSize({
99
99
  width: event.currentTarget.naturalWidth,
100
100
  height: event.currentTarget.naturalHeight,
101
- }), transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom / 100}) rotate(${rotation}deg)`, transition: dragging ? "none" : "transform 0.15s ease-out", "data-testid": "media-image" })) }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { role: "toolbar", "aria-label": labels.imageControls, position: "absolute", bottom: 4, left: "50%", transform: "translateX(-50%)", align: "center", gap: 1, p: 1, borderRadius: "12px", bg: chrome.raised, borderWidth: "1px", borderColor: chrome.hover, maxW: "calc(100% - 16px)", overflowX: "auto", children: [(0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.zoomOut, hint: "-", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ZoomOut, { size: 18 }), onClick: () => zoomBy(-mediaItems_1.ZOOM_STEP), isDisabled: zoom <= mediaItems_1.MIN_ZOOM, testId: "media-zoom-out" }), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "output", "aria-live": "polite", "aria-label": labels.zoomLevel, minW: "56px", textAlign: "center", fontSize: "sm", fontWeight: 600, color: chrome.ink, "data-testid": "media-zoom-level", children: `${zoom}%` }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.zoomIn, hint: "+", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ZoomIn, { size: 18 }), onClick: () => zoomBy(mediaItems_1.ZOOM_STEP), isDisabled: zoom >= mediaItems_1.MAX_ZOOM, testId: "media-zoom-in" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.fitLabel, hint: "0", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Scan, { size: 16, "aria-hidden": true }), onClick: reset, testId: "media-fit" }), (0, jsx_runtime_1.jsx)(react_2.Box, { w: "1px", h: "24px", bg: chrome.hover, mx: 1, "aria-hidden": true }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.rotate, hint: "R", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.RotateCw, { size: 18 }), onClick: rotate, testId: "media-rotate" }), fullscreenSupported ? ((0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: isFullscreen ? labels.exitFullscreen : labels.fullscreen, hint: "F", icon: isFullscreen ? (0, jsx_runtime_1.jsx)(lucide_react_1.Minimize, { size: 18 }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Maximize, { size: 18 }), onClick: () => void toggleFullscreen(), pressed: isFullscreen, testId: "media-fullscreen" })) : null] })] }));
101
+ }), style: { transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom / 100}) rotate(${rotation}deg)` }, transition: dragging ? "none" : "transform 0.15s ease-out", "data-testid": "media-image" })) }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { role: "toolbar", "aria-label": labels.imageControls, position: "absolute", bottom: 4, left: "50%", transform: "translateX(-50%)", align: "center", gap: 1, p: 1, borderRadius: "xl", bg: chrome.raised, borderWidth: "1px", borderColor: chrome.hover, maxW: "calc(100% - 16px)", overflowX: "auto", children: [(0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.zoomOut, hint: "-", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ZoomOut, { size: 18 }), onClick: () => zoomBy(-mediaItems_1.ZOOM_STEP), isDisabled: zoom <= mediaItems_1.MIN_ZOOM, testId: "media-zoom-out" }), (0, jsx_runtime_1.jsx)(react_2.Text, { as: "output", "aria-live": "polite", "aria-label": labels.zoomLevel, minW: "56px", textAlign: "center", fontSize: "sm", fontWeight: 600, color: chrome.ink, "data-testid": "media-zoom-level", children: `${zoom}%` }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.zoomIn, hint: "+", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ZoomIn, { size: 18 }), onClick: () => zoomBy(mediaItems_1.ZOOM_STEP), isDisabled: zoom >= mediaItems_1.MAX_ZOOM, testId: "media-zoom-in" }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.fitLabel, hint: "0", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Scan, { size: 16, "aria-hidden": true }), onClick: reset, testId: "media-fit" }), (0, jsx_runtime_1.jsx)(react_2.Box, { w: "1px", h: "24px", bg: chrome.hover, mx: 1, "aria-hidden": true }), (0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: labels.rotate, hint: "R", icon: (0, jsx_runtime_1.jsx)(lucide_react_1.RotateCw, { size: 18 }), onClick: rotate, testId: "media-rotate" }), fullscreenSupported ? ((0, jsx_runtime_1.jsx)(ViewerIconButton_1.default, { label: isFullscreen ? labels.exitFullscreen : labels.fullscreen, hint: "F", icon: isFullscreen ? (0, jsx_runtime_1.jsx)(lucide_react_1.Minimize, { size: 18 }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Maximize, { size: 18 }), onClick: () => void toggleFullscreen(), pressed: isFullscreen, testId: "media-fullscreen" })) : null] })] }));
102
102
  };
103
103
  exports.default = MediaImageViewer;