@12-apps/ui 6.6.0 → 6.8.0

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 (436) hide show
  1. package/dist/{chunk-QLBYAYUG.js → chunk-KR2BP7NK.js} +4 -4
  2. package/dist/chunk-KR2BP7NK.js.map +1 -0
  3. package/dist/{chunk-DFVRZ3UK.js → chunk-KXARS46L.js} +3 -3
  4. package/dist/chunk-KXARS46L.js.map +1 -0
  5. package/dist/{chunk-JP55QWVR.js → chunk-L7L6SX64.js} +5 -2
  6. package/dist/chunk-L7L6SX64.js.map +1 -0
  7. package/dist/{chunk-QZZVHY6U.js → chunk-PVLDKXKR.js} +7 -3
  8. package/dist/chunk-PVLDKXKR.js.map +1 -0
  9. package/dist/{chunk-3KWD5Y5O.js → chunk-RXE5CUUE.js} +8 -4
  10. package/dist/chunk-RXE5CUUE.js.map +1 -0
  11. package/dist/{chunk-H7UAGTVW.js → chunk-TSG5C7MP.js} +4 -3
  12. package/dist/chunk-TSG5C7MP.js.map +1 -0
  13. package/dist/{chunk-NUCLEOHF.js → chunk-UNM7KFDX.js} +44 -14
  14. package/dist/chunk-UNM7KFDX.js.map +1 -0
  15. package/dist/{chunk-CEKPLUQV.js → chunk-UY7UF7IN.js} +19 -13
  16. package/dist/chunk-UY7UF7IN.js.map +1 -0
  17. package/dist/data-display/Alert.js +1 -1
  18. package/dist/data-display/AsyncStateContainer.js +2 -1
  19. package/dist/data-display/AsyncStateContainer.js.map +1 -1
  20. package/dist/data-display/Banner.js +4 -2
  21. package/dist/data-display/Banner.js.map +1 -1
  22. package/dist/data-display/CardKit.js +3 -1
  23. package/dist/data-display/CardKit.js.map +1 -1
  24. package/dist/data-display/Carousel.js +5 -2
  25. package/dist/data-display/Carousel.js.map +1 -1
  26. package/dist/data-display/DataGrid.js +1 -1
  27. package/dist/data-display/DataViews.js +90 -66
  28. package/dist/data-display/DataViews.js.map +1 -1
  29. package/dist/data-display/HoverCard.js +4 -1
  30. package/dist/data-display/HoverCard.js.map +1 -1
  31. package/dist/data-display/Lightbox.js +147 -117
  32. package/dist/data-display/Lightbox.js.map +1 -1
  33. package/dist/data-display/MapPreview.js +14 -10
  34. package/dist/data-display/MapPreview.js.map +1 -1
  35. package/dist/data-display/Table.js +4 -2
  36. package/dist/data-display/Table.js.map +1 -1
  37. package/dist/data-display/TimingDiagram.js +3 -2
  38. package/dist/data-display/TimingDiagram.js.map +1 -1
  39. package/dist/feedback/Sonner.js +5 -4
  40. package/dist/feedback/Sonner.js.map +1 -1
  41. package/dist/feedback/StackedModal.js +1 -1
  42. package/dist/feedback/TutorialOverlay.js +19 -5
  43. package/dist/feedback/TutorialOverlay.js.map +1 -1
  44. package/dist/form/AddressAutocomplete.js +16 -8
  45. package/dist/form/AddressAutocomplete.js.map +1 -1
  46. package/dist/form/Autocomplete.js +9 -7
  47. package/dist/form/Autocomplete.js.map +1 -1
  48. package/dist/form/Calendar.js +1 -1
  49. package/dist/form/CodeEditor.js +14 -9
  50. package/dist/form/CodeEditor.js.map +1 -1
  51. package/dist/form/DateRangePicker.js +10 -3
  52. package/dist/form/DateRangePicker.js.map +1 -1
  53. package/dist/form/Menubar.js +4 -1
  54. package/dist/form/Menubar.js.map +1 -1
  55. package/dist/form/PasswordStrength.js +48 -28
  56. package/dist/form/PasswordStrength.js.map +1 -1
  57. package/dist/form/PhoneInput.js +11 -5
  58. package/dist/form/PhoneInput.js.map +1 -1
  59. package/dist/form/SearchPalette.js +4 -1
  60. package/dist/form/SearchPalette.js.map +1 -1
  61. package/dist/form/Textarea.js +21 -19
  62. package/dist/form/Textarea.js.map +1 -1
  63. package/dist/form/UploadButton.js +16 -11
  64. package/dist/form/UploadButton.js.map +1 -1
  65. package/dist/layout/ContentToolbar.js +1 -1
  66. package/dist/layout/Dashboard.js +2 -1
  67. package/dist/layout/Dashboard.js.map +1 -1
  68. package/dist/layout/ScrollArea.js +9 -3
  69. package/dist/layout/ScrollArea.js.map +1 -1
  70. package/dist/layout/TableFilter.js +1 -1
  71. package/dist/navigation/Breadcrumbs.js +9 -3
  72. package/dist/navigation/Breadcrumbs.js.map +1 -1
  73. package/dist/navigation/CommandPalette.js +20 -7
  74. package/dist/navigation/CommandPalette.js.map +1 -1
  75. package/dist/navigation/Pagination.js +1 -1
  76. package/dist/navigation/Tabs.js +7 -3
  77. package/dist/navigation/Tabs.js.map +1 -1
  78. package/dist/pt-BR.js +192 -5
  79. package/dist/pt-BR.js.map +1 -1
  80. package/dist/types/components/data-display/Alert/Alert.d.ts +9 -2
  81. package/dist/types/components/data-display/Alert/Alert.d.ts.map +1 -1
  82. package/dist/types/components/data-display/Alert/Alert.types.d.ts +25 -9
  83. package/dist/types/components/data-display/Alert/Alert.types.d.ts.map +1 -1
  84. package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.d.ts.map +1 -1
  85. package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts +6 -0
  86. package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts.map +1 -1
  87. package/dist/types/components/data-display/Banner/Banner.d.ts.map +1 -1
  88. package/dist/types/components/data-display/Banner/Banner.types.d.ts +2 -0
  89. package/dist/types/components/data-display/Banner/Banner.types.d.ts.map +1 -1
  90. package/dist/types/components/data-display/CardKit/card-actions-context.d.ts +3 -1
  91. package/dist/types/components/data-display/CardKit/card-actions-context.d.ts.map +1 -1
  92. package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts +3 -0
  93. package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts.map +1 -1
  94. package/dist/types/components/data-display/Carousel/Carousel.parts.d.ts.map +1 -1
  95. package/dist/types/components/data-display/Carousel/Carousel.types.d.ts +7 -0
  96. package/dist/types/components/data-display/Carousel/Carousel.types.d.ts.map +1 -1
  97. package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts +1 -0
  98. package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts.map +1 -1
  99. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +5 -0
  100. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  101. package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts.map +1 -1
  102. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +29 -1
  103. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  104. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +12 -1
  105. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
  106. package/dist/types/components/data-display/DataViews/data-views-filter-panel.d.ts.map +1 -1
  107. package/dist/types/components/data-display/DataViews/data-views-grid-bodies.d.ts.map +1 -1
  108. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
  109. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
  110. package/dist/types/components/data-display/DataViews/data-views-pagination.d.ts.map +1 -1
  111. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
  112. package/dist/types/components/data-display/DataViews/data-views-table-parts.d.ts.map +1 -1
  113. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
  114. package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts +1 -1
  115. package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts.map +1 -1
  116. package/dist/types/components/data-display/HoverCard/HoverCard.d.ts.map +1 -1
  117. package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts +2 -0
  118. package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts.map +1 -1
  119. package/dist/types/components/data-display/Lightbox/Lightbox.d.ts.map +1 -1
  120. package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts +9 -0
  121. package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts.map +1 -1
  122. package/dist/types/components/data-display/Lightbox/LightboxControls.d.ts.map +1 -1
  123. package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts +17 -0
  124. package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts.map +1 -0
  125. package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts +7 -0
  126. package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts.map +1 -1
  127. package/dist/types/components/data-display/MapPreview/MapLayers.d.ts.map +1 -1
  128. package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts +9 -0
  129. package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts.map +1 -1
  130. package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts +2 -0
  131. package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
  132. package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
  133. package/dist/types/components/data-display/Table/Table.types.d.ts +5 -0
  134. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  135. package/dist/types/components/data-display/Table/TableStates.d.ts +3 -1
  136. package/dist/types/components/data-display/Table/TableStates.d.ts.map +1 -1
  137. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.d.ts.map +1 -1
  138. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts +3 -0
  139. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts.map +1 -1
  140. package/dist/types/components/feedback/Sonner/Sonner.d.ts +8 -0
  141. package/dist/types/components/feedback/Sonner/Sonner.d.ts.map +1 -1
  142. package/dist/types/components/feedback/Sonner/Sonner.types.d.ts +2 -0
  143. package/dist/types/components/feedback/Sonner/Sonner.types.d.ts.map +1 -1
  144. package/dist/types/components/feedback/Sonner/SonnerToast.d.ts.map +1 -1
  145. package/dist/types/components/feedback/StackedModal/StackedModal.d.ts.map +1 -1
  146. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts +2 -0
  147. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  148. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts +2 -0
  149. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts.map +1 -1
  150. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.d.ts.map +1 -1
  151. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts +3 -0
  152. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts.map +1 -1
  153. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts +2 -0
  154. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts.map +1 -1
  155. package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts +7 -0
  156. package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts.map +1 -1
  157. package/dist/types/components/form/AddressAutocomplete/AddressAutocompleteField.d.ts.map +1 -1
  158. package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts +1 -0
  159. package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts.map +1 -1
  160. package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts +1 -0
  161. package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts.map +1 -1
  162. package/dist/types/components/form/Autocomplete/Autocomplete.d.ts.map +1 -1
  163. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts +9 -3
  164. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts.map +1 -1
  165. package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts +7 -0
  166. package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts.map +1 -1
  167. package/dist/types/components/form/Calendar/Calendar.types.d.ts +6 -0
  168. package/dist/types/components/form/Calendar/Calendar.types.d.ts.map +1 -1
  169. package/dist/types/components/form/CodeEditor/CodeEditor.d.ts.map +1 -1
  170. package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts +7 -0
  171. package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts.map +1 -1
  172. package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts +2 -0
  173. package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts.map +1 -1
  174. package/dist/types/components/form/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  175. package/dist/types/components/form/DateRangePicker/DateRangePicker.range.d.ts.map +1 -1
  176. package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts +11 -0
  177. package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts.map +1 -1
  178. package/dist/types/components/form/DateRangePicker/DateRangePickerFields.d.ts.map +1 -1
  179. package/dist/types/components/form/Menubar/Menubar.d.ts.map +1 -1
  180. package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts +1 -0
  181. package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts.map +1 -1
  182. package/dist/types/components/form/Menubar/Menubar.types.d.ts +5 -0
  183. package/dist/types/components/form/Menubar/Menubar.types.d.ts.map +1 -1
  184. package/dist/types/components/form/PasswordStrength/PasswordStrength.d.ts.map +1 -1
  185. package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts +4 -2
  186. package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts.map +1 -1
  187. package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts +8 -0
  188. package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts.map +1 -1
  189. package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
  190. package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts +7 -0
  191. package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts.map +1 -1
  192. package/dist/types/components/form/SearchPalette/SearchPalette.d.ts.map +1 -1
  193. package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts +2 -0
  194. package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts.map +1 -1
  195. package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts +6 -0
  196. package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts.map +1 -1
  197. package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
  198. package/dist/types/components/form/Textarea/Textarea.types.d.ts +16 -1
  199. package/dist/types/components/form/Textarea/Textarea.types.d.ts.map +1 -1
  200. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts +7 -0
  201. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
  202. package/dist/types/components/form/UploadButton/UploadButton.d.ts.map +1 -1
  203. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts +6 -3
  204. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts.map +1 -1
  205. package/dist/types/components/form/UploadButton/UploadButton.types.d.ts +7 -0
  206. package/dist/types/components/form/UploadButton/UploadButton.types.d.ts.map +1 -1
  207. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts +1 -1
  208. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts.map +1 -1
  209. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts +12 -0
  210. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts.map +1 -1
  211. package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts +1 -1
  212. package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts.map +1 -1
  213. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts +1 -1
  214. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts.map +1 -1
  215. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts +1 -1
  216. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts.map +1 -1
  217. package/dist/types/components/layout/Dashboard/Dashboard.d.ts +1 -1
  218. package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts +4 -0
  219. package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts.map +1 -1
  220. package/dist/types/components/layout/Dashboard/DashboardParts.d.ts +1 -1
  221. package/dist/types/components/layout/Dashboard/DashboardParts.d.ts.map +1 -1
  222. package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
  223. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +21 -3
  224. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
  225. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts +2 -0
  226. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts.map +1 -1
  227. package/dist/types/components/layout/TableFilter/TableFilter.d.ts +1 -1
  228. package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
  229. package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts +7 -0
  230. package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts.map +1 -1
  231. package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts +9 -0
  232. package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts.map +1 -1
  233. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts +2 -0
  234. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts.map +1 -1
  235. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  236. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +3 -0
  237. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -1
  238. package/dist/types/components/navigation/CommandPalette/CommandPalette.d.ts.map +1 -1
  239. package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts +3 -0
  240. package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts.map +1 -1
  241. package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts +2 -0
  242. package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts.map +1 -1
  243. package/dist/types/components/navigation/Pagination/Pagination.d.ts.map +1 -1
  244. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +2 -0
  245. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts.map +1 -1
  246. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts +2 -0
  247. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
  248. package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
  249. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +2 -0
  250. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts.map +1 -1
  251. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
  252. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +6 -2
  253. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
  254. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +6 -0
  255. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
  256. package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts +4 -2
  257. package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts.map +1 -1
  258. package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts +8 -7
  259. package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts.map +1 -1
  260. package/dist/types/copy/data-display.d.ts +56 -0
  261. package/dist/types/copy/data-display.d.ts.map +1 -0
  262. package/dist/types/copy/feedback.d.ts +38 -0
  263. package/dist/types/copy/feedback.d.ts.map +1 -0
  264. package/dist/types/copy/form.d.ts +146 -0
  265. package/dist/types/copy/form.d.ts.map +1 -0
  266. package/dist/types/copy/layout.d.ts +18 -0
  267. package/dist/types/copy/layout.d.ts.map +1 -0
  268. package/dist/types/copy/navigation.d.ts +24 -0
  269. package/dist/types/copy/navigation.d.ts.map +1 -0
  270. package/dist/types/copy/shared.d.ts +119 -0
  271. package/dist/types/copy/shared.d.ts.map +1 -0
  272. package/dist/types/copy/utility.d.ts +35 -0
  273. package/dist/types/copy/utility.d.ts.map +1 -0
  274. package/dist/types/copy.d.ts +13 -113
  275. package/dist/types/copy.d.ts.map +1 -1
  276. package/dist/types/pt-BR.d.ts +15 -18
  277. package/dist/types/pt-BR.d.ts.map +1 -1
  278. package/dist/types/pt-BR.data-display.d.ts +13 -0
  279. package/dist/types/pt-BR.data-display.d.ts.map +1 -0
  280. package/dist/types/pt-BR.feedback.d.ts +8 -0
  281. package/dist/types/pt-BR.feedback.d.ts.map +1 -0
  282. package/dist/types/pt-BR.form.d.ts +13 -0
  283. package/dist/types/pt-BR.form.d.ts.map +1 -0
  284. package/dist/types/pt-BR.layout.d.ts +7 -0
  285. package/dist/types/pt-BR.layout.d.ts.map +1 -0
  286. package/dist/types/pt-BR.navigation.d.ts +8 -0
  287. package/dist/types/pt-BR.navigation.d.ts.map +1 -0
  288. package/dist/types/pt-BR.shared.d.ts +21 -0
  289. package/dist/types/pt-BR.shared.d.ts.map +1 -0
  290. package/dist/types/pt-BR.utility.d.ts +8 -0
  291. package/dist/types/pt-BR.utility.d.ts.map +1 -0
  292. package/dist/types/user-avatar/user-avatar.d.ts +7 -1
  293. package/dist/types/user-avatar/user-avatar.d.ts.map +1 -1
  294. package/dist/user-avatar.js +2 -2
  295. package/dist/user-avatar.js.map +1 -1
  296. package/dist/utility/InfiniteScroll.js +7 -5
  297. package/dist/utility/InfiniteScroll.js.map +1 -1
  298. package/dist/utility/InstallPrompt.js +14 -13
  299. package/dist/utility/InstallPrompt.js.map +1 -1
  300. package/package.json +1 -1
  301. package/src/components/data-display/Alert/Alert.tsx +22 -5
  302. package/src/components/data-display/Alert/Alert.types.ts +20 -10
  303. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +2 -1
  304. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +6 -0
  305. package/src/components/data-display/Banner/Banner.tsx +5 -2
  306. package/src/components/data-display/Banner/Banner.types.ts +2 -0
  307. package/src/components/data-display/CardKit/card-actions-context.tsx +4 -0
  308. package/src/components/data-display/Carousel/Carousel.chrome.tsx +5 -0
  309. package/src/components/data-display/Carousel/Carousel.parts.tsx +4 -3
  310. package/src/components/data-display/Carousel/Carousel.types.ts +7 -0
  311. package/src/components/data-display/DataGrid/DataGrid.states.tsx +3 -3
  312. package/src/components/data-display/DataGrid/DataGrid.tsx +1 -1
  313. package/src/components/data-display/DataGrid/DataGrid.types.ts +5 -0
  314. package/src/components/data-display/DataViews/data-views-category-pill.tsx +2 -0
  315. package/src/components/data-display/DataViews/data-views-copy.ts +29 -1
  316. package/src/components/data-display/DataViews/data-views-day-input.tsx +14 -3
  317. package/src/components/data-display/DataViews/data-views-filter-panel.tsx +2 -1
  318. package/src/components/data-display/DataViews/data-views-grid-bodies.tsx +3 -0
  319. package/src/components/data-display/DataViews/data-views-grid-parts.tsx +9 -10
  320. package/src/components/data-display/DataViews/data-views-more-fields.tsx +3 -1
  321. package/src/components/data-display/DataViews/data-views-pagination.tsx +3 -0
  322. package/src/components/data-display/DataViews/data-views-range-pill.tsx +3 -1
  323. package/src/components/data-display/DataViews/data-views-table-parts.tsx +1 -0
  324. package/src/components/data-display/DataViews/data-views-toolbar.tsx +2 -0
  325. package/src/components/data-display/HoverCard/HoverCard.content.tsx +10 -2
  326. package/src/components/data-display/HoverCard/HoverCard.tsx +2 -3
  327. package/src/components/data-display/HoverCard/HoverCard.types.ts +2 -0
  328. package/src/components/data-display/Lightbox/Lightbox.tsx +3 -0
  329. package/src/components/data-display/Lightbox/Lightbox.types.ts +9 -0
  330. package/src/components/data-display/Lightbox/LightboxControls.tsx +28 -15
  331. package/src/components/data-display/Lightbox/lightbox-copy-context.tsx +42 -0
  332. package/src/components/data-display/MapPreview/MapControlBar.tsx +17 -9
  333. package/src/components/data-display/MapPreview/MapLayers.tsx +2 -0
  334. package/src/components/data-display/MapPreview/MapPreview.types.ts +10 -0
  335. package/src/components/data-display/MapPreview/MapSearchBar.tsx +4 -1
  336. package/src/components/data-display/Table/Table.tsx +7 -2
  337. package/src/components/data-display/Table/Table.types.ts +5 -0
  338. package/src/components/data-display/Table/TableStates.tsx +2 -2
  339. package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +3 -2
  340. package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +3 -0
  341. package/src/components/feedback/Sonner/Sonner.tsx +15 -3
  342. package/src/components/feedback/Sonner/Sonner.types.ts +2 -0
  343. package/src/components/feedback/Sonner/SonnerToast.tsx +2 -1
  344. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +10 -3
  345. package/src/components/feedback/StackedModal/StackedModal.tsx +2 -1
  346. package/src/components/feedback/StackedModal/StackedModal.types.ts +2 -0
  347. package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +13 -1
  348. package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +3 -0
  349. package/src/components/feedback/TutorialOverlay/TutorialStepBody.tsx +10 -4
  350. package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +7 -0
  351. package/src/components/form/AddressAutocomplete/AddressAutocompleteField.tsx +2 -0
  352. package/src/components/form/AddressAutocomplete/AddressFallbackField.tsx +4 -2
  353. package/src/components/form/AddressAutocomplete/AddressInputField.tsx +13 -6
  354. package/src/components/form/Autocomplete/Autocomplete.parts.tsx +9 -6
  355. package/src/components/form/Autocomplete/Autocomplete.tsx +2 -1
  356. package/src/components/form/Autocomplete/Autocomplete.types.ts +7 -0
  357. package/src/components/form/Calendar/Calendar.tsx +2 -2
  358. package/src/components/form/Calendar/Calendar.types.ts +7 -0
  359. package/src/components/form/CodeEditor/CodeEditor.tsx +6 -4
  360. package/src/components/form/CodeEditor/CodeEditor.types.ts +7 -0
  361. package/src/components/form/CodeEditor/CodeEditorToolbar.tsx +12 -5
  362. package/src/components/form/DateRangePicker/DateRangePicker.range.ts +2 -0
  363. package/src/components/form/DateRangePicker/DateRangePicker.tsx +4 -0
  364. package/src/components/form/DateRangePicker/DateRangePicker.types.ts +11 -0
  365. package/src/components/form/DateRangePicker/DateRangePickerFields.tsx +2 -0
  366. package/src/components/form/Menubar/Menubar.toolbar.tsx +3 -1
  367. package/src/components/form/Menubar/Menubar.tsx +2 -1
  368. package/src/components/form/Menubar/Menubar.types.ts +5 -0
  369. package/src/components/form/PasswordStrength/PasswordStrength.helpers.tsx +33 -17
  370. package/src/components/form/PasswordStrength/PasswordStrength.tsx +29 -13
  371. package/src/components/form/PasswordStrength/PasswordStrength.types.ts +9 -0
  372. package/src/components/form/PhoneInput/PhoneInput.tsx +15 -5
  373. package/src/components/form/PhoneInput/PhoneInput.types.ts +7 -0
  374. package/src/components/form/SearchPalette/SearchPalette.parts.tsx +4 -1
  375. package/src/components/form/SearchPalette/SearchPalette.tsx +4 -1
  376. package/src/components/form/SearchPalette/SearchPalette.types.ts +6 -0
  377. package/src/components/form/Textarea/Textarea.tsx +6 -1
  378. package/src/components/form/Textarea/Textarea.types.ts +14 -1
  379. package/src/components/form/Textarea/TextareaRichEditor.tsx +28 -18
  380. package/src/components/form/UploadButton/UploadButton.parts.tsx +16 -7
  381. package/src/components/form/UploadButton/UploadButton.tsx +4 -1
  382. package/src/components/form/UploadButton/UploadButton.types.ts +8 -0
  383. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +10 -2
  384. package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +12 -0
  385. package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +15 -4
  386. package/src/components/layout/ContentToolbar/SortByDropdown.tsx +12 -3
  387. package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -1
  388. package/src/components/layout/Dashboard/Dashboard.types.ts +4 -0
  389. package/src/components/layout/Dashboard/DashboardParts.tsx +2 -1
  390. package/src/components/layout/ScrollArea/ScrollArea.tsx +16 -3
  391. package/src/components/layout/ScrollArea/ScrollArea.types.ts +19 -4
  392. package/src/components/layout/ScrollArea/ScrollViewport.tsx +4 -1
  393. package/src/components/layout/TableFilter/TableFilter.tsx +19 -11
  394. package/src/components/layout/TableFilter/TableFilter.types.ts +8 -0
  395. package/src/components/layout/TableFilter/TableFilterContext.tsx +10 -0
  396. package/src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx +11 -4
  397. package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +2 -0
  398. package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +3 -0
  399. package/src/components/navigation/CommandPalette/CommandPalette.tsx +15 -5
  400. package/src/components/navigation/CommandPalette/CommandPalette.types.ts +3 -0
  401. package/src/components/navigation/CommandPalette/CommandPaletteResults.tsx +5 -2
  402. package/src/components/navigation/Pagination/Pagination.tsx +2 -0
  403. package/src/components/navigation/Pagination/Pagination.types.ts +2 -0
  404. package/src/components/navigation/Pagination/PaginationParts.tsx +4 -1
  405. package/src/components/navigation/Tabs/Tabs.tsx +8 -3
  406. package/src/components/navigation/Tabs/Tabs.types.ts +2 -0
  407. package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +4 -4
  408. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +4 -2
  409. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +6 -0
  410. package/src/components/utility/InstallPrompt/InstallPrompt.tsx +18 -13
  411. package/src/components/utility/InstallPrompt/InstallPrompt.types.ts +9 -7
  412. package/src/copy/data-display.ts +60 -0
  413. package/src/copy/feedback.ts +39 -0
  414. package/src/copy/form.ts +154 -0
  415. package/src/copy/layout.ts +18 -0
  416. package/src/copy/navigation.ts +25 -0
  417. package/src/copy/shared.ts +122 -0
  418. package/src/copy/utility.ts +36 -0
  419. package/src/copy.ts +13 -117
  420. package/src/pt-BR.data-display.ts +236 -0
  421. package/src/pt-BR.feedback.ts +25 -0
  422. package/src/pt-BR.form.ts +96 -0
  423. package/src/pt-BR.layout.ts +15 -0
  424. package/src/pt-BR.navigation.ts +21 -0
  425. package/src/pt-BR.shared.ts +94 -0
  426. package/src/pt-BR.ts +15 -267
  427. package/src/pt-BR.utility.ts +21 -0
  428. package/src/user-avatar/user-avatar.tsx +8 -2
  429. package/dist/chunk-3KWD5Y5O.js.map +0 -1
  430. package/dist/chunk-CEKPLUQV.js.map +0 -1
  431. package/dist/chunk-DFVRZ3UK.js.map +0 -1
  432. package/dist/chunk-H7UAGTVW.js.map +0 -1
  433. package/dist/chunk-JP55QWVR.js.map +0 -1
  434. package/dist/chunk-NUCLEOHF.js.map +0 -1
  435. package/dist/chunk-QLBYAYUG.js.map +0 -1
  436. package/dist/chunk-QZZVHY6U.js.map +0 -1
@@ -86,10 +86,11 @@ var DetailedContent = ({
86
86
  ] });
87
87
  var HoverCardContent = (props) => {
88
88
  const { variant, title, description, avatar, loading, loadingComponent, children, dataTestId } = props;
89
+ const { loadingText } = props;
89
90
  if (loading) {
90
91
  return /* @__PURE__ */ jsx(LoadingContainer, { children: loadingComponent || /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
91
92
  /* @__PURE__ */ jsx(CircularProgress, { size: 20 }),
92
- /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Loading..." })
93
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: loadingText })
93
94
  ] }) });
94
95
  }
95
96
  if (variant === "detailed" && (avatar || title || description)) {
@@ -486,6 +487,7 @@ var HoverCard = React3.forwardRef((props, ref) => {
486
487
  maxWidth,
487
488
  loading,
488
489
  loadingComponent,
490
+ loadingText,
489
491
  touchEnabled,
490
492
  offset,
491
493
  disabled,
@@ -542,6 +544,7 @@ var HoverCard = React3.forwardRef((props, ref) => {
542
544
  children: /* @__PURE__ */ jsx2(CardContent, { sx: { p: padding, "&:last-child": { pb: padding } }, children: /* @__PURE__ */ jsx2(
543
545
  HoverCardContent,
544
546
  {
547
+ loadingText,
545
548
  variant,
546
549
  title,
547
550
  description,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-display/HoverCard/HoverCard.tsx","../../src/components/data-display/HoverCard/HoverCard.content.tsx","../../src/components/data-display/HoverCard/HoverCard.hooks.ts","../../src/components/data-display/HoverCard/HoverCard.styles.ts","../../src/components/data-display/HoverCard/HoverCard.animations.ts"],"sourcesContent":["import { Box, Card, CardContent, Popover } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { HoverCardContent } from './HoverCard.content';\nimport { useHoverCard } from './HoverCard.hooks';\nimport { arrowSx, cardSx, getAnchorOrigin, getTransformOrigin, sideOf } from './HoverCard.styles';\nimport type { CardStyleFlags } from './HoverCard.styles';\nimport type { HoverCardAnimation, HoverCardPlacement, HoverCardProps } from './HoverCard.types';\n\nconst ArrowContainer = styled('div')<{ placement: HoverCardPlacement; offset: number }>(\n ({ theme, placement }) => ({ ...arrowSx(theme, placement) }),\n);\n\nconst StyledCard = styled(Card, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'animation'].includes(prop as string),\n})<CardStyleFlags>(({ theme, ...flags }) => ({ ...cardSx(theme, flags) }));\n\nconst StyledPopover = styled(Popover, {\n shouldForwardProp: (prop) => prop !== 'customAnimation',\n})<{ customAnimation?: HoverCardAnimation }>(({ customAnimation }) => ({\n // The popover only positions; StyledCard draws the surface.\n '& .MuiPopover-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n overflow: 'visible',\n ...(customAnimation === 'scale' && { transformOrigin: 'center' }),\n },\n}));\n\nconst DEFAULTS = {\n variant: 'default',\n glow: false,\n pulse: false,\n placement: 'bottom',\n showArrow: false,\n animation: 'fade',\n enterDelay: 700,\n exitDelay: 0,\n maxWidth: 400,\n loading: false,\n touchEnabled: true,\n offset: 8,\n disabled: false,\n} satisfies Partial<HoverCardProps>;\n\ntype ResolvedProps = HoverCardProps & Required<Pick<HoverCardProps, keyof typeof DEFAULTS>>;\n\n/** Padding is the variant's own: detailed roomier, minimal tighter. */\nconst CONTENT_PADDING: Record<string, number> = { detailed: 3, minimal: 1.5 };\n\n/** The card is nudged off the anchor on whichever side it sits. */\nconst offsetMargin = (placement: HoverCardPlacement, offset: number) => {\n const side = sideOf(placement);\n const key = ({ top: 'mt', bottom: 'mb', left: 'ml', right: 'mr' } as const)[side];\n return { [key]: `${offset}px` };\n};\n\nexport const HoverCard = React.forwardRef<HTMLDivElement, HoverCardProps>((props, ref) => {\n const {\n variant, glow, pulse, title, description, avatar, trigger, placement, showArrow,\n animation, enterDelay, exitDelay, maxWidth, loading, loadingComponent, touchEnabled,\n offset, disabled, onOpen, onClose, children, dataTestId,\n ...rest\n } = withDefaults(props, DEFAULTS) as ResolvedProps;\n\n const { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers } = useHoverCard({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n });\n\n const triggerProps = {\n ...triggerHandlers,\n style: { cursor: disabled ? 'default' : 'pointer' },\n 'data-testid': dataTestId ? `${dataTestId}-trigger` : 'hover-card-trigger',\n };\n\n const triggerElement = trigger ? (\n React.cloneElement(trigger, triggerProps)\n ) : (\n <span {...triggerProps} style={{ display: 'inline-block', ...triggerProps.style }}>\n {children}\n </span>\n );\n\n const padding = CONTENT_PADDING[variant] ?? 2;\n\n return (\n <>\n {triggerElement}\n <StyledPopover\n ref={ref}\n open={isOpen && !disabled}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={getAnchorOrigin(placement)}\n transformOrigin={getTransformOrigin(placement)}\n {...cardHandlers}\n disableAutoFocus\n disableEnforceFocus\n disableRestoreFocus\n customAnimation={animation}\n slotProps={{ paper: { style: { pointerEvents: 'auto' } } }}\n {...rest}\n >\n <Box sx={{ position: 'relative' }}>\n {showArrow && <ArrowContainer placement={placement} offset={offset} />}\n <StyledCard\n customVariant={variant}\n glow={glow}\n pulse={pulse}\n animation={animation}\n data-testid={dataTestId || 'hover-card-content'}\n sx={{ maxWidth, ...offsetMargin(placement, offset) }}\n >\n <CardContent sx={{ p: padding, '&:last-child': { pb: padding } }}>\n <HoverCardContent\n variant={variant}\n title={title}\n description={description}\n avatar={avatar}\n loading={loading}\n loadingComponent={loadingComponent}\n dataTestId={dataTestId}\n >\n {children}\n </HoverCardContent>\n </CardContent>\n </StyledCard>\n </Box>\n </StyledPopover>\n </>\n );\n});\n\nHoverCard.displayName = 'HoverCard';\n","import { Avatar, Box, CircularProgress, Typography } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type { HoverCardProps } from './HoverCard.types';\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 80,\n color: theme.palette.text.secondary,\n}));\n\n/** `${dataTestId}-${suffix}`, or the shared default when the caller gave no id. */\nconst testId = (base: string | undefined, suffix: string, fallback: string) =>\n base ? `${base}-${suffix}` : fallback;\n\nexport interface HoverCardContentProps\n extends Pick<\n HoverCardProps,\n 'variant' | 'title' | 'description' | 'avatar' | 'loading' | 'loadingComponent' | 'children'\n > {\n dataTestId?: string;\n}\n\n/** A string avatar is a src; anything else is an element to re-size in place. */\nconst CardAvatar: React.FC<{ avatar: HoverCardProps['avatar'] }> = ({ avatar }) => {\n if (!avatar) return null;\n\n if (typeof avatar === 'string') {\n return <Avatar src={avatar} sx={{ width: 48, height: 48, mr: 2 }} />;\n }\n\n const element = avatar as React.ReactElement<{ sx?: object }>;\n return React.cloneElement(element, {\n sx: { width: 48, height: 48, mr: 2, ...element.props.sx },\n });\n};\n\nconst Title: React.FC<{\n title: React.ReactNode;\n variant?: string;\n sx?: object;\n dataTestId?: string;\n}> = ({ title, variant, sx, dataTestId }) => (\n <Typography\n variant={variant === 'minimal' ? 'body2' : 'subtitle1'}\n sx={{ fontWeight: 600, ...sx }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n);\n\nconst Description: React.FC<{\n description: React.ReactNode;\n sx?: object;\n dataTestId?: string;\n}> = ({ description, sx, dataTestId }) => (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={sx}\n data-testid={testId(dataTestId, 'description', 'hover-card-description')}\n >\n {description}\n </Typography>\n);\n\n/** The detailed variant leads with the avatar and sets the text beside it. */\nconst DetailedContent: React.FC<HoverCardContentProps> = ({\n title,\n description,\n avatar,\n children,\n dataTestId,\n}) => (\n <>\n {avatar && (\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\n <CardAvatar avatar={avatar} />\n <Box>\n {title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 0.5 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n </Box>\n </Box>\n )}\n {!avatar && title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 1 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {!avatar && description && (\n <Description description={description} sx={{ mb: 1 }} dataTestId={dataTestId} />\n )}\n {children && <Box>{children}</Box>}\n </>\n);\n\nexport const HoverCardContent: React.FC<HoverCardContentProps> = (props) => {\n const { variant, title, description, avatar, loading, loadingComponent, children, dataTestId } =\n props;\n\n if (loading) {\n return (\n <LoadingContainer>\n {loadingComponent || (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={20} />\n <Typography variant=\"body2\">Loading...</Typography>\n </Box>\n )}\n </LoadingContainer>\n );\n }\n\n if (variant === 'detailed' && (avatar || title || description)) {\n return <DetailedContent {...props} />;\n }\n\n return (\n <>\n {title && (\n <Title title={title} variant={variant} sx={{ mb: 0.5 }} dataTestId={dataTestId} />\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n {children}\n </>\n );\n};\n","import React from 'react';\n\ninterface HandlerInput {\n isTouchDevice: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n openCard: (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => void;\n closeCard: () => void;\n exitTimeoutRef: React.MutableRefObject<number | undefined>;\n}\n\n/**\n * The pointer and touch handlers, over the open/close pair. Touch gets a\n * long-press because there is no hover to respond to; the card's own handlers\n * keep it open while the pointer is travelling onto it.\n */\nconst useHoverHandlers = ({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n}: HandlerInput) => {\n const [touchTimeout, setTouchTimeout] = React.useState<number>();\n\n /** A touch device with touch disabled has no hover to respond to. */\n const hoverIgnored = isTouchDevice && !touchEnabled;\n\n const cancelTouch = React.useCallback(() => {\n if (touchTimeout) {\n window.clearTimeout(touchTimeout);\n setTouchTimeout(undefined);\n }\n }, [touchTimeout]);\n\n React.useEffect(\n () => () => {\n if (touchTimeout) window.clearTimeout(touchTimeout);\n },\n [touchTimeout],\n );\n\n const triggerHandlers = {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n if (hoverIgnored) return;\n openCard(event);\n },\n onMouseLeave: () => {\n if (hoverIgnored) return;\n closeCard();\n },\n onTouchStart: (event: React.TouchEvent<HTMLElement>) => {\n if (!touchEnabled) return;\n if (touchTimeout) window.clearTimeout(touchTimeout);\n setTouchTimeout(window.setTimeout(() => openCard(event), enterDelay));\n },\n // End and cancel do the same thing: the press did not become a long press.\n onTouchEnd: cancelTouch,\n onTouchCancel: cancelTouch,\n };\n\n /** Moving onto the card keeps it open; leaving it starts the exit delay. */\n const cardHandlers = {\n onMouseEnter: () => {\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n onMouseLeave: closeCard,\n };\n\n return { triggerHandlers, cardHandlers };\n};\n\n/** Escape dismisses the card while it is open. */\nconst useEscapeKey = (active: boolean, onEscape: () => void) => {\n React.useEffect(() => {\n if (!active) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') onEscape();\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [active, onEscape]);\n};\n\ninterface HoverCardTimingInput {\n disabled: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n exitDelay: number;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\n/**\n * When the card is open, and the delays that decide it.\n *\n * Three timers are in play: the enter delay before opening, the exit delay\n * before closing (so the pointer can travel from the trigger onto the card\n * without dismissing it), and the long-press timer on touch. Each cancels the\n * others' pending work, which is why they live together.\n */\nexport const useHoverCard = ({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n}: HoverCardTimingInput) => {\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);\n const [isOpen, setIsOpen] = React.useState(false);\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n const enterTimeoutRef = React.useRef<number | undefined>(undefined);\n const exitTimeoutRef = React.useRef<number | undefined>(undefined);\n\n // Probed in an effect, not during render, so SSR and hydration stay intact.\n React.useEffect(() => {\n setIsTouchDevice('ontouchstart' in window);\n }, []);\n\n const openCard = React.useCallback(\n (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => {\n if (disabled) return;\n\n if (exitTimeoutRef.current) {\n window.clearTimeout(exitTimeoutRef.current);\n }\n\n const target = event.currentTarget;\n enterTimeoutRef.current = window.setTimeout(() => {\n setAnchorEl(target);\n setIsOpen(true);\n onOpen?.();\n }, enterDelay);\n },\n [disabled, enterDelay, onOpen],\n );\n\n const closeCard = React.useCallback(() => {\n if (enterTimeoutRef.current) {\n window.clearTimeout(enterTimeoutRef.current);\n }\n\n exitTimeoutRef.current = window.setTimeout(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, exitDelay);\n }, [exitDelay, onClose]);\n\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, [onClose]);\n\n const { triggerHandlers, cardHandlers } = useHoverHandlers({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n });\n\n useEscapeKey(isOpen, handleClose);\n\n React.useEffect(\n () => () => {\n if (enterTimeoutRef.current) window.clearTimeout(enterTimeoutRef.current);\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n [],\n );\n\n return { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers };\n};\n","import { alpha } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport {\n pulseAnimation,\n scaleIn,\n slideInDown,\n slideInLeft,\n slideInRight,\n slideInUp,\n} from './HoverCard.animations';\nimport type { HoverCardAnimation, HoverCardPlacement } from './HoverCard.types';\n\n/** The edge the card sits on, ignoring the `-start`/`-end` alignment suffix. */\ntype Side = 'top' | 'bottom' | 'left' | 'right';\n\nexport const sideOf = (placement: HoverCardPlacement): Side => {\n if (placement.startsWith('top')) return 'top';\n if (placement.startsWith('left')) return 'left';\n if (placement.startsWith('right')) return 'right';\n return 'bottom';\n};\n\nconst ARROW_SIZE = 8;\n\n/**\n * The arrow is a CSS triangle: two transparent borders on the cross axis and one\n * filled border pointing back at the anchor. Every placement is that same shape,\n * so the table holds only which edge is filled and where the triangle sits.\n */\nconst ARROWS: Record<Side, (color: string) => CSSObject> = {\n top: (color) => ({\n bottom: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid ${color}`,\n }),\n bottom: (color) => ({\n top: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid ${color}`,\n }),\n left: (color) => ({\n right: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderLeft: `${ARROW_SIZE}px solid ${color}`,\n }),\n right: (color) => ({\n left: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid ${color}`,\n }),\n};\n\nexport const arrowSx = (theme: Theme, placement: HoverCardPlacement): CSSObject => ({\n position: 'absolute',\n width: 0,\n height: 0,\n zIndex: 1,\n ...ARROWS[sideOf(placement)](theme.palette.background.paper),\n});\n\ntype Origin = { vertical: 'top' | 'center' | 'bottom'; horizontal: 'left' | 'center' | 'right' };\n\n/** Where the popover attaches to the anchor, per side. */\nconst ANCHOR_ORIGINS: Record<Side, Origin> = {\n top: { vertical: 'top', horizontal: 'center' },\n bottom: { vertical: 'bottom', horizontal: 'center' },\n left: { vertical: 'center', horizontal: 'left' },\n right: { vertical: 'center', horizontal: 'right' },\n};\n\n/** The card's own corner meets the anchor's, so its origin is the opposite one. */\nconst flip = (origin: Origin): Origin => ({\n vertical: origin.vertical === 'top' ? 'bottom' : origin.vertical === 'bottom' ? 'top' : 'center',\n horizontal:\n origin.horizontal === 'left' ? 'right' : origin.horizontal === 'right' ? 'left' : 'center',\n});\n\nexport const getAnchorOrigin = (placement: HoverCardPlacement): Origin =>\n ANCHOR_ORIGINS[sideOf(placement)];\n\nexport const getTransformOrigin = (placement: HoverCardPlacement): Origin =>\n flip(ANCHOR_ORIGINS[sideOf(placement)]);\n\nconst ANIMATIONS: Record<string, CSSObject> = {\n // `fade` shares slideInUp deliberately: the keyframes fade in while rising.\n fade: { animation: `${slideInUp} 0.2s ease-out` },\n scale: { transformOrigin: 'center', animation: `${scaleIn} 0.2s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-up': { animation: `${slideInUp} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-down': { animation: `${slideInDown} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-left': { animation: `${slideInLeft} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-right': { animation: `${slideInRight} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n};\n\nconst VARIANTS: Record<string, (theme: Theme) => CSSObject> = {\n default: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[8],\n }),\n glass: (theme) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.85),\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.common.black, 0.12)}`,\n }),\n detailed: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[12],\n }),\n minimal: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n boxShadow: theme.shadows[4],\n }),\n};\n\nconst glowStyles = (theme: Theme): CSSObject => ({\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n});\n\nconst pulseStyles = (theme: Theme): CSSObject => ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n});\n\nexport interface CardStyleFlags {\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n animation?: HoverCardAnimation;\n}\n\nexport const cardSx = (theme: Theme, flags: CardStyleFlags): CSSObject => {\n const { customVariant, glow, pulse, animation } = flags;\n\n return {\n borderRadius: theme.spacing(1.5),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n overflow: 'visible',\n minWidth: 200,\n maxWidth: 400,\n ...(animation ? (ANIMATIONS[animation] ?? {}) : {}),\n ...(customVariant ? (VARIANTS[customVariant]?.(theme) ?? {}) : {}),\n // The old \"both\" arm was exactly these two spread together.\n ...(glow && glowStyles(theme)),\n ...(pulse && pulseStyles(theme)),\n };\n};\n","import { keyframes } from '@mui/material';\n\nexport const pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nexport const slideInUp = keyframes`\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInDown = keyframes`\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const slideInRight = keyframes`\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const scaleIn = keyframes`\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Arrow component\n"],"mappings":";;;;;;AAAA,SAAS,OAAAA,MAAK,MAAM,aAAa,eAAe;AAChD,SAAS,UAAAC,eAAc;AACvB,OAAOC,YAAW;;;ACFlB,SAAS,QAAQ,KAAK,kBAAkB,kBAAkB;AAC1D,SAAS,cAAc;AACvB,OAAO,WAAW;AA6BP,SA+CT,UA/CS,KAmDH,YAnDG;AAzBX,IAAM,mBAAmB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACnD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO,MAAM,QAAQ,KAAK;AAC5B,EAAE;AAGF,IAAM,SAAS,CAAC,MAA0B,QAAgB,aACxD,OAAO,GAAG,IAAI,IAAI,MAAM,KAAK;AAW/B,IAAM,aAA6D,CAAC,EAAE,OAAO,MAAM;AACjF,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,oBAAC,UAAO,KAAK,QAAQ,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;AAAA,EACpE;AAEA,QAAM,UAAU;AAChB,SAAO,MAAM,aAAa,SAAS;AAAA,IACjC,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,GAAG,QAAQ,MAAM,GAAG;AAAA,EAC1D,CAAC;AACH;AAEA,IAAM,QAKD,CAAC,EAAE,OAAO,SAAS,IAAI,WAAW,MACrC;AAAA,EAAC;AAAA;AAAA,IACC,SAAS,YAAY,YAAY,UAAU;AAAA,IAC3C,IAAI,EAAE,YAAY,KAAK,GAAG,GAAG;AAAA,IAC7B,eAAa,OAAO,YAAY,SAAS,kBAAkB;AAAA,IAE1D;AAAA;AACH;AAGF,IAAM,cAID,CAAC,EAAE,aAAa,IAAI,WAAW,MAClC;AAAA,EAAC;AAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN;AAAA,IACA,eAAa,OAAO,YAAY,eAAe,wBAAwB;AAAA,IAEtE;AAAA;AACH;AAIF,IAAM,kBAAmD,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,iCACG;AAAA,YACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,IAAI,EAAE,GACtD;AAAA,wBAAC,cAAW,QAAgB;AAAA,IAC5B,qBAAC,OACE;AAAA,eACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,EAAE,YAAY,KAAK,IAAI,IAAI;AAAA,UAC/B,eAAa,OAAO,YAAY,SAAS,kBAAkB;AAAA,UAE1D;AAAA;AAAA,MACH;AAAA,MAED,eAAe,oBAAC,eAAY,aAA0B,YAAwB;AAAA,OACjF;AAAA,KACF;AAAA,EAED,CAAC,UAAU,SACV;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,IAAI,EAAE,YAAY,KAAK,IAAI,EAAE;AAAA,MAC7B,eAAa,OAAO,YAAY,SAAS,kBAAkB;AAAA,MAE1D;AAAA;AAAA,EACH;AAAA,EAED,CAAC,UAAU,eACV,oBAAC,eAAY,aAA0B,IAAI,EAAE,IAAI,EAAE,GAAG,YAAwB;AAAA,EAE/E,YAAY,oBAAC,OAAK,UAAS;AAAA,GAC9B;AAGK,IAAM,mBAAoD,CAAC,UAAU;AAC1E,QAAM,EAAE,SAAS,OAAO,aAAa,QAAQ,SAAS,kBAAkB,UAAU,WAAW,IAC3F;AAEF,MAAI,SAAS;AACX,WACE,oBAAC,oBACE,8BACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,0BAAC,oBAAiB,MAAM,IAAI;AAAA,MAC5B,oBAAC,cAAW,SAAQ,SAAQ,wBAAU;AAAA,OACxC,GAEJ;AAAA,EAEJ;AAEA,MAAI,YAAY,eAAe,UAAU,SAAS,cAAc;AAC9D,WAAO,oBAAC,mBAAiB,GAAG,OAAO;AAAA,EACrC;AAEA,SACE,iCACG;AAAA,aACC,oBAAC,SAAM,OAAc,SAAkB,IAAI,EAAE,IAAI,IAAI,GAAG,YAAwB;AAAA,IAEjF,eAAe,oBAAC,eAAY,aAA0B,YAAwB;AAAA,IAC9E;AAAA,KACH;AAEJ;;;AC9IA,OAAOC,YAAW;AAgBlB,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAoB;AAClB,QAAM,CAAC,cAAc,eAAe,IAAIA,OAAM,SAAiB;AAG/D,QAAM,eAAe,iBAAiB,CAAC;AAEvC,QAAM,cAAcA,OAAM,YAAY,MAAM;AAC1C,QAAI,cAAc;AAChB,aAAO,aAAa,YAAY;AAChC,sBAAgB,MAAS;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,EAAAA,OAAM;AAAA,IACJ,MAAM,MAAM;AACV,UAAI,aAAc,QAAO,aAAa,YAAY;AAAA,IACpD;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,kBAAkB;AAAA,IACtB,cAAc,CAAC,UAAyC;AACtD,UAAI,aAAc;AAClB,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,cAAc,MAAM;AAClB,UAAI,aAAc;AAClB,gBAAU;AAAA,IACZ;AAAA,IACA,cAAc,CAAC,UAAyC;AACtD,UAAI,CAAC,aAAc;AACnB,UAAI,aAAc,QAAO,aAAa,YAAY;AAClD,sBAAgB,OAAO,WAAW,MAAM,SAAS,KAAK,GAAG,UAAU,CAAC;AAAA,IACtE;AAAA;AAAA,IAEA,YAAY;AAAA,IACZ,eAAe;AAAA,EACjB;AAGA,QAAM,eAAe;AAAA,IACnB,cAAc,MAAM;AAClB,UAAI,eAAe,QAAS,QAAO,aAAa,eAAe,OAAO;AAAA,IACxE;AAAA,IACA,cAAc;AAAA,EAChB;AAEA,SAAO,EAAE,iBAAiB,aAAa;AACzC;AAGA,IAAM,eAAe,CAAC,QAAiB,aAAyB;AAC9D,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,CAAC,UAAoC;AACxD,UAAI,MAAM,QAAQ,SAAU,UAAS;AAAA,IACvC;AAEA,aAAS,iBAAiB,WAAW,YAAY;AACjD,WAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,EACnE,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACvB;AAmBO,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAIA,OAAM,SAA6B,IAAI;AACvE,QAAM,CAAC,QAAQ,SAAS,IAAIA,OAAM,SAAS,KAAK;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,OAAM,SAAS,KAAK;AAC9D,QAAM,kBAAkBA,OAAM,OAA2B,MAAS;AAClE,QAAM,iBAAiBA,OAAM,OAA2B,MAAS;AAGjE,EAAAA,OAAM,UAAU,MAAM;AACpB,qBAAiB,kBAAkB,MAAM;AAAA,EAC3C,GAAG,CAAC,CAAC;AAEL,QAAM,WAAWA,OAAM;AAAA,IACrB,CAAC,UAAyE;AACxE,UAAI,SAAU;AAEd,UAAI,eAAe,SAAS;AAC1B,eAAO,aAAa,eAAe,OAAO;AAAA,MAC5C;AAEA,YAAM,SAAS,MAAM;AACrB,sBAAgB,UAAU,OAAO,WAAW,MAAM;AAChD,oBAAY,MAAM;AAClB,kBAAU,IAAI;AACd,iBAAS;AAAA,MACX,GAAG,UAAU;AAAA,IACf;AAAA,IACA,CAAC,UAAU,YAAY,MAAM;AAAA,EAC/B;AAEA,QAAM,YAAYA,OAAM,YAAY,MAAM;AACxC,QAAI,gBAAgB,SAAS;AAC3B,aAAO,aAAa,gBAAgB,OAAO;AAAA,IAC7C;AAEA,mBAAe,UAAU,OAAO,WAAW,MAAM;AAC/C,gBAAU,KAAK;AACf,kBAAY,IAAI;AAChB,gBAAU;AAAA,IACZ,GAAG,SAAS;AAAA,EACd,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,QAAM,cAAcA,OAAM,YAAY,MAAM;AAC1C,cAAU,KAAK;AACf,gBAAY,IAAI;AAChB,cAAU;AAAA,EACZ,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,EAAE,iBAAiB,aAAa,IAAI,iBAAiB;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,eAAa,QAAQ,WAAW;AAEhC,EAAAA,OAAM;AAAA,IACJ,MAAM,MAAM;AACV,UAAI,gBAAgB,QAAS,QAAO,aAAa,gBAAgB,OAAO;AACxE,UAAI,eAAe,QAAS,QAAO,aAAa,eAAe,OAAO;AAAA,IACxE;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,QAAQ,aAAa,iBAAiB,aAAa;AACxE;;;ACnLA,SAAS,aAAa;;;ACAtB,SAAS,iBAAiB;AAEnB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAevB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWlB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrB,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AD7ChB,IAAM,SAAS,CAAC,cAAwC;AAC7D,MAAI,UAAU,WAAW,KAAK,EAAG,QAAO;AACxC,MAAI,UAAU,WAAW,MAAM,EAAG,QAAO;AACzC,MAAI,UAAU,WAAW,OAAO,EAAG,QAAO;AAC1C,SAAO;AACT;AAEA,IAAM,aAAa;AAOnB,IAAM,SAAqD;AAAA,EACzD,KAAK,CAAC,WAAW;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY,GAAG,UAAU;AAAA,IACzB,aAAa,GAAG,UAAU;AAAA,IAC1B,WAAW,GAAG,UAAU,YAAY,KAAK;AAAA,EAC3C;AAAA,EACA,QAAQ,CAAC,WAAW;AAAA,IAClB,KAAK,CAAC;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY,GAAG,UAAU;AAAA,IACzB,aAAa,GAAG,UAAU;AAAA,IAC1B,cAAc,GAAG,UAAU,YAAY,KAAK;AAAA,EAC9C;AAAA,EACA,MAAM,CAAC,WAAW;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,WAAW,GAAG,UAAU;AAAA,IACxB,cAAc,GAAG,UAAU;AAAA,IAC3B,YAAY,GAAG,UAAU,YAAY,KAAK;AAAA,EAC5C;AAAA,EACA,OAAO,CAAC,WAAW;AAAA,IACjB,MAAM,CAAC;AAAA,IACP,KAAK;AAAA,IACL,WAAW;AAAA,IACX,WAAW,GAAG,UAAU;AAAA,IACxB,cAAc,GAAG,UAAU;AAAA,IAC3B,aAAa,GAAG,UAAU,YAAY,KAAK;AAAA,EAC7C;AACF;AAEO,IAAM,UAAU,CAAC,OAAc,eAA8C;AAAA,EAClF,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,MAAM,QAAQ,WAAW,KAAK;AAC7D;AAKA,IAAM,iBAAuC;AAAA,EAC3C,KAAK,EAAE,UAAU,OAAO,YAAY,SAAS;AAAA,EAC7C,QAAQ,EAAE,UAAU,UAAU,YAAY,SAAS;AAAA,EACnD,MAAM,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,EAC/C,OAAO,EAAE,UAAU,UAAU,YAAY,QAAQ;AACnD;AAGA,IAAM,OAAO,CAAC,YAA4B;AAAA,EACxC,UAAU,OAAO,aAAa,QAAQ,WAAW,OAAO,aAAa,WAAW,QAAQ;AAAA,EACxF,YACE,OAAO,eAAe,SAAS,UAAU,OAAO,eAAe,UAAU,SAAS;AACtF;AAEO,IAAM,kBAAkB,CAAC,cAC9B,eAAe,OAAO,SAAS,CAAC;AAE3B,IAAM,qBAAqB,CAAC,cACjC,KAAK,eAAe,OAAO,SAAS,CAAC,CAAC;AAExC,IAAM,aAAwC;AAAA;AAAA,EAE5C,MAAM,EAAE,WAAW,GAAG,SAAS,iBAAiB;AAAA,EAChD,OAAO,EAAE,iBAAiB,UAAU,WAAW,GAAG,OAAO,qCAAqC;AAAA,EAC9F,YAAY,EAAE,WAAW,GAAG,SAAS,qCAAqC;AAAA,EAC1E,cAAc,EAAE,WAAW,GAAG,WAAW,qCAAqC;AAAA,EAC9E,cAAc,EAAE,WAAW,GAAG,WAAW,qCAAqC;AAAA,EAC9E,eAAe,EAAE,WAAW,GAAG,YAAY,qCAAqC;AAClF;AAEA,IAAM,WAAwD;AAAA,EAC5D,SAAS,CAAC,WAAW;AAAA,IACnB,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,MAAM,QAAQ,CAAC;AAAA,EAC5B;AAAA,EACA,OAAO,CAAC,WAAW;AAAA,IACjB,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,IAAI;AAAA,IAC3D,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,cAAc,MAAM,MAAM,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,EAClE;AAAA,EACA,UAAU,CAAC,WAAW;AAAA,IACpB,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,MAAM,QAAQ,EAAE;AAAA,EAC7B;AAAA,EACA,SAAS,CAAC,WAAW;AAAA,IACnB,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,MAAM,QAAQ,CAAC;AAAA,EAC5B;AACF;AAEA,IAAM,aAAa,CAAC,WAA6B;AAAA,EAC/C,WAAW,gBAAgB,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,EACjE,QAAQ;AACV;AAEA,IAAM,cAAc,CAAC,WAA6B;AAAA,EAChD,UAAU;AAAA,EACV,YAAY;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,iBAAiB,MAAM,QAAQ,QAAQ;AAAA,IACvC,SAAS;AAAA,IACT,WAAW,GAAG,cAAc;AAAA,IAC5B,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AACF;AASO,IAAM,SAAS,CAAC,OAAc,UAAqC;AACxE,QAAM,EAAE,eAAe,MAAM,OAAO,UAAU,IAAI;AAElD,SAAO;AAAA,IACL,cAAc,MAAM,QAAQ,GAAG;AAAA,IAC/B,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,GAAI,YAAa,WAAW,SAAS,KAAK,CAAC,IAAK,CAAC;AAAA,IACjD,GAAI,gBAAiB,SAAS,aAAa,IAAI,KAAK,KAAK,CAAC,IAAK,CAAC;AAAA;AAAA,IAEhE,GAAI,QAAQ,WAAW,KAAK;AAAA,IAC5B,GAAI,SAAS,YAAY,KAAK;AAAA,EAChC;AACF;;;AH1FI,SAQA,YAAAC,WARA,OAAAC,MAyBI,QAAAC,aAzBJ;AA3EJ,IAAM,iBAAiBC,QAAO,KAAK;AAAA,EACjC,CAAC,EAAE,OAAO,UAAU,OAAO,EAAE,GAAG,QAAQ,OAAO,SAAS,EAAE;AAC5D;AAEA,IAAM,aAAaA,QAAO,MAAM;AAAA,EAC9B,mBAAmB,CAAC,SAClB,CAAC,CAAC,iBAAiB,QAAQ,SAAS,WAAW,EAAE,SAAS,IAAc;AAC5E,CAAC,EAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,OAAO,EAAE,GAAG,OAAO,OAAO,KAAK,EAAE,EAAE;AAEzE,IAAM,gBAAgBA,QAAO,SAAS;AAAA,EACpC,mBAAmB,CAAC,SAAS,SAAS;AACxC,CAAC,EAA4C,CAAC,EAAE,gBAAgB,OAAO;AAAA;AAAA,EAErE,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAI,oBAAoB,WAAW,EAAE,iBAAiB,SAAS;AAAA,EACjE;AACF,EAAE;AAEF,IAAM,WAAW;AAAA,EACf,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AACZ;AAKA,IAAM,kBAA0C,EAAE,UAAU,GAAG,SAAS,IAAI;AAG5E,IAAM,eAAe,CAAC,WAA+B,WAAmB;AACtE,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM,MAAO,EAAE,KAAK,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO,KAAK,EAAY,IAAI;AAChF,SAAO,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,KAAK;AAChC;AAEO,IAAM,YAAYC,OAAM,WAA2C,CAAC,OAAO,QAAQ;AACxF,QAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAa;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAW;AAAA,IACtE;AAAA,IAAW;AAAA,IAAY;AAAA,IAAW;AAAA,IAAU;AAAA,IAAS;AAAA,IAAkB;AAAA,IACvE;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAC7C,GAAG;AAAA,EACL,IAAI,aAAa,OAAO,QAAQ;AAEhC,QAAM,EAAE,UAAU,QAAQ,aAAa,iBAAiB,aAAa,IAAI,aAAa;AAAA,IACpF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,eAAe;AAAA,IACnB,GAAG;AAAA,IACH,OAAO,EAAE,QAAQ,WAAW,YAAY,UAAU;AAAA,IAClD,eAAe,aAAa,GAAG,UAAU,aAAa;AAAA,EACxD;AAEA,QAAM,iBAAiB,UACrBA,OAAM,aAAa,SAAS,YAAY,IAExC,gBAAAH,KAAC,UAAM,GAAG,cAAc,OAAO,EAAE,SAAS,gBAAgB,GAAG,aAAa,MAAM,GAC7E,UACH;AAGF,QAAM,UAAU,gBAAgB,OAAO,KAAK;AAE5C,SACE,gBAAAC,MAAAF,WAAA,EACG;AAAA;AAAA,IACD,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,UAAU,CAAC;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,cAAc,gBAAgB,SAAS;AAAA,QACvC,iBAAiB,mBAAmB,SAAS;AAAA,QAC5C,GAAG;AAAA,QACJ,kBAAgB;AAAA,QAChB,qBAAmB;AAAA,QACnB,qBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,OAAO,EAAE,EAAE;AAAA,QACxD,GAAG;AAAA,QAEJ,0BAAAC,MAACG,MAAA,EAAI,IAAI,EAAE,UAAU,WAAW,GAC7B;AAAA,uBAAa,gBAAAJ,KAAC,kBAAe,WAAsB,QAAgB;AAAA,UACpE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAe;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,cACA,eAAa,cAAc;AAAA,cAC3B,IAAI,EAAE,UAAU,GAAG,aAAa,WAAW,MAAM,EAAE;AAAA,cAEnD,0BAAAA,KAAC,eAAY,IAAI,EAAE,GAAG,SAAS,gBAAgB,EAAE,IAAI,QAAQ,EAAE,GAC7D,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBAEC;AAAA;AAAA,cACH,GACF;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ,CAAC;AAED,UAAU,cAAc;","names":["Box","styled","React","React","Fragment","jsx","jsxs","styled","React","Box"]}
1
+ {"version":3,"sources":["../../src/components/data-display/HoverCard/HoverCard.tsx","../../src/components/data-display/HoverCard/HoverCard.content.tsx","../../src/components/data-display/HoverCard/HoverCard.hooks.ts","../../src/components/data-display/HoverCard/HoverCard.styles.ts","../../src/components/data-display/HoverCard/HoverCard.animations.ts"],"sourcesContent":["import { Box, Card, CardContent, Popover } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { HoverCardContent } from './HoverCard.content';\nimport { useHoverCard } from './HoverCard.hooks';\nimport { arrowSx, cardSx, getAnchorOrigin, getTransformOrigin, sideOf } from './HoverCard.styles';\nimport type { CardStyleFlags } from './HoverCard.styles';\nimport type { HoverCardAnimation, HoverCardPlacement, HoverCardProps } from './HoverCard.types';\n\nconst ArrowContainer = styled('div')<{ placement: HoverCardPlacement; offset: number }>(\n ({ theme, placement }) => ({ ...arrowSx(theme, placement) }),\n);\n\nconst StyledCard = styled(Card, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'animation'].includes(prop as string),\n})<CardStyleFlags>(({ theme, ...flags }) => ({ ...cardSx(theme, flags) }));\n\nconst StyledPopover = styled(Popover, {\n shouldForwardProp: (prop) => prop !== 'customAnimation',\n})<{ customAnimation?: HoverCardAnimation }>(({ customAnimation }) => ({\n // The popover only positions; StyledCard draws the surface.\n '& .MuiPopover-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n overflow: 'visible',\n ...(customAnimation === 'scale' && { transformOrigin: 'center' }),\n },\n}));\n\nconst DEFAULTS = {\n variant: 'default',\n glow: false,\n pulse: false,\n placement: 'bottom',\n showArrow: false,\n animation: 'fade',\n enterDelay: 700,\n exitDelay: 0,\n maxWidth: 400,\n loading: false,\n touchEnabled: true,\n offset: 8,\n disabled: false,\n} satisfies Partial<HoverCardProps>;\n\ntype ResolvedProps = HoverCardProps & Required<Pick<HoverCardProps, keyof typeof DEFAULTS>>;\n\n/** Padding is the variant's own: detailed roomier, minimal tighter. */\nconst CONTENT_PADDING: Record<string, number> = { detailed: 3, minimal: 1.5 };\n\n/** The card is nudged off the anchor on whichever side it sits. */\nconst offsetMargin = (placement: HoverCardPlacement, offset: number) => {\n const side = sideOf(placement);\n const key = ({ top: 'mt', bottom: 'mb', left: 'ml', right: 'mr' } as const)[side];\n return { [key]: `${offset}px` };\n};\n\nexport const HoverCard = React.forwardRef<HTMLDivElement, HoverCardProps>((props, ref) => {\n const {\n variant, glow, pulse, title, description, avatar, trigger, placement, showArrow,\n animation, enterDelay, exitDelay, maxWidth, loading, loadingComponent, loadingText, touchEnabled,\n offset, disabled, onOpen, onClose, children, dataTestId,\n ...rest\n } = withDefaults(props, DEFAULTS) as ResolvedProps;\n\n const { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers } = useHoverCard({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n });\n\n const triggerProps = {\n ...triggerHandlers,\n style: { cursor: disabled ? 'default' : 'pointer' },\n 'data-testid': dataTestId ? `${dataTestId}-trigger` : 'hover-card-trigger',\n };\n\n const triggerElement = trigger ? (\n React.cloneElement(trigger, triggerProps)\n ) : (\n <span {...triggerProps} style={{ display: 'inline-block', ...triggerProps.style }}>\n {children}\n </span>\n );\n\n const padding = CONTENT_PADDING[variant] ?? 2;\n\n return (\n <>\n {triggerElement}\n <StyledPopover\n ref={ref}\n open={isOpen && !disabled}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={getAnchorOrigin(placement)}\n transformOrigin={getTransformOrigin(placement)}\n {...cardHandlers}\n disableAutoFocus\n disableEnforceFocus\n disableRestoreFocus\n customAnimation={animation}\n slotProps={{ paper: { style: { pointerEvents: 'auto' } } }}\n {...rest}\n >\n <Box sx={{ position: 'relative' }}>\n {showArrow && <ArrowContainer placement={placement} offset={offset} />}\n <StyledCard\n customVariant={variant}\n glow={glow}\n pulse={pulse}\n animation={animation}\n data-testid={dataTestId || 'hover-card-content'}\n sx={{ maxWidth, ...offsetMargin(placement, offset) }}\n >\n <CardContent sx={{ p: padding, '&:last-child': { pb: padding } }}>\n <HoverCardContent\n loadingText={loadingText} variant={variant} title={title}\n description={description}\n avatar={avatar}\n loading={loading}\n loadingComponent={loadingComponent}\n dataTestId={dataTestId}\n >\n {children}\n </HoverCardContent>\n </CardContent>\n </StyledCard>\n </Box>\n </StyledPopover>\n </>\n );\n});\n\nHoverCard.displayName = 'HoverCard';\n","import { Avatar, Box, CircularProgress, Typography } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type { HoverCardProps } from './HoverCard.types';\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 80,\n color: theme.palette.text.secondary,\n}));\n\n/** `${dataTestId}-${suffix}`, or the shared default when the caller gave no id. */\nconst testId = (base: string | undefined, suffix: string, fallback: string) =>\n base ? `${base}-${suffix}` : fallback;\n\nexport interface HoverCardContentProps\n extends Pick<\n HoverCardProps,\n | 'variant'\n | 'title'\n | 'description'\n | 'avatar'\n | 'loading'\n | 'loadingComponent'\n | 'loadingText'\n | 'children'\n > {\n dataTestId?: string;\n}\n\n/** A string avatar is a src; anything else is an element to re-size in place. */\nconst CardAvatar: React.FC<{ avatar: HoverCardProps['avatar'] }> = ({ avatar }) => {\n if (!avatar) return null;\n\n if (typeof avatar === 'string') {\n return <Avatar src={avatar} sx={{ width: 48, height: 48, mr: 2 }} />;\n }\n\n const element = avatar as React.ReactElement<{ sx?: object }>;\n return React.cloneElement(element, {\n sx: { width: 48, height: 48, mr: 2, ...element.props.sx },\n });\n};\n\nconst Title: React.FC<{\n title: React.ReactNode;\n variant?: string;\n sx?: object;\n dataTestId?: string;\n}> = ({ title, variant, sx, dataTestId }) => (\n <Typography\n variant={variant === 'minimal' ? 'body2' : 'subtitle1'}\n sx={{ fontWeight: 600, ...sx }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n);\n\nconst Description: React.FC<{\n description: React.ReactNode;\n sx?: object;\n dataTestId?: string;\n}> = ({ description, sx, dataTestId }) => (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={sx}\n data-testid={testId(dataTestId, 'description', 'hover-card-description')}\n >\n {description}\n </Typography>\n);\n\n/** The detailed variant leads with the avatar and sets the text beside it. */\nconst DetailedContent: React.FC<HoverCardContentProps> = ({\n title,\n description,\n avatar,\n children,\n dataTestId,\n}) => (\n <>\n {avatar && (\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\n <CardAvatar avatar={avatar} />\n <Box>\n {title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 0.5 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n </Box>\n </Box>\n )}\n {!avatar && title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 1 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {!avatar && description && (\n <Description description={description} sx={{ mb: 1 }} dataTestId={dataTestId} />\n )}\n {children && <Box>{children}</Box>}\n </>\n);\n\nexport const HoverCardContent: React.FC<HoverCardContentProps> = (props) => {\n const { variant, title, description, avatar, loading, loadingComponent, children, dataTestId } =\n props;\n const { loadingText } = props;\n\n if (loading) {\n return (\n <LoadingContainer>\n {loadingComponent || (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={20} />\n <Typography variant=\"body2\">{loadingText}</Typography>\n </Box>\n )}\n </LoadingContainer>\n );\n }\n\n if (variant === 'detailed' && (avatar || title || description)) {\n return <DetailedContent {...props} />;\n }\n\n return (\n <>\n {title && (\n <Title title={title} variant={variant} sx={{ mb: 0.5 }} dataTestId={dataTestId} />\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n {children}\n </>\n );\n};\n","import React from 'react';\n\ninterface HandlerInput {\n isTouchDevice: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n openCard: (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => void;\n closeCard: () => void;\n exitTimeoutRef: React.MutableRefObject<number | undefined>;\n}\n\n/**\n * The pointer and touch handlers, over the open/close pair. Touch gets a\n * long-press because there is no hover to respond to; the card's own handlers\n * keep it open while the pointer is travelling onto it.\n */\nconst useHoverHandlers = ({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n}: HandlerInput) => {\n const [touchTimeout, setTouchTimeout] = React.useState<number>();\n\n /** A touch device with touch disabled has no hover to respond to. */\n const hoverIgnored = isTouchDevice && !touchEnabled;\n\n const cancelTouch = React.useCallback(() => {\n if (touchTimeout) {\n window.clearTimeout(touchTimeout);\n setTouchTimeout(undefined);\n }\n }, [touchTimeout]);\n\n React.useEffect(\n () => () => {\n if (touchTimeout) window.clearTimeout(touchTimeout);\n },\n [touchTimeout],\n );\n\n const triggerHandlers = {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n if (hoverIgnored) return;\n openCard(event);\n },\n onMouseLeave: () => {\n if (hoverIgnored) return;\n closeCard();\n },\n onTouchStart: (event: React.TouchEvent<HTMLElement>) => {\n if (!touchEnabled) return;\n if (touchTimeout) window.clearTimeout(touchTimeout);\n setTouchTimeout(window.setTimeout(() => openCard(event), enterDelay));\n },\n // End and cancel do the same thing: the press did not become a long press.\n onTouchEnd: cancelTouch,\n onTouchCancel: cancelTouch,\n };\n\n /** Moving onto the card keeps it open; leaving it starts the exit delay. */\n const cardHandlers = {\n onMouseEnter: () => {\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n onMouseLeave: closeCard,\n };\n\n return { triggerHandlers, cardHandlers };\n};\n\n/** Escape dismisses the card while it is open. */\nconst useEscapeKey = (active: boolean, onEscape: () => void) => {\n React.useEffect(() => {\n if (!active) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') onEscape();\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [active, onEscape]);\n};\n\ninterface HoverCardTimingInput {\n disabled: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n exitDelay: number;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\n/**\n * When the card is open, and the delays that decide it.\n *\n * Three timers are in play: the enter delay before opening, the exit delay\n * before closing (so the pointer can travel from the trigger onto the card\n * without dismissing it), and the long-press timer on touch. Each cancels the\n * others' pending work, which is why they live together.\n */\nexport const useHoverCard = ({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n}: HoverCardTimingInput) => {\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);\n const [isOpen, setIsOpen] = React.useState(false);\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n const enterTimeoutRef = React.useRef<number | undefined>(undefined);\n const exitTimeoutRef = React.useRef<number | undefined>(undefined);\n\n // Probed in an effect, not during render, so SSR and hydration stay intact.\n React.useEffect(() => {\n setIsTouchDevice('ontouchstart' in window);\n }, []);\n\n const openCard = React.useCallback(\n (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => {\n if (disabled) return;\n\n if (exitTimeoutRef.current) {\n window.clearTimeout(exitTimeoutRef.current);\n }\n\n const target = event.currentTarget;\n enterTimeoutRef.current = window.setTimeout(() => {\n setAnchorEl(target);\n setIsOpen(true);\n onOpen?.();\n }, enterDelay);\n },\n [disabled, enterDelay, onOpen],\n );\n\n const closeCard = React.useCallback(() => {\n if (enterTimeoutRef.current) {\n window.clearTimeout(enterTimeoutRef.current);\n }\n\n exitTimeoutRef.current = window.setTimeout(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, exitDelay);\n }, [exitDelay, onClose]);\n\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, [onClose]);\n\n const { triggerHandlers, cardHandlers } = useHoverHandlers({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n });\n\n useEscapeKey(isOpen, handleClose);\n\n React.useEffect(\n () => () => {\n if (enterTimeoutRef.current) window.clearTimeout(enterTimeoutRef.current);\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n [],\n );\n\n return { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers };\n};\n","import { alpha } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport {\n pulseAnimation,\n scaleIn,\n slideInDown,\n slideInLeft,\n slideInRight,\n slideInUp,\n} from './HoverCard.animations';\nimport type { HoverCardAnimation, HoverCardPlacement } from './HoverCard.types';\n\n/** The edge the card sits on, ignoring the `-start`/`-end` alignment suffix. */\ntype Side = 'top' | 'bottom' | 'left' | 'right';\n\nexport const sideOf = (placement: HoverCardPlacement): Side => {\n if (placement.startsWith('top')) return 'top';\n if (placement.startsWith('left')) return 'left';\n if (placement.startsWith('right')) return 'right';\n return 'bottom';\n};\n\nconst ARROW_SIZE = 8;\n\n/**\n * The arrow is a CSS triangle: two transparent borders on the cross axis and one\n * filled border pointing back at the anchor. Every placement is that same shape,\n * so the table holds only which edge is filled and where the triangle sits.\n */\nconst ARROWS: Record<Side, (color: string) => CSSObject> = {\n top: (color) => ({\n bottom: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid ${color}`,\n }),\n bottom: (color) => ({\n top: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid ${color}`,\n }),\n left: (color) => ({\n right: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderLeft: `${ARROW_SIZE}px solid ${color}`,\n }),\n right: (color) => ({\n left: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid ${color}`,\n }),\n};\n\nexport const arrowSx = (theme: Theme, placement: HoverCardPlacement): CSSObject => ({\n position: 'absolute',\n width: 0,\n height: 0,\n zIndex: 1,\n ...ARROWS[sideOf(placement)](theme.palette.background.paper),\n});\n\ntype Origin = { vertical: 'top' | 'center' | 'bottom'; horizontal: 'left' | 'center' | 'right' };\n\n/** Where the popover attaches to the anchor, per side. */\nconst ANCHOR_ORIGINS: Record<Side, Origin> = {\n top: { vertical: 'top', horizontal: 'center' },\n bottom: { vertical: 'bottom', horizontal: 'center' },\n left: { vertical: 'center', horizontal: 'left' },\n right: { vertical: 'center', horizontal: 'right' },\n};\n\n/** The card's own corner meets the anchor's, so its origin is the opposite one. */\nconst flip = (origin: Origin): Origin => ({\n vertical: origin.vertical === 'top' ? 'bottom' : origin.vertical === 'bottom' ? 'top' : 'center',\n horizontal:\n origin.horizontal === 'left' ? 'right' : origin.horizontal === 'right' ? 'left' : 'center',\n});\n\nexport const getAnchorOrigin = (placement: HoverCardPlacement): Origin =>\n ANCHOR_ORIGINS[sideOf(placement)];\n\nexport const getTransformOrigin = (placement: HoverCardPlacement): Origin =>\n flip(ANCHOR_ORIGINS[sideOf(placement)]);\n\nconst ANIMATIONS: Record<string, CSSObject> = {\n // `fade` shares slideInUp deliberately: the keyframes fade in while rising.\n fade: { animation: `${slideInUp} 0.2s ease-out` },\n scale: { transformOrigin: 'center', animation: `${scaleIn} 0.2s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-up': { animation: `${slideInUp} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-down': { animation: `${slideInDown} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-left': { animation: `${slideInLeft} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-right': { animation: `${slideInRight} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n};\n\nconst VARIANTS: Record<string, (theme: Theme) => CSSObject> = {\n default: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[8],\n }),\n glass: (theme) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.85),\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.common.black, 0.12)}`,\n }),\n detailed: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[12],\n }),\n minimal: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n boxShadow: theme.shadows[4],\n }),\n};\n\nconst glowStyles = (theme: Theme): CSSObject => ({\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n});\n\nconst pulseStyles = (theme: Theme): CSSObject => ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n});\n\nexport interface CardStyleFlags {\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n animation?: HoverCardAnimation;\n}\n\nexport const cardSx = (theme: Theme, flags: CardStyleFlags): CSSObject => {\n const { customVariant, glow, pulse, animation } = flags;\n\n return {\n borderRadius: theme.spacing(1.5),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n overflow: 'visible',\n minWidth: 200,\n maxWidth: 400,\n ...(animation ? (ANIMATIONS[animation] ?? {}) : {}),\n ...(customVariant ? (VARIANTS[customVariant]?.(theme) ?? {}) : {}),\n // The old \"both\" arm was exactly these two spread together.\n ...(glow && glowStyles(theme)),\n ...(pulse && pulseStyles(theme)),\n };\n};\n","import { keyframes } from '@mui/material';\n\nexport const pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nexport const slideInUp = keyframes`\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInDown = keyframes`\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const slideInRight = keyframes`\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const scaleIn = keyframes`\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Arrow component\n"],"mappings":";;;;;;AAAA,SAAS,OAAAA,MAAK,MAAM,aAAa,eAAe;AAChD,SAAS,UAAAC,eAAc;AACvB,OAAOC,YAAW;;;ACFlB,SAAS,QAAQ,KAAK,kBAAkB,kBAAkB;AAC1D,SAAS,cAAc;AACvB,OAAO,WAAW;AAoCP,SA+CT,UA/CS,KAmDH,YAnDG;AAhCX,IAAM,mBAAmB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACnD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO,MAAM,QAAQ,KAAK;AAC5B,EAAE;AAGF,IAAM,SAAS,CAAC,MAA0B,QAAgB,aACxD,OAAO,GAAG,IAAI,IAAI,MAAM,KAAK;AAkB/B,IAAM,aAA6D,CAAC,EAAE,OAAO,MAAM;AACjF,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,oBAAC,UAAO,KAAK,QAAQ,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;AAAA,EACpE;AAEA,QAAM,UAAU;AAChB,SAAO,MAAM,aAAa,SAAS;AAAA,IACjC,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,GAAG,QAAQ,MAAM,GAAG;AAAA,EAC1D,CAAC;AACH;AAEA,IAAM,QAKD,CAAC,EAAE,OAAO,SAAS,IAAI,WAAW,MACrC;AAAA,EAAC;AAAA;AAAA,IACC,SAAS,YAAY,YAAY,UAAU;AAAA,IAC3C,IAAI,EAAE,YAAY,KAAK,GAAG,GAAG;AAAA,IAC7B,eAAa,OAAO,YAAY,SAAS,kBAAkB;AAAA,IAE1D;AAAA;AACH;AAGF,IAAM,cAID,CAAC,EAAE,aAAa,IAAI,WAAW,MAClC;AAAA,EAAC;AAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN;AAAA,IACA,eAAa,OAAO,YAAY,eAAe,wBAAwB;AAAA,IAEtE;AAAA;AACH;AAIF,IAAM,kBAAmD,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,iCACG;AAAA,YACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,IAAI,EAAE,GACtD;AAAA,wBAAC,cAAW,QAAgB;AAAA,IAC5B,qBAAC,OACE;AAAA,eACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,EAAE,YAAY,KAAK,IAAI,IAAI;AAAA,UAC/B,eAAa,OAAO,YAAY,SAAS,kBAAkB;AAAA,UAE1D;AAAA;AAAA,MACH;AAAA,MAED,eAAe,oBAAC,eAAY,aAA0B,YAAwB;AAAA,OACjF;AAAA,KACF;AAAA,EAED,CAAC,UAAU,SACV;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,IAAI,EAAE,YAAY,KAAK,IAAI,EAAE;AAAA,MAC7B,eAAa,OAAO,YAAY,SAAS,kBAAkB;AAAA,MAE1D;AAAA;AAAA,EACH;AAAA,EAED,CAAC,UAAU,eACV,oBAAC,eAAY,aAA0B,IAAI,EAAE,IAAI,EAAE,GAAG,YAAwB;AAAA,EAE/E,YAAY,oBAAC,OAAK,UAAS;AAAA,GAC9B;AAGK,IAAM,mBAAoD,CAAC,UAAU;AAC1E,QAAM,EAAE,SAAS,OAAO,aAAa,QAAQ,SAAS,kBAAkB,UAAU,WAAW,IAC3F;AACF,QAAM,EAAE,YAAY,IAAI;AAExB,MAAI,SAAS;AACX,WACE,oBAAC,oBACE,8BACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,0BAAC,oBAAiB,MAAM,IAAI;AAAA,MAC5B,oBAAC,cAAW,SAAQ,SAAS,uBAAY;AAAA,OAC3C,GAEJ;AAAA,EAEJ;AAEA,MAAI,YAAY,eAAe,UAAU,SAAS,cAAc;AAC9D,WAAO,oBAAC,mBAAiB,GAAG,OAAO;AAAA,EACrC;AAEA,SACE,iCACG;AAAA,aACC,oBAAC,SAAM,OAAc,SAAkB,IAAI,EAAE,IAAI,IAAI,GAAG,YAAwB;AAAA,IAEjF,eAAe,oBAAC,eAAY,aAA0B,YAAwB;AAAA,IAC9E;AAAA,KACH;AAEJ;;;ACtJA,OAAOC,YAAW;AAgBlB,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAoB;AAClB,QAAM,CAAC,cAAc,eAAe,IAAIA,OAAM,SAAiB;AAG/D,QAAM,eAAe,iBAAiB,CAAC;AAEvC,QAAM,cAAcA,OAAM,YAAY,MAAM;AAC1C,QAAI,cAAc;AAChB,aAAO,aAAa,YAAY;AAChC,sBAAgB,MAAS;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,EAAAA,OAAM;AAAA,IACJ,MAAM,MAAM;AACV,UAAI,aAAc,QAAO,aAAa,YAAY;AAAA,IACpD;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,kBAAkB;AAAA,IACtB,cAAc,CAAC,UAAyC;AACtD,UAAI,aAAc;AAClB,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,cAAc,MAAM;AAClB,UAAI,aAAc;AAClB,gBAAU;AAAA,IACZ;AAAA,IACA,cAAc,CAAC,UAAyC;AACtD,UAAI,CAAC,aAAc;AACnB,UAAI,aAAc,QAAO,aAAa,YAAY;AAClD,sBAAgB,OAAO,WAAW,MAAM,SAAS,KAAK,GAAG,UAAU,CAAC;AAAA,IACtE;AAAA;AAAA,IAEA,YAAY;AAAA,IACZ,eAAe;AAAA,EACjB;AAGA,QAAM,eAAe;AAAA,IACnB,cAAc,MAAM;AAClB,UAAI,eAAe,QAAS,QAAO,aAAa,eAAe,OAAO;AAAA,IACxE;AAAA,IACA,cAAc;AAAA,EAChB;AAEA,SAAO,EAAE,iBAAiB,aAAa;AACzC;AAGA,IAAM,eAAe,CAAC,QAAiB,aAAyB;AAC9D,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,CAAC,UAAoC;AACxD,UAAI,MAAM,QAAQ,SAAU,UAAS;AAAA,IACvC;AAEA,aAAS,iBAAiB,WAAW,YAAY;AACjD,WAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,EACnE,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACvB;AAmBO,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAIA,OAAM,SAA6B,IAAI;AACvE,QAAM,CAAC,QAAQ,SAAS,IAAIA,OAAM,SAAS,KAAK;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,OAAM,SAAS,KAAK;AAC9D,QAAM,kBAAkBA,OAAM,OAA2B,MAAS;AAClE,QAAM,iBAAiBA,OAAM,OAA2B,MAAS;AAGjE,EAAAA,OAAM,UAAU,MAAM;AACpB,qBAAiB,kBAAkB,MAAM;AAAA,EAC3C,GAAG,CAAC,CAAC;AAEL,QAAM,WAAWA,OAAM;AAAA,IACrB,CAAC,UAAyE;AACxE,UAAI,SAAU;AAEd,UAAI,eAAe,SAAS;AAC1B,eAAO,aAAa,eAAe,OAAO;AAAA,MAC5C;AAEA,YAAM,SAAS,MAAM;AACrB,sBAAgB,UAAU,OAAO,WAAW,MAAM;AAChD,oBAAY,MAAM;AAClB,kBAAU,IAAI;AACd,iBAAS;AAAA,MACX,GAAG,UAAU;AAAA,IACf;AAAA,IACA,CAAC,UAAU,YAAY,MAAM;AAAA,EAC/B;AAEA,QAAM,YAAYA,OAAM,YAAY,MAAM;AACxC,QAAI,gBAAgB,SAAS;AAC3B,aAAO,aAAa,gBAAgB,OAAO;AAAA,IAC7C;AAEA,mBAAe,UAAU,OAAO,WAAW,MAAM;AAC/C,gBAAU,KAAK;AACf,kBAAY,IAAI;AAChB,gBAAU;AAAA,IACZ,GAAG,SAAS;AAAA,EACd,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,QAAM,cAAcA,OAAM,YAAY,MAAM;AAC1C,cAAU,KAAK;AACf,gBAAY,IAAI;AAChB,cAAU;AAAA,EACZ,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,EAAE,iBAAiB,aAAa,IAAI,iBAAiB;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,eAAa,QAAQ,WAAW;AAEhC,EAAAA,OAAM;AAAA,IACJ,MAAM,MAAM;AACV,UAAI,gBAAgB,QAAS,QAAO,aAAa,gBAAgB,OAAO;AACxE,UAAI,eAAe,QAAS,QAAO,aAAa,eAAe,OAAO;AAAA,IACxE;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,QAAQ,aAAa,iBAAiB,aAAa;AACxE;;;ACnLA,SAAS,aAAa;;;ACAtB,SAAS,iBAAiB;AAEnB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAevB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWlB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrB,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AD7ChB,IAAM,SAAS,CAAC,cAAwC;AAC7D,MAAI,UAAU,WAAW,KAAK,EAAG,QAAO;AACxC,MAAI,UAAU,WAAW,MAAM,EAAG,QAAO;AACzC,MAAI,UAAU,WAAW,OAAO,EAAG,QAAO;AAC1C,SAAO;AACT;AAEA,IAAM,aAAa;AAOnB,IAAM,SAAqD;AAAA,EACzD,KAAK,CAAC,WAAW;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY,GAAG,UAAU;AAAA,IACzB,aAAa,GAAG,UAAU;AAAA,IAC1B,WAAW,GAAG,UAAU,YAAY,KAAK;AAAA,EAC3C;AAAA,EACA,QAAQ,CAAC,WAAW;AAAA,IAClB,KAAK,CAAC;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY,GAAG,UAAU;AAAA,IACzB,aAAa,GAAG,UAAU;AAAA,IAC1B,cAAc,GAAG,UAAU,YAAY,KAAK;AAAA,EAC9C;AAAA,EACA,MAAM,CAAC,WAAW;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,WAAW,GAAG,UAAU;AAAA,IACxB,cAAc,GAAG,UAAU;AAAA,IAC3B,YAAY,GAAG,UAAU,YAAY,KAAK;AAAA,EAC5C;AAAA,EACA,OAAO,CAAC,WAAW;AAAA,IACjB,MAAM,CAAC;AAAA,IACP,KAAK;AAAA,IACL,WAAW;AAAA,IACX,WAAW,GAAG,UAAU;AAAA,IACxB,cAAc,GAAG,UAAU;AAAA,IAC3B,aAAa,GAAG,UAAU,YAAY,KAAK;AAAA,EAC7C;AACF;AAEO,IAAM,UAAU,CAAC,OAAc,eAA8C;AAAA,EAClF,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,MAAM,QAAQ,WAAW,KAAK;AAC7D;AAKA,IAAM,iBAAuC;AAAA,EAC3C,KAAK,EAAE,UAAU,OAAO,YAAY,SAAS;AAAA,EAC7C,QAAQ,EAAE,UAAU,UAAU,YAAY,SAAS;AAAA,EACnD,MAAM,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,EAC/C,OAAO,EAAE,UAAU,UAAU,YAAY,QAAQ;AACnD;AAGA,IAAM,OAAO,CAAC,YAA4B;AAAA,EACxC,UAAU,OAAO,aAAa,QAAQ,WAAW,OAAO,aAAa,WAAW,QAAQ;AAAA,EACxF,YACE,OAAO,eAAe,SAAS,UAAU,OAAO,eAAe,UAAU,SAAS;AACtF;AAEO,IAAM,kBAAkB,CAAC,cAC9B,eAAe,OAAO,SAAS,CAAC;AAE3B,IAAM,qBAAqB,CAAC,cACjC,KAAK,eAAe,OAAO,SAAS,CAAC,CAAC;AAExC,IAAM,aAAwC;AAAA;AAAA,EAE5C,MAAM,EAAE,WAAW,GAAG,SAAS,iBAAiB;AAAA,EAChD,OAAO,EAAE,iBAAiB,UAAU,WAAW,GAAG,OAAO,qCAAqC;AAAA,EAC9F,YAAY,EAAE,WAAW,GAAG,SAAS,qCAAqC;AAAA,EAC1E,cAAc,EAAE,WAAW,GAAG,WAAW,qCAAqC;AAAA,EAC9E,cAAc,EAAE,WAAW,GAAG,WAAW,qCAAqC;AAAA,EAC9E,eAAe,EAAE,WAAW,GAAG,YAAY,qCAAqC;AAClF;AAEA,IAAM,WAAwD;AAAA,EAC5D,SAAS,CAAC,WAAW;AAAA,IACnB,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,MAAM,QAAQ,CAAC;AAAA,EAC5B;AAAA,EACA,OAAO,CAAC,WAAW;AAAA,IACjB,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,IAAI;AAAA,IAC3D,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,cAAc,MAAM,MAAM,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,EAClE;AAAA,EACA,UAAU,CAAC,WAAW;AAAA,IACpB,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,MAAM,QAAQ,EAAE;AAAA,EAC7B;AAAA,EACA,SAAS,CAAC,WAAW;AAAA,IACnB,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IACtD,WAAW,MAAM,QAAQ,CAAC;AAAA,EAC5B;AACF;AAEA,IAAM,aAAa,CAAC,WAA6B;AAAA,EAC/C,WAAW,gBAAgB,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,EACjE,QAAQ;AACV;AAEA,IAAM,cAAc,CAAC,WAA6B;AAAA,EAChD,UAAU;AAAA,EACV,YAAY;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,iBAAiB,MAAM,QAAQ,QAAQ;AAAA,IACvC,SAAS;AAAA,IACT,WAAW,GAAG,cAAc;AAAA,IAC5B,eAAe;AAAA,IACf,QAAQ;AAAA,EACV;AACF;AASO,IAAM,SAAS,CAAC,OAAc,UAAqC;AACxE,QAAM,EAAE,eAAe,MAAM,OAAO,UAAU,IAAI;AAElD,SAAO;AAAA,IACL,cAAc,MAAM,QAAQ,GAAG;AAAA,IAC/B,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,GAAI,YAAa,WAAW,SAAS,KAAK,CAAC,IAAK,CAAC;AAAA,IACjD,GAAI,gBAAiB,SAAS,aAAa,IAAI,KAAK,KAAK,CAAC,IAAK,CAAC;AAAA;AAAA,IAEhE,GAAI,QAAQ,WAAW,KAAK;AAAA,IAC5B,GAAI,SAAS,YAAY,KAAK;AAAA,EAChC;AACF;;;AH1FI,SAQA,YAAAC,WARA,OAAAC,MAyBI,QAAAC,aAzBJ;AA3EJ,IAAM,iBAAiBC,QAAO,KAAK;AAAA,EACjC,CAAC,EAAE,OAAO,UAAU,OAAO,EAAE,GAAG,QAAQ,OAAO,SAAS,EAAE;AAC5D;AAEA,IAAM,aAAaA,QAAO,MAAM;AAAA,EAC9B,mBAAmB,CAAC,SAClB,CAAC,CAAC,iBAAiB,QAAQ,SAAS,WAAW,EAAE,SAAS,IAAc;AAC5E,CAAC,EAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,OAAO,EAAE,GAAG,OAAO,OAAO,KAAK,EAAE,EAAE;AAEzE,IAAM,gBAAgBA,QAAO,SAAS;AAAA,EACpC,mBAAmB,CAAC,SAAS,SAAS;AACxC,CAAC,EAA4C,CAAC,EAAE,gBAAgB,OAAO;AAAA;AAAA,EAErE,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAI,oBAAoB,WAAW,EAAE,iBAAiB,SAAS;AAAA,EACjE;AACF,EAAE;AAEF,IAAM,WAAW;AAAA,EACf,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AACZ;AAKA,IAAM,kBAA0C,EAAE,UAAU,GAAG,SAAS,IAAI;AAG5E,IAAM,eAAe,CAAC,WAA+B,WAAmB;AACtE,QAAM,OAAO,OAAO,SAAS;AAC7B,QAAM,MAAO,EAAE,KAAK,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO,KAAK,EAAY,IAAI;AAChF,SAAO,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,KAAK;AAChC;AAEO,IAAM,YAAYC,OAAM,WAA2C,CAAC,OAAO,QAAQ;AACxF,QAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAa;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAW;AAAA,IACtE;AAAA,IAAW;AAAA,IAAY;AAAA,IAAW;AAAA,IAAU;AAAA,IAAS;AAAA,IAAkB;AAAA,IAAa;AAAA,IACpF;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAC7C,GAAG;AAAA,EACL,IAAI,aAAa,OAAO,QAAQ;AAEhC,QAAM,EAAE,UAAU,QAAQ,aAAa,iBAAiB,aAAa,IAAI,aAAa;AAAA,IACpF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,eAAe;AAAA,IACnB,GAAG;AAAA,IACH,OAAO,EAAE,QAAQ,WAAW,YAAY,UAAU;AAAA,IAClD,eAAe,aAAa,GAAG,UAAU,aAAa;AAAA,EACxD;AAEA,QAAM,iBAAiB,UACrBA,OAAM,aAAa,SAAS,YAAY,IAExC,gBAAAH,KAAC,UAAM,GAAG,cAAc,OAAO,EAAE,SAAS,gBAAgB,GAAG,aAAa,MAAM,GAC7E,UACH;AAGF,QAAM,UAAU,gBAAgB,OAAO,KAAK;AAE5C,SACE,gBAAAC,MAAAF,WAAA,EACG;AAAA;AAAA,IACD,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,UAAU,CAAC;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,cAAc,gBAAgB,SAAS;AAAA,QACvC,iBAAiB,mBAAmB,SAAS;AAAA,QAC5C,GAAG;AAAA,QACJ,kBAAgB;AAAA,QAChB,qBAAmB;AAAA,QACnB,qBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,OAAO,EAAE,EAAE;AAAA,QACxD,GAAG;AAAA,QAEJ,0BAAAC,MAACG,MAAA,EAAI,IAAI,EAAE,UAAU,WAAW,GAC7B;AAAA,uBAAa,gBAAAJ,KAAC,kBAAe,WAAsB,QAAgB;AAAA,UACpE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAe;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,cACA,eAAa,cAAc;AAAA,cAC3B,IAAI,EAAE,UAAU,GAAG,aAAa,WAAW,MAAM,EAAE;AAAA,cAEnD,0BAAAA,KAAC,eAAY,IAAI,EAAE,GAAG,SAAS,gBAAgB,EAAE,IAAI,QAAQ,EAAE,GAC7D,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBAA0B;AAAA,kBAAkB;AAAA,kBAC5C;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBAEC;AAAA;AAAA,cACH,GACF;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ,CAAC;AAED,UAAU,cAAc;","names":["Box","styled","React","React","Fragment","jsx","jsxs","styled","React","Box"]}
@@ -60,8 +60,26 @@ var definedProps = (props) => Object.fromEntries(
60
60
  );
61
61
  var resolveLightboxProps = (props) => ({ ...LIGHTBOX_DEFAULTS, ...definedProps(props) });
62
62
 
63
- // src/components/data-display/Lightbox/LightboxMedia.tsx
63
+ // src/components/data-display/Lightbox/lightbox-copy-context.tsx
64
+ import { createContext, useContext } from "react";
64
65
  import { jsx } from "react/jsx-runtime";
66
+ var LightboxCopyContext = createContext(null);
67
+ function LightboxCopyProvider({
68
+ copy,
69
+ children
70
+ }) {
71
+ return /* @__PURE__ */ jsx(LightboxCopyContext.Provider, { value: copy, children });
72
+ }
73
+ function useLightboxCopy() {
74
+ const copy = useContext(LightboxCopyContext);
75
+ if (!copy) {
76
+ throw new Error("useLightboxCopy must be rendered inside a <LightboxCopyProvider>");
77
+ }
78
+ return copy;
79
+ }
80
+
81
+ // src/components/data-display/Lightbox/LightboxMedia.tsx
82
+ import { jsx as jsx2 } from "react/jsx-runtime";
65
83
  var cursorFor = (zoomLevel, zoomable) => {
66
84
  if (zoomLevel > 1) return "move";
67
85
  return zoomable ? "zoom-in" : "default";
@@ -81,7 +99,7 @@ var LightboxMedia = ({
81
99
  onDoubleClick
82
100
  }) => {
83
101
  if (item.type === "video") {
84
- return /* @__PURE__ */ jsx(
102
+ return /* @__PURE__ */ jsx2(
85
103
  "video",
86
104
  {
87
105
  src: item.src,
@@ -94,7 +112,7 @@ var LightboxMedia = ({
94
112
  }
95
113
  );
96
114
  }
97
- return /* @__PURE__ */ jsx(
115
+ return /* @__PURE__ */ jsx2(
98
116
  "img",
99
117
  {
100
118
  src: item.src,
@@ -120,7 +138,7 @@ var LightboxMedia = ({
120
138
  };
121
139
 
122
140
  // src/components/data-display/Lightbox/LightboxCurrentMedia.tsx
123
- import { jsx as jsx2 } from "react/jsx-runtime";
141
+ import { jsx as jsx3 } from "react/jsx-runtime";
124
142
  var LightboxCurrentMedia = ({
125
143
  item,
126
144
  index,
@@ -132,7 +150,7 @@ var LightboxCurrentMedia = ({
132
150
  onWheel
133
151
  }) => {
134
152
  if (!item) return null;
135
- return /* @__PURE__ */ jsx2(
153
+ return /* @__PURE__ */ jsx3(
136
154
  LightboxMedia,
137
155
  {
138
156
  item,
@@ -161,20 +179,23 @@ import ResetZoomIcon from "@mui/icons-material/RestartAlt";
161
179
  import ZoomInIcon from "@mui/icons-material/ZoomIn";
162
180
  import ZoomOutIcon from "@mui/icons-material/ZoomOut";
163
181
  import { Box, IconButton } from "@mui/material";
164
- import { Fragment, jsx as jsx3, jsxs } from "react/jsx-runtime";
182
+ import { Fragment, jsx as jsx4, jsxs } from "react/jsx-runtime";
165
183
  var LightboxCloseButton = ({
166
184
  testId,
167
185
  onClose
168
- }) => /* @__PURE__ */ jsx3(
169
- IconButton,
170
- {
171
- onClick: onClose,
172
- sx: { ...overlayButtonSx, position: "absolute", top: 16, right: 16, zIndex: OVERLAY_Z_INDEX },
173
- "aria-label": "Close lightbox",
174
- "data-testid": testId("close"),
175
- children: /* @__PURE__ */ jsx3(CloseIcon, {})
176
- }
177
- );
186
+ }) => {
187
+ const copy = useLightboxCopy();
188
+ return /* @__PURE__ */ jsx4(
189
+ IconButton,
190
+ {
191
+ onClick: onClose,
192
+ sx: { ...overlayButtonSx, position: "absolute", top: 16, right: 16, zIndex: OVERLAY_Z_INDEX },
193
+ "aria-label": copy.close,
194
+ "data-testid": testId("close"),
195
+ children: /* @__PURE__ */ jsx4(CloseIcon, {})
196
+ }
197
+ );
198
+ };
178
199
  var arrowSx = (side) => ({
179
200
  ...navButtonSx,
180
201
  position: "absolute",
@@ -189,97 +210,106 @@ var LightboxNavButtons = ({
189
210
  atEnd,
190
211
  onPrev,
191
212
  onNext
192
- }) => /* @__PURE__ */ jsxs(Fragment, { children: [
193
- /* @__PURE__ */ jsx3(
194
- IconButton,
195
- {
196
- onClick: onPrev,
197
- disabled: atStart,
198
- sx: arrowSx("left"),
199
- "aria-label": "Previous item",
200
- "data-testid": testId("prev"),
201
- children: /* @__PURE__ */ jsx3(PrevIcon, {})
202
- }
203
- ),
204
- /* @__PURE__ */ jsx3(
205
- IconButton,
206
- {
207
- onClick: onNext,
208
- disabled: atEnd,
209
- sx: arrowSx("right"),
210
- "aria-label": "Next item",
211
- "data-testid": testId("next"),
212
- children: /* @__PURE__ */ jsx3(NextIcon, {})
213
- }
214
- )
215
- ] });
213
+ }) => {
214
+ const copy = useLightboxCopy();
215
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
216
+ /* @__PURE__ */ jsx4(
217
+ IconButton,
218
+ {
219
+ onClick: onPrev,
220
+ disabled: atStart,
221
+ sx: arrowSx("left"),
222
+ "aria-label": copy.previous,
223
+ "data-testid": testId("prev"),
224
+ children: /* @__PURE__ */ jsx4(PrevIcon, {})
225
+ }
226
+ ),
227
+ /* @__PURE__ */ jsx4(
228
+ IconButton,
229
+ {
230
+ onClick: onNext,
231
+ disabled: atEnd,
232
+ sx: arrowSx("right"),
233
+ "aria-label": copy.next,
234
+ "data-testid": testId("next"),
235
+ children: /* @__PURE__ */ jsx4(NextIcon, {})
236
+ }
237
+ )
238
+ ] });
239
+ };
216
240
  var LightboxZoomControls = ({
217
241
  testId,
218
242
  onZoomIn,
219
243
  onZoomOut,
220
244
  onResetZoom
221
- }) => /* @__PURE__ */ jsxs(
222
- Box,
223
- {
224
- sx: {
225
- position: "absolute",
226
- top: 16,
227
- left: 16,
228
- display: "flex",
229
- flexDirection: "column",
230
- gap: 1,
231
- zIndex: OVERLAY_Z_INDEX
232
- },
233
- "data-testid": testId("zoom-controls"),
234
- children: [
235
- /* @__PURE__ */ jsx3(IconButton, { onClick: onZoomIn, sx: overlayButtonSx, "aria-label": "Zoom in", "data-testid": testId("zoom-in"), children: /* @__PURE__ */ jsx3(ZoomInIcon, {}) }),
236
- /* @__PURE__ */ jsx3(
237
- IconButton,
238
- {
239
- onClick: onZoomOut,
240
- sx: overlayButtonSx,
241
- "aria-label": "Zoom out",
242
- "data-testid": testId("zoom-out"),
243
- children: /* @__PURE__ */ jsx3(ZoomOutIcon, {})
244
- }
245
- ),
246
- /* @__PURE__ */ jsx3(
247
- IconButton,
248
- {
249
- onClick: onResetZoom,
250
- sx: overlayButtonSx,
251
- "aria-label": "Reset zoom",
252
- "data-testid": testId("zoom-reset"),
253
- children: /* @__PURE__ */ jsx3(ResetZoomIcon, {})
254
- }
255
- )
256
- ]
257
- }
258
- );
245
+ }) => {
246
+ const copy = useLightboxCopy();
247
+ return /* @__PURE__ */ jsxs(
248
+ Box,
249
+ {
250
+ sx: {
251
+ position: "absolute",
252
+ top: 16,
253
+ left: 16,
254
+ display: "flex",
255
+ flexDirection: "column",
256
+ gap: 1,
257
+ zIndex: OVERLAY_Z_INDEX
258
+ },
259
+ "data-testid": testId("zoom-controls"),
260
+ children: [
261
+ /* @__PURE__ */ jsx4(IconButton, { onClick: onZoomIn, sx: overlayButtonSx, "aria-label": copy.zoomIn, "data-testid": testId("zoom-in"), children: /* @__PURE__ */ jsx4(ZoomInIcon, {}) }),
262
+ /* @__PURE__ */ jsx4(
263
+ IconButton,
264
+ {
265
+ onClick: onZoomOut,
266
+ sx: overlayButtonSx,
267
+ "aria-label": copy.zoomOut,
268
+ "data-testid": testId("zoom-out"),
269
+ children: /* @__PURE__ */ jsx4(ZoomOutIcon, {})
270
+ }
271
+ ),
272
+ /* @__PURE__ */ jsx4(
273
+ IconButton,
274
+ {
275
+ onClick: onResetZoom,
276
+ sx: overlayButtonSx,
277
+ "aria-label": copy.resetZoom,
278
+ "data-testid": testId("zoom-reset"),
279
+ children: /* @__PURE__ */ jsx4(ResetZoomIcon, {})
280
+ }
281
+ )
282
+ ]
283
+ }
284
+ );
285
+ };
259
286
  var LightboxAutoplayButton = ({
260
287
  testId,
261
288
  isAutoPlaying,
262
289
  onToggle
263
- }) => /* @__PURE__ */ jsx3(
264
- IconButton,
265
- {
266
- onClick: onToggle,
267
- sx: {
268
- ...overlayButtonSx,
269
- position: "absolute",
270
- top: 16,
271
- left: "50%",
272
- transform: "translateX(-50%)",
273
- zIndex: OVERLAY_Z_INDEX
274
- },
275
- "aria-label": isAutoPlaying ? "Pause slideshow" : "Start slideshow",
276
- "data-testid": testId("autoplay"),
277
- children: isAutoPlaying ? /* @__PURE__ */ jsx3(PauseIcon, {}) : /* @__PURE__ */ jsx3(PlayIcon, {})
278
- }
279
- );
290
+ }) => {
291
+ const copy = useLightboxCopy();
292
+ return /* @__PURE__ */ jsx4(
293
+ IconButton,
294
+ {
295
+ onClick: onToggle,
296
+ sx: {
297
+ ...overlayButtonSx,
298
+ position: "absolute",
299
+ top: 16,
300
+ left: "50%",
301
+ transform: "translateX(-50%)",
302
+ zIndex: OVERLAY_Z_INDEX
303
+ },
304
+ "aria-label": isAutoPlaying ? copy.pause : copy.play,
305
+ "data-testid": testId("autoplay"),
306
+ children: isAutoPlaying ? /* @__PURE__ */ jsx4(PauseIcon, {}) : /* @__PURE__ */ jsx4(PlayIcon, {})
307
+ }
308
+ );
309
+ };
280
310
 
281
311
  // src/components/data-display/Lightbox/LightboxOverlay.tsx
282
- import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
312
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
283
313
  var LightboxOverlay = ({
284
314
  testId,
285
315
  itemCount,
@@ -299,8 +329,8 @@ var LightboxOverlay = ({
299
329
  }) => {
300
330
  const hasMultiple = itemCount > 1;
301
331
  return /* @__PURE__ */ jsxs2(Fragment2, { children: [
302
- /* @__PURE__ */ jsx4(LightboxCloseButton, { testId, onClose }),
303
- showControls && hasMultiple && /* @__PURE__ */ jsx4(
332
+ /* @__PURE__ */ jsx5(LightboxCloseButton, { testId, onClose }),
333
+ showControls && hasMultiple && /* @__PURE__ */ jsx5(
304
334
  LightboxNavButtons,
305
335
  {
306
336
  testId,
@@ -310,7 +340,7 @@ var LightboxOverlay = ({
310
340
  onNext
311
341
  }
312
342
  ),
313
- canZoom && /* @__PURE__ */ jsx4(
343
+ canZoom && /* @__PURE__ */ jsx5(
314
344
  LightboxZoomControls,
315
345
  {
316
346
  testId,
@@ -319,7 +349,7 @@ var LightboxOverlay = ({
319
349
  onResetZoom
320
350
  }
321
351
  ),
322
- autoplay && hasMultiple && /* @__PURE__ */ jsx4(
352
+ autoplay && hasMultiple && /* @__PURE__ */ jsx5(
323
353
  LightboxAutoplayButton,
324
354
  {
325
355
  testId,
@@ -332,7 +362,7 @@ var LightboxOverlay = ({
332
362
 
333
363
  // src/components/data-display/Lightbox/LightboxStage.tsx
334
364
  import { Box as Box2, CircularProgress, DialogContent, Typography } from "@mui/material";
335
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
365
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
336
366
  var LightboxStage = ({
337
367
  items,
338
368
  currentItem,
@@ -357,14 +387,14 @@ var LightboxStage = ({
357
387
  },
358
388
  "data-testid": testId("content"),
359
389
  children: [
360
- isLoading && /* @__PURE__ */ jsx5(
390
+ isLoading && /* @__PURE__ */ jsx6(
361
391
  CircularProgress,
362
392
  {
363
393
  sx: { position: "absolute", color: "white", zIndex: 999 },
364
394
  "data-testid": testId("loading")
365
395
  }
366
396
  ),
367
- /* @__PURE__ */ jsx5(
397
+ /* @__PURE__ */ jsx6(
368
398
  Box2,
369
399
  {
370
400
  sx: {
@@ -378,7 +408,7 @@ var LightboxStage = ({
378
408
  children: media
379
409
  }
380
410
  ),
381
- showCaptions && currentItem?.caption && /* @__PURE__ */ jsx5(
411
+ showCaptions && currentItem?.caption && /* @__PURE__ */ jsx6(
382
412
  Typography,
383
413
  {
384
414
  id: "lightbox-description",
@@ -417,10 +447,10 @@ var LightboxStage = ({
417
447
  // src/components/data-display/Lightbox/LightboxThumbnails.tsx
418
448
  import PlayIcon2 from "@mui/icons-material/PlayArrow";
419
449
  import { Box as Box3 } from "@mui/material";
420
- import { jsx as jsx6 } from "react/jsx-runtime";
450
+ import { jsx as jsx7 } from "react/jsx-runtime";
421
451
  var THUMB_WIDTH = 60;
422
452
  var THUMB_HEIGHT = 40;
423
- var VideoThumbnail = () => /* @__PURE__ */ jsx6(
453
+ var VideoThumbnail = () => /* @__PURE__ */ jsx7(
424
454
  Box3,
425
455
  {
426
456
  sx: {
@@ -431,7 +461,7 @@ var VideoThumbnail = () => /* @__PURE__ */ jsx6(
431
461
  alignItems: "center",
432
462
  justifyContent: "center"
433
463
  },
434
- children: /* @__PURE__ */ jsx6(PlayIcon2, { sx: { color: "white", fontSize: 16 } })
464
+ children: /* @__PURE__ */ jsx7(PlayIcon2, { sx: { color: "white", fontSize: 16 } })
435
465
  }
436
466
  );
437
467
  var LightboxThumbnails = ({
@@ -439,7 +469,7 @@ var LightboxThumbnails = ({
439
469
  currentIndex,
440
470
  testId,
441
471
  onSelect
442
- }) => /* @__PURE__ */ jsx6(
472
+ }) => /* @__PURE__ */ jsx7(
443
473
  Box3,
444
474
  {
445
475
  sx: {
@@ -455,7 +485,7 @@ var LightboxThumbnails = ({
455
485
  padding: 1
456
486
  },
457
487
  "data-testid": testId("thumbnails"),
458
- children: items.map((item, index) => /* @__PURE__ */ jsx6(
488
+ children: items.map((item, index) => /* @__PURE__ */ jsx7(
459
489
  Box3,
460
490
  {
461
491
  onClick: () => onSelect(index),
@@ -470,7 +500,7 @@ var LightboxThumbnails = ({
470
500
  "&:hover": { border: "2px solid rgba(255, 255, 255, 0.7)" }
471
501
  },
472
502
  "data-testid": testId(`thumbnail-${index}`),
473
- children: item.type === "video" ? /* @__PURE__ */ jsx6(VideoThumbnail, {}) : /* @__PURE__ */ jsx6(
503
+ children: item.type === "video" ? /* @__PURE__ */ jsx7(VideoThumbnail, {}) : /* @__PURE__ */ jsx7(
474
504
  "img",
475
505
  {
476
506
  src: item.src,
@@ -694,7 +724,7 @@ var useLightbox = ({ isOpen, onClose, items, startIndex, showControls, loop, aut
694
724
  };
695
725
 
696
726
  // src/components/data-display/Lightbox/Lightbox.tsx
697
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
727
+ import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
698
728
  var DIALOG_STATIC_PROPS = {
699
729
  maxWidth: false,
700
730
  fullScreen: true,
@@ -713,7 +743,7 @@ var Lightbox = React.forwardRef((componentProps, ref) => {
713
743
  const testId = makeTestId(dataTestId);
714
744
  const lightbox = useLightbox(props, ref);
715
745
  const { currentIndex, currentItem, zoom } = lightbox;
716
- return /* @__PURE__ */ jsxs4(
746
+ return /* @__PURE__ */ jsx8(LightboxCopyProvider, { copy: props.copy, children: /* @__PURE__ */ jsxs4(
717
747
  Dialog,
718
748
  {
719
749
  open: isOpen,
@@ -729,7 +759,7 @@ var Lightbox = React.forwardRef((componentProps, ref) => {
729
759
  "Lightbox - ",
730
760
  currentItem?.alt || `Item ${currentIndex + 1} of ${items.length}`
731
761
  ] }),
732
- /* @__PURE__ */ jsx7(
762
+ /* @__PURE__ */ jsx8(
733
763
  LightboxOverlay,
734
764
  {
735
765
  testId,
@@ -749,7 +779,7 @@ var Lightbox = React.forwardRef((componentProps, ref) => {
749
779
  onToggleAutoplay: () => lightbox.setIsAutoPlaying((playing) => !playing)
750
780
  }
751
781
  ),
752
- /* @__PURE__ */ jsx7(
782
+ /* @__PURE__ */ jsx8(
753
783
  LightboxStage,
754
784
  {
755
785
  items,
@@ -759,7 +789,7 @@ var Lightbox = React.forwardRef((componentProps, ref) => {
759
789
  showCaptions,
760
790
  thumbnails,
761
791
  testId,
762
- media: /* @__PURE__ */ jsx7(
792
+ media: /* @__PURE__ */ jsx8(
763
793
  LightboxCurrentMedia,
764
794
  {
765
795
  item: currentItem,
@@ -772,7 +802,7 @@ var Lightbox = React.forwardRef((componentProps, ref) => {
772
802
  onWheel: lightbox.handleWheel
773
803
  }
774
804
  ),
775
- thumbnailStrip: thumbnails && items.length > 1 && /* @__PURE__ */ jsx7(
805
+ thumbnailStrip: thumbnails && items.length > 1 && /* @__PURE__ */ jsx8(
776
806
  LightboxThumbnails,
777
807
  {
778
808
  items,
@@ -785,7 +815,7 @@ var Lightbox = React.forwardRef((componentProps, ref) => {
785
815
  )
786
816
  ]
787
817
  }
788
- );
818
+ ) });
789
819
  });
790
820
  Lightbox.displayName = "Lightbox";
791
821
  var Lightbox_default = Lightbox;