@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-display/Lightbox/Lightbox.tsx","../../src/components/data-display/Lightbox/Lightbox.constants.ts","../../src/components/data-display/Lightbox/Lightbox.helpers.ts","../../src/components/data-display/Lightbox/LightboxMedia.tsx","../../src/components/data-display/Lightbox/LightboxCurrentMedia.tsx","../../src/components/data-display/Lightbox/LightboxControls.tsx","../../src/components/data-display/Lightbox/LightboxOverlay.tsx","../../src/components/data-display/Lightbox/LightboxStage.tsx","../../src/components/data-display/Lightbox/LightboxThumbnails.tsx","../../src/components/data-display/Lightbox/useLightbox.ts","../../src/components/data-display/Lightbox/Lightbox.hooks.ts"],"sourcesContent":["import { Dialog, Fade, Typography } from '@mui/material';\nimport React from 'react';\n\nimport { makeTestId } from './Lightbox.constants';\nimport { resolveLightboxProps } from './Lightbox.helpers';\nimport type { LightboxProps, LightboxRef } from './Lightbox.types';\nimport { LightboxCurrentMedia } from './LightboxCurrentMedia';\nimport { LightboxOverlay } from './LightboxOverlay';\nimport { LightboxStage } from './LightboxStage';\nimport { LightboxThumbnails } from './LightboxThumbnails';\nimport { useLightbox } from './useLightbox';\n\nconst DIALOG_STATIC_PROPS = {\n maxWidth: false,\n fullScreen: true,\n TransitionComponent: Fade,\n TransitionProps: { timeout: 300 },\n PaperProps: { sx: { background: 'rgba(0, 0, 0, 0.9)', backdropFilter: 'blur(2px)' } },\n 'aria-label': 'Lightbox',\n 'aria-labelledby': 'lightbox-title',\n role: 'dialog',\n 'aria-modal': 'true',\n} as const;\n\nexport const Lightbox = React.forwardRef<LightboxRef, LightboxProps>((componentProps, ref) => {\n const props = resolveLightboxProps(componentProps);\n const { isOpen, items, loop, autoplay, showControls, showCaptions, thumbnails, zoomable } = props;\n const { className, style, dataTestId } = props;\n\n const testId = makeTestId(dataTestId);\n const lightbox = useLightbox(props, ref);\n const { currentIndex, currentItem, zoom } = lightbox;\n\n return (\n <Dialog\n open={isOpen}\n onClose={lightbox.close}\n {...DIALOG_STATIC_PROPS}\n className={className}\n style={style}\n onTouchStart={lightbox.handleTouchStart}\n onTouchEnd={lightbox.handleTouchEnd}\n data-testid={dataTestId || 'lightbox'}\n >\n {/* Visually hidden title for screen readers */}\n <Typography id=\"lightbox-title\" variant=\"h6\" sx={{ position: 'absolute', left: -10000 }}>\n Lightbox - {currentItem?.alt || `Item ${currentIndex + 1} of ${items.length}`}\n </Typography>\n\n <LightboxOverlay\n testId={testId}\n itemCount={items.length}\n currentIndex={currentIndex}\n showControls={showControls}\n loop={loop}\n autoplay={autoplay}\n canZoom={lightbox.canZoom}\n isAutoPlaying={lightbox.isAutoPlaying}\n onClose={lightbox.close}\n onPrev={lightbox.prev}\n onNext={lightbox.next}\n onZoomIn={zoom.zoomIn}\n onZoomOut={zoom.zoomOut}\n onResetZoom={zoom.resetZoom}\n onToggleAutoplay={() => lightbox.setIsAutoPlaying((playing) => !playing)}\n />\n\n <LightboxStage\n items={items}\n currentItem={currentItem}\n currentIndex={currentIndex}\n isLoading={lightbox.isLoading}\n showCaptions={showCaptions}\n thumbnails={thumbnails}\n testId={testId}\n media={\n <LightboxCurrentMedia\n item={currentItem}\n index={currentIndex}\n total={items.length}\n zoomable={zoomable}\n zoom={zoom}\n testId={testId}\n onLoadingChange={lightbox.setIsLoading}\n onWheel={lightbox.handleWheel}\n />\n }\n thumbnailStrip={\n thumbnails &&\n items.length > 1 && (\n <LightboxThumbnails\n items={items}\n currentIndex={currentIndex}\n testId={testId}\n onSelect={lightbox.goToIndex}\n />\n )\n }\n />\n </Dialog>\n );\n});\n\nLightbox.displayName = 'Lightbox';\n\nexport default Lightbox;\n","export const MIN_ZOOM = 0.5;\nexport const MAX_ZOOM = 5;\nexport const ZOOM_STEP = 1.2;\n// Each wheel notch is ~100 deltaY, so this makes one notch a 1x zoom change.\nexport const WHEEL_ZOOM_FACTOR = 0.01;\n\nexport const DEFAULT_AUTOPLAY_INTERVAL_MS = 4000;\nexport const MIN_SWIPE_DISTANCE = 50;\nexport const OVERLAY_Z_INDEX = 1000;\n\nconst SCRIM = 'rgba(0, 0, 0, 0.5)';\nconst SCRIM_HOVER = 'rgba(0, 0, 0, 0.7)';\n\nexport const overlayButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover': { backgroundColor: SCRIM_HOVER },\n} as const;\n\n// The arrows drop their hover treatment at the ends of a non-looping gallery and\n// dim instead, so a disabled arrow does not look pressable.\nexport const navButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover:not(:disabled)': { backgroundColor: SCRIM_HOVER },\n '&:disabled': { color: 'rgba(255, 255, 255, 0.3)' },\n} as const;\n\nexport const captionSx = {\n color: 'white',\n textAlign: 'center',\n backgroundColor: SCRIM_HOVER,\n borderRadius: 1,\n} as const;\n\nexport const counterSx = {\n color: 'white',\n fontSize: '0.875rem',\n backgroundColor: SCRIM,\n borderRadius: 1,\n} as const;\n\nexport const thumbnailStripSx = {\n background: SCRIM,\n borderRadius: 1,\n} as const;\n\n// Every element gets `${dataTestId}-suffix` when the caller supplied an id, and\n// `lightbox-suffix` otherwise.\nexport const makeTestId =\n (dataTestId?: string) =>\n (suffix: string): string =>\n dataTestId ? `${dataTestId}-${suffix}` : `lightbox-${suffix}`;\n","import type { LightboxProps } from './Lightbox.types';\n\ntype LightboxDefaultedKeys =\n | 'isOpen'\n | 'items'\n | 'startIndex'\n | 'showControls'\n | 'showCaptions'\n | 'loop'\n | 'autoplay'\n | 'thumbnails'\n | 'zoomable';\n\nexport type ResolvedLightboxProps = LightboxProps &\n Required<Pick<LightboxProps, LightboxDefaultedKeys>>;\n\nconst LIGHTBOX_DEFAULTS: Pick<LightboxProps, LightboxDefaultedKeys> = {\n isOpen: false,\n items: [],\n startIndex: 0,\n showControls: true,\n showCaptions: true,\n loop: false,\n autoplay: false,\n thumbnails: false,\n zoomable: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = (props: LightboxProps): Partial<LightboxProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<LightboxProps>;\n\n// Applied as a merge rather than destructuring defaults, which would otherwise\n// put nine branches into the component's own complexity budget.\nexport const resolveLightboxProps = (props: LightboxProps): ResolvedLightboxProps =>\n ({ ...LIGHTBOX_DEFAULTS, ...definedProps(props) }) as ResolvedLightboxProps;\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxItem } from './Lightbox.types';\n\nexport interface LightboxMediaProps {\n item: LightboxItem;\n index: number;\n total: number;\n zoomLevel: number;\n panOffset: { x: number; y: number };\n zoomable: boolean;\n isDragging: boolean;\n testId: (suffix: string) => string;\n onLoadStart: () => void;\n onLoaded: () => void;\n onWheel: (event: React.WheelEvent) => void;\n onDoubleClick: () => void;\n}\n\nconst cursorFor = (zoomLevel: number, zoomable: boolean): string => {\n if (zoomLevel > 1) return 'move';\n return zoomable ? 'zoom-in' : 'default';\n};\n\nexport const LightboxMedia: FC<LightboxMediaProps> = ({\n item,\n index,\n total,\n zoomLevel,\n panOffset,\n zoomable,\n isDragging,\n testId,\n onLoadStart,\n onLoaded,\n onWheel,\n onDoubleClick,\n}) => {\n if (item.type === 'video') {\n return (\n <video\n src={item.src}\n controls\n style={{ maxWidth: '90vw', maxHeight: '80vh', objectFit: 'contain' }}\n onLoadStart={onLoadStart}\n onLoadedData={onLoaded}\n aria-label={item.alt || `Video ${index + 1} of ${total}`}\n data-testid={testId('video')}\n />\n );\n }\n\n return (\n <img\n src={item.src}\n alt={item.alt || `Image ${index + 1} of ${total}`}\n style={{\n // At 1x the image is bounded by the viewport; once zoomed it is allowed\n // to overflow so there is something to pan around.\n maxWidth: zoomLevel === 1 ? '90vw' : 'none',\n maxHeight: zoomLevel === 1 ? '80vh' : 'none',\n transform: `scale(${zoomLevel}) translate(${panOffset.x}px, ${panOffset.y}px)`,\n transformOrigin: 'center',\n cursor: cursorFor(zoomLevel, zoomable),\n transition: isDragging ? 'none' : 'transform 0.2s ease',\n objectFit: 'contain',\n }}\n onLoad={onLoaded}\n onWheel={onWheel}\n onDoubleClick={onDoubleClick}\n draggable={false}\n data-testid={testId('image')}\n />\n );\n};\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { ZoomState } from './Lightbox.hooks';\nimport type { LightboxItem } from './Lightbox.types';\nimport { LightboxMedia } from './LightboxMedia';\n\nexport interface LightboxCurrentMediaProps {\n item?: LightboxItem;\n index: number;\n total: number;\n zoomable: boolean;\n zoom: ZoomState;\n testId: (suffix: string) => string;\n onLoadingChange: (loading: boolean) => void;\n onWheel: (event: React.WheelEvent) => void;\n}\n\n// Wires the active item to the zoom state. Double-clicking zooms in, or snaps\n// back to 1x if already zoomed.\nexport const LightboxCurrentMedia: FC<LightboxCurrentMediaProps> = ({\n item,\n index,\n total,\n zoomable,\n zoom,\n testId,\n onLoadingChange,\n onWheel,\n}) => {\n if (!item) return null;\n\n return (\n <LightboxMedia\n item={item}\n index={index}\n total={total}\n zoomLevel={zoom.zoomLevel}\n panOffset={zoom.panOffset}\n zoomable={zoomable}\n // Drag-panning is not wired up, so the transform transition is always on.\n isDragging={false}\n testId={testId}\n onLoadStart={() => onLoadingChange(true)}\n onLoaded={() => onLoadingChange(false)}\n onWheel={onWheel}\n onDoubleClick={zoom.zoomLevel > 1 ? zoom.resetZoom : zoom.zoomIn}\n />\n );\n};\n","import PrevIcon from '@mui/icons-material/ChevronLeft';\nimport NextIcon from '@mui/icons-material/ChevronRight';\nimport CloseIcon from '@mui/icons-material/Close';\nimport PauseIcon from '@mui/icons-material/Pause';\nimport PlayIcon from '@mui/icons-material/PlayArrow';\nimport ResetZoomIcon from '@mui/icons-material/RestartAlt';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport { Box, IconButton } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { navButtonSx, OVERLAY_Z_INDEX, overlayButtonSx } from './Lightbox.constants';\n\ntype TestId = (suffix: string) => string;\n\nexport const LightboxCloseButton: FC<{ testId: TestId; onClose: () => void }> = ({\n testId,\n onClose,\n}) => (\n <IconButton\n onClick={onClose}\n sx={{ ...overlayButtonSx, position: 'absolute', top: 16, right: 16, zIndex: OVERLAY_Z_INDEX }}\n aria-label=\"Close lightbox\"\n data-testid={testId('close')}\n >\n <CloseIcon />\n </IconButton>\n);\n\nconst arrowSx = (side: 'left' | 'right') =>\n ({\n ...navButtonSx,\n position: 'absolute',\n [side]: 16,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }) as const;\n\nexport interface LightboxNavButtonsProps {\n testId: TestId;\n atStart: boolean;\n atEnd: boolean;\n onPrev: () => void;\n onNext: () => void;\n}\n\nexport const LightboxNavButtons: FC<LightboxNavButtonsProps> = ({\n testId,\n atStart,\n atEnd,\n onPrev,\n onNext,\n}) => (\n <>\n <IconButton\n onClick={onPrev}\n disabled={atStart}\n sx={arrowSx('left')}\n aria-label=\"Previous item\"\n data-testid={testId('prev')}\n >\n <PrevIcon />\n </IconButton>\n\n <IconButton\n onClick={onNext}\n disabled={atEnd}\n sx={arrowSx('right')}\n aria-label=\"Next item\"\n data-testid={testId('next')}\n >\n <NextIcon />\n </IconButton>\n </>\n);\n\nexport interface LightboxZoomControlsProps {\n testId: TestId;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n}\n\nexport const LightboxZoomControls: FC<LightboxZoomControlsProps> = ({\n testId,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n}) => (\n <Box\n sx={{\n position: 'absolute',\n top: 16,\n left: 16,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n zIndex: OVERLAY_Z_INDEX,\n }}\n data-testid={testId('zoom-controls')}\n >\n <IconButton onClick={onZoomIn} sx={overlayButtonSx} aria-label=\"Zoom in\" data-testid={testId('zoom-in')}>\n <ZoomInIcon />\n </IconButton>\n <IconButton\n onClick={onZoomOut}\n sx={overlayButtonSx}\n aria-label=\"Zoom out\"\n data-testid={testId('zoom-out')}\n >\n <ZoomOutIcon />\n </IconButton>\n <IconButton\n onClick={onResetZoom}\n sx={overlayButtonSx}\n aria-label=\"Reset zoom\"\n data-testid={testId('zoom-reset')}\n >\n <ResetZoomIcon />\n </IconButton>\n </Box>\n);\n\nexport interface LightboxAutoplayButtonProps {\n testId: TestId;\n isAutoPlaying: boolean;\n onToggle: () => void;\n}\n\nexport const LightboxAutoplayButton: FC<LightboxAutoplayButtonProps> = ({\n testId,\n isAutoPlaying,\n onToggle,\n}) => (\n <IconButton\n onClick={onToggle}\n sx={{\n ...overlayButtonSx,\n position: 'absolute',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }}\n aria-label={isAutoPlaying ? 'Pause slideshow' : 'Start slideshow'}\n data-testid={testId('autoplay')}\n >\n {isAutoPlaying ? <PauseIcon /> : <PlayIcon />}\n </IconButton>\n);\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxProps } from './Lightbox.types';\nimport {\n LightboxAutoplayButton,\n LightboxCloseButton,\n LightboxNavButtons,\n LightboxZoomControls,\n} from './LightboxControls';\n\nexport interface LightboxOverlayProps {\n testId: (suffix: string) => string;\n itemCount: number;\n currentIndex: number;\n showControls: boolean;\n loop: boolean;\n autoplay: LightboxProps['autoplay'];\n canZoom: boolean;\n isAutoPlaying: boolean;\n onClose: () => void;\n onPrev: () => void;\n onNext: () => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n onToggleAutoplay: () => void;\n}\n\n// Everything that floats above the media: dismiss, step, zoom and slideshow.\nexport const LightboxOverlay: FC<LightboxOverlayProps> = ({\n testId,\n itemCount,\n currentIndex,\n showControls,\n loop,\n autoplay,\n canZoom,\n isAutoPlaying,\n onClose,\n onPrev,\n onNext,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n onToggleAutoplay,\n}) => {\n const hasMultiple = itemCount > 1;\n\n return (\n <>\n <LightboxCloseButton testId={testId} onClose={onClose} />\n\n {showControls && hasMultiple && (\n <LightboxNavButtons\n testId={testId}\n // A non-looping gallery runs out of moves at either end.\n atStart={!loop && currentIndex === 0}\n atEnd={!loop && currentIndex === itemCount - 1}\n onPrev={onPrev}\n onNext={onNext}\n />\n )}\n\n {canZoom && (\n <LightboxZoomControls\n testId={testId}\n onZoomIn={onZoomIn}\n onZoomOut={onZoomOut}\n onResetZoom={onResetZoom}\n />\n )}\n\n {autoplay && hasMultiple && (\n <LightboxAutoplayButton\n testId={testId}\n isAutoPlaying={isAutoPlaying}\n onToggle={onToggleAutoplay}\n />\n )}\n </>\n );\n};\n","import { Box, CircularProgress, DialogContent, Typography } from '@mui/material';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\n\nimport { captionSx, counterSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\ntype TestId = (suffix: string) => string;\n\nexport interface LightboxStageProps {\n items: LightboxItem[];\n currentItem?: LightboxItem;\n currentIndex: number;\n isLoading: boolean;\n showCaptions: boolean;\n thumbnails: boolean;\n testId: TestId;\n media: ReactNode;\n thumbnailStrip: ReactNode;\n}\n\n// The viewport itself: the media, whatever floats over it, and the filmstrip.\nexport const LightboxStage: FC<LightboxStageProps> = ({\n items,\n currentItem,\n currentIndex,\n isLoading,\n showCaptions,\n thumbnails,\n testId,\n media,\n thumbnailStrip,\n}) => (\n <DialogContent\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n position: 'relative',\n height: '100vh',\n overflow: 'hidden',\n }}\n data-testid={testId('content')}\n >\n {isLoading && (\n <CircularProgress\n sx={{ position: 'absolute', color: 'white', zIndex: 999 }}\n data-testid={testId('loading')}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n }}\n data-testid={testId('image-container')}\n >\n {media}\n </Box>\n\n {showCaptions && currentItem?.caption && (\n <Typography\n id=\"lightbox-description\"\n sx={{\n ...captionSx,\n position: 'absolute',\n // Sit above the filmstrip when there is one.\n bottom: thumbnails ? 120 : 16,\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '80vw',\n padding: 2,\n }}\n data-testid={testId('caption')}\n >\n {currentItem.caption}\n </Typography>\n )}\n\n {items.length > 1 && (\n <Typography\n sx={{ ...counterSx, position: 'absolute', top: 70, right: 16, padding: '4px 8px' }}\n aria-live=\"polite\"\n data-testid={testId('counter')}\n >\n {currentIndex + 1} / {items.length}\n </Typography>\n )}\n\n {thumbnailStrip}\n </DialogContent>\n);\n","import PlayIcon from '@mui/icons-material/PlayArrow';\nimport { Box } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { thumbnailStripSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\nconst THUMB_WIDTH = 60;\nconst THUMB_HEIGHT = 40;\n\nconst VideoThumbnail: FC = () => (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n background: 'rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <PlayIcon sx={{ color: 'white', fontSize: 16 }} />\n </Box>\n);\n\nexport interface LightboxThumbnailsProps {\n items: LightboxItem[];\n currentIndex: number;\n testId: (suffix: string) => string;\n onSelect: (index: number) => void;\n}\n\nexport const LightboxThumbnails: FC<LightboxThumbnailsProps> = ({\n items,\n currentIndex,\n testId,\n onSelect,\n}) => (\n <Box\n sx={{\n ...thumbnailStripSx,\n position: 'absolute',\n bottom: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n gap: 1,\n maxWidth: '90vw',\n overflowX: 'auto',\n padding: 1,\n }}\n data-testid={testId('thumbnails')}\n >\n {items.map((item, index) => (\n <Box\n key={`${item.src}-${index}`}\n onClick={() => onSelect(index)}\n sx={{\n width: THUMB_WIDTH,\n height: THUMB_HEIGHT,\n cursor: 'pointer',\n border: currentIndex === index ? '2px solid white' : '2px solid transparent',\n borderRadius: 0.5,\n overflow: 'hidden',\n flexShrink: 0,\n '&:hover': { border: '2px solid rgba(255, 255, 255, 0.7)' },\n }}\n data-testid={testId(`thumbnail-${index}`)}\n >\n {item.type === 'video' ? (\n <VideoThumbnail />\n ) : (\n <img\n src={item.src}\n alt={item.alt || `Thumbnail ${index + 1}`}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n )}\n </Box>\n ))}\n </Box>\n);\n","import { useCallback, useImperativeHandle, useState } from 'react';\nimport type React from 'react';\n\nimport {\n useAutoplay,\n useLightboxKeyboard,\n useNavigation,\n usePreloader,\n useSwipe,\n useWheelZoom,\n useZoomState,\n} from './Lightbox.hooks';\nimport type { ResolvedLightboxProps } from './Lightbox.helpers';\nimport type { LightboxRef } from './Lightbox.types';\n\n// Wires the independent concerns together in dependency order: zoom, then\n// navigation (which resets zoom), then autoplay (which advances), then the\n// input handlers that close.\nexport const useLightbox = (\n { isOpen, onClose, items, startIndex, showControls, loop, autoplay, zoomable }: ResolvedLightboxProps,\n ref: React.ForwardedRef<LightboxRef>,\n) => {\n const [isLoading, setIsLoading] = useState(false);\n\n const preloadImage = usePreloader();\n const zoom = useZoomState();\n\n const { currentIndex, goToIndex, next, prev } = useNavigation({\n items,\n loop,\n startIndex,\n resetZoom: zoom.resetZoom,\n preloadImage,\n });\n\n const currentItem = items[currentIndex];\n const canZoom = Boolean(zoomable && currentItem && currentItem.type !== 'video');\n\n const handleWheel = useWheelZoom({ enabled: canZoom, setZoomLevel: zoom.setZoomLevel });\n\n const { isAutoPlaying, setIsAutoPlaying, stopAutoplay } = useAutoplay({\n isOpen,\n autoplay,\n itemCount: items.length,\n currentIndex,\n next,\n });\n\n const close = useCallback(() => {\n stopAutoplay();\n onClose();\n }, [stopAutoplay, onClose]);\n\n // open() with no argument starts at the first item.\n const open = useCallback((index = 0) => goToIndex(index), [goToIndex]);\n\n useImperativeHandle(ref, () => ({ open, close, next, prev, goTo: goToIndex }));\n\n useLightboxKeyboard({ isOpen, showControls, autoplay, close, prev, next, setIsAutoPlaying });\n\n const { handleTouchStart, handleTouchEnd } = useSwipe({ prev, next, close });\n\n return {\n currentIndex,\n currentItem,\n canZoom,\n isLoading,\n setIsLoading,\n isAutoPlaying,\n setIsAutoPlaying,\n zoom,\n handleWheel,\n goToIndex,\n next,\n prev,\n close,\n handleTouchStart,\n handleTouchEnd,\n };\n};\n","import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n DEFAULT_AUTOPLAY_INTERVAL_MS,\n MAX_ZOOM,\n MIN_SWIPE_DISTANCE,\n MIN_ZOOM,\n WHEEL_ZOOM_FACTOR,\n ZOOM_STEP,\n} from './Lightbox.constants';\nimport type { LightboxItem, LightboxProps } from './Lightbox.types';\n\nconst clampZoom = (zoom: number): number => Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n\n// Items with no explicit type are images.\nconst isImageItem = (item?: LightboxItem): item is LightboxItem =>\n Boolean(item && (item.type === 'image' || !item.type));\n\n// Images are fetched once and remembered, so stepping back to one is instant.\nexport const usePreloader = () => {\n const [preloadedImages, setPreloadedImages] = useState<Set<string>>(new Set());\n\n return useCallback(\n (src: string) => {\n if (preloadedImages.has(src)) return;\n\n const img = new window.Image();\n img.onload = () => setPreloadedImages((prev) => new Set([...prev, src]));\n img.src = src;\n },\n [preloadedImages],\n );\n};\n\nexport interface ZoomState {\n zoomLevel: number;\n panOffset: { x: number; y: number };\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n resetZoom: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n}\n\nexport const useZoomState = (): ZoomState => {\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });\n\n const resetZoom = useCallback(() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, []);\n\n const zoomIn = useCallback(() => setZoomLevel((prev) => Math.min(MAX_ZOOM, prev * ZOOM_STEP)), []);\n const zoomOut = useCallback(\n () => setZoomLevel((prev) => Math.max(MIN_ZOOM, prev / ZOOM_STEP)),\n [],\n );\n\n return { zoomLevel, panOffset, setZoomLevel, resetZoom, zoomIn, zoomOut };\n};\n\nexport const useWheelZoom = ({\n enabled,\n setZoomLevel,\n}: {\n enabled: boolean;\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n}) =>\n useCallback(\n (event: React.WheelEvent) => {\n if (!enabled) return;\n\n event.preventDefault();\n // Scrolling up (negative deltaY) zooms in.\n setZoomLevel((prev) => clampZoom(prev + event.deltaY * -WHEEL_ZOOM_FACTOR));\n },\n [enabled, setZoomLevel],\n );\n\nexport const useNavigation = ({\n items,\n loop,\n startIndex,\n resetZoom,\n preloadImage,\n}: {\n items: LightboxItem[];\n loop: boolean;\n startIndex: number;\n resetZoom: () => void;\n preloadImage: (src: string) => void;\n}) => {\n const [currentIndex, setCurrentIndex] = useState(\n Math.max(0, Math.min(startIndex, items.length - 1)),\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n if (items.length === 0) return;\n\n // Looping wraps both ways; otherwise the index sticks at the ends.\n const newIndex = loop\n ? ((index % items.length) + items.length) % items.length\n : Math.max(0, Math.min(index, items.length - 1));\n\n setCurrentIndex(newIndex);\n resetZoom();\n\n // Fetch the neighbours so a step in either direction shows immediately.\n [items[newIndex - 1], items[newIndex + 1]]\n .filter(isImageItem)\n .forEach((item) => preloadImage(item.src));\n },\n [items, loop, resetZoom, preloadImage],\n );\n\n const next = useCallback(() => {\n if (currentIndex < items.length - 1 || loop) goToIndex(currentIndex + 1);\n }, [currentIndex, items.length, loop, goToIndex]);\n\n const prev = useCallback(() => {\n if (currentIndex > 0 || loop) goToIndex(currentIndex - 1);\n }, [currentIndex, loop, goToIndex]);\n\n return { currentIndex, goToIndex, next, prev };\n};\n\nexport const useAutoplay = ({\n isOpen,\n autoplay,\n itemCount,\n currentIndex,\n next,\n}: {\n isOpen: boolean;\n autoplay: LightboxProps['autoplay'];\n itemCount: number;\n currentIndex: number;\n next: () => void;\n}) => {\n const [isAutoPlaying, setIsAutoPlaying] = useState(false);\n const timerRef = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (!isAutoPlaying || !autoplay || itemCount <= 1) return;\n\n const interval =\n typeof autoplay === 'object'\n ? autoplay.interval || DEFAULT_AUTOPLAY_INTERVAL_MS\n : DEFAULT_AUTOPLAY_INTERVAL_MS;\n\n timerRef.current = window.setTimeout(next, interval);\n\n return () => window.clearTimeout(timerRef.current);\n }, [isAutoPlaying, autoplay, currentIndex, next, itemCount]);\n\n // Opening a gallery with more than one item starts the slideshow.\n useEffect(() => {\n setIsAutoPlaying(Boolean(isOpen && autoplay && itemCount > 1));\n }, [isOpen, autoplay, itemCount]);\n\n const stopAutoplay = useCallback(() => {\n setIsAutoPlaying(false);\n window.clearTimeout(timerRef.current);\n }, []);\n\n return { isAutoPlaying, setIsAutoPlaying, stopAutoplay };\n};\n\nexport const useLightboxKeyboard = ({\n isOpen,\n showControls,\n autoplay,\n close,\n prev,\n next,\n setIsAutoPlaying,\n}: {\n isOpen: boolean;\n showControls: boolean;\n autoplay: LightboxProps['autoplay'];\n close: () => void;\n prev: () => void;\n next: () => void;\n setIsAutoPlaying: React.Dispatch<React.SetStateAction<boolean>>;\n}) => {\n useEffect(() => {\n if (!isOpen) return;\n\n const arrows: Record<string, () => void> = { ArrowLeft: prev, ArrowRight: next };\n\n const handleKeyDown = (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Escape') {\n close();\n return;\n }\n\n const arrow = arrows[event.key];\n if (arrow && showControls) {\n event.preventDefault();\n arrow();\n return;\n }\n\n if (event.key === ' ') {\n event.preventDefault();\n if (autoplay) setIsAutoPlaying((playing) => !playing);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, showControls, close, prev, next, autoplay, setIsAutoPlaying]);\n};\n\n// Horizontal swipes step through the gallery; a downward swipe dismisses it.\nexport const useSwipe = ({\n prev,\n next,\n close,\n}: {\n prev: () => void;\n next: () => void;\n close: () => void;\n}) => {\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n\n const handleTouchStart = useCallback((event: React.TouchEvent) => {\n const touch = event.touches.length === 1 ? event.touches[0] : undefined;\n if (touch) touchStartRef.current = { x: touch.clientX, y: touch.clientY };\n }, []);\n\n const handleTouchEnd = useCallback(\n (event: React.TouchEvent) => {\n const start = touchStartRef.current;\n const touch = event.changedTouches[0];\n touchStartRef.current = null;\n if (!start || !touch) return;\n\n const deltaX = touch.clientX - start.x;\n const deltaY = touch.clientY - start.y;\n\n // Whichever axis moved further decides what the gesture meant.\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n if (Math.abs(deltaX) > MIN_SWIPE_DISTANCE) {\n if (deltaX > 0) prev();\n else next();\n }\n return;\n }\n\n if (deltaY > MIN_SWIPE_DISTANCE) close();\n },\n [prev, next, close],\n );\n\n return { handleTouchStart, handleTouchEnd };\n};\n"],"mappings":"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","names":["Typography","jsx","jsx","Fragment","jsx","jsxs","Box","jsx","jsxs","Box","PlayIcon","Box","jsx","Box","PlayIcon","useCallback","useState","useState","useCallback","jsx","jsxs","Typography"]}
1
+ {"version":3,"sources":["../../src/components/data-display/Lightbox/Lightbox.tsx","../../src/components/data-display/Lightbox/Lightbox.constants.ts","../../src/components/data-display/Lightbox/Lightbox.helpers.ts","../../src/components/data-display/Lightbox/lightbox-copy-context.tsx","../../src/components/data-display/Lightbox/LightboxMedia.tsx","../../src/components/data-display/Lightbox/LightboxCurrentMedia.tsx","../../src/components/data-display/Lightbox/LightboxControls.tsx","../../src/components/data-display/Lightbox/LightboxOverlay.tsx","../../src/components/data-display/Lightbox/LightboxStage.tsx","../../src/components/data-display/Lightbox/LightboxThumbnails.tsx","../../src/components/data-display/Lightbox/useLightbox.ts","../../src/components/data-display/Lightbox/Lightbox.hooks.ts"],"sourcesContent":["import { Dialog, Fade, Typography } from '@mui/material';\nimport React from 'react';\n\nimport { makeTestId } from './Lightbox.constants';\nimport { resolveLightboxProps } from './Lightbox.helpers';\nimport { LightboxCopyProvider } from './lightbox-copy-context';\nimport type { LightboxProps, LightboxRef } from './Lightbox.types';\nimport { LightboxCurrentMedia } from './LightboxCurrentMedia';\nimport { LightboxOverlay } from './LightboxOverlay';\nimport { LightboxStage } from './LightboxStage';\nimport { LightboxThumbnails } from './LightboxThumbnails';\nimport { useLightbox } from './useLightbox';\n\nconst DIALOG_STATIC_PROPS = {\n maxWidth: false,\n fullScreen: true,\n TransitionComponent: Fade,\n TransitionProps: { timeout: 300 },\n PaperProps: { sx: { background: 'rgba(0, 0, 0, 0.9)', backdropFilter: 'blur(2px)' } },\n 'aria-label': 'Lightbox',\n 'aria-labelledby': 'lightbox-title',\n role: 'dialog',\n 'aria-modal': 'true',\n} as const;\n\nexport const Lightbox = React.forwardRef<LightboxRef, LightboxProps>((componentProps, ref) => {\n const props = resolveLightboxProps(componentProps);\n const { isOpen, items, loop, autoplay, showControls, showCaptions, thumbnails, zoomable } = props;\n const { className, style, dataTestId } = props;\n\n const testId = makeTestId(dataTestId);\n const lightbox = useLightbox(props, ref);\n const { currentIndex, currentItem, zoom } = lightbox;\n\n return (\n <LightboxCopyProvider copy={props.copy}>\n <Dialog\n open={isOpen}\n onClose={lightbox.close}\n {...DIALOG_STATIC_PROPS}\n className={className}\n style={style}\n onTouchStart={lightbox.handleTouchStart}\n onTouchEnd={lightbox.handleTouchEnd}\n data-testid={dataTestId || 'lightbox'}\n >\n {/* Visually hidden title for screen readers */}\n <Typography id=\"lightbox-title\" variant=\"h6\" sx={{ position: 'absolute', left: -10000 }}>\n Lightbox - {currentItem?.alt || `Item ${currentIndex + 1} of ${items.length}`}\n </Typography>\n\n <LightboxOverlay\n testId={testId}\n itemCount={items.length}\n currentIndex={currentIndex}\n showControls={showControls}\n loop={loop}\n autoplay={autoplay}\n canZoom={lightbox.canZoom}\n isAutoPlaying={lightbox.isAutoPlaying}\n onClose={lightbox.close}\n onPrev={lightbox.prev}\n onNext={lightbox.next}\n onZoomIn={zoom.zoomIn}\n onZoomOut={zoom.zoomOut}\n onResetZoom={zoom.resetZoom}\n onToggleAutoplay={() => lightbox.setIsAutoPlaying((playing) => !playing)}\n />\n\n <LightboxStage\n items={items}\n currentItem={currentItem}\n currentIndex={currentIndex}\n isLoading={lightbox.isLoading}\n showCaptions={showCaptions}\n thumbnails={thumbnails}\n testId={testId}\n media={\n <LightboxCurrentMedia\n item={currentItem}\n index={currentIndex}\n total={items.length}\n zoomable={zoomable}\n zoom={zoom}\n testId={testId}\n onLoadingChange={lightbox.setIsLoading}\n onWheel={lightbox.handleWheel}\n />\n }\n thumbnailStrip={\n thumbnails &&\n items.length > 1 && (\n <LightboxThumbnails\n items={items}\n currentIndex={currentIndex}\n testId={testId}\n onSelect={lightbox.goToIndex}\n />\n )\n }\n />\n </Dialog>\n </LightboxCopyProvider>\n );\n});\n\nLightbox.displayName = 'Lightbox';\n\nexport default Lightbox;\n","export const MIN_ZOOM = 0.5;\nexport const MAX_ZOOM = 5;\nexport const ZOOM_STEP = 1.2;\n// Each wheel notch is ~100 deltaY, so this makes one notch a 1x zoom change.\nexport const WHEEL_ZOOM_FACTOR = 0.01;\n\nexport const DEFAULT_AUTOPLAY_INTERVAL_MS = 4000;\nexport const MIN_SWIPE_DISTANCE = 50;\nexport const OVERLAY_Z_INDEX = 1000;\n\nconst SCRIM = 'rgba(0, 0, 0, 0.5)';\nconst SCRIM_HOVER = 'rgba(0, 0, 0, 0.7)';\n\nexport const overlayButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover': { backgroundColor: SCRIM_HOVER },\n} as const;\n\n// The arrows drop their hover treatment at the ends of a non-looping gallery and\n// dim instead, so a disabled arrow does not look pressable.\nexport const navButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover:not(:disabled)': { backgroundColor: SCRIM_HOVER },\n '&:disabled': { color: 'rgba(255, 255, 255, 0.3)' },\n} as const;\n\nexport const captionSx = {\n color: 'white',\n textAlign: 'center',\n backgroundColor: SCRIM_HOVER,\n borderRadius: 1,\n} as const;\n\nexport const counterSx = {\n color: 'white',\n fontSize: '0.875rem',\n backgroundColor: SCRIM,\n borderRadius: 1,\n} as const;\n\nexport const thumbnailStripSx = {\n background: SCRIM,\n borderRadius: 1,\n} as const;\n\n// Every element gets `${dataTestId}-suffix` when the caller supplied an id, and\n// `lightbox-suffix` otherwise.\nexport const makeTestId =\n (dataTestId?: string) =>\n (suffix: string): string =>\n dataTestId ? `${dataTestId}-${suffix}` : `lightbox-${suffix}`;\n","import type { LightboxProps } from './Lightbox.types';\n\ntype LightboxDefaultedKeys =\n | 'isOpen'\n | 'items'\n | 'startIndex'\n | 'showControls'\n | 'showCaptions'\n | 'loop'\n | 'autoplay'\n | 'thumbnails'\n | 'zoomable';\n\nexport type ResolvedLightboxProps = LightboxProps &\n Required<Pick<LightboxProps, LightboxDefaultedKeys>>;\n\nconst LIGHTBOX_DEFAULTS: Pick<LightboxProps, LightboxDefaultedKeys> = {\n isOpen: false,\n items: [],\n startIndex: 0,\n showControls: true,\n showCaptions: true,\n loop: false,\n autoplay: false,\n thumbnails: false,\n zoomable: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = (props: LightboxProps): Partial<LightboxProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<LightboxProps>;\n\n// Applied as a merge rather than destructuring defaults, which would otherwise\n// put nine branches into the component's own complexity budget.\nexport const resolveLightboxProps = (props: LightboxProps): ResolvedLightboxProps =>\n ({ ...LIGHTBOX_DEFAULTS, ...definedProps(props) }) as ResolvedLightboxProps;\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport React from 'react';\n\nimport type { LightboxCopy } from '../../../copy';\n\n/**\n * The lightbox's words, for the four control components that render them.\n *\n * A CONTEXT rather than props: the viewer is `Lightbox` → `LightboxOverlay` →\n * three separate control clusters, and threading one object down three hops is\n * how a copy port comes to exist, be required, and go unread. It stays a\n * single REQUIRED prop at the mount, which is the only place a host answers.\n */\nconst LightboxCopyContext = createContext<LightboxCopy | null>(null);\n\nexport function LightboxCopyProvider({\n copy,\n children,\n}: {\n copy: LightboxCopy;\n children: ReactNode;\n}): React.JSX.Element {\n return <LightboxCopyContext.Provider value={copy}>{children}</LightboxCopyContext.Provider>;\n}\n\n/**\n * The words this viewer renders — THROWS outside a provider rather than\n * falling back.\n *\n * Every one of them is an aria-label on a glyph, so a fallback would be the\n * one failure nobody sees in review: the sighted path renders identically\n * whichever language it is in.\n */\nexport function useLightboxCopy(): LightboxCopy {\n const copy = useContext(LightboxCopyContext);\n if (!copy) {\n throw new Error('useLightboxCopy must be rendered inside a <LightboxCopyProvider>');\n }\n return copy;\n}\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxItem } from './Lightbox.types';\n\nexport interface LightboxMediaProps {\n item: LightboxItem;\n index: number;\n total: number;\n zoomLevel: number;\n panOffset: { x: number; y: number };\n zoomable: boolean;\n isDragging: boolean;\n testId: (suffix: string) => string;\n onLoadStart: () => void;\n onLoaded: () => void;\n onWheel: (event: React.WheelEvent) => void;\n onDoubleClick: () => void;\n}\n\nconst cursorFor = (zoomLevel: number, zoomable: boolean): string => {\n if (zoomLevel > 1) return 'move';\n return zoomable ? 'zoom-in' : 'default';\n};\n\nexport const LightboxMedia: FC<LightboxMediaProps> = ({\n item,\n index,\n total,\n zoomLevel,\n panOffset,\n zoomable,\n isDragging,\n testId,\n onLoadStart,\n onLoaded,\n onWheel,\n onDoubleClick,\n}) => {\n if (item.type === 'video') {\n return (\n <video\n src={item.src}\n controls\n style={{ maxWidth: '90vw', maxHeight: '80vh', objectFit: 'contain' }}\n onLoadStart={onLoadStart}\n onLoadedData={onLoaded}\n aria-label={item.alt || `Video ${index + 1} of ${total}`}\n data-testid={testId('video')}\n />\n );\n }\n\n return (\n <img\n src={item.src}\n alt={item.alt || `Image ${index + 1} of ${total}`}\n style={{\n // At 1x the image is bounded by the viewport; once zoomed it is allowed\n // to overflow so there is something to pan around.\n maxWidth: zoomLevel === 1 ? '90vw' : 'none',\n maxHeight: zoomLevel === 1 ? '80vh' : 'none',\n transform: `scale(${zoomLevel}) translate(${panOffset.x}px, ${panOffset.y}px)`,\n transformOrigin: 'center',\n cursor: cursorFor(zoomLevel, zoomable),\n transition: isDragging ? 'none' : 'transform 0.2s ease',\n objectFit: 'contain',\n }}\n onLoad={onLoaded}\n onWheel={onWheel}\n onDoubleClick={onDoubleClick}\n draggable={false}\n data-testid={testId('image')}\n />\n );\n};\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { ZoomState } from './Lightbox.hooks';\nimport type { LightboxItem } from './Lightbox.types';\nimport { LightboxMedia } from './LightboxMedia';\n\nexport interface LightboxCurrentMediaProps {\n item?: LightboxItem;\n index: number;\n total: number;\n zoomable: boolean;\n zoom: ZoomState;\n testId: (suffix: string) => string;\n onLoadingChange: (loading: boolean) => void;\n onWheel: (event: React.WheelEvent) => void;\n}\n\n// Wires the active item to the zoom state. Double-clicking zooms in, or snaps\n// back to 1x if already zoomed.\nexport const LightboxCurrentMedia: FC<LightboxCurrentMediaProps> = ({\n item,\n index,\n total,\n zoomable,\n zoom,\n testId,\n onLoadingChange,\n onWheel,\n}) => {\n if (!item) return null;\n\n return (\n <LightboxMedia\n item={item}\n index={index}\n total={total}\n zoomLevel={zoom.zoomLevel}\n panOffset={zoom.panOffset}\n zoomable={zoomable}\n // Drag-panning is not wired up, so the transform transition is always on.\n isDragging={false}\n testId={testId}\n onLoadStart={() => onLoadingChange(true)}\n onLoaded={() => onLoadingChange(false)}\n onWheel={onWheel}\n onDoubleClick={zoom.zoomLevel > 1 ? zoom.resetZoom : zoom.zoomIn}\n />\n );\n};\n","import PrevIcon from '@mui/icons-material/ChevronLeft';\nimport NextIcon from '@mui/icons-material/ChevronRight';\nimport CloseIcon from '@mui/icons-material/Close';\nimport PauseIcon from '@mui/icons-material/Pause';\nimport PlayIcon from '@mui/icons-material/PlayArrow';\nimport ResetZoomIcon from '@mui/icons-material/RestartAlt';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport { Box, IconButton } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { navButtonSx, OVERLAY_Z_INDEX, overlayButtonSx } from './Lightbox.constants';\nimport { useLightboxCopy } from './lightbox-copy-context';\n\ntype TestId = (suffix: string) => string;\n\nexport const LightboxCloseButton: FC<{ testId: TestId; onClose: () => void }> = ({\n testId,\n onClose,\n}) => {\n const copy = useLightboxCopy();\n return (\n <IconButton\n onClick={onClose}\n sx={{ ...overlayButtonSx, position: 'absolute', top: 16, right: 16, zIndex: OVERLAY_Z_INDEX }}\n aria-label={copy.close}\n data-testid={testId('close')}\n >\n <CloseIcon />\n </IconButton>\n );\n};\n\nconst arrowSx = (side: 'left' | 'right') =>\n ({\n ...navButtonSx,\n position: 'absolute',\n [side]: 16,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }) as const;\n\nexport interface LightboxNavButtonsProps {\n testId: TestId;\n atStart: boolean;\n atEnd: boolean;\n onPrev: () => void;\n onNext: () => void;\n}\n\nexport const LightboxNavButtons: FC<LightboxNavButtonsProps> = ({\n testId,\n atStart,\n atEnd,\n onPrev,\n onNext,\n}) => {\n const copy = useLightboxCopy();\n return (\n <>\n <IconButton\n onClick={onPrev}\n disabled={atStart}\n sx={arrowSx('left')}\n aria-label={copy.previous}\n data-testid={testId('prev')}\n >\n <PrevIcon />\n </IconButton>\n\n <IconButton\n onClick={onNext}\n disabled={atEnd}\n sx={arrowSx('right')}\n aria-label={copy.next}\n data-testid={testId('next')}\n >\n <NextIcon />\n </IconButton>\n </>\n );\n};\n\nexport interface LightboxZoomControlsProps {\n testId: TestId;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n}\n\nexport const LightboxZoomControls: FC<LightboxZoomControlsProps> = ({\n testId,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n}) => {\n const copy = useLightboxCopy();\n return (\n <Box\n sx={{\n position: 'absolute',\n top: 16,\n left: 16,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n zIndex: OVERLAY_Z_INDEX,\n }}\n data-testid={testId('zoom-controls')}\n >\n <IconButton onClick={onZoomIn} sx={overlayButtonSx} aria-label={copy.zoomIn} data-testid={testId('zoom-in')}>\n <ZoomInIcon />\n </IconButton>\n <IconButton\n onClick={onZoomOut}\n sx={overlayButtonSx}\n aria-label={copy.zoomOut}\n data-testid={testId('zoom-out')}\n >\n <ZoomOutIcon />\n </IconButton>\n <IconButton\n onClick={onResetZoom}\n sx={overlayButtonSx}\n aria-label={copy.resetZoom}\n data-testid={testId('zoom-reset')}\n >\n <ResetZoomIcon />\n </IconButton>\n </Box>\n );\n};\n\nexport interface LightboxAutoplayButtonProps {\n testId: TestId;\n isAutoPlaying: boolean;\n onToggle: () => void;\n}\n\nexport const LightboxAutoplayButton: FC<LightboxAutoplayButtonProps> = ({\n testId,\n isAutoPlaying,\n onToggle,\n}) => {\n const copy = useLightboxCopy();\n return (\n <IconButton\n onClick={onToggle}\n sx={{\n ...overlayButtonSx,\n position: 'absolute',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }}\n aria-label={isAutoPlaying ? copy.pause : copy.play}\n data-testid={testId('autoplay')}\n >\n {isAutoPlaying ? <PauseIcon /> : <PlayIcon />}\n </IconButton>\n );\n};\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxProps } from './Lightbox.types';\nimport {\n LightboxAutoplayButton,\n LightboxCloseButton,\n LightboxNavButtons,\n LightboxZoomControls,\n} from './LightboxControls';\n\nexport interface LightboxOverlayProps {\n testId: (suffix: string) => string;\n itemCount: number;\n currentIndex: number;\n showControls: boolean;\n loop: boolean;\n autoplay: LightboxProps['autoplay'];\n canZoom: boolean;\n isAutoPlaying: boolean;\n onClose: () => void;\n onPrev: () => void;\n onNext: () => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n onToggleAutoplay: () => void;\n}\n\n// Everything that floats above the media: dismiss, step, zoom and slideshow.\nexport const LightboxOverlay: FC<LightboxOverlayProps> = ({\n testId,\n itemCount,\n currentIndex,\n showControls,\n loop,\n autoplay,\n canZoom,\n isAutoPlaying,\n onClose,\n onPrev,\n onNext,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n onToggleAutoplay,\n}) => {\n const hasMultiple = itemCount > 1;\n\n return (\n <>\n <LightboxCloseButton testId={testId} onClose={onClose} />\n\n {showControls && hasMultiple && (\n <LightboxNavButtons\n testId={testId}\n // A non-looping gallery runs out of moves at either end.\n atStart={!loop && currentIndex === 0}\n atEnd={!loop && currentIndex === itemCount - 1}\n onPrev={onPrev}\n onNext={onNext}\n />\n )}\n\n {canZoom && (\n <LightboxZoomControls\n testId={testId}\n onZoomIn={onZoomIn}\n onZoomOut={onZoomOut}\n onResetZoom={onResetZoom}\n />\n )}\n\n {autoplay && hasMultiple && (\n <LightboxAutoplayButton\n testId={testId}\n isAutoPlaying={isAutoPlaying}\n onToggle={onToggleAutoplay}\n />\n )}\n </>\n );\n};\n","import { Box, CircularProgress, DialogContent, Typography } from '@mui/material';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\n\nimport { captionSx, counterSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\ntype TestId = (suffix: string) => string;\n\nexport interface LightboxStageProps {\n items: LightboxItem[];\n currentItem?: LightboxItem;\n currentIndex: number;\n isLoading: boolean;\n showCaptions: boolean;\n thumbnails: boolean;\n testId: TestId;\n media: ReactNode;\n thumbnailStrip: ReactNode;\n}\n\n// The viewport itself: the media, whatever floats over it, and the filmstrip.\nexport const LightboxStage: FC<LightboxStageProps> = ({\n items,\n currentItem,\n currentIndex,\n isLoading,\n showCaptions,\n thumbnails,\n testId,\n media,\n thumbnailStrip,\n}) => (\n <DialogContent\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n position: 'relative',\n height: '100vh',\n overflow: 'hidden',\n }}\n data-testid={testId('content')}\n >\n {isLoading && (\n <CircularProgress\n sx={{ position: 'absolute', color: 'white', zIndex: 999 }}\n data-testid={testId('loading')}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n }}\n data-testid={testId('image-container')}\n >\n {media}\n </Box>\n\n {showCaptions && currentItem?.caption && (\n <Typography\n id=\"lightbox-description\"\n sx={{\n ...captionSx,\n position: 'absolute',\n // Sit above the filmstrip when there is one.\n bottom: thumbnails ? 120 : 16,\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '80vw',\n padding: 2,\n }}\n data-testid={testId('caption')}\n >\n {currentItem.caption}\n </Typography>\n )}\n\n {items.length > 1 && (\n <Typography\n sx={{ ...counterSx, position: 'absolute', top: 70, right: 16, padding: '4px 8px' }}\n aria-live=\"polite\"\n data-testid={testId('counter')}\n >\n {currentIndex + 1} / {items.length}\n </Typography>\n )}\n\n {thumbnailStrip}\n </DialogContent>\n);\n","import PlayIcon from '@mui/icons-material/PlayArrow';\nimport { Box } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { thumbnailStripSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\nconst THUMB_WIDTH = 60;\nconst THUMB_HEIGHT = 40;\n\nconst VideoThumbnail: FC = () => (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n background: 'rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <PlayIcon sx={{ color: 'white', fontSize: 16 }} />\n </Box>\n);\n\nexport interface LightboxThumbnailsProps {\n items: LightboxItem[];\n currentIndex: number;\n testId: (suffix: string) => string;\n onSelect: (index: number) => void;\n}\n\nexport const LightboxThumbnails: FC<LightboxThumbnailsProps> = ({\n items,\n currentIndex,\n testId,\n onSelect,\n}) => (\n <Box\n sx={{\n ...thumbnailStripSx,\n position: 'absolute',\n bottom: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n gap: 1,\n maxWidth: '90vw',\n overflowX: 'auto',\n padding: 1,\n }}\n data-testid={testId('thumbnails')}\n >\n {items.map((item, index) => (\n <Box\n key={`${item.src}-${index}`}\n onClick={() => onSelect(index)}\n sx={{\n width: THUMB_WIDTH,\n height: THUMB_HEIGHT,\n cursor: 'pointer',\n border: currentIndex === index ? '2px solid white' : '2px solid transparent',\n borderRadius: 0.5,\n overflow: 'hidden',\n flexShrink: 0,\n '&:hover': { border: '2px solid rgba(255, 255, 255, 0.7)' },\n }}\n data-testid={testId(`thumbnail-${index}`)}\n >\n {item.type === 'video' ? (\n <VideoThumbnail />\n ) : (\n <img\n src={item.src}\n alt={item.alt || `Thumbnail ${index + 1}`}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n )}\n </Box>\n ))}\n </Box>\n);\n","import { useCallback, useImperativeHandle, useState } from 'react';\nimport type React from 'react';\n\nimport {\n useAutoplay,\n useLightboxKeyboard,\n useNavigation,\n usePreloader,\n useSwipe,\n useWheelZoom,\n useZoomState,\n} from './Lightbox.hooks';\nimport type { ResolvedLightboxProps } from './Lightbox.helpers';\nimport type { LightboxRef } from './Lightbox.types';\n\n// Wires the independent concerns together in dependency order: zoom, then\n// navigation (which resets zoom), then autoplay (which advances), then the\n// input handlers that close.\nexport const useLightbox = (\n { isOpen, onClose, items, startIndex, showControls, loop, autoplay, zoomable }: ResolvedLightboxProps,\n ref: React.ForwardedRef<LightboxRef>,\n) => {\n const [isLoading, setIsLoading] = useState(false);\n\n const preloadImage = usePreloader();\n const zoom = useZoomState();\n\n const { currentIndex, goToIndex, next, prev } = useNavigation({\n items,\n loop,\n startIndex,\n resetZoom: zoom.resetZoom,\n preloadImage,\n });\n\n const currentItem = items[currentIndex];\n const canZoom = Boolean(zoomable && currentItem && currentItem.type !== 'video');\n\n const handleWheel = useWheelZoom({ enabled: canZoom, setZoomLevel: zoom.setZoomLevel });\n\n const { isAutoPlaying, setIsAutoPlaying, stopAutoplay } = useAutoplay({\n isOpen,\n autoplay,\n itemCount: items.length,\n currentIndex,\n next,\n });\n\n const close = useCallback(() => {\n stopAutoplay();\n onClose();\n }, [stopAutoplay, onClose]);\n\n // open() with no argument starts at the first item.\n const open = useCallback((index = 0) => goToIndex(index), [goToIndex]);\n\n useImperativeHandle(ref, () => ({ open, close, next, prev, goTo: goToIndex }));\n\n useLightboxKeyboard({ isOpen, showControls, autoplay, close, prev, next, setIsAutoPlaying });\n\n const { handleTouchStart, handleTouchEnd } = useSwipe({ prev, next, close });\n\n return {\n currentIndex,\n currentItem,\n canZoom,\n isLoading,\n setIsLoading,\n isAutoPlaying,\n setIsAutoPlaying,\n zoom,\n handleWheel,\n goToIndex,\n next,\n prev,\n close,\n handleTouchStart,\n handleTouchEnd,\n };\n};\n","import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n DEFAULT_AUTOPLAY_INTERVAL_MS,\n MAX_ZOOM,\n MIN_SWIPE_DISTANCE,\n MIN_ZOOM,\n WHEEL_ZOOM_FACTOR,\n ZOOM_STEP,\n} from './Lightbox.constants';\nimport type { LightboxItem, LightboxProps } from './Lightbox.types';\n\nconst clampZoom = (zoom: number): number => Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n\n// Items with no explicit type are images.\nconst isImageItem = (item?: LightboxItem): item is LightboxItem =>\n Boolean(item && (item.type === 'image' || !item.type));\n\n// Images are fetched once and remembered, so stepping back to one is instant.\nexport const usePreloader = () => {\n const [preloadedImages, setPreloadedImages] = useState<Set<string>>(new Set());\n\n return useCallback(\n (src: string) => {\n if (preloadedImages.has(src)) return;\n\n const img = new window.Image();\n img.onload = () => setPreloadedImages((prev) => new Set([...prev, src]));\n img.src = src;\n },\n [preloadedImages],\n );\n};\n\nexport interface ZoomState {\n zoomLevel: number;\n panOffset: { x: number; y: number };\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n resetZoom: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n}\n\nexport const useZoomState = (): ZoomState => {\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });\n\n const resetZoom = useCallback(() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, []);\n\n const zoomIn = useCallback(() => setZoomLevel((prev) => Math.min(MAX_ZOOM, prev * ZOOM_STEP)), []);\n const zoomOut = useCallback(\n () => setZoomLevel((prev) => Math.max(MIN_ZOOM, prev / ZOOM_STEP)),\n [],\n );\n\n return { zoomLevel, panOffset, setZoomLevel, resetZoom, zoomIn, zoomOut };\n};\n\nexport const useWheelZoom = ({\n enabled,\n setZoomLevel,\n}: {\n enabled: boolean;\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n}) =>\n useCallback(\n (event: React.WheelEvent) => {\n if (!enabled) return;\n\n event.preventDefault();\n // Scrolling up (negative deltaY) zooms in.\n setZoomLevel((prev) => clampZoom(prev + event.deltaY * -WHEEL_ZOOM_FACTOR));\n },\n [enabled, setZoomLevel],\n );\n\nexport const useNavigation = ({\n items,\n loop,\n startIndex,\n resetZoom,\n preloadImage,\n}: {\n items: LightboxItem[];\n loop: boolean;\n startIndex: number;\n resetZoom: () => void;\n preloadImage: (src: string) => void;\n}) => {\n const [currentIndex, setCurrentIndex] = useState(\n Math.max(0, Math.min(startIndex, items.length - 1)),\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n if (items.length === 0) return;\n\n // Looping wraps both ways; otherwise the index sticks at the ends.\n const newIndex = loop\n ? ((index % items.length) + items.length) % items.length\n : Math.max(0, Math.min(index, items.length - 1));\n\n setCurrentIndex(newIndex);\n resetZoom();\n\n // Fetch the neighbours so a step in either direction shows immediately.\n [items[newIndex - 1], items[newIndex + 1]]\n .filter(isImageItem)\n .forEach((item) => preloadImage(item.src));\n },\n [items, loop, resetZoom, preloadImage],\n );\n\n const next = useCallback(() => {\n if (currentIndex < items.length - 1 || loop) goToIndex(currentIndex + 1);\n }, [currentIndex, items.length, loop, goToIndex]);\n\n const prev = useCallback(() => {\n if (currentIndex > 0 || loop) goToIndex(currentIndex - 1);\n }, [currentIndex, loop, goToIndex]);\n\n return { currentIndex, goToIndex, next, prev };\n};\n\nexport const useAutoplay = ({\n isOpen,\n autoplay,\n itemCount,\n currentIndex,\n next,\n}: {\n isOpen: boolean;\n autoplay: LightboxProps['autoplay'];\n itemCount: number;\n currentIndex: number;\n next: () => void;\n}) => {\n const [isAutoPlaying, setIsAutoPlaying] = useState(false);\n const timerRef = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (!isAutoPlaying || !autoplay || itemCount <= 1) return;\n\n const interval =\n typeof autoplay === 'object'\n ? autoplay.interval || DEFAULT_AUTOPLAY_INTERVAL_MS\n : DEFAULT_AUTOPLAY_INTERVAL_MS;\n\n timerRef.current = window.setTimeout(next, interval);\n\n return () => window.clearTimeout(timerRef.current);\n }, [isAutoPlaying, autoplay, currentIndex, next, itemCount]);\n\n // Opening a gallery with more than one item starts the slideshow.\n useEffect(() => {\n setIsAutoPlaying(Boolean(isOpen && autoplay && itemCount > 1));\n }, [isOpen, autoplay, itemCount]);\n\n const stopAutoplay = useCallback(() => {\n setIsAutoPlaying(false);\n window.clearTimeout(timerRef.current);\n }, []);\n\n return { isAutoPlaying, setIsAutoPlaying, stopAutoplay };\n};\n\nexport const useLightboxKeyboard = ({\n isOpen,\n showControls,\n autoplay,\n close,\n prev,\n next,\n setIsAutoPlaying,\n}: {\n isOpen: boolean;\n showControls: boolean;\n autoplay: LightboxProps['autoplay'];\n close: () => void;\n prev: () => void;\n next: () => void;\n setIsAutoPlaying: React.Dispatch<React.SetStateAction<boolean>>;\n}) => {\n useEffect(() => {\n if (!isOpen) return;\n\n const arrows: Record<string, () => void> = { ArrowLeft: prev, ArrowRight: next };\n\n const handleKeyDown = (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Escape') {\n close();\n return;\n }\n\n const arrow = arrows[event.key];\n if (arrow && showControls) {\n event.preventDefault();\n arrow();\n return;\n }\n\n if (event.key === ' ') {\n event.preventDefault();\n if (autoplay) setIsAutoPlaying((playing) => !playing);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, showControls, close, prev, next, autoplay, setIsAutoPlaying]);\n};\n\n// Horizontal swipes step through the gallery; a downward swipe dismisses it.\nexport const useSwipe = ({\n prev,\n next,\n close,\n}: {\n prev: () => void;\n next: () => void;\n close: () => void;\n}) => {\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n\n const handleTouchStart = useCallback((event: React.TouchEvent) => {\n const touch = event.touches.length === 1 ? event.touches[0] : undefined;\n if (touch) touchStartRef.current = { x: touch.clientX, y: touch.clientY };\n }, []);\n\n const handleTouchEnd = useCallback(\n (event: React.TouchEvent) => {\n const start = touchStartRef.current;\n const touch = event.changedTouches[0];\n touchStartRef.current = null;\n if (!start || !touch) return;\n\n const deltaX = touch.clientX - start.x;\n const deltaY = touch.clientY - start.y;\n\n // Whichever axis moved further decides what the gesture meant.\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n if (Math.abs(deltaX) > MIN_SWIPE_DISTANCE) {\n if (deltaX > 0) prev();\n else next();\n }\n return;\n }\n\n if (deltaY > MIN_SWIPE_DISTANCE) close();\n },\n [prev, next, close],\n );\n\n return { handleTouchStart, handleTouchEnd };\n};\n"],"mappings":"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","names":["Typography","jsx","jsx","jsx","Fragment","jsx","jsxs","Box","jsx","jsxs","Box","PlayIcon","Box","jsx","Box","PlayIcon","useCallback","useState","useState","useCallback","jsx","jsxs","Typography"]}
@@ -83,6 +83,7 @@ var ControlButton = styled(IconButton)(({ theme }) => ({
83
83
  }
84
84
  }));
85
85
  var MapControlBar = ({
86
+ copy,
86
87
  zoom,
87
88
  mapType,
88
89
  onZoomIn,
@@ -91,34 +92,34 @@ var MapControlBar = ({
91
92
  onToggleMapType,
92
93
  onToggleFullscreen
93
94
  }) => /* @__PURE__ */ jsxs(MapControls, { "data-testid": "map-controls", children: [
94
- /* @__PURE__ */ jsx(Tooltip, { title: "Zoom in", placement: "left", children: /* @__PURE__ */ jsx(
95
+ /* @__PURE__ */ jsx(Tooltip, { title: copy.zoomIn, placement: "left", children: /* @__PURE__ */ jsx(
95
96
  ControlButton,
96
97
  {
97
98
  size: "small",
98
99
  onClick: onZoomIn,
99
- "aria-label": "Zoom in",
100
+ "aria-label": copy.zoomIn,
100
101
  "data-testid": "zoom-in-button",
101
102
  disabled: zoom >= MAX_ZOOM,
102
103
  children: /* @__PURE__ */ jsx(ZoomInIcon, { fontSize: "small" })
103
104
  }
104
105
  ) }),
105
- /* @__PURE__ */ jsx(Tooltip, { title: "Zoom out", placement: "left", children: /* @__PURE__ */ jsx(
106
+ /* @__PURE__ */ jsx(Tooltip, { title: copy.zoomOut, placement: "left", children: /* @__PURE__ */ jsx(
106
107
  ControlButton,
107
108
  {
108
109
  size: "small",
109
110
  onClick: onZoomOut,
110
- "aria-label": "Zoom out",
111
+ "aria-label": copy.zoomOut,
111
112
  "data-testid": "zoom-out-button",
112
113
  disabled: zoom <= MIN_ZOOM,
113
114
  children: /* @__PURE__ */ jsx(ZoomOutIcon, { fontSize: "small" })
114
115
  }
115
116
  ) }),
116
- /* @__PURE__ */ jsx(Tooltip, { title: "Center map", placement: "left", children: /* @__PURE__ */ jsx(
117
+ /* @__PURE__ */ jsx(Tooltip, { title: copy.center, placement: "left", children: /* @__PURE__ */ jsx(
117
118
  ControlButton,
118
119
  {
119
120
  size: "small",
120
121
  onClick: onCenter,
121
- "aria-label": "Center map",
122
+ "aria-label": copy.center,
122
123
  "data-testid": "center-button",
123
124
  children: /* @__PURE__ */ jsx(CenterIcon, { fontSize: "small" })
124
125
  }
@@ -128,17 +129,17 @@ var MapControlBar = ({
128
129
  {
129
130
  size: "small",
130
131
  onClick: onToggleMapType,
131
- "aria-label": "Change map type",
132
+ "aria-label": copy.mapType,
132
133
  "data-testid": "map-type-button",
133
134
  children: /* @__PURE__ */ jsx(LayersIcon, { fontSize: "small" })
134
135
  }
135
136
  ) }),
136
- /* @__PURE__ */ jsx(Tooltip, { title: "Toggle fullscreen", placement: "left", children: /* @__PURE__ */ jsx(
137
+ /* @__PURE__ */ jsx(Tooltip, { title: copy.fullscreen, placement: "left", children: /* @__PURE__ */ jsx(
137
138
  ControlButton,
138
139
  {
139
140
  size: "small",
140
141
  onClick: onToggleFullscreen,
141
- "aria-label": "Toggle fullscreen",
142
+ "aria-label": copy.fullscreen,
142
143
  "data-testid": "fullscreen-button",
143
144
  children: /* @__PURE__ */ jsx(FullscreenIcon, { fontSize: "small" })
144
145
  }
@@ -216,6 +217,7 @@ var SearchField = styled2(TextField)(({ theme }) => ({
216
217
  }
217
218
  }));
218
219
  var MapSearchBar = ({
220
+ label,
219
221
  value,
220
222
  placeholder,
221
223
  isSearching,
@@ -234,7 +236,7 @@ var MapSearchBar = ({
234
236
  startAdornment: /* @__PURE__ */ jsx3(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx3(SearchIcon, { fontSize: "small", sx: { opacity: isSearching ? 0.5 : 1 } }) })
235
237
  },
236
238
  disabled: isSearching,
237
- "aria-label": "Search location"
239
+ "aria-label": label
238
240
  }
239
241
  ) });
240
242
 
@@ -255,6 +257,7 @@ var MapLayers = ({ settings, zoom, mapType, search, controls }) => {
255
257
  settings.showSearch && /* @__PURE__ */ jsx4(
256
258
  MapSearchBar,
257
259
  {
260
+ label: settings.copy.search,
258
261
  value: search.searchValue,
259
262
  placeholder: settings.searchPlaceholder,
260
263
  isSearching: search.isSearching,
@@ -265,6 +268,7 @@ var MapLayers = ({ settings, zoom, mapType, search, controls }) => {
265
268
  settings.showControls && /* @__PURE__ */ jsx4(
266
269
  MapControlBar,
267
270
  {
271
+ copy: settings.copy,
268
272
  zoom,
269
273
  mapType,
270
274
  onZoomIn: controls.handleZoomIn,