@lumx/react 3.10.1-alpha.2 → 3.10.1-alpha.4

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 (334) hide show
  1. package/_internal/{8d67e1e3.d.ts → index.d.ts} +1 -1
  2. package/_internal/index.js +99 -0
  3. package/_internal/index.js.map +1 -0
  4. package/index.d.ts +3000 -66
  5. package/index.js +14561 -64
  6. package/index.js.map +1 -1
  7. package/package.json +3 -3
  8. package/src/components/button/Button.tsx +4 -5
  9. package/src/components/button/ButtonRoot.tsx +1 -3
  10. package/src/components/chip/Chip.tsx +7 -11
  11. package/src/components/date-picker/DatePickerControlled.tsx +1 -1
  12. package/src/components/dialog/Dialog.tsx +1 -1
  13. package/src/components/expansion-panel/ExpansionPanel.test.tsx +2 -2
  14. package/src/components/expansion-panel/ExpansionPanel.tsx +14 -18
  15. package/src/components/flex-box/FlexBox.tsx +1 -1
  16. package/src/components/generic-block/GenericBlock.tsx +6 -7
  17. package/src/components/generic-block/constants.ts +9 -4
  18. package/src/components/grid-column/GridColumn.tsx +1 -2
  19. package/src/components/image-lightbox/internal/ImageSlide.tsx +2 -2
  20. package/src/components/image-lightbox/internal/ImageSlideshow.tsx +4 -8
  21. package/src/components/image-lightbox/useImageLightbox.tsx +3 -4
  22. package/src/components/link/Link.tsx +3 -5
  23. package/src/components/list/ListItem.tsx +2 -3
  24. package/src/components/list/useInteractiveList.tsx +1 -2
  25. package/src/components/mosaic/Mosaic.test.tsx +3 -3
  26. package/src/components/mosaic/Mosaic.tsx +2 -3
  27. package/src/components/navigation/Navigation.tsx +42 -37
  28. package/src/components/navigation/NavigationSection.tsx +76 -79
  29. package/src/components/notification/Notification.tsx +1 -5
  30. package/src/components/popover/usePopoverStyle.tsx +3 -1
  31. package/src/components/popover/useRestoreFocusOnClose.tsx +1 -1
  32. package/src/components/popover-dialog/PopoverDialog.test.tsx +1 -1
  33. package/src/components/post-block/PostBlock.tsx +4 -8
  34. package/src/components/progress-tracker/ProgressTracker.stories.tsx +11 -11
  35. package/src/components/select/Select.stories.tsx +14 -5
  36. package/src/components/select/Select.test.tsx +2 -2
  37. package/src/components/select/Select.tsx +1 -2
  38. package/src/components/select/SelectMultiple.stories.tsx +12 -10
  39. package/src/components/side-navigation/SideNavigationItem.tsx +1 -1
  40. package/src/components/slideshow/Slides.tsx +1 -1
  41. package/src/components/slideshow/SlideshowControls.tsx +1 -1
  42. package/src/components/slideshow/useSlideFocusManagement.tsx +1 -1
  43. package/src/components/switch/Switch.tsx +1 -2
  44. package/src/components/tabs/Tabs.stories.tsx +3 -4
  45. package/src/components/text-field/TextField.test.tsx +4 -4
  46. package/src/components/text-field/TextField.tsx +2 -3
  47. package/src/components/tooltip/Tooltip.test.tsx +2 -2
  48. package/src/components/tooltip/useTooltipOpen.tsx +3 -3
  49. package/src/components/user-block/UserBlock.tsx +7 -9
  50. package/src/hooks/useCallbackOnEscape.ts +1 -1
  51. package/src/hooks/useClickAway.tsx +1 -2
  52. package/src/hooks/useFocusTrap.ts +1 -1
  53. package/src/hooks/useInterval.tsx +1 -4
  54. package/src/hooks/useKeyboardListNavigation.tsx +2 -4
  55. package/src/hooks/useSizeOnWindowResize.ts +14 -10
  56. package/src/hooks/useStopPropagation.ts +1 -2
  57. package/src/hooks/useTransitionVisibility.ts +2 -2
  58. package/src/stories/decorators/withCombinations.tsx +1 -1
  59. package/src/testing/utils/commonTestsSuiteRTL.tsx +2 -2
  60. package/src/utils/{DOM → browser/DOM}/startViewTransition.ts +3 -3
  61. package/src/utils/{focus → browser/focus}/getFirstAndLastFocusable.test.ts +1 -1
  62. package/src/utils/{focus → browser/focus}/getFocusableElements.test.ts +1 -1
  63. package/src/utils/{browserDoesNotSupportHover.test.js → browser/isHoverNotSupported.test.js} +5 -5
  64. package/src/utils/browser/isHoverNotSupported.ts +2 -0
  65. package/src/utils/browser/{getPrefersReducedMotion.ts → isReducedMotion.ts} +1 -1
  66. package/src/utils/className/getFontColorClassName.ts +9 -0
  67. package/src/utils/{className.ts → className/getRootClassName.ts} +1 -21
  68. package/src/utils/className/getTypographyClassName.ts +9 -0
  69. package/src/utils/className/index.ts +4 -0
  70. package/src/utils/collection/castArray.test.ts +15 -0
  71. package/src/utils/collection/castArray.ts +3 -0
  72. package/src/utils/collection/chunk.test.ts +15 -0
  73. package/src/utils/collection/chunk.ts +6 -0
  74. package/src/utils/collection/isEmpty.test.js +20 -0
  75. package/src/utils/collection/isEmpty.ts +4 -0
  76. package/src/utils/collection/last.ts +2 -0
  77. package/src/utils/collection/partitionMulti.test.ts +35 -0
  78. package/src/utils/{partitionMulti.ts → collection/partitionMulti.ts} +13 -12
  79. package/src/utils/collection/pull.test.ts +17 -0
  80. package/src/utils/collection/pull.ts +7 -0
  81. package/src/utils/collection/range.test.js +9 -0
  82. package/src/utils/collection/range.ts +2 -0
  83. package/src/utils/date/getMonthCalendar.ts +3 -4
  84. package/src/utils/flattenChildren.ts +2 -3
  85. package/src/utils/function/memoize.test.ts +36 -0
  86. package/src/utils/function/memoize.ts +13 -0
  87. package/src/utils/makeListenerTowerContext.ts +2 -2
  88. package/src/utils/partitionMulti.test.ts +27 -0
  89. package/src/utils/react/forwardRef.ts +3 -2
  90. package/src/utils/react/forwardRefPolymorphic.ts +1 -2
  91. package/utils/index.d.ts +1 -1
  92. package/utils/index.js +1 -96
  93. package/utils/index.js.map +1 -1
  94. package/_internal/17c3ea1d.js +0 -137
  95. package/_internal/17c3ea1d.js.map +0 -1
  96. package/_internal/1da25128.js +0 -411
  97. package/_internal/1da25128.js.map +0 -1
  98. package/_internal/230173a8.js +0 -13
  99. package/_internal/230173a8.js.map +0 -1
  100. package/_internal/23bdba2d.js +0 -71
  101. package/_internal/23bdba2d.js.map +0 -1
  102. package/_internal/26926e5c.d.ts +0 -36
  103. package/_internal/2a3d237c.js +0 -12
  104. package/_internal/2a3d237c.js.map +0 -1
  105. package/_internal/2c5dbb03.js +0 -26
  106. package/_internal/2c5dbb03.js.map +0 -1
  107. package/_internal/2e2abe51.js +0 -2154
  108. package/_internal/2e2abe51.js.map +0 -1
  109. package/_internal/31490c59.d.ts +0 -167
  110. package/_internal/3181f000.js +0 -14
  111. package/_internal/3181f000.js.map +0 -1
  112. package/_internal/35f100be.d.ts +0 -104
  113. package/_internal/36bd7352.js +0 -219
  114. package/_internal/36bd7352.js.map +0 -1
  115. package/_internal/3a1facc0.js +0 -18
  116. package/_internal/3a1facc0.js.map +0 -1
  117. package/_internal/4c20d932.js +0 -89
  118. package/_internal/4c20d932.js.map +0 -1
  119. package/_internal/4c28d012.js +0 -305
  120. package/_internal/4c28d012.js.map +0 -1
  121. package/_internal/4cd0bf32.js +0 -160
  122. package/_internal/4cd0bf32.js.map +0 -1
  123. package/_internal/4daccdd5.js +0 -25
  124. package/_internal/4daccdd5.js.map +0 -1
  125. package/_internal/524b1d04.js +0 -64
  126. package/_internal/524b1d04.js.map +0 -1
  127. package/_internal/53c94227.js +0 -123
  128. package/_internal/53c94227.js.map +0 -1
  129. package/_internal/54d9ded5.js +0 -418
  130. package/_internal/54d9ded5.js.map +0 -1
  131. package/_internal/56aec41b.js +0 -652
  132. package/_internal/56aec41b.js.map +0 -1
  133. package/_internal/5720caf5.js +0 -124
  134. package/_internal/5720caf5.js.map +0 -1
  135. package/_internal/646f0db6.js +0 -113
  136. package/_internal/646f0db6.js.map +0 -1
  137. package/_internal/6cc8dca8.d.ts +0 -22
  138. package/_internal/7f022f8c.d.ts +0 -34
  139. package/_internal/b8f2948d.js +0 -691
  140. package/_internal/b8f2948d.js.map +0 -1
  141. package/_internal/bc28d510.js +0 -784
  142. package/_internal/bc28d510.js.map +0 -1
  143. package/_internal/c68d24e4.js +0 -145
  144. package/_internal/c68d24e4.js.map +0 -1
  145. package/_internal/c6c99f76.js +0 -105
  146. package/_internal/c6c99f76.js.map +0 -1
  147. package/_internal/cae46566.js +0 -65
  148. package/_internal/cae46566.js.map +0 -1
  149. package/_internal/components/alert-dialog/index.ts-623b1ed3.d.ts +0 -37
  150. package/_internal/components/alert-dialog/index.ts-f83bd6ef.js +0 -148
  151. package/_internal/components/alert-dialog/index.ts-f83bd6ef.js.map +0 -1
  152. package/_internal/components/autocomplete/index.ts-3f8f125c.js +0 -264
  153. package/_internal/components/autocomplete/index.ts-3f8f125c.js.map +0 -1
  154. package/_internal/components/autocomplete/index.ts-8d6b123f.d.ts +0 -201
  155. package/_internal/components/avatar/index.ts-93ee0ea9.js +0 -89
  156. package/_internal/components/avatar/index.ts-93ee0ea9.js.map +0 -1
  157. package/_internal/components/avatar/index.ts-f92852b4.d.ts +0 -43
  158. package/_internal/components/badge/index.ts-2d7700ef.d.ts +0 -30
  159. package/_internal/components/badge/index.ts-6753d67f.js +0 -88
  160. package/_internal/components/badge/index.ts-6753d67f.js.map +0 -1
  161. package/_internal/components/button/index.ts-031307ce.js +0 -51
  162. package/_internal/components/button/index.ts-031307ce.js.map +0 -1
  163. package/_internal/components/button/index.ts-b29e26a4.d.ts +0 -22
  164. package/_internal/components/checkbox/index.ts-a33166d7.js +0 -127
  165. package/_internal/components/checkbox/index.ts-a33166d7.js.map +0 -1
  166. package/_internal/components/checkbox/index.ts-f82358ff.d.ts +0 -38
  167. package/_internal/components/chip/index.ts-4a91f1a7.d.ts +0 -68
  168. package/_internal/components/chip/index.ts-a2b5b771.js +0 -110
  169. package/_internal/components/chip/index.ts-a2b5b771.js.map +0 -1
  170. package/_internal/components/comment-block/index.ts-58fa051a.js +0 -121
  171. package/_internal/components/comment-block/index.ts-58fa051a.js.map +0 -1
  172. package/_internal/components/comment-block/index.ts-8cfa5af0.d.ts +0 -67
  173. package/_internal/components/date-picker/index.ts-145262d5.js +0 -2
  174. package/_internal/components/date-picker/index.ts-145262d5.js.map +0 -1
  175. package/_internal/components/date-picker/index.ts-70a34fa7.d.ts +0 -95
  176. package/_internal/components/dialog/index.ts-ea044db2.js +0 -224
  177. package/_internal/components/dialog/index.ts-ea044db2.js.map +0 -1
  178. package/_internal/components/dialog/index.ts-eca28654.d.ts +0 -55
  179. package/_internal/components/divider/index.ts-4a56db75.js +0 -55
  180. package/_internal/components/divider/index.ts-4a56db75.js.map +0 -1
  181. package/_internal/components/divider/index.ts-b011d8ca.d.ts +0 -18
  182. package/_internal/components/drag-handle/index.ts-0aebf92f.js +0 -54
  183. package/_internal/components/drag-handle/index.ts-0aebf92f.js.map +0 -1
  184. package/_internal/components/drag-handle/index.ts-3ab31dd1.d.ts +0 -18
  185. package/_internal/components/dropdown/index.ts-2a17db51.js +0 -154
  186. package/_internal/components/dropdown/index.ts-2a17db51.js.map +0 -1
  187. package/_internal/components/dropdown/index.ts-b648a15c.d.ts +0 -87
  188. package/_internal/components/expansion-panel/index.ts-69f09f5b.d.ts +0 -38
  189. package/_internal/components/expansion-panel/index.ts-fae3762e.js +0 -143
  190. package/_internal/components/expansion-panel/index.ts-fae3762e.js.map +0 -1
  191. package/_internal/components/flag/index.ts-8dcd685b.js +0 -56
  192. package/_internal/components/flag/index.ts-8dcd685b.js.map +0 -1
  193. package/_internal/components/flag/index.ts-fda89adb.d.ts +0 -23
  194. package/_internal/components/flex-box/index.ts-87f2b58d.d.ts +0 -43
  195. package/_internal/components/flex-box/index.ts-c216e957.js +0 -60
  196. package/_internal/components/flex-box/index.ts-c216e957.js.map +0 -1
  197. package/_internal/components/generic-block/index.ts-999a62a4.js +0 -115
  198. package/_internal/components/generic-block/index.ts-999a62a4.js.map +0 -1
  199. package/_internal/components/generic-block/index.ts-cd3b0e21.d.ts +0 -106
  200. package/_internal/components/grid/index.ts-67e0694f.d.ts +0 -50
  201. package/_internal/components/grid/index.ts-fdf1b306.js +0 -113
  202. package/_internal/components/grid/index.ts-fdf1b306.js.map +0 -1
  203. package/_internal/components/grid-column/index.ts-97c61cbe.js +0 -64
  204. package/_internal/components/grid-column/index.ts-97c61cbe.js.map +0 -1
  205. package/_internal/components/grid-column/index.ts-c89e1c18.d.ts +0 -31
  206. package/_internal/components/heading/index.ts-0179e9a9.js +0 -112
  207. package/_internal/components/heading/index.ts-0179e9a9.js.map +0 -1
  208. package/_internal/components/heading/index.ts-587579e8.d.ts +0 -37
  209. package/_internal/components/icon/index.ts-740ca1de.js +0 -2
  210. package/_internal/components/icon/index.ts-740ca1de.js.map +0 -1
  211. package/_internal/components/icon/index.ts-b3fa5e15.d.ts +0 -34
  212. package/_internal/components/image-block/index.ts-36b3828f.d.ts +0 -49
  213. package/_internal/components/image-block/index.ts-ef5e2e7d.js +0 -111
  214. package/_internal/components/image-block/index.ts-ef5e2e7d.js.map +0 -1
  215. package/_internal/components/image-lightbox/index.ts-137f85a8.js +0 -765
  216. package/_internal/components/image-lightbox/index.ts-137f85a8.js.map +0 -1
  217. package/_internal/components/image-lightbox/index.ts-2cb92d18.d.ts +0 -75
  218. package/_internal/components/inline-list/index.ts-033dd358.js +0 -76
  219. package/_internal/components/inline-list/index.ts-033dd358.js.map +0 -1
  220. package/_internal/components/inline-list/index.ts-e1c8a3ff.d.ts +0 -34
  221. package/_internal/components/input-helper/index.ts-32a9ca90.d.ts +0 -22
  222. package/_internal/components/input-helper/index.ts-ab3a1ef5.js +0 -75
  223. package/_internal/components/input-helper/index.ts-ab3a1ef5.js.map +0 -1
  224. package/_internal/components/input-label/index.ts-86f2ea41.d.ts +0 -24
  225. package/_internal/components/input-label/index.ts-d6ca5569.js +0 -60
  226. package/_internal/components/input-label/index.ts-d6ca5569.js.map +0 -1
  227. package/_internal/components/lightbox/index.ts-5370e8e6.d.ts +0 -36
  228. package/_internal/components/lightbox/index.ts-7a16cdc7.js +0 -149
  229. package/_internal/components/lightbox/index.ts-7a16cdc7.js.map +0 -1
  230. package/_internal/components/link/index.ts-26435006.d.ts +0 -37
  231. package/_internal/components/link/index.ts-d04f4e53.js +0 -120
  232. package/_internal/components/link/index.ts-d04f4e53.js.map +0 -1
  233. package/_internal/components/link-preview/index.ts-e560a274.d.ts +0 -36
  234. package/_internal/components/link-preview/index.ts-fee89f66.js +0 -109
  235. package/_internal/components/link-preview/index.ts-fee89f66.js.map +0 -1
  236. package/_internal/components/list/index.ts-ab57902e.d.ts +0 -118
  237. package/_internal/components/list/index.ts-f3101625.js +0 -86
  238. package/_internal/components/list/index.ts-f3101625.js.map +0 -1
  239. package/_internal/components/message/index.ts-041cf0cb.js +0 -97
  240. package/_internal/components/message/index.ts-041cf0cb.js.map +0 -1
  241. package/_internal/components/message/index.ts-2d38e0ea.d.ts +0 -37
  242. package/_internal/components/mosaic/index.ts-232d5aed.d.ts +0 -23
  243. package/_internal/components/mosaic/index.ts-d2128cd3.js +0 -94
  244. package/_internal/components/mosaic/index.ts-d2128cd3.js.map +0 -1
  245. package/_internal/components/navigation/index.ts-6d8bea53.d.ts +0 -58
  246. package/_internal/components/navigation/index.ts-e8dc0a7f.js +0 -222
  247. package/_internal/components/navigation/index.ts-e8dc0a7f.js.map +0 -1
  248. package/_internal/components/notification/index.ts-235fd340.js +0 -140
  249. package/_internal/components/notification/index.ts-235fd340.js.map +0 -1
  250. package/_internal/components/notification/index.ts-bb3f03f6.d.ts +0 -34
  251. package/_internal/components/popover/index.ts-2f17a9b6.js +0 -3
  252. package/_internal/components/popover/index.ts-2f17a9b6.js.map +0 -1
  253. package/_internal/components/popover/index.ts-e3b4ff19.d.ts +0 -66
  254. package/_internal/components/post-block/index.ts-0acb9bb4.js +0 -101
  255. package/_internal/components/post-block/index.ts-0acb9bb4.js.map +0 -1
  256. package/_internal/components/post-block/index.ts-9b8ff90b.d.ts +0 -41
  257. package/_internal/components/progress/index.ts-2a713859.js +0 -189
  258. package/_internal/components/progress/index.ts-2a713859.js.map +0 -1
  259. package/_internal/components/progress/index.ts-dfdfa5fb.d.ts +0 -60
  260. package/_internal/components/progress-tracker/index.ts-2649f756.js +0 -312
  261. package/_internal/components/progress-tracker/index.ts-2649f756.js.map +0 -1
  262. package/_internal/components/progress-tracker/index.ts-95320f32.d.ts +0 -101
  263. package/_internal/components/radio-button/index.ts-5eaab4cf.d.ts +0 -54
  264. package/_internal/components/radio-button/index.ts-b4dfb2a0.js +0 -150
  265. package/_internal/components/radio-button/index.ts-b4dfb2a0.js.map +0 -1
  266. package/_internal/components/select/index.ts-a65e3507.d.ts +0 -91
  267. package/_internal/components/select/index.ts-e8fad28b.js +0 -257
  268. package/_internal/components/select/index.ts-e8fad28b.js.map +0 -1
  269. package/_internal/components/side-navigation/index.ts-3f5f3785.d.ts +0 -60
  270. package/_internal/components/side-navigation/index.ts-c9a5fc3e.js +0 -184
  271. package/_internal/components/side-navigation/index.ts-c9a5fc3e.js.map +0 -1
  272. package/_internal/components/skeleton/index.ts-a7daefac.d.ts +0 -75
  273. package/_internal/components/skeleton/index.ts-ffc995af.js +0 -179
  274. package/_internal/components/skeleton/index.ts-ffc995af.js.map +0 -1
  275. package/_internal/components/slider/index.ts-24a0d598.d.ts +0 -52
  276. package/_internal/components/slider/index.ts-72aadf4c.js +0 -308
  277. package/_internal/components/slider/index.ts-72aadf4c.js.map +0 -1
  278. package/_internal/components/slideshow/index.ts-c99f2892.js +0 -151
  279. package/_internal/components/slideshow/index.ts-c99f2892.js.map +0 -1
  280. package/_internal/components/slideshow/index.ts-e49462c6.d.ts +0 -25
  281. package/_internal/components/switch/index.ts-207ba52b.d.ts +0 -34
  282. package/_internal/components/switch/index.ts-542e6eaf.js +0 -115
  283. package/_internal/components/switch/index.ts-542e6eaf.js.map +0 -1
  284. package/_internal/components/table/index.ts-905ce390.js +0 -310
  285. package/_internal/components/table/index.ts-905ce390.js.map +0 -1
  286. package/_internal/components/table/index.ts-c4f39b2d.d.ts +0 -108
  287. package/_internal/components/tabs/index.ts-713119f4.js +0 -289
  288. package/_internal/components/tabs/index.ts-713119f4.js.map +0 -1
  289. package/_internal/components/tabs/index.ts-dbfc48d9.d.ts +0 -106
  290. package/_internal/components/text/index.ts-6afbe8cd.js +0 -2
  291. package/_internal/components/text/index.ts-6afbe8cd.js.map +0 -1
  292. package/_internal/components/text/index.ts-8a812048.d.ts +0 -53
  293. package/_internal/components/text-field/index.ts-92e6b3b3.d.ts +0 -77
  294. package/_internal/components/text-field/index.ts-c3be8563.js +0 -341
  295. package/_internal/components/text-field/index.ts-c3be8563.js.map +0 -1
  296. package/_internal/components/thumbnail/index.ts-16d7b403.js +0 -40
  297. package/_internal/components/thumbnail/index.ts-16d7b403.js.map +0 -1
  298. package/_internal/components/thumbnail/index.ts-1b6c0b48.d.ts +0 -8
  299. package/_internal/components/toolbar/index.ts-813b902e.js +0 -63
  300. package/_internal/components/toolbar/index.ts-813b902e.js.map +0 -1
  301. package/_internal/components/toolbar/index.ts-9f5129d1.d.ts +0 -24
  302. package/_internal/components/tooltip/index.ts-905c847c.js +0 -322
  303. package/_internal/components/tooltip/index.ts-905c847c.js.map +0 -1
  304. package/_internal/components/tooltip/index.ts-c6931e9e.d.ts +0 -35
  305. package/_internal/components/uploader/index.ts-31f21c2a.js +0 -132
  306. package/_internal/components/uploader/index.ts-31f21c2a.js.map +0 -1
  307. package/_internal/components/uploader/index.ts-c3ccba98.d.ts +0 -51
  308. package/_internal/components/user-block/index.ts-18c58e19.d.ts +0 -50
  309. package/_internal/components/user-block/index.ts-d43e5f3c.js +0 -136
  310. package/_internal/components/user-block/index.ts-d43e5f3c.js.map +0 -1
  311. package/_internal/dc3e28c8.d.ts +0 -38
  312. package/_internal/f39a1ba4.js +0 -73
  313. package/_internal/f39a1ba4.js.map +0 -1
  314. package/_internal/f3e77e3e.js +0 -22
  315. package/_internal/f3e77e3e.js.map +0 -1
  316. package/_internal/f502ab30.js +0 -78
  317. package/_internal/f502ab30.js.map +0 -1
  318. package/_internal/f52adbae.js +0 -36
  319. package/_internal/f52adbae.js.map +0 -1
  320. package/_internal/f57e1239.js +0 -205
  321. package/_internal/f57e1239.js.map +0 -1
  322. package/_internal/f5ff1aa4.d.ts +0 -47
  323. package/_internal/fb975afe.js +0 -52
  324. package/_internal/fb975afe.js.map +0 -1
  325. package/src/utils/browserDoesNotSupportHover.ts +0 -2
  326. package/src/utils/isInternetExplorer.ts +0 -15
  327. package/src/utils/userHasReducedMotion.ts +0 -7
  328. package/src/utils/utils.test.ts +0 -48
  329. /package/src/utils/{DOM → browser/DOM}/findImage.tsx +0 -0
  330. /package/src/utils/{event.ts → browser/event.ts} +0 -0
  331. /package/src/utils/{focus → browser/focus}/constants.ts +0 -0
  332. /package/src/utils/{focus → browser/focus}/getFirstAndLastFocusable.ts +0 -0
  333. /package/src/utils/{focus → browser/focus}/getFocusableElements.ts +0 -0
  334. /package/src/utils/{isFocusVisible.ts → browser/isFocusVisible.ts} +0 -0
@@ -1,765 +0,0 @@
1
- import { h as getRootClassName, m as WINDOW, k as _objectSpread2, _ as _extends, j as _objectWithoutProperties, i as forwardRef, g as classNames } from '../../1da25128.js';
2
- import React__default from 'react';
3
- import { u as useMergeRefs, m as mergeRefs } from '../../f52adbae.js';
4
- import memoize from 'lodash/memoize';
5
- import { I as ImageCaption } from '../../524b1d04.js';
6
- import throttle from 'lodash/throttle';
7
- import { S as SlideshowItem, a as SlideshowControls, b as Slides } from '../../b8f2948d.js';
8
- import { T as Thumbnail } from '../../4c28d012.js';
9
- import { p as mdiMagnifyPlusOutline, q as mdiMagnifyMinusOutline } from '../../c6c99f76.js';
10
- import { I as IconButton } from '../../23bdba2d.js';
11
- import { FlexBox } from '../flex-box/index.ts-c216e957.js';
12
- import ReactDOM from 'react-dom';
13
- import { Lightbox } from '../lightbox/index.ts-7a16cdc7.js';
14
- import { ClickAwayProvider } from '../../../utils/index.js';
15
-
16
- /**
17
- * Component display name.
18
- */
19
- const COMPONENT_NAME = 'ImageLightbox';
20
-
21
- /**
22
- * Component default class name and class prefix.
23
- */
24
- const CLASSNAME = getRootClassName(COMPONENT_NAME);
25
-
26
- /**
27
- * Observe element size (only works if it's size depends on the window size).
28
- *
29
- * (Not using ResizeObserver for better browser backward compat)
30
- *
31
- * @param elementRef Element to observe
32
- * @return the size and a manual update callback
33
- */
34
- function useSizeOnWindowResize(elementRef) {
35
- const [size, setSize] = React__default.useState(null);
36
- const updateSize = React__default.useMemo(() => throttle(() => {
37
- var _elementRef$current;
38
- const newSize = (_elementRef$current = elementRef.current) === null || _elementRef$current === void 0 ? void 0 : _elementRef$current.getBoundingClientRect();
39
- if (newSize) setSize(newSize);
40
- }, 10), [elementRef]);
41
- React__default.useEffect(() => {
42
- updateSize();
43
- window.addEventListener('resize', updateSize);
44
- return () => window.removeEventListener('resize', updateSize);
45
- }, [updateSize]);
46
- return [size, updateSize];
47
- }
48
-
49
- /** Get natural image size after load. */
50
- function useImageSize(imgRef, getInitialSize) {
51
- const [imageSize, setImageSize] = React__default.useState(getInitialSize || null);
52
- React__default.useEffect(() => {
53
- const {
54
- current: img
55
- } = imgRef;
56
- if (!img) {
57
- return undefined;
58
- }
59
- const onLoad = () => setImageSize({
60
- width: img.naturalWidth,
61
- height: img.naturalHeight
62
- });
63
- img.addEventListener('load', onLoad);
64
- return () => img.removeEventListener('load', onLoad);
65
- }, [imgRef]);
66
- return imageSize;
67
- }
68
-
69
- /** Check if user prefers reduced motion */
70
- function getPrefersReducedMotion() {
71
- var _WINDOW$matchMedia;
72
- return WINDOW === null || WINDOW === void 0 ? void 0 : (_WINDOW$matchMedia = WINDOW.matchMedia) === null || _WINDOW$matchMedia === void 0 ? void 0 : _WINDOW$matchMedia.call(WINDOW, '(prefers-reduced-motion: reduce)').matches;
73
- }
74
-
75
- /** Minimal recursive deep equal of JS values */
76
- function isEqual(obj1, obj2) {
77
- if (obj1 === obj2) return true;
78
- if (typeof obj1 === 'object' && typeof obj2 === 'object') {
79
- const keys1 = Object.keys(obj1);
80
- const keys2 = Object.keys(obj2);
81
- if (keys1.length !== keys2.length) return false;
82
- return keys1.every(key1 => isEqual(obj1[key1], obj2[key1]));
83
- }
84
- return false;
85
- }
86
-
87
- /**
88
- * Listen to mouse wheel + ctrl and multi-pointer pinch to zoom
89
- */
90
- function usePointerZoom(scrollAreaRef, onScaleChange, animateScroll) {
91
- const [isPointerZooming, setPointerZooming] = React__default.useState(false);
92
- React__default.useEffect(() => {
93
- const scrollArea = scrollAreaRef.current;
94
- if (!scrollArea || !onScaleChange) {
95
- return undefined;
96
- }
97
- let animationFrame;
98
- let zoomStateTimeoutId;
99
- function updateScaleOnNextFrame(newScale, mousePosition) {
100
- // Cancel previously scheduled frame
101
- if (animationFrame) cancelAnimationFrame(animationFrame);
102
-
103
- // Cancel previously scheduled zoom state change
104
- if (zoomStateTimeoutId) clearTimeout(zoomStateTimeoutId);
105
- function nextFrame() {
106
- setPointerZooming(true);
107
- onScaleChange === null || onScaleChange === void 0 ? void 0 : onScaleChange(newScale);
108
- animationFrame = null;
109
- // Wait a bit before indicating the pointer zooming is finished
110
- zoomStateTimeoutId = setTimeout(() => setPointerZooming(false), 100);
111
- }
112
- animationFrame = requestAnimationFrame(nextFrame);
113
-
114
- // Animate scroll in parallel (centering on the current mouse position)
115
- animateScroll(mousePosition, {
116
- width: scrollArea.scrollWidth,
117
- height: scrollArea.scrollHeight
118
- });
119
- }
120
- function onWheel(event) {
121
- if (!event.ctrlKey) {
122
- return;
123
- }
124
- event.preventDefault();
125
- const newScale = Math.exp(-event.deltaY / 50);
126
-
127
- // Update scale on next frame (focused on the mouse position)
128
- updateScaleOnNextFrame(newScale, {
129
- x: event.clientX,
130
- y: event.clientY
131
- });
132
- }
133
- const activePointers = {};
134
- let prevDistance = null;
135
- let previousCenterPoint = null;
136
- function onPointerDown(event) {
137
- activePointers[event.pointerId] = event;
138
- }
139
- function onPointerMove(event) {
140
- var _pointers$;
141
- // Update pointer in cache
142
- if (activePointers[event.pointerId]) {
143
- activePointers[event.pointerId] = event;
144
- }
145
- const pointers = Object.values(activePointers);
146
-
147
- // Make sure we run computation on one of the pointer in the group
148
- if (((_pointers$ = pointers[0]) === null || _pointers$ === void 0 ? void 0 : _pointers$.pointerId) !== event.pointerId) {
149
- return;
150
- }
151
-
152
- // Centered point between all pointers
153
- const centerPoint = {
154
- x: pointers.reduce((x, _ref) => {
155
- let {
156
- clientX
157
- } = _ref;
158
- return x + clientX;
159
- }, 0) / pointers.length,
160
- y: pointers.reduce((y, _ref2) => {
161
- let {
162
- clientY
163
- } = _ref2;
164
- return y + clientY;
165
- }, 0) / pointers.length
166
- };
167
-
168
- // Movement of the center point
169
- const deltaCenterPoint = previousCenterPoint && {
170
- left: previousCenterPoint.x - centerPoint.x,
171
- top: previousCenterPoint.y - centerPoint.y
172
- };
173
-
174
- // Pan X & Y
175
- if (deltaCenterPoint) {
176
- // Apply movement of the center point to the scroll
177
- scrollArea.scrollBy({
178
- top: deltaCenterPoint.top / 2,
179
- left: deltaCenterPoint.left / 2
180
- });
181
- }
182
-
183
- // Pinch to zoom
184
- if (pointers.length === 2) {
185
- const [pointer1, pointer2] = pointers;
186
- const distance = Math.hypot(pointer2.clientX - pointer1.clientX, pointer2.clientY - pointer1.clientY);
187
- if (prevDistance && deltaCenterPoint) {
188
- const delta = prevDistance - distance;
189
- const absDelta = Math.abs(delta);
190
-
191
- // Zoom only if we are "pinching" more than we are moving the pointers
192
- if (absDelta > Math.abs(deltaCenterPoint.left) && absDelta > Math.abs(deltaCenterPoint.top)) {
193
- // Update scale on next frame (focused on the center point between the two pointers)
194
- const newScale = Math.exp(-delta / 100);
195
- updateScaleOnNextFrame(newScale, centerPoint);
196
- }
197
- }
198
- prevDistance = distance;
199
- }
200
- previousCenterPoint = centerPoint;
201
- }
202
- function onPointerUp(event) {
203
- prevDistance = null;
204
- previousCenterPoint = null;
205
- delete activePointers[event.pointerId];
206
- }
207
- scrollArea.addEventListener('wheel', onWheel, {
208
- passive: false
209
- });
210
- const isMultiTouch = navigator.maxTouchPoints >= 2;
211
- if (isMultiTouch) {
212
- scrollArea.addEventListener('pointerdown', onPointerDown);
213
- scrollArea.addEventListener('pointermove', onPointerMove);
214
- scrollArea.addEventListener('pointerup', onPointerUp);
215
- }
216
- return () => {
217
- scrollArea.removeEventListener('wheel', onWheel);
218
- if (isMultiTouch) {
219
- scrollArea.removeEventListener('pointerdown', onPointerDown);
220
- scrollArea.removeEventListener('pointermove', onPointerMove);
221
- scrollArea.removeEventListener('pointerup', onPointerUp);
222
- }
223
- };
224
- }, [animateScroll, onScaleChange, scrollAreaRef]);
225
- return isPointerZooming;
226
- }
227
-
228
- /** Maintains the scroll position centered relative to the original scroll area's dimensions when the content scales. */
229
- function useAnimateScroll(scrollAreaRef) {
230
- return React__default.useMemo(() => {
231
- let animationFrame = null;
232
- return function animate(centerPoint, initialScrollAreaSize) {
233
- const scrollArea = scrollAreaRef.current;
234
- if (!scrollArea) {
235
- return;
236
- }
237
-
238
- // Cancel previously running animation
239
- if (animationFrame) cancelAnimationFrame(animationFrame);
240
-
241
- // Center on the given point or else on the scroll area visual center
242
- const clientHeightRatio = centerPoint !== null && centerPoint !== void 0 && centerPoint.y ? centerPoint.y / scrollArea.clientHeight : 0.5;
243
- const clientWidthRatio = centerPoint !== null && centerPoint !== void 0 && centerPoint.x ? centerPoint.x / scrollArea.clientWidth : 0.5;
244
- const initialScrollHeight = (initialScrollAreaSize === null || initialScrollAreaSize === void 0 ? void 0 : initialScrollAreaSize.height) || scrollArea.scrollHeight;
245
- const initialScrollWidth = (initialScrollAreaSize === null || initialScrollAreaSize === void 0 ? void 0 : initialScrollAreaSize.width) || scrollArea.scrollWidth;
246
- const heightCenter = scrollArea.scrollTop + scrollArea.clientHeight * clientHeightRatio;
247
- const heightRatio = heightCenter / initialScrollHeight;
248
- const widthCenter = scrollArea.scrollLeft + scrollArea.clientWidth * clientWidthRatio;
249
- const widthRatio = widthCenter / initialScrollWidth;
250
- let prevScrollHeight = 0;
251
- let prevScrollWidth = 0;
252
- function nextFrame() {
253
- const {
254
- scrollHeight,
255
- scrollWidth,
256
- clientHeight,
257
- clientWidth
258
- } = scrollArea;
259
-
260
- // Scroll area stopped expanding => stop animation
261
- if (scrollHeight === prevScrollHeight && scrollWidth === prevScrollWidth) {
262
- animationFrame = null;
263
- return;
264
- }
265
-
266
- // Compute next scroll position
267
- const top = heightRatio * scrollHeight - clientHeight * clientHeightRatio;
268
- const left = widthRatio * scrollWidth - clientWidth * clientWidthRatio;
269
- scrollArea.scrollTo({
270
- top,
271
- left
272
- });
273
- prevScrollHeight = scrollHeight;
274
- prevScrollWidth = scrollWidth;
275
- animationFrame = requestAnimationFrame(nextFrame);
276
- }
277
- animationFrame = requestAnimationFrame(nextFrame);
278
- };
279
- }, [scrollAreaRef]);
280
- }
281
-
282
- /** Internal image slide component for ImageLightbox */
283
- const ImageSlide = /*#__PURE__*/React__default.memo(props => {
284
- const {
285
- isActive,
286
- scale,
287
- onScaleChange,
288
- image: {
289
- image,
290
- imgRef: propImgRef,
291
- imgProps,
292
- alt,
293
- loadingPlaceholderImageRef
294
- }
295
- } = props;
296
-
297
- // Get scroll area size
298
- const scrollAreaRef = React__default.useRef(null);
299
- const [scrollAreaSize, updateSize] = useSizeOnWindowResize(scrollAreaRef);
300
- React__default.useEffect(() => {
301
- // Update size when active
302
- if (isActive) updateSize();
303
- }, [isActive, updateSize]);
304
-
305
- // Get image size
306
- const imgRef = React__default.useRef(null);
307
- const imageSize = useImageSize(imgRef, () => {
308
- const width = Number.parseInt(imgProps === null || imgProps === void 0 ? void 0 : imgProps.width, 10);
309
- const height = Number.parseInt(imgProps === null || imgProps === void 0 ? void 0 : imgProps.height, 10);
310
- return width && height ? {
311
- width,
312
- height
313
- } : null;
314
- });
315
-
316
- // Calculate new image size with scale
317
- const scaledImageSize = React__default.useMemo(() => {
318
- if (!scrollAreaSize || !imageSize) {
319
- return null;
320
- }
321
- const horizontalScale = scrollAreaSize.width / imageSize.width;
322
- const verticalScale = scrollAreaSize.height / imageSize.height;
323
- const baseScale = Math.min(1, Math.min(horizontalScale, verticalScale));
324
- return {
325
- width: imageSize.width * baseScale * (scale !== null && scale !== void 0 ? scale : 1),
326
- height: imageSize.height * baseScale * (scale !== null && scale !== void 0 ? scale : 1)
327
- };
328
- }, [scrollAreaSize, imageSize, scale]);
329
-
330
- // Animate scroll to preserve the center of the current visible window in the scroll area
331
- const animateScroll = useAnimateScroll(scrollAreaRef);
332
-
333
- // Zoom via mouse wheel or multi-touch pinch zoom
334
- const isPointerZooming = usePointerZoom(scrollAreaRef, onScaleChange, animateScroll);
335
-
336
- // Animate scroll on scale change
337
- React__default.useLayoutEffect(() => {
338
- if (scale && !isPointerZooming) {
339
- animateScroll();
340
- }
341
- }, [isPointerZooming, scale, animateScroll]);
342
- const isScrollable = scaledImageSize && scrollAreaSize && (scaledImageSize.width > scrollAreaSize.width || scaledImageSize.height > scrollAreaSize.height);
343
- return /*#__PURE__*/React__default.createElement(SlideshowItem, {
344
- ref: scrollAreaRef
345
- // Make it accessible to keyboard nav when the zone is scrollable
346
- ,
347
- tabIndex: isScrollable ? 0 : undefined,
348
- className: `${CLASSNAME}__image-slide`
349
- }, /*#__PURE__*/React__default.createElement(Thumbnail, {
350
- imgRef: useMergeRefs(imgRef, propImgRef),
351
- image: image,
352
- alt: alt,
353
- className: `${CLASSNAME}__thumbnail`,
354
- imgProps: _objectSpread2(_objectSpread2({}, imgProps), {}, {
355
- style: _objectSpread2(_objectSpread2(_objectSpread2({}, imgProps === null || imgProps === void 0 ? void 0 : imgProps.style), scaledImageSize || {
356
- maxHeight: scrollAreaSize === null || scrollAreaSize === void 0 ? void 0 : scrollAreaSize.height,
357
- maxWidth: scrollAreaSize === null || scrollAreaSize === void 0 ? void 0 : scrollAreaSize.width
358
- }), {}, {
359
- // Only animate when scale is set, and we are not pointer zooming and the user does not prefer reduced motion
360
- transition: scale && !isPointerZooming && !getPrefersReducedMotion() ? 'all 250ms' : undefined
361
- })
362
- }),
363
- loadingPlaceholderImageRef: loadingPlaceholderImageRef
364
- }));
365
- }, isEqual);
366
-
367
- const _excluded$1 = ["image", "imgRef"];
368
- /** Internal image slideshow component for ImageLightbox */
369
- const ImageSlideshow = _ref => {
370
- var _images$activeIndex, _images$activeIndex2, _images$activeIndex3;
371
- let {
372
- activeImageIndex,
373
- images,
374
- slideGroupLabel,
375
- zoomInButtonProps,
376
- zoomOutButtonProps,
377
- slideshowControlsProps,
378
- currentPaginationItemRef,
379
- footerRef,
380
- activeImageRef
381
- } = _ref;
382
- const {
383
- activeIndex,
384
- slideshowId,
385
- setSlideshow,
386
- slideshowSlidesId,
387
- slidesCount,
388
- onNextClick,
389
- onPaginationClick,
390
- onPreviousClick,
391
- toggleAutoPlay
392
- } = SlideshowControls.useSlideshowControls({
393
- itemsCount: images.length,
394
- activeIndex: activeImageIndex
395
- });
396
-
397
- // Image metadata (caption)
398
- const title = (_images$activeIndex = images[activeIndex]) === null || _images$activeIndex === void 0 ? void 0 : _images$activeIndex.title;
399
- const description = (_images$activeIndex2 = images[activeIndex]) === null || _images$activeIndex2 === void 0 ? void 0 : _images$activeIndex2.description;
400
- const tags = (_images$activeIndex3 = images[activeIndex]) === null || _images$activeIndex3 === void 0 ? void 0 : _images$activeIndex3.tags;
401
- const metadata = title || description || tags ? /*#__PURE__*/React__default.createElement(ImageCaption, {
402
- theme: "dark",
403
- as: "div",
404
- title: title,
405
- description: description,
406
- tags: tags,
407
- align: "center"
408
- }) : null;
409
-
410
- // Slideshow controls
411
- const slideShowControls = slidesCount > 1 && slideshowControlsProps ? /*#__PURE__*/React__default.createElement(SlideshowControls, _extends({
412
- theme: "dark",
413
- activeIndex: activeIndex,
414
- slidesCount: slidesCount,
415
- onNextClick: onNextClick,
416
- onPreviousClick: onPreviousClick,
417
- onPaginationClick: onPaginationClick
418
- }, slideshowControlsProps, {
419
- paginationItemProps: index => {
420
- var _slideshowControlsPro;
421
- const props = (slideshowControlsProps === null || slideshowControlsProps === void 0 ? void 0 : (_slideshowControlsPro = slideshowControlsProps.paginationItemProps) === null || _slideshowControlsPro === void 0 ? void 0 : _slideshowControlsPro.call(slideshowControlsProps, index)) || {};
422
- return _objectSpread2(_objectSpread2({}, props), {}, {
423
- ref: mergeRefs(props === null || props === void 0 ? void 0 : props.ref,
424
- // Focus the active pagination item once on mount
425
- activeIndex === index ? currentPaginationItemRef : undefined)
426
- });
427
- }
428
- })) : null;
429
-
430
- // Zoom controls
431
- const [scale, setScale] = React__default.useState(undefined);
432
- const zoomEnabled = zoomInButtonProps && zoomOutButtonProps;
433
- const onScaleChange = React__default.useMemo(() => {
434
- if (!zoomEnabled) return undefined;
435
- return newScale => {
436
- setScale(function () {
437
- let prevScale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
438
- return Math.max(1, newScale * prevScale);
439
- });
440
- };
441
- }, [zoomEnabled]);
442
- const zoomIn = React__default.useCallback(() => onScaleChange === null || onScaleChange === void 0 ? void 0 : onScaleChange(1.5), [onScaleChange]);
443
- const zoomOut = React__default.useCallback(() => onScaleChange === null || onScaleChange === void 0 ? void 0 : onScaleChange(0.5), [onScaleChange]);
444
- React__default.useEffect(() => {
445
- // Reset scale on slide change
446
- if (typeof activeIndex === 'number') setScale(undefined);
447
- }, [activeIndex]);
448
- const zoomControls = zoomEnabled && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(IconButton, _extends({}, zoomInButtonProps, {
449
- theme: "dark",
450
- emphasis: "low",
451
- icon: mdiMagnifyPlusOutline,
452
- onClick: zoomIn
453
- })), /*#__PURE__*/React__default.createElement(IconButton, _extends({}, zoomOutButtonProps, {
454
- theme: "dark",
455
- emphasis: "low",
456
- isDisabled: !scale || scale <= 1,
457
- icon: mdiMagnifyMinusOutline,
458
- onClick: zoomOut
459
- })));
460
- const getImgRef = React__default.useMemo(() => memoize((index, isActive) => {
461
- return mergeRefs(images === null || images === void 0 ? void 0 : images[index].imgRef, isActive ? activeImageRef : undefined);
462
- },
463
- // memoize based on both arguments
464
- function () {
465
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
466
- args[_key] = arguments[_key];
467
- }
468
- return args.join();
469
- }), [images, activeImageRef]);
470
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Slides, {
471
- activeIndex: activeIndex,
472
- theme: "dark",
473
- slideGroupLabel: slideGroupLabel,
474
- fillHeight: true,
475
- id: slideshowId,
476
- ref: setSlideshow,
477
- slidesId: slideshowSlidesId,
478
- toggleAutoPlay: toggleAutoPlay
479
- }, images.map((_ref2, index) => {
480
- let {
481
- image,
482
- imgRef
483
- } = _ref2,
484
- imageProps = _objectWithoutProperties(_ref2, _excluded$1);
485
- const isActive = index === activeIndex;
486
- return /*#__PURE__*/React__default.createElement(ImageSlide, {
487
- isActive: isActive,
488
- key: image,
489
- image: _objectSpread2(_objectSpread2({}, imageProps), {}, {
490
- image,
491
- imgRef: getImgRef(index, isActive)
492
- }),
493
- scale: isActive ? scale : undefined,
494
- onScaleChange: onScaleChange
495
- });
496
- })), (metadata || slideShowControls || zoomControls) && /*#__PURE__*/React__default.createElement(FlexBox, {
497
- ref: footerRef,
498
- className: `${CLASSNAME}__footer`,
499
- orientation: "vertical",
500
- vAlign: "center",
501
- gap: "big"
502
- }, metadata, /*#__PURE__*/React__default.createElement(FlexBox, {
503
- className: `${CLASSNAME}__footer-actions`,
504
- orientation: "horizontal",
505
- gap: "regular"
506
- }, slideShowControls, zoomControls)));
507
- };
508
-
509
- /** Unref a react ref or element */
510
- function unref(maybeElement) {
511
- if (maybeElement instanceof HTMLElement) return maybeElement;
512
- return maybeElement === null || maybeElement === void 0 ? void 0 : maybeElement.current;
513
- }
514
-
515
- function setupViewTransitionName(elementRef, name) {
516
- let originalName = null;
517
- return {
518
- set() {
519
- const element = unref(elementRef);
520
- if (!element) return;
521
- originalName = element.style.viewTransitionName;
522
- element.style.viewTransitionName = name;
523
- },
524
- unset() {
525
- const element = unref(elementRef);
526
- if (!element || originalName === null) return;
527
- element.style.viewTransitionName = originalName;
528
- }
529
- };
530
- }
531
-
532
- /**
533
- * Wrapper around the `document.startViewTransition` handling browser incompatibilities, react DOM flush and
534
- * user preference.
535
- *
536
- * @param changes callback containing the changes to apply within the view transition.
537
- * @param setViewTransitionName set the `viewTransitionName` style on a `source` & `target` to morph these elements.
538
- */
539
- async function startViewTransition(_ref) {
540
- var _document, _document$startViewTr;
541
- let {
542
- changes,
543
- viewTransitionName
544
- } = _ref;
545
- const start = (_document = document) === null || _document === void 0 ? void 0 : (_document$startViewTr = _document.startViewTransition) === null || _document$startViewTr === void 0 ? void 0 : _document$startViewTr.bind(document);
546
- const prefersReducedMotion = getPrefersReducedMotion();
547
- const {
548
- flushSync
549
- } = ReactDOM;
550
- if (prefersReducedMotion || !start || !flushSync || !(viewTransitionName !== null && viewTransitionName !== void 0 && viewTransitionName.source) || !(viewTransitionName !== null && viewTransitionName !== void 0 && viewTransitionName.target)) {
551
- // Skip, apply changes without a transition
552
- changes();
553
- return;
554
- }
555
-
556
- // Setup set/unset transition name on source & target
557
- const sourceTransitionName = setupViewTransitionName(viewTransitionName.source, viewTransitionName.name);
558
- const targetTransitionName = setupViewTransitionName(viewTransitionName.target, viewTransitionName.name);
559
- sourceTransitionName.set();
560
-
561
- // Start view transition, apply changes & flush to DOM
562
- await start(() => {
563
- sourceTransitionName.unset();
564
- flushSync(changes);
565
- targetTransitionName.set();
566
- }).updateCallbackDone;
567
- targetTransitionName.unset();
568
- }
569
-
570
- /** Find image in element including the element */
571
- const findImage = element => element !== null && element !== void 0 && element.matches('img') ? element : (element === null || element === void 0 ? void 0 : element.querySelector('img')) || null;
572
-
573
- /** Subset of the ImageLightboxProps managed by the useImageLightbox hook */
574
-
575
- const EMPTY_PROPS = {
576
- isOpen: false,
577
- images: [],
578
- parentElement: /*#__PURE__*/React__default.createRef()
579
- };
580
- /**
581
- * Set up an ImageLightbox with images and triggers.
582
- *
583
- * - Associate a trigger with the lightbox to properly focus the trigger on close
584
- * - Associate a trigger with an image to display on open
585
- * - Automatically provide a view transition between an image trigger and the displayed image on open & close
586
- *
587
- * @param props Images to display in the image lightbox
588
- */
589
- function useImageLightbox(props) {
590
- const propsRef = React__default.useRef(props);
591
- React__default.useEffect(() => {
592
- propsRef.current = props;
593
- }, [props]);
594
-
595
- // Keep reference for each image elements
596
- const imageRefsRef = React__default.useRef([]);
597
- const currentImageRef = React__default.useRef(null);
598
- const [imageLightboxProps, setImageLightboxProps] = React__default.useState(() => _objectSpread2(_objectSpread2({}, EMPTY_PROPS), props));
599
- const getTriggerProps = React__default.useMemo(() => {
600
- const triggerImageRefs = {};
601
- async function close() {
602
- const currentImage = currentImageRef.current;
603
- if (!currentImage) {
604
- return;
605
- }
606
- const currentIndex = imageRefsRef.current.findIndex(imageRef => imageRef.current === currentImage);
607
- await startViewTransition({
608
- changes() {
609
- // Close lightbox
610
- setImageLightboxProps(prevProps => _objectSpread2(_objectSpread2({}, prevProps), {}, {
611
- isOpen: false
612
- }));
613
- },
614
- // Morph from the image in lightbox to the image in trigger
615
- viewTransitionName: {
616
- source: currentImageRef,
617
- target: triggerImageRefs[currentIndex],
618
- name: CLASSNAME
619
- }
620
- });
621
- }
622
- async function open(triggerElement) {
623
- var _triggerImageRefs, _propsRef$current, _propsRef$current$ima;
624
- let {
625
- activeImageIndex
626
- } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
627
- // If we find an image inside the trigger, animate it in transition with the opening image
628
- const triggerImage = ((_triggerImageRefs = triggerImageRefs[activeImageIndex]) === null || _triggerImageRefs === void 0 ? void 0 : _triggerImageRefs.current) || findImage(triggerElement);
629
-
630
- // Inject refs to improve transition and loading style
631
- const images = (_propsRef$current = propsRef.current) === null || _propsRef$current === void 0 ? void 0 : (_propsRef$current$ima = _propsRef$current.images) === null || _propsRef$current$ima === void 0 ? void 0 : _propsRef$current$ima.map((image, idx) => {
632
- // Get or create image reference
633
- let imgRef = imageRefsRef.current[idx];
634
- if (!imgRef) {
635
- imgRef = /*#__PURE__*/React__default.createRef();
636
- imageRefsRef.current[idx] = imgRef;
637
- }
638
-
639
- // Try to use the trigger image as the loading placeholder
640
- const loadingPlaceholderImageRef = triggerImage && idx === activeImageIndex ? {
641
- current: triggerImage
642
- } : undefined;
643
- return _objectSpread2(_objectSpread2({
644
- loadingPlaceholderImageRef
645
- }, image), {}, {
646
- imgRef
647
- });
648
- });
649
- await startViewTransition({
650
- changes: () => {
651
- // Open lightbox with setup props
652
- setImageLightboxProps(prevProps => _objectSpread2(_objectSpread2(_objectSpread2({}, prevProps), propsRef.current), {}, {
653
- activeImageRef: currentImageRef,
654
- parentElement: {
655
- current: triggerElement
656
- },
657
- isOpen: true,
658
- onClose: () => {
659
- var _propsRef$current2, _propsRef$current2$on;
660
- close();
661
- (_propsRef$current2 = propsRef.current) === null || _propsRef$current2 === void 0 ? void 0 : (_propsRef$current2$on = _propsRef$current2.onClose) === null || _propsRef$current2$on === void 0 ? void 0 : _propsRef$current2$on.call(_propsRef$current2);
662
- },
663
- images,
664
- activeImageIndex: activeImageIndex || 0
665
- }));
666
- },
667
- // Morph from the image in trigger to the image in lightbox
668
- viewTransitionName: {
669
- source: triggerImage,
670
- target: currentImageRef,
671
- name: CLASSNAME
672
- }
673
- });
674
- }
675
- return memoize(options => ({
676
- ref(element) {
677
- // Track trigger image ref if any
678
- if ((options === null || options === void 0 ? void 0 : options.activeImageIndex) !== undefined && element) {
679
- triggerImageRefs[options.activeImageIndex] = {
680
- current: findImage(element)
681
- };
682
- }
683
- },
684
- onClick(e) {
685
- open(e.target, options);
686
- }
687
- }));
688
- }, []);
689
- return {
690
- getTriggerProps,
691
- imageLightboxProps
692
- };
693
- }
694
-
695
- const _excluded = ["className", "isOpen", "closeButtonProps", "onClose", "parentElement", "activeImageIndex", "slideshowControlsProps", "slideGroupLabel", "images", "zoomOutButtonProps", "zoomInButtonProps", "activeImageRef"];
696
- const Inner = forwardRef((props, ref) => {
697
- const {
698
- className,
699
- isOpen,
700
- closeButtonProps,
701
- onClose,
702
- parentElement,
703
- activeImageIndex,
704
- slideshowControlsProps,
705
- slideGroupLabel,
706
- images,
707
- zoomOutButtonProps,
708
- zoomInButtonProps,
709
- activeImageRef: propImageRef
710
- } = props,
711
- forwardedProps = _objectWithoutProperties(props, _excluded);
712
- const currentPaginationItemRef = React__default.useRef(null);
713
- const footerRef = React__default.useRef(null);
714
- const imageRef = React__default.useRef(null);
715
- const clickAwayChildrenRefs = React__default.useRef([imageRef, footerRef]);
716
- const onClickAway = React__default.useCallback(evt => {
717
- const targetElement = evt.target;
718
- if (!(targetElement instanceof HTMLElement) || !(evt instanceof MouseEvent)) return;
719
-
720
- // Skip click away if clicking on the scrollbar
721
- if (targetElement.clientWidth < evt.clientX || targetElement.clientHeight < evt.clientY) return;
722
- onClose === null || onClose === void 0 ? void 0 : onClose();
723
- }, [onClose]);
724
- return /*#__PURE__*/React__default.createElement(Lightbox, _extends({
725
- ref: ref,
726
- className: classNames(className, CLASSNAME),
727
- parentElement: parentElement,
728
- isOpen: isOpen,
729
- onClose: onClose,
730
- closeButtonProps: closeButtonProps,
731
- focusElement: currentPaginationItemRef
732
- }, forwardedProps, {
733
- // Disable the close on click away as we want a custom one here
734
- preventAutoClose: true
735
- }), /*#__PURE__*/React__default.createElement(ClickAwayProvider, {
736
- childrenRefs: clickAwayChildrenRefs,
737
- callback: onClickAway
738
- }, /*#__PURE__*/React__default.createElement(ImageSlideshow, {
739
- activeImageIndex: activeImageIndex,
740
- slideGroupLabel: slideGroupLabel,
741
- slideshowControlsProps: slideshowControlsProps,
742
- images: images,
743
- zoomInButtonProps: zoomInButtonProps,
744
- zoomOutButtonProps: zoomOutButtonProps,
745
- footerRef: footerRef,
746
- activeImageRef: useMergeRefs(propImageRef, imageRef),
747
- currentPaginationItemRef: currentPaginationItemRef
748
- })));
749
- });
750
- Inner.displayName = COMPONENT_NAME;
751
- Inner.className = CLASSNAME;
752
-
753
- /**
754
- * ImageLightbox component.
755
- *
756
- * @param props Component props.
757
- * @param ref Component ref.
758
- * @return React element.
759
- */
760
- const ImageLightbox = Object.assign(Inner, {
761
- useImageLightbox
762
- });
763
-
764
- export { ImageLightbox };
765
- //# sourceMappingURL=index.ts-137f85a8.js.map