@alfalab/core-components-gallery 7.2.3 → 7.3.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 (285) hide show
  1. package/Component.js +51 -7
  2. package/Component.js.map +1 -1
  3. package/components/bottom-button/index.css +5 -5
  4. package/components/bottom-button/index.module.css.js +1 -1
  5. package/components/buttons/index.css +5 -5
  6. package/components/buttons/index.d.ts +3 -1
  7. package/components/buttons/index.js +49 -12
  8. package/components/buttons/index.js.map +1 -1
  9. package/components/buttons/index.module.css.js +1 -1
  10. package/components/header/Component.js +1 -0
  11. package/components/header/Component.js.map +1 -1
  12. package/components/header/index.css +3 -2
  13. package/components/header/index.module.css.js +1 -1
  14. package/components/header/index.module.css.js.map +1 -1
  15. package/components/header-info-block/Component.js +2 -1
  16. package/components/header-info-block/Component.js.map +1 -1
  17. package/components/header-info-block/index.css +4 -4
  18. package/components/header-info-block/index.module.css.js +1 -1
  19. package/components/header-mobile/index.css +6 -6
  20. package/components/header-mobile/index.module.css.js +1 -1
  21. package/components/image-preview/Component.js +2 -1
  22. package/components/image-preview/Component.js.map +1 -1
  23. package/components/image-preview/index.css +20 -20
  24. package/components/image-preview/index.module.css.js +1 -1
  25. package/components/image-preview/index.module.css.js.map +1 -1
  26. package/components/image-viewer/hooks.js +3 -2
  27. package/components/image-viewer/hooks.js.map +1 -1
  28. package/components/image-viewer/index.css +30 -31
  29. package/components/image-viewer/index.module.css.js +1 -1
  30. package/components/image-viewer/index.module.css.js.map +1 -1
  31. package/components/image-viewer/single.js +1 -0
  32. package/components/image-viewer/single.js.map +1 -1
  33. package/components/image-viewer/slide.js +3 -2
  34. package/components/image-viewer/slide.js.map +1 -1
  35. package/components/image-viewer/video/index.css +22 -10
  36. package/components/image-viewer/video/index.js +50 -15
  37. package/components/image-viewer/video/index.js.map +1 -1
  38. package/components/image-viewer/video/index.module.css.js +1 -1
  39. package/components/image-viewer/video/index.module.css.js.map +1 -1
  40. package/components/info-bar/Component.js +1 -0
  41. package/components/info-bar/Component.js.map +1 -1
  42. package/components/info-bar/index.css +3 -3
  43. package/components/info-bar/index.module.css.js +1 -1
  44. package/components/navigation-bar/Component.js +56 -26
  45. package/components/navigation-bar/Component.js.map +1 -1
  46. package/components/navigation-bar/index.css +21 -11
  47. package/components/navigation-bar/index.module.css.js +1 -1
  48. package/components/navigation-bar/index.module.css.js.map +1 -1
  49. package/components/subtitles/index.css +3 -3
  50. package/components/subtitles/index.module.css.js +1 -1
  51. package/constants.d.ts +1 -1
  52. package/constants.js +1 -1
  53. package/constants.js.map +1 -1
  54. package/cssm/Component.js +51 -7
  55. package/cssm/Component.js.map +1 -1
  56. package/cssm/components/buttons/index.d.ts +3 -1
  57. package/cssm/components/buttons/index.js +54 -17
  58. package/cssm/components/buttons/index.js.map +1 -1
  59. package/cssm/components/header/Component.js +1 -0
  60. package/cssm/components/header/Component.js.map +1 -1
  61. package/cssm/components/header/index.module.css +2 -1
  62. package/cssm/components/header-info-block/Component.js +2 -1
  63. package/cssm/components/header-info-block/Component.js.map +1 -1
  64. package/cssm/components/image-preview/Component.js +2 -1
  65. package/cssm/components/image-preview/Component.js.map +1 -1
  66. package/cssm/components/image-preview/index.module.css +3 -3
  67. package/cssm/components/image-viewer/hooks.js +3 -2
  68. package/cssm/components/image-viewer/hooks.js.map +1 -1
  69. package/cssm/components/image-viewer/index.module.css +2 -3
  70. package/cssm/components/image-viewer/single.js +1 -0
  71. package/cssm/components/image-viewer/single.js.map +1 -1
  72. package/cssm/components/image-viewer/slide.js +3 -2
  73. package/cssm/components/image-viewer/slide.js.map +1 -1
  74. package/cssm/components/image-viewer/video/index.js +50 -15
  75. package/cssm/components/image-viewer/video/index.js.map +1 -1
  76. package/cssm/components/image-viewer/video/index.module.css +15 -3
  77. package/cssm/components/info-bar/Component.js +1 -0
  78. package/cssm/components/info-bar/Component.js.map +1 -1
  79. package/cssm/components/navigation-bar/Component.js +56 -26
  80. package/cssm/components/navigation-bar/Component.js.map +1 -1
  81. package/cssm/components/navigation-bar/index.module.css +13 -3
  82. package/cssm/constants.d.ts +1 -1
  83. package/cssm/constants.js +1 -1
  84. package/cssm/constants.js.map +1 -1
  85. package/cssm/hooks/use-custom-subtitles.js +57 -11
  86. package/cssm/hooks/use-custom-subtitles.js.map +1 -1
  87. package/cssm/index.js +1 -0
  88. package/cssm/index.js.map +1 -1
  89. package/cssm/types.d.ts +4 -2
  90. package/cssm/utils/index.d.ts +1 -0
  91. package/cssm/utils/index.js +2 -0
  92. package/cssm/utils/index.js.map +1 -1
  93. package/cssm/utils/modern-download.d.ts +6 -0
  94. package/cssm/utils/modern-download.js +113 -0
  95. package/cssm/utils/modern-download.js.map +1 -0
  96. package/esm/Component.js +51 -7
  97. package/esm/Component.js.map +1 -1
  98. package/esm/components/bottom-button/index.css +5 -5
  99. package/esm/components/bottom-button/index.module.css.js +1 -1
  100. package/esm/components/buttons/index.css +5 -5
  101. package/esm/components/buttons/index.d.ts +3 -1
  102. package/esm/components/buttons/index.js +50 -13
  103. package/esm/components/buttons/index.js.map +1 -1
  104. package/esm/components/buttons/index.module.css.js +1 -1
  105. package/esm/components/header/Component.js +1 -0
  106. package/esm/components/header/Component.js.map +1 -1
  107. package/esm/components/header/index.css +3 -2
  108. package/esm/components/header/index.module.css.js +1 -1
  109. package/esm/components/header/index.module.css.js.map +1 -1
  110. package/esm/components/header-info-block/Component.js +2 -1
  111. package/esm/components/header-info-block/Component.js.map +1 -1
  112. package/esm/components/header-info-block/index.css +4 -4
  113. package/esm/components/header-info-block/index.module.css.js +1 -1
  114. package/esm/components/header-mobile/index.css +6 -6
  115. package/esm/components/header-mobile/index.module.css.js +1 -1
  116. package/esm/components/image-preview/Component.js +2 -1
  117. package/esm/components/image-preview/Component.js.map +1 -1
  118. package/esm/components/image-preview/index.css +20 -20
  119. package/esm/components/image-preview/index.module.css.js +1 -1
  120. package/esm/components/image-preview/index.module.css.js.map +1 -1
  121. package/esm/components/image-viewer/hooks.js +3 -2
  122. package/esm/components/image-viewer/hooks.js.map +1 -1
  123. package/esm/components/image-viewer/index.css +30 -31
  124. package/esm/components/image-viewer/index.module.css.js +1 -1
  125. package/esm/components/image-viewer/index.module.css.js.map +1 -1
  126. package/esm/components/image-viewer/single.js +1 -0
  127. package/esm/components/image-viewer/single.js.map +1 -1
  128. package/esm/components/image-viewer/slide.js +3 -2
  129. package/esm/components/image-viewer/slide.js.map +1 -1
  130. package/esm/components/image-viewer/video/index.css +22 -10
  131. package/esm/components/image-viewer/video/index.js +51 -16
  132. package/esm/components/image-viewer/video/index.js.map +1 -1
  133. package/esm/components/image-viewer/video/index.module.css.js +1 -1
  134. package/esm/components/image-viewer/video/index.module.css.js.map +1 -1
  135. package/esm/components/info-bar/Component.js +1 -0
  136. package/esm/components/info-bar/Component.js.map +1 -1
  137. package/esm/components/info-bar/index.css +3 -3
  138. package/esm/components/info-bar/index.module.css.js +1 -1
  139. package/esm/components/navigation-bar/Component.js +56 -25
  140. package/esm/components/navigation-bar/Component.js.map +1 -1
  141. package/esm/components/navigation-bar/index.css +21 -11
  142. package/esm/components/navigation-bar/index.module.css.js +1 -1
  143. package/esm/components/navigation-bar/index.module.css.js.map +1 -1
  144. package/esm/components/subtitles/index.css +3 -3
  145. package/esm/components/subtitles/index.module.css.js +1 -1
  146. package/esm/constants.d.ts +1 -1
  147. package/esm/constants.js +1 -1
  148. package/esm/constants.js.map +1 -1
  149. package/esm/hooks/use-custom-subtitles.js +57 -11
  150. package/esm/hooks/use-custom-subtitles.js.map +1 -1
  151. package/esm/index.css +9 -9
  152. package/esm/index.js +1 -0
  153. package/esm/index.js.map +1 -1
  154. package/esm/index.module.css.js +1 -1
  155. package/esm/types.d.ts +4 -2
  156. package/esm/utils/index.d.ts +1 -0
  157. package/esm/utils/index.js +1 -0
  158. package/esm/utils/index.js.map +1 -1
  159. package/esm/utils/modern-download.d.ts +6 -0
  160. package/esm/utils/modern-download.js +109 -0
  161. package/esm/utils/modern-download.js.map +1 -0
  162. package/hooks/use-custom-subtitles.js +57 -11
  163. package/hooks/use-custom-subtitles.js.map +1 -1
  164. package/index.css +9 -9
  165. package/index.js +1 -0
  166. package/index.js.map +1 -1
  167. package/index.module.css.js +1 -1
  168. package/modern/Component.js +50 -7
  169. package/modern/Component.js.map +1 -1
  170. package/modern/components/bottom-button/index.css +5 -5
  171. package/modern/components/bottom-button/index.module.css.js +1 -1
  172. package/modern/components/buttons/index.css +5 -5
  173. package/modern/components/buttons/index.d.ts +3 -1
  174. package/modern/components/buttons/index.js +51 -12
  175. package/modern/components/buttons/index.js.map +1 -1
  176. package/modern/components/buttons/index.module.css.js +1 -1
  177. package/modern/components/header/index.css +3 -2
  178. package/modern/components/header/index.module.css.js +1 -1
  179. package/modern/components/header/index.module.css.js.map +1 -1
  180. package/modern/components/header-info-block/Component.js +1 -1
  181. package/modern/components/header-info-block/Component.js.map +1 -1
  182. package/modern/components/header-info-block/index.css +4 -4
  183. package/modern/components/header-info-block/index.module.css.js +1 -1
  184. package/modern/components/header-mobile/index.css +6 -6
  185. package/modern/components/header-mobile/index.module.css.js +1 -1
  186. package/modern/components/image-preview/Component.js +1 -1
  187. package/modern/components/image-preview/Component.js.map +1 -1
  188. package/modern/components/image-preview/index.css +20 -20
  189. package/modern/components/image-preview/index.module.css.js +1 -1
  190. package/modern/components/image-preview/index.module.css.js.map +1 -1
  191. package/modern/components/image-viewer/hooks.js +3 -2
  192. package/modern/components/image-viewer/hooks.js.map +1 -1
  193. package/modern/components/image-viewer/index.css +30 -31
  194. package/modern/components/image-viewer/index.module.css.js +1 -1
  195. package/modern/components/image-viewer/index.module.css.js.map +1 -1
  196. package/modern/components/image-viewer/slide.js +2 -2
  197. package/modern/components/image-viewer/slide.js.map +1 -1
  198. package/modern/components/image-viewer/video/index.css +22 -10
  199. package/modern/components/image-viewer/video/index.js +47 -12
  200. package/modern/components/image-viewer/video/index.js.map +1 -1
  201. package/modern/components/image-viewer/video/index.module.css.js +1 -1
  202. package/modern/components/image-viewer/video/index.module.css.js.map +1 -1
  203. package/modern/components/info-bar/index.css +3 -3
  204. package/modern/components/info-bar/index.module.css.js +1 -1
  205. package/modern/components/navigation-bar/Component.js +55 -25
  206. package/modern/components/navigation-bar/Component.js.map +1 -1
  207. package/modern/components/navigation-bar/index.css +21 -11
  208. package/modern/components/navigation-bar/index.module.css.js +1 -1
  209. package/modern/components/navigation-bar/index.module.css.js.map +1 -1
  210. package/modern/components/subtitles/index.css +3 -3
  211. package/modern/components/subtitles/index.module.css.js +1 -1
  212. package/modern/constants.d.ts +1 -1
  213. package/modern/constants.js +1 -1
  214. package/modern/constants.js.map +1 -1
  215. package/modern/hooks/use-custom-subtitles.js +56 -9
  216. package/modern/hooks/use-custom-subtitles.js.map +1 -1
  217. package/modern/index.css +9 -9
  218. package/modern/index.module.css.js +1 -1
  219. package/modern/types.d.ts +4 -2
  220. package/modern/utils/index.d.ts +1 -0
  221. package/modern/utils/index.js +1 -0
  222. package/modern/utils/index.js.map +1 -1
  223. package/modern/utils/modern-download.d.ts +6 -0
  224. package/modern/utils/modern-download.js +76 -0
  225. package/modern/utils/modern-download.js.map +1 -0
  226. package/moderncssm/Component.js +50 -7
  227. package/moderncssm/Component.js.map +1 -1
  228. package/moderncssm/components/buttons/index.d.ts +3 -1
  229. package/moderncssm/components/buttons/index.js +51 -12
  230. package/moderncssm/components/buttons/index.js.map +1 -1
  231. package/moderncssm/components/header/index.module.css +1 -1
  232. package/moderncssm/components/header-info-block/Component.js +1 -1
  233. package/moderncssm/components/header-info-block/Component.js.map +1 -1
  234. package/moderncssm/components/image-preview/Component.js +1 -1
  235. package/moderncssm/components/image-preview/Component.js.map +1 -1
  236. package/moderncssm/components/image-preview/index.module.css +2 -2
  237. package/moderncssm/components/image-viewer/hooks.js +3 -2
  238. package/moderncssm/components/image-viewer/hooks.js.map +1 -1
  239. package/moderncssm/components/image-viewer/index.module.css +2 -2
  240. package/moderncssm/components/image-viewer/slide.js +2 -2
  241. package/moderncssm/components/image-viewer/slide.js.map +1 -1
  242. package/moderncssm/components/image-viewer/video/index.js +47 -12
  243. package/moderncssm/components/image-viewer/video/index.js.map +1 -1
  244. package/moderncssm/components/image-viewer/video/index.module.css +16 -3
  245. package/moderncssm/components/navigation-bar/Component.js +55 -25
  246. package/moderncssm/components/navigation-bar/Component.js.map +1 -1
  247. package/moderncssm/components/navigation-bar/index.module.css +14 -2
  248. package/moderncssm/constants.d.ts +1 -1
  249. package/moderncssm/constants.js +1 -1
  250. package/moderncssm/constants.js.map +1 -1
  251. package/moderncssm/hooks/use-custom-subtitles.js +56 -9
  252. package/moderncssm/hooks/use-custom-subtitles.js.map +1 -1
  253. package/moderncssm/types.d.ts +4 -2
  254. package/moderncssm/utils/index.d.ts +1 -0
  255. package/moderncssm/utils/index.js +1 -0
  256. package/moderncssm/utils/index.js.map +1 -1
  257. package/moderncssm/utils/modern-download.d.ts +6 -0
  258. package/moderncssm/utils/modern-download.js +76 -0
  259. package/moderncssm/utils/modern-download.js.map +1 -0
  260. package/package.json +2 -2
  261. package/src/Component.tsx +63 -6
  262. package/src/components/buttons/index.tsx +157 -62
  263. package/src/components/header/index.module.css +1 -1
  264. package/src/components/header-info-block/Component.tsx +2 -2
  265. package/src/components/image-preview/Component.tsx +1 -1
  266. package/src/components/image-preview/index.module.css +2 -2
  267. package/src/components/image-viewer/hooks.ts +3 -2
  268. package/src/components/image-viewer/index.module.css +2 -2
  269. package/src/components/image-viewer/slide.tsx +2 -1
  270. package/src/components/image-viewer/video/index.module.css +16 -3
  271. package/src/components/image-viewer/video/index.tsx +62 -13
  272. package/src/components/navigation-bar/Component.tsx +68 -27
  273. package/src/components/navigation-bar/index.module.css +12 -2
  274. package/src/constants.ts +1 -1
  275. package/src/hooks/use-custom-subtitles.ts +72 -12
  276. package/src/types.ts +4 -2
  277. package/src/utils/index.ts +1 -0
  278. package/src/utils/modern-download.ts +107 -0
  279. package/types.d.ts +4 -2
  280. package/utils/index.d.ts +1 -0
  281. package/utils/index.js +2 -0
  282. package/utils/index.js.map +1 -1
  283. package/utils/modern-download.d.ts +6 -0
  284. package/utils/modern-download.js +113 -0
  285. package/utils/modern-download.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Component.js","sources":["../../../src/components/image-preview/Component.tsx"],"sourcesContent":["import React, {\n type FC,\n type KeyboardEventHandler,\n type MouseEventHandler,\n useContext,\n useEffect,\n useRef,\n} from 'react';\nimport cn from 'classnames';\n\nimport { useFocus } from '@alfalab/hooks';\n\nimport {\n PREVIEW_HEIGHT_DESKTOP,\n PREVIEW_HEIGHT_MOBILE,\n PREVIEW_VIDEO_MULTIPLIER,\n PREVIEW_WIDTH_DESKTOP,\n PREVIEW_WIDTH_MOBILE,\n} from '../../constants';\nimport { GalleryContext } from '../../context';\nimport { type GalleryImage } from '../../types';\nimport { getImageAlt, isVideo } from '../../utils';\n\nimport { NoImagePaths } from './paths';\n\nimport styles from './index.module.css';\n\ntype Props = {\n image: GalleryImage;\n index: number;\n active?: boolean;\n onSelect: (index: number) => void;\n className: string;\n};\n\nexport const ImagePreview: FC<Props> = ({ image, active = false, index, onSelect, className }) => {\n const { imagesMeta, view } = useContext(GalleryContext);\n\n const isMobile = view === 'mobile';\n\n const previewWidth = isMobile ? PREVIEW_WIDTH_MOBILE : PREVIEW_WIDTH_DESKTOP;\n const previewHeight = isMobile ? PREVIEW_HEIGHT_MOBILE : PREVIEW_HEIGHT_DESKTOP;\n\n const ref = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const video = imagesMeta[index]?.player?.current;\n const context = canvas?.getContext('2d');\n const drawPreview = () => {\n if (video) {\n context?.drawImage(\n video,\n 0,\n 0,\n video.videoWidth / PREVIEW_VIDEO_MULTIPLIER,\n video.videoHeight / PREVIEW_VIDEO_MULTIPLIER,\n );\n }\n };\n\n drawPreview();\n\n if (isVideo(image.src)) {\n video?.addEventListener('canplay', drawPreview);\n }\n\n return () => {\n if (isVideo(image.src)) {\n video?.removeEventListener('canplay', drawPreview);\n }\n };\n }, [image.src, imagesMeta, index]);\n\n const handleClick = () => {\n onSelect(index);\n };\n\n const handleKeyDown: KeyboardEventHandler = (event) => {\n if (event.key === 'Enter') {\n onSelect(index);\n }\n };\n\n const handleDragStart: MouseEventHandler<HTMLDivElement> = (e) => {\n e.preventDefault();\n };\n\n const [focused] = useFocus(ref, 'keyboard');\n\n const meta = imagesMeta[index];\n\n const isBroken = Boolean(meta?.broken);\n\n const renderPreview = () => {\n if (isBroken) {\n return (\n <div\n className={cn(\n styles.preview,\n { [styles.mobile]: isMobile, [styles.active]: active },\n styles.brokenImageWrapper,\n )}\n >\n <div className={cn(styles.brokenIcon)}>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={previewWidth}\n height={previewHeight}\n viewBox={`${isMobile ? -6 : 0} ${\n isMobile ? -12 : 0\n } ${previewWidth} ${previewHeight}`}\n fill='none'\n >\n <rect fill='none' />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d={isMobile ? NoImagePaths.mobileImage : NoImagePaths.baseImage}\n fill='#89898A'\n />\n <path\n d={\n isMobile\n ? NoImagePaths.mobileTriangle\n : NoImagePaths.triangleImage\n }\n fill='#89898A'\n />\n </svg>\n </div>\n </div>\n );\n }\n\n if (image.previewSrc) {\n return (\n <div\n className={cn(styles.preview, styles.image, {\n [styles.loading]: !meta,\n [styles.mobile]: isMobile,\n })}\n >\n <img src={image.previewSrc} alt={getImageAlt(image, index)} />\n </div>\n );\n }\n\n if (isVideo(image.src)) {\n return (\n <div\n className={cn(styles.preview, styles.image, {\n [styles.loading]: !meta,\n [styles.mobile]: isMobile,\n })}\n >\n <canvas\n className={cn(styles.canvasPreview, { [styles.mobile]: isMobile })}\n data-testid='canvas'\n width={previewWidth}\n height={previewHeight}\n ref={canvasRef}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(styles.preview, styles.image, {\n [styles.loading]: !meta,\n [styles.mobile]: isMobile,\n })}\n >\n <img src={image.src} alt={getImageAlt(image, index)} />\n </div>\n );\n };\n\n return (\n <div\n className={cn(\n styles.component,\n {\n [styles.active]: active,\n [styles.focused]: focused,\n [styles.mobile]: isMobile,\n },\n className,\n )}\n onClick={handleClick}\n role='button'\n onKeyDown={handleKeyDown}\n onMouseDown={handleDragStart}\n tabIndex={0}\n ref={ref}\n aria-label={`Перейти к ${index + 1} элементу`}\n >\n {renderPreview()}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Component.js","sources":["../../../src/components/image-preview/Component.tsx"],"sourcesContent":["import React, {\n type FC,\n type KeyboardEventHandler,\n type MouseEventHandler,\n useContext,\n useEffect,\n useRef,\n} from 'react';\nimport cn from 'classnames';\n\nimport { useFocus } from '@alfalab/hooks';\n\nimport {\n PREVIEW_HEIGHT_DESKTOP,\n PREVIEW_HEIGHT_MOBILE,\n PREVIEW_VIDEO_MULTIPLIER,\n PREVIEW_WIDTH_DESKTOP,\n PREVIEW_WIDTH_MOBILE,\n} from '../../constants';\nimport { GalleryContext } from '../../context';\nimport { type GalleryImage } from '../../types';\nimport { getImageAlt, isVideo } from '../../utils';\n\nimport { NoImagePaths } from './paths';\n\nimport styles from './index.module.css';\n\ntype Props = {\n image: GalleryImage;\n index: number;\n active?: boolean;\n onSelect: (index: number) => void;\n className: string;\n};\n\nexport const ImagePreview: FC<Props> = ({ image, active = false, index, onSelect, className }) => {\n const { imagesMeta, view } = useContext(GalleryContext);\n\n const isMobile = view === 'mobile';\n\n const previewWidth = isMobile ? PREVIEW_WIDTH_MOBILE : PREVIEW_WIDTH_DESKTOP;\n const previewHeight = isMobile ? PREVIEW_HEIGHT_MOBILE : PREVIEW_HEIGHT_DESKTOP;\n\n const ref = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const video = imagesMeta[index]?.player?.current;\n const context = canvas?.getContext('2d');\n const drawPreview = () => {\n if (video) {\n context?.drawImage(\n video,\n 0,\n 0,\n video.videoWidth / PREVIEW_VIDEO_MULTIPLIER,\n video.videoHeight / PREVIEW_VIDEO_MULTIPLIER,\n );\n }\n };\n\n drawPreview();\n\n if (isVideo(image.src)) {\n video?.addEventListener('canplay', drawPreview);\n }\n\n return () => {\n if (isVideo(image.src)) {\n video?.removeEventListener('canplay', drawPreview);\n }\n };\n }, [image.src, imagesMeta, index]);\n\n const handleClick = () => {\n onSelect(index);\n };\n\n const handleKeyDown: KeyboardEventHandler = (event) => {\n if (event.key === 'Enter') {\n onSelect(index);\n }\n };\n\n const handleDragStart: MouseEventHandler<HTMLDivElement> = (e) => {\n e.preventDefault();\n };\n\n const [focused] = useFocus(ref, 'keyboard');\n\n const meta = imagesMeta[index];\n\n const isBroken = Boolean(meta?.broken);\n\n const renderPreview = () => {\n if (isBroken) {\n return (\n <div\n className={cn(\n styles.preview,\n { [styles.mobile]: isMobile, [styles.active]: active },\n styles.brokenImageWrapper,\n )}\n >\n <div className={cn(styles.brokenIcon)}>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width={previewWidth}\n height={previewHeight}\n viewBox={`${isMobile ? -6 : 0} ${\n isMobile ? -12 : 0\n } ${previewWidth} ${previewHeight}`}\n fill='none'\n >\n <rect fill='none' />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d={isMobile ? NoImagePaths.mobileImage : NoImagePaths.baseImage}\n fill='#89898A'\n />\n <path\n d={\n isMobile\n ? NoImagePaths.mobileTriangle\n : NoImagePaths.triangleImage\n }\n fill='#89898A'\n />\n </svg>\n </div>\n </div>\n );\n }\n\n if (image.previewSrc) {\n return (\n <div\n className={cn(styles.preview, styles.image, {\n [styles.loading]: !meta,\n [styles.mobile]: isMobile,\n })}\n >\n <img src={image.previewSrc} alt={getImageAlt(image, index)} />\n </div>\n );\n }\n\n if (isVideo(image.src)) {\n return (\n <div\n className={cn(styles.preview, styles.image, {\n [styles.loading]: !meta?.loaded,\n [styles.mobile]: isMobile,\n })}\n >\n <canvas\n className={cn(styles.canvasPreview, { [styles.mobile]: isMobile })}\n data-testid='canvas'\n width={previewWidth}\n height={previewHeight}\n ref={canvasRef}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(styles.preview, styles.image, {\n [styles.loading]: !meta,\n [styles.mobile]: isMobile,\n })}\n >\n <img src={image.src} alt={getImageAlt(image, index)} />\n </div>\n );\n };\n\n return (\n <div\n className={cn(\n styles.component,\n {\n [styles.active]: active,\n [styles.focused]: focused,\n [styles.mobile]: isMobile,\n },\n className,\n )}\n onClick={handleClick}\n role='button'\n onKeyDown={handleKeyDown}\n onMouseDown={handleDragStart}\n tabIndex={0}\n ref={ref}\n aria-label={`Перейти к ${index + 1} элементу`}\n >\n {renderPreview()}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  :root {
2
2
  --color-light-status-info: #2288fa;
3
3
  --color-static-neutral-100-inverted: #1c1c1e;
4
- --color-static-neutral-300-inverted: #29292c;
4
+ --color-static-neutral-translucent-100-inverted: rgba(214, 214, 229, 0.07);
5
5
  }
6
6
  :root {
7
7
  --border-radius-8: 8px;
@@ -10,23 +10,23 @@
10
10
  :root {
11
11
  --focus-color: var(--color-light-status-info);
12
12
  }
13
- .gallery__component_8gxye {
13
+ .gallery__component_1p08d {
14
14
  display: flex;
15
15
  z-index: 3;
16
16
  overflow: hidden;
17
17
  transition: border 0.15s ease-in-out;
18
18
  outline: none;
19
19
  }
20
- .gallery__component_8gxye .gallery__image_8gxye {
20
+ .gallery__component_1p08d .gallery__image_1p08d {
21
21
  opacity: 0.3;
22
22
  }
23
- .gallery__component_8gxye.gallery__mobile_8gxye {
23
+ .gallery__component_1p08d.gallery__mobile_1p08d {
24
24
  padding: 0;
25
25
  }
26
- .gallery__active_8gxye > .gallery__image_8gxye {
26
+ .gallery__active_1p08d > .gallery__image_1p08d {
27
27
  opacity: 1;
28
28
  }
29
- .gallery__preview_8gxye {
29
+ .gallery__preview_1p08d {
30
30
  width: 56px;
31
31
  height: 56px;
32
32
  flex-shrink: 0;
@@ -36,15 +36,15 @@
36
36
  -moz-user-select: none;
37
37
  user-select: none;
38
38
  }
39
- .gallery__preview_8gxye.gallery__mobile_8gxye {
39
+ .gallery__preview_1p08d.gallery__mobile_1p08d {
40
40
  width: 46px;
41
41
  height: 46px;
42
42
  border-radius: var(--border-radius-8);
43
43
  }
44
- .gallery__image_8gxye {
44
+ .gallery__image_1p08d {
45
45
  transition: opacity 0.15s ease-in-out;
46
46
  }
47
- .gallery__image_8gxye > img {
47
+ .gallery__image_1p08d > img {
48
48
  display: block;
49
49
  width: 100%;
50
50
  height: 100%;
@@ -54,36 +54,36 @@
54
54
  overflow: clip;
55
55
  overflow-clip-margin: border-box;
56
56
  }
57
- .gallery__image_8gxye:hover {
57
+ .gallery__image_1p08d:hover {
58
58
  opacity: 0.7;
59
59
  }
60
- .gallery__loading_8gxye {
60
+ .gallery__loading_1p08d {
61
61
  background-color: var(--color-static-neutral-100-inverted);
62
62
  }
63
- .gallery__loading_8gxye .gallery__active_8gxye {
64
- background-color: var(--color-static-neutral-300-inverted);
63
+ .gallery__loading_1p08d .gallery__active_1p08d {
64
+ background-color: var(--color-static-neutral-translucent-100-inverted);
65
65
  }
66
- .gallery__brokenImageWrapper_8gxye {
66
+ .gallery__brokenImageWrapper_1p08d {
67
67
  display: flex;
68
68
  justify-content: center;
69
69
  align-items: center;
70
- background-color: var(--color-static-neutral-300-inverted);
70
+ background-color: var(--color-static-neutral-translucent-100-inverted);
71
71
  opacity: 0.3;
72
72
  }
73
- .gallery__brokenImageWrapper_8gxye.gallery__active_8gxye {
73
+ .gallery__brokenImageWrapper_1p08d.gallery__active_1p08d {
74
74
  opacity: 1;
75
75
  }
76
- .gallery__brokenIcon_8gxye {
76
+ .gallery__brokenIcon_1p08d {
77
77
  width: 40px;
78
78
  height: 40px;
79
79
  }
80
- .gallery__focused_8gxye {
80
+ .gallery__focused_1p08d {
81
81
  outline: 2px solid var(--focus-color);
82
82
  outline-offset: 2px;
83
83
  }
84
- .gallery__canvasPreview_8gxye {
84
+ .gallery__canvasPreview_1p08d {
85
85
  border-radius: var(--border-radius-12);
86
86
  }
87
- .gallery__canvasPreview_8gxye.gallery__mobile_8gxye {
87
+ .gallery__canvasPreview_1p08d.gallery__mobile_1p08d {
88
88
  border-radius: var(--border-radius-8);
89
89
  }
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"component":"gallery__component_8gxye","image":"gallery__image_8gxye","mobile":"gallery__mobile_8gxye","active":"gallery__active_8gxye","preview":"gallery__preview_8gxye","loading":"gallery__loading_8gxye","brokenImageWrapper":"gallery__brokenImageWrapper_8gxye","brokenIcon":"gallery__brokenIcon_8gxye","focused":"gallery__focused_8gxye","canvasPreview":"gallery__canvasPreview_8gxye"};
3
+ const styles = {"component":"gallery__component_1p08d","image":"gallery__image_1p08d","mobile":"gallery__mobile_1p08d","active":"gallery__active_1p08d","preview":"gallery__preview_1p08d","loading":"gallery__loading_1p08d","brokenImageWrapper":"gallery__brokenImageWrapper_1p08d","brokenIcon":"gallery__brokenIcon_1p08d","focused":"gallery__focused_1p08d","canvasPreview":"gallery__canvasPreview_1p08d"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.css.js","sources":["../../src/components/image-preview/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n.component {\n display: flex;\n z-index: 3;\n overflow: hidden;\n transition: border 0.15s ease-in-out;\n outline: none;\n\n & .image {\n opacity: 0.3;\n }\n\n &.mobile {\n padding: 0;\n }\n}\n\n.active {\n & > .image {\n opacity: 1;\n }\n}\n\n.preview {\n width: 56px;\n height: 56px;\n flex-shrink: 0;\n border-radius: var(--border-radius-12);\n cursor: pointer;\n user-select: none;\n\n &.mobile {\n width: 46px;\n height: 46px;\n border-radius: var(--border-radius-8);\n }\n}\n\n.image {\n transition: opacity 0.15s ease-in-out;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n object-fit: cover;\n overflow: clip;\n overflow-clip-margin: border-box;\n }\n\n &:hover {\n opacity: 0.7;\n }\n}\n\n.loading {\n background-color: var(--color-static-neutral-100-inverted);\n\n & .active {\n background-color: var(--color-static-neutral-300-inverted);\n }\n}\n\n.brokenImageWrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--color-static-neutral-300-inverted);\n opacity: 0.3;\n\n &.active {\n opacity: 1;\n }\n}\n\n.brokenIcon {\n width: 40px;\n height: 40px;\n}\n\n.focused {\n @mixin focus-outline;\n}\n\n.canvasPreview {\n border-radius: var(--border-radius-12);\n\n &.mobile {\n border-radius: var(--border-radius-8);\n }\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,WAAW,CAAC,0BAA0B,CAAC,OAAO,CAAC,sBAAsB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,YAAY,CAAC,2BAA2B,CAAC,SAAS,CAAC,wBAAwB,CAAC,eAAe,CAAC,8BAA8B,CAAC;;;;"}
1
+ {"version":3,"file":"index.module.css.js","sources":["../../src/components/image-preview/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n.component {\n display: flex;\n z-index: 3;\n overflow: hidden;\n transition: border 0.15s ease-in-out;\n outline: none;\n\n & .image {\n opacity: 0.3;\n }\n\n &.mobile {\n padding: 0;\n }\n}\n\n.active {\n & > .image {\n opacity: 1;\n }\n}\n\n.preview {\n width: 56px;\n height: 56px;\n flex-shrink: 0;\n border-radius: var(--border-radius-12);\n cursor: pointer;\n user-select: none;\n\n &.mobile {\n width: 46px;\n height: 46px;\n border-radius: var(--border-radius-8);\n }\n}\n\n.image {\n transition: opacity 0.15s ease-in-out;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n object-fit: cover;\n overflow: clip;\n overflow-clip-margin: border-box;\n }\n\n &:hover {\n opacity: 0.7;\n }\n}\n\n.loading {\n background-color: var(--color-static-neutral-100-inverted);\n\n & .active {\n background-color: var(--color-static-neutral-translucent-100-inverted);\n }\n}\n\n.brokenImageWrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--color-static-neutral-translucent-100-inverted);\n opacity: 0.3;\n\n &.active {\n opacity: 1;\n }\n}\n\n.brokenIcon {\n width: 40px;\n height: 40px;\n}\n\n.focused {\n @mixin focus-outline;\n}\n\n.canvasPreview {\n border-radius: var(--border-radius-12);\n\n &.mobile {\n border-radius: var(--border-radius-8);\n }\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,WAAW,CAAC,0BAA0B,CAAC,OAAO,CAAC,sBAAsB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,YAAY,CAAC,2BAA2B,CAAC,SAAS,CAAC,wBAAwB,CAAC,eAAe,CAAC,8BAA8B,CAAC;;;;"}
@@ -21,8 +21,9 @@ const useHandleImageViewer = () => {
21
21
  const isArrow = leftArrowRef.current?.contains(eventTarget) ||
22
22
  rightArrowRef.current?.contains(eventTarget);
23
23
  const isPlaceholder = Boolean(eventTarget.closest(`.${styles.placeholder}`));
24
- const isImg = eventTarget.tagName === 'IMG';
25
- if (!isImg && !isPlaceholder && !isArrow && !isMobile) {
24
+ const isContentArea = Boolean(eventTarget.closest('[data-content-area]'));
25
+ // Закрываем галерею только при клике вне элементов контента и только на desktop
26
+ if (!isPlaceholder && !isArrow && !isContentArea && !isMobile) {
26
27
  onClose();
27
28
  }
28
29
  }, [isMobile, onClose]);
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":["../../../src/components/image-viewer/hooks.ts"],"sourcesContent":["import {\n type MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useContext,\n useEffect,\n useRef,\n} from 'react';\nimport elementClosest from 'element-closest';\n\nimport { GalleryContext } from '../../context';\n\nimport styles from './index.module.css';\n\nexport const useHandleImageViewer = () => {\n const { view, onClose, setImageMeta } = useContext(GalleryContext);\n\n const leftArrowRef = useRef<HTMLDivElement>(null);\n const rightArrowRef = useRef<HTMLDivElement>(null);\n\n const isMobile = view === 'mobile';\n\n const handleLoad = (event: SyntheticEvent<HTMLImageElement>, index: number) => {\n const target = event.currentTarget;\n\n const { naturalWidth, naturalHeight } = target;\n\n setImageMeta({ width: naturalWidth, height: naturalHeight }, index);\n };\n\n const handleLoadError = (index: number) => {\n setImageMeta({ width: 0, height: 0, broken: true }, index);\n };\n\n const handleWrapperClick = useCallback<MouseEventHandler>(\n (event) => {\n const eventTarget = event.target as HTMLElement;\n\n const isArrow =\n leftArrowRef.current?.contains(eventTarget) ||\n rightArrowRef.current?.contains(eventTarget);\n\n const isPlaceholder = Boolean(eventTarget.closest(`.${styles.placeholder}`));\n\n const isImg = eventTarget.tagName === 'IMG';\n\n if (!isImg && !isPlaceholder && !isArrow && !isMobile) {\n onClose();\n }\n },\n [isMobile, onClose],\n );\n\n useEffect(() => {\n elementClosest(window);\n }, []);\n\n return {\n handleLoad,\n handleLoadError,\n handleWrapperClick,\n isMobile,\n leftArrowRef,\n rightArrowRef,\n };\n};\n"],"names":[],"mappings":";;;;;AAcO,MAAM,oBAAoB,GAAG,MAAK;AACrC,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC;AAElE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC;AACjD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAiB,IAAI,CAAC;AAElD,IAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ;AAElC,IAAA,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAE,KAAa,KAAI;AAC1E,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;AAElC,QAAA,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM;AAE9C,QAAA,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC;AACvE,KAAC;AAED,IAAA,MAAM,eAAe,GAAG,CAAC,KAAa,KAAI;AACtC,QAAA,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC;AAC9D,KAAC;AAED,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAClC,CAAC,KAAK,KAAI;AACN,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB;QAE/C,MAAM,OAAO,GACT,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC;AAC3C,YAAA,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC;AAEhD,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,WAAW,CAAE,CAAA,CAAC,CAAC;AAE5E,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,KAAK,KAAK;AAE3C,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE;AACnD,YAAA,OAAO,EAAE;;AAEjB,KAAC,EACD,CAAC,QAAQ,EAAE,OAAO,CAAC,CACtB;IAED,SAAS,CAAC,MAAK;QACX,cAAc,CAAC,MAAM,CAAC;KACzB,EAAE,EAAE,CAAC;IAEN,OAAO;QACH,UAAU;QACV,eAAe;QACf,kBAAkB;QAClB,QAAQ;QACR,YAAY;QACZ,aAAa;KAChB;AACL;;;;"}
1
+ {"version":3,"file":"hooks.js","sources":["../../../src/components/image-viewer/hooks.ts"],"sourcesContent":["import {\n type MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useContext,\n useEffect,\n useRef,\n} from 'react';\nimport elementClosest from 'element-closest';\n\nimport { GalleryContext } from '../../context';\n\nimport styles from './index.module.css';\n\nexport const useHandleImageViewer = () => {\n const { view, onClose, setImageMeta } = useContext(GalleryContext);\n\n const leftArrowRef = useRef<HTMLDivElement>(null);\n const rightArrowRef = useRef<HTMLDivElement>(null);\n\n const isMobile = view === 'mobile';\n\n const handleLoad = (event: SyntheticEvent<HTMLImageElement>, index: number) => {\n const target = event.currentTarget;\n\n const { naturalWidth, naturalHeight } = target;\n\n setImageMeta({ width: naturalWidth, height: naturalHeight }, index);\n };\n\n const handleLoadError = (index: number) => {\n setImageMeta({ width: 0, height: 0, broken: true }, index);\n };\n\n const handleWrapperClick = useCallback<MouseEventHandler>(\n (event) => {\n const eventTarget = event.target as HTMLElement;\n\n const isArrow =\n leftArrowRef.current?.contains(eventTarget) ||\n rightArrowRef.current?.contains(eventTarget);\n\n const isPlaceholder = Boolean(eventTarget.closest(`.${styles.placeholder}`));\n\n const isContentArea = Boolean(eventTarget.closest('[data-content-area]'));\n\n // Закрываем галерею только при клике вне элементов контента и только на desktop\n if (!isPlaceholder && !isArrow && !isContentArea && !isMobile) {\n onClose();\n }\n },\n [isMobile, onClose],\n );\n\n useEffect(() => {\n elementClosest(window);\n }, []);\n\n return {\n handleLoad,\n handleLoadError,\n handleWrapperClick,\n isMobile,\n leftArrowRef,\n rightArrowRef,\n };\n};\n"],"names":[],"mappings":";;;;;AAcO,MAAM,oBAAoB,GAAG,MAAK;AACrC,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC;AAElE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC;AACjD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAiB,IAAI,CAAC;AAElD,IAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ;AAElC,IAAA,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAE,KAAa,KAAI;AAC1E,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;AAElC,QAAA,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM;AAE9C,QAAA,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC;AACvE,KAAC;AAED,IAAA,MAAM,eAAe,GAAG,CAAC,KAAa,KAAI;AACtC,QAAA,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC;AAC9D,KAAC;AAED,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAClC,CAAC,KAAK,KAAI;AACN,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB;QAE/C,MAAM,OAAO,GACT,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC;AAC3C,YAAA,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC;AAEhD,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,WAAW,CAAE,CAAA,CAAC,CAAC;QAE5E,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;;AAGzE,QAAA,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE;AAC3D,YAAA,OAAO,EAAE;;AAEjB,KAAC,EACD,CAAC,QAAQ,EAAE,OAAO,CAAC,CACtB;IAED,SAAS,CAAC,MAAK;QACX,cAAc,CAAC,MAAM,CAAC;KACzB,EAAE,EAAE,CAAC;IAEN,OAAO;QACH,UAAU;QACV,eAAe;QACf,kBAAkB;QAClB,QAAQ;QACR,YAAY;QACZ,aAAa;KAChB;AACL;;;;"}
@@ -3,7 +3,6 @@
3
3
  --color-static-neutral-0-inverted: #262629;
4
4
  --color-static-neutral-0-inverted-hover: #2f2f32;
5
5
  --color-static-neutral-0-inverted-press: #353539;
6
- --color-static-neutral-300-inverted: #29292c;
7
6
  --color-static-neutral-translucent-100-inverted: rgba(214, 214, 229, 0.07);
8
7
  --color-static-neutral-translucent-1300-inverted: rgba(255, 255, 255, 0.94);
9
8
  }
@@ -20,7 +19,7 @@
20
19
  :root {
21
20
  --focus-color: var(--color-light-status-info);
22
21
  }
23
- .gallery__component_j553i {
22
+ .gallery__component_15cn9 {
24
23
  display: flex;
25
24
  flex-grow: 1;
26
25
  justify-content: center;
@@ -88,7 +87,7 @@
88
87
  z-index: -1000;
89
88
  }
90
89
 
91
- .gallery__swiperFrame_j553i {
90
+ .gallery__swiperFrame_15cn9 {
92
91
  display: flex;
93
92
  flex: 1 1 0;
94
93
  min-width: 0;
@@ -100,17 +99,17 @@
100
99
  box-sizing: border-box;
101
100
  }
102
101
 
103
- .gallery__swiperFrame_j553i.gallery__mobile_j553i {
102
+ .gallery__swiperFrame_15cn9.gallery__mobile_15cn9 {
104
103
  max-height: calc(100vh - 210px);
105
104
  max-height: calc(100dvh - 210px);
106
105
  }
107
106
 
108
- .gallery__swiperFrame_j553i.gallery__mobileVideo_j553i {
107
+ .gallery__swiperFrame_15cn9.gallery__mobileVideo_15cn9 {
109
108
  max-height: 100vh;
110
109
  max-height: 100dvh;
111
110
  }
112
111
 
113
- .gallery__fullScreenFrame_j553i {
112
+ .gallery__fullScreenFrame_15cn9 {
114
113
  display: flex;
115
114
  align-items: center;
116
115
  justify-content: center;
@@ -123,7 +122,7 @@
123
122
  overflow: hidden;
124
123
  }
125
124
 
126
- .gallery__hiddenFrame_j553i {
125
+ .gallery__hiddenFrame_15cn9 {
127
126
  flex: 0 0 0;
128
127
  width: 0;
129
128
  height: 0;
@@ -131,16 +130,16 @@
131
130
  overflow: hidden;
132
131
  }
133
132
 
134
- .gallery__swiper_j553i {
133
+ .gallery__swiper_15cn9 {
135
134
  width: 100%;
136
135
  height: 100%;
137
136
  }
138
137
 
139
- .gallery__hidden_j553i {
138
+ .gallery__hidden_15cn9 {
140
139
  display: none;
141
140
  }
142
141
 
143
- .gallery__singleSlideContainer_j553i {
142
+ .gallery__singleSlideContainer_15cn9 {
144
143
  display: flex;
145
144
  width: 100%;
146
145
  height: 100%;
@@ -148,22 +147,22 @@
148
147
 
149
148
  max-height: calc(100vh - 80px);
150
149
  max-height: calc(100dvh - 80px);
151
- padding: var(--gap-32);
150
+ padding: var(--gap-0) var(--gap-32) var(--gap-32);
152
151
  box-sizing: border-box;
153
152
  }
154
153
 
155
- .gallery__singleSlideContainer_j553i.gallery__mobile_j553i {
154
+ .gallery__singleSlideContainer_15cn9.gallery__mobile_15cn9 {
156
155
  max-height: calc(100vh - 174px);
157
156
  max-height: calc(100dvh - 174px);
158
157
  padding: 0;
159
158
  }
160
159
 
161
- .gallery__singleSlideContainer_j553i.gallery__mobileVideo_j553i {
160
+ .gallery__singleSlideContainer_15cn9.gallery__mobileVideo_15cn9 {
162
161
  max-height: 100vh;
163
162
  max-height: 100dvh;
164
163
  }
165
164
 
166
- .gallery__slide_j553i {
165
+ .gallery__slide_15cn9 {
167
166
  position: relative;
168
167
  display: flex;
169
168
  justify-content: center;
@@ -172,17 +171,17 @@
172
171
  height: 100%;
173
172
  }
174
173
 
175
- .gallery__slideLoading_j553i {
174
+ .gallery__slideLoading_15cn9 {
176
175
  background-color: var(--color-static-neutral-translucent-100-inverted);
177
176
  border-radius: var(--border-radius-8);
178
177
  }
179
178
 
180
- .gallery__spinner_j553i {
179
+ .gallery__spinner_15cn9 {
181
180
  position: absolute;
182
181
  color: var(--color-static-neutral-translucent-1300-inverted);
183
182
  }
184
183
 
185
- .gallery__image_j553i {
184
+ .gallery__image_15cn9 {
186
185
  width: auto;
187
186
  height: auto;
188
187
  max-width: 100%;
@@ -195,11 +194,11 @@
195
194
  border-radius: var(--border-radius-8);
196
195
  }
197
196
 
198
- .gallery__image_j553i.gallery__mobile_j553i {
197
+ .gallery__image_15cn9.gallery__mobile_15cn9 {
199
198
  border-radius: var(--border-radius-0);
200
199
  }
201
200
 
202
- .gallery__smallImage_j553i {
201
+ .gallery__smallImage_15cn9 {
203
202
  position: relative;
204
203
  width: auto;
205
204
  height: auto;
@@ -212,17 +211,17 @@
212
211
  user-select: none;
213
212
  }
214
213
 
215
- .gallery__verticalImageFit_j553i {
214
+ .gallery__verticalImageFit_15cn9 {
216
215
  width: auto;
217
216
  height: 100%;
218
217
  }
219
218
 
220
- .gallery__horizontalImageFit_j553i {
219
+ .gallery__horizontalImageFit_15cn9 {
221
220
  width: 100%;
222
221
  height: auto;
223
222
  }
224
223
 
225
- .gallery__fullScreenMedia_j553i {
224
+ .gallery__fullScreenMedia_15cn9 {
226
225
  width: 100%;
227
226
  height: 100%;
228
227
  max-width: 100%;
@@ -232,7 +231,7 @@
232
231
  border-radius: var(--border-radius-0);
233
232
  }
234
233
 
235
- .gallery__arrow_j553i {
234
+ .gallery__arrow_15cn9 {
236
235
  display: flex;
237
236
  flex-direction: column;
238
237
  justify-content: center;
@@ -246,30 +245,30 @@
246
245
  outline: none;
247
246
  }
248
247
 
249
- .gallery__arrow_j553i:hover {
248
+ .gallery__arrow_15cn9:hover {
250
249
  background-color: var(--color-static-neutral-0-inverted-hover);
251
250
  }
252
251
 
253
- .gallery__arrow_j553i:active {
252
+ .gallery__arrow_15cn9:active {
254
253
  background-color: var(--color-static-neutral-0-inverted-press);
255
254
  }
256
255
 
257
- .gallery__focused_j553i {
256
+ .gallery__focused_15cn9 {
258
257
  outline: 2px solid var(--focus-color);
259
258
  outline-offset: 2px;
260
259
  }
261
260
 
262
- .gallery__placeholder_j553i {
261
+ .gallery__placeholder_15cn9 {
263
262
  display: flex;
264
263
  justify-content: center;
265
264
  align-items: center;
266
265
  width: 100%;
267
266
  height: 100%;
268
267
  border-radius: var(--border-radius-8);
269
- background-color: var(--color-static-neutral-300-inverted);
268
+ background-color: var(--color-static-neutral-translucent-100-inverted);
270
269
  }
271
270
 
272
- .gallery__brokenImgWrapper_j553i {
271
+ .gallery__brokenImgWrapper_15cn9 {
273
272
  position: relative;
274
273
  display: flex;
275
274
  flex-direction: column;
@@ -278,13 +277,13 @@
278
277
  text-align: center;
279
278
  }
280
279
 
281
- .gallery__brokenImgIcon_j553i {
280
+ .gallery__brokenImgIcon_15cn9 {
282
281
  width: 80px;
283
282
  height: 80px;
284
283
  margin-bottom: var(--gap-4);
285
284
  }
286
285
 
287
- .gallery__fullScreenVideo_j553i {
286
+ .gallery__fullScreenVideo_15cn9 {
288
287
  width: 100%;
289
288
  height: 100%;
290
289
  max-height: none;
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
 
3
- const styles = {"component":"gallery__component_j553i","swiperFrame":"gallery__swiperFrame_j553i","mobile":"gallery__mobile_j553i","mobileVideo":"gallery__mobileVideo_j553i","fullScreenFrame":"gallery__fullScreenFrame_j553i","hiddenFrame":"gallery__hiddenFrame_j553i","swiper":"gallery__swiper_j553i","hidden":"gallery__hidden_j553i","singleSlideContainer":"gallery__singleSlideContainer_j553i","slide":"gallery__slide_j553i","slideLoading":"gallery__slideLoading_j553i","spinner":"gallery__spinner_j553i","image":"gallery__image_j553i","smallImage":"gallery__smallImage_j553i","verticalImageFit":"gallery__verticalImageFit_j553i","horizontalImageFit":"gallery__horizontalImageFit_j553i","fullScreenMedia":"gallery__fullScreenMedia_j553i","arrow":"gallery__arrow_j553i","focused":"gallery__focused_j553i","placeholder":"gallery__placeholder_j553i","brokenImgWrapper":"gallery__brokenImgWrapper_j553i","brokenImgIcon":"gallery__brokenImgIcon_j553i","fullScreenVideo":"gallery__fullScreenVideo_j553i"};
3
+ const styles = {"component":"gallery__component_15cn9","swiperFrame":"gallery__swiperFrame_15cn9","mobile":"gallery__mobile_15cn9","mobileVideo":"gallery__mobileVideo_15cn9","fullScreenFrame":"gallery__fullScreenFrame_15cn9","hiddenFrame":"gallery__hiddenFrame_15cn9","swiper":"gallery__swiper_15cn9","hidden":"gallery__hidden_15cn9","singleSlideContainer":"gallery__singleSlideContainer_15cn9","slide":"gallery__slide_15cn9","slideLoading":"gallery__slideLoading_15cn9","spinner":"gallery__spinner_15cn9","image":"gallery__image_15cn9","smallImage":"gallery__smallImage_15cn9","verticalImageFit":"gallery__verticalImageFit_15cn9","horizontalImageFit":"gallery__horizontalImageFit_15cn9","fullScreenMedia":"gallery__fullScreenMedia_15cn9","arrow":"gallery__arrow_15cn9","focused":"gallery__focused_15cn9","placeholder":"gallery__placeholder_15cn9","brokenImgWrapper":"gallery__brokenImgWrapper_15cn9","brokenImgIcon":"gallery__brokenImgIcon_15cn9","fullScreenVideo":"gallery__fullScreenVideo_15cn9"};
4
4
 
5
5
  export { styles as default };
6
6
  //# sourceMappingURL=index.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.css.js","sources":["../../src/components/image-viewer/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n.component {\n display: flex;\n flex-grow: 1;\n justify-content: center;\n min-height: 0;\n background-color: var(--color-static-neutral-0-inverted);\n\n /* swiper/swiper.css; */\n :global(.swiper) {\n margin-left: auto;\n margin-right: auto;\n position: relative;\n overflow: hidden;\n list-style: none;\n padding: 0;\n z-index: 1;\n display: block;\n }\n :global(.swiper-wrapper) {\n position: relative;\n width: 100%;\n height: 100%;\n z-index: 1;\n display: flex;\n transition-property: transform;\n transition-timing-function: var(--swiper-wrapper-transition-timing-function, initial);\n box-sizing: content-box;\n }\n :global(.swiper-android) :global(.swiper-slide),\n :global(.swiper-ios) :global(.swiper-slide),\n :global(.swiper-wrapper) {\n transform: translate3d(0, 0, 0);\n }\n :global(.swiper-horizontal) {\n touch-action: pan-y;\n }\n :global(.swiper-slide) {\n flex-shrink: 0;\n width: 100%;\n height: 100%;\n position: relative;\n transition-property: transform;\n display: block;\n }\n :global(.swiper-slide-invisible-blank) {\n visibility: hidden;\n }\n :global(.swiper-autoheight),\n :global(.swiper-autoheight) :global(.swiper-slide) {\n height: auto;\n }\n :global(.swiper-autoheight) :global(.swiper-wrapper) {\n align-items: flex-start;\n transition-property: transform, height;\n }\n :global(.swiper-backface-hidden) :global(.swiper-slide) {\n transform: translateZ(0);\n backface-visibility: hidden;\n }\n\n /* swiper/modules/a11y.css */\n :global(.swiper) :global(.swiper-notification) {\n position: absolute;\n left: 0;\n top: 0;\n pointer-events: none;\n opacity: 0;\n z-index: -1000;\n }\n\n .swiperFrame {\n display: flex;\n flex: 1 1 0;\n min-width: 0;\n height: 100%;\n min-height: 0;\n\n /* 168px - высота хэдера и футера */\n max-height: calc(100vh - 168px);\n max-height: calc(100dvh - 168px);\n padding: var(--gap-32) var(--gap-16);\n box-sizing: border-box;\n\n &.mobile {\n max-height: calc(100vh - 210px);\n max-height: calc(100dvh - 210px);\n }\n\n &.mobileVideo {\n max-height: 100vh;\n max-height: 100dvh;\n }\n }\n\n .fullScreenFrame {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n max-height: none;\n min-height: 0;\n padding: var(--gap-0);\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .hiddenFrame {\n flex: 0 0 0;\n width: 0;\n height: 0;\n padding: var(--gap-0);\n overflow: hidden;\n }\n\n .swiper {\n width: 100%;\n height: 100%;\n }\n\n .hidden {\n display: none;\n }\n\n .singleSlideContainer {\n display: flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n\n max-height: calc(100vh - 80px);\n max-height: calc(100dvh - 80px);\n padding: var(--gap-32);\n box-sizing: border-box;\n\n &.mobile {\n max-height: calc(100vh - 174px);\n max-height: calc(100dvh - 174px);\n padding: 0;\n }\n\n &.mobileVideo {\n max-height: 100vh;\n max-height: 100dvh;\n }\n }\n\n .slide {\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n }\n\n .slideLoading {\n background-color: var(--color-static-neutral-translucent-100-inverted);\n border-radius: var(--border-radius-8);\n }\n\n .spinner {\n position: absolute;\n color: var(--color-static-neutral-translucent-1300-inverted);\n }\n\n .image {\n width: auto;\n height: auto;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n user-select: none;\n border-radius: var(--border-radius-8);\n\n &.mobile {\n border-radius: var(--border-radius-0);\n }\n }\n\n .smallImage {\n position: relative;\n width: auto;\n height: auto;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n user-select: none;\n }\n\n .verticalImageFit {\n width: auto;\n height: 100%;\n }\n\n .horizontalImageFit {\n width: 100%;\n height: auto;\n }\n\n .fullScreenMedia {\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: var(--border-radius-0);\n }\n\n .arrow {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n width: 96px;\n height: 100%;\n cursor: pointer;\n color: var(--color-static-neutral-translucent-1300-inverted);\n transition: background-color 0.15s ease-in-out;\n outline: none;\n\n &:hover {\n background-color: var(--color-static-neutral-0-inverted-hover);\n }\n\n &:active {\n background-color: var(--color-static-neutral-0-inverted-press);\n }\n }\n\n .focused {\n @mixin focus-outline;\n }\n\n .placeholder {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n border-radius: var(--border-radius-8);\n background-color: var(--color-static-neutral-300-inverted);\n }\n\n .brokenImgWrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 150px;\n text-align: center;\n }\n\n .brokenImgIcon {\n width: 80px;\n height: 80px;\n margin-bottom: var(--gap-4);\n }\n\n .fullScreenVideo {\n width: 100%;\n height: 100%;\n max-height: none;\n }\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,WAAW,CAAC,0BAA0B,CAAC,aAAa,CAAC,4BAA4B,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,aAAa,CAAC,4BAA4B,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,qCAAqC,CAAC,OAAO,CAAC,sBAAsB,CAAC,cAAc,CAAC,6BAA6B,CAAC,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,wBAAwB,CAAC,aAAa,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,eAAe,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,gCAAgC,CAAC;;;;"}
1
+ {"version":3,"file":"index.module.css.js","sources":["../../src/components/image-viewer/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n\n.component {\n display: flex;\n flex-grow: 1;\n justify-content: center;\n min-height: 0;\n background-color: var(--color-static-neutral-0-inverted);\n\n /* swiper/swiper.css; */\n :global(.swiper) {\n margin-left: auto;\n margin-right: auto;\n position: relative;\n overflow: hidden;\n list-style: none;\n padding: 0;\n z-index: 1;\n display: block;\n }\n :global(.swiper-wrapper) {\n position: relative;\n width: 100%;\n height: 100%;\n z-index: 1;\n display: flex;\n transition-property: transform;\n transition-timing-function: var(--swiper-wrapper-transition-timing-function, initial);\n box-sizing: content-box;\n }\n :global(.swiper-android) :global(.swiper-slide),\n :global(.swiper-ios) :global(.swiper-slide),\n :global(.swiper-wrapper) {\n transform: translate3d(0, 0, 0);\n }\n :global(.swiper-horizontal) {\n touch-action: pan-y;\n }\n :global(.swiper-slide) {\n flex-shrink: 0;\n width: 100%;\n height: 100%;\n position: relative;\n transition-property: transform;\n display: block;\n }\n :global(.swiper-slide-invisible-blank) {\n visibility: hidden;\n }\n :global(.swiper-autoheight),\n :global(.swiper-autoheight) :global(.swiper-slide) {\n height: auto;\n }\n :global(.swiper-autoheight) :global(.swiper-wrapper) {\n align-items: flex-start;\n transition-property: transform, height;\n }\n :global(.swiper-backface-hidden) :global(.swiper-slide) {\n transform: translateZ(0);\n backface-visibility: hidden;\n }\n\n /* swiper/modules/a11y.css */\n :global(.swiper) :global(.swiper-notification) {\n position: absolute;\n left: 0;\n top: 0;\n pointer-events: none;\n opacity: 0;\n z-index: -1000;\n }\n\n .swiperFrame {\n display: flex;\n flex: 1 1 0;\n min-width: 0;\n height: 100%;\n min-height: 0;\n\n /* 168px - высота хэдера и футера */\n max-height: calc(100vh - 168px);\n max-height: calc(100dvh - 168px);\n padding: var(--gap-32) var(--gap-16);\n box-sizing: border-box;\n\n &.mobile {\n max-height: calc(100vh - 210px);\n max-height: calc(100dvh - 210px);\n }\n\n &.mobileVideo {\n max-height: 100vh;\n max-height: 100dvh;\n }\n }\n\n .fullScreenFrame {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n max-height: none;\n min-height: 0;\n padding: var(--gap-0);\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .hiddenFrame {\n flex: 0 0 0;\n width: 0;\n height: 0;\n padding: var(--gap-0);\n overflow: hidden;\n }\n\n .swiper {\n width: 100%;\n height: 100%;\n }\n\n .hidden {\n display: none;\n }\n\n .singleSlideContainer {\n display: flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n\n max-height: calc(100vh - 80px);\n max-height: calc(100dvh - 80px);\n padding: var(--gap-0) var(--gap-32) var(--gap-32);\n box-sizing: border-box;\n\n &.mobile {\n max-height: calc(100vh - 174px);\n max-height: calc(100dvh - 174px);\n padding: 0;\n }\n\n &.mobileVideo {\n max-height: 100vh;\n max-height: 100dvh;\n }\n }\n\n .slide {\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n }\n\n .slideLoading {\n background-color: var(--color-static-neutral-translucent-100-inverted);\n border-radius: var(--border-radius-8);\n }\n\n .spinner {\n position: absolute;\n color: var(--color-static-neutral-translucent-1300-inverted);\n }\n\n .image {\n width: auto;\n height: auto;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n user-select: none;\n border-radius: var(--border-radius-8);\n\n &.mobile {\n border-radius: var(--border-radius-0);\n }\n }\n\n .smallImage {\n position: relative;\n width: auto;\n height: auto;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n user-select: none;\n }\n\n .verticalImageFit {\n width: auto;\n height: 100%;\n }\n\n .horizontalImageFit {\n width: 100%;\n height: auto;\n }\n\n .fullScreenMedia {\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: var(--border-radius-0);\n }\n\n .arrow {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n width: 96px;\n height: 100%;\n cursor: pointer;\n color: var(--color-static-neutral-translucent-1300-inverted);\n transition: background-color 0.15s ease-in-out;\n outline: none;\n\n &:hover {\n background-color: var(--color-static-neutral-0-inverted-hover);\n }\n\n &:active {\n background-color: var(--color-static-neutral-0-inverted-press);\n }\n }\n\n .focused {\n @mixin focus-outline;\n }\n\n .placeholder {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n border-radius: var(--border-radius-8);\n background-color: var(--color-static-neutral-translucent-100-inverted);\n }\n\n .brokenImgWrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 150px;\n text-align: center;\n }\n\n .brokenImgIcon {\n width: 80px;\n height: 80px;\n margin-bottom: var(--gap-4);\n }\n\n .fullScreenVideo {\n width: 100%;\n height: 100%;\n max-height: none;\n }\n}\n"],"names":[],"mappings":";;AAEgB,eAAe,CAAC,WAAW,CAAC,0BAA0B,CAAC,aAAa,CAAC,4BAA4B,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,aAAa,CAAC,4BAA4B,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,qCAAqC,CAAC,OAAO,CAAC,sBAAsB,CAAC,cAAc,CAAC,6BAA6B,CAAC,SAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,wBAAwB,CAAC,aAAa,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,eAAe,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,gCAAgC,CAAC;;;;"}
@@ -20,7 +20,7 @@ const SlideInner = ({ children, broken, loading, isVideoView }) => {
20
20
  React.createElement(TypographyText, { view: 'primary-small', color: 'static-secondary-light' },
21
21
  "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C ",
22
22
  isVideoView ? 'видео' : 'изображение'))) : (children);
23
- return (React.createElement("div", { className: cn(styles.slide, { [styles.slideLoading]: loading }) },
23
+ return (React.createElement("div", { className: cn(styles.slide, { [styles.slideLoading]: loading && !isVideoView }) },
24
24
  broken ? React.createElement("div", { className: styles.placeholder }, content) : content,
25
25
  React.createElement(Spinner, { className: styles.spinner, preset: 48, visible: loading })));
26
26
  };
@@ -49,7 +49,7 @@ const Slide = ({ isActive, meta, containerAspectRatio, imageAspectRatio, image,
49
49
  [styles.fullScreenMedia]: fullScreen,
50
50
  [styles.verticalImageFit]: verticalImageFit,
51
51
  [styles.horizontalImageFit]: horizontalImageFit,
52
- }), onLoad: (event) => handleLoad(event, index), onError: () => handleLoadError(index), style: imageStyle, "data-test-id": slideVisible ? TestIds.ACTIVE_IMAGE : undefined })));
52
+ }), onLoad: (event) => handleLoad(event, index), onError: () => handleLoadError(index), style: imageStyle, "data-content-area": 'true', "data-test-id": slideVisible ? TestIds.ACTIVE_IMAGE : undefined })));
53
53
  };
54
54
 
55
55
  export { Slide };
@@ -1 +1 @@
1
- {"version":3,"file":"slide.js","sources":["../../../src/components/image-viewer/slide.tsx"],"sourcesContent":["import React, { type FC, type ReactNode, useCallback, useContext } from 'react';\nimport cn from 'classnames';\n\nimport { Spinner } from '@alfalab/core-components-spinner';\nimport { TypographyText } from '@alfalab/core-components-typography';\n\nimport { GalleryContext } from '../../context';\nimport { type GalleryImage, type ImageMeta } from '../../types';\nimport { getImageAlt, isSmallImage, isVideo, TestIds } from '../../utils';\n\nimport { useHandleImageViewer } from './hooks';\nimport { NoImagePaths } from './paths';\nimport { Video } from './video';\n\nimport styles from './index.module.css';\n\ntype SlideInnerProps = {\n active: boolean;\n broken: boolean;\n loading: boolean;\n children: ReactNode;\n isVideoView?: boolean;\n};\n\nconst SlideInner: FC<SlideInnerProps> = ({ children, broken, loading, isVideoView }) => {\n const content = broken ? (\n <div className={styles.brokenImgWrapper}>\n <div className={styles.brokenImgIcon}>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='80'\n height='80'\n viewBox='0 0 80 80'\n fill='none'\n >\n <rect width='80' height='80' fill='none' />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d={NoImagePaths.baseImage}\n fill='#89898A'\n />\n <path d={NoImagePaths.triangleImage} fill='#89898A' />\n </svg>\n </div>\n\n <TypographyText view='primary-small' color='static-secondary-light'>\n Не удалось загрузить {isVideoView ? 'видео' : 'изображение'}\n </TypographyText>\n </div>\n ) : (\n children\n );\n\n return (\n <div className={cn(styles.slide, { [styles.slideLoading]: loading })}>\n {broken ? <div className={styles.placeholder}>{content}</div> : content}\n <Spinner className={styles.spinner} preset={48} visible={loading} />\n </div>\n );\n};\n\ntype SlideProps = {\n isActive: boolean;\n image: GalleryImage;\n meta?: ImageMeta;\n containerAspectRatio: number;\n imageAspectRatio: number;\n index: number;\n containerHeight: number;\n slideVisible: boolean;\n fullScreen?: boolean;\n};\n\nexport const Slide: FC<SlideProps> = ({\n isActive,\n meta,\n containerAspectRatio,\n imageAspectRatio,\n image,\n index,\n containerHeight,\n slideVisible,\n fullScreen,\n}) => {\n const { view } = useContext(GalleryContext);\n const { handleLoad, handleLoadError } = useHandleImageViewer();\n\n const broken = Boolean(meta?.broken);\n const small = isSmallImage(meta);\n const verticalImageFit = !small && containerAspectRatio > imageAspectRatio;\n const horizontalImageFit = !small && containerAspectRatio <= imageAspectRatio;\n const imageStyle =\n fullScreen || !containerHeight ? undefined : { maxHeight: `${containerHeight}px` };\n\n const handleImageRef = useCallback(\n (node: HTMLImageElement | null) => {\n if (node?.complete && node.naturalWidth > 0 && !meta) {\n handleLoad(\n { currentTarget: node } as React.SyntheticEvent<HTMLImageElement>,\n index,\n );\n }\n },\n [handleLoad, index, meta],\n );\n\n if (isVideo(image.src)) {\n return (\n <SlideInner isVideoView={true} active={isActive} broken={broken} loading={!meta}>\n <Video\n url={image.src}\n index={index}\n isActive={isActive}\n className={cn({ [styles.fullScreenMedia]: fullScreen })}\n />\n </SlideInner>\n );\n }\n\n return (\n <SlideInner active={isActive} broken={broken} loading={!meta}>\n <img\n ref={handleImageRef}\n src={image.src}\n alt={getImageAlt(image, index)}\n className={cn({\n [styles.smallImage]: small,\n [styles.image]: !small && meta,\n [styles.mobile]: view === 'mobile',\n [styles.fullScreenMedia]: fullScreen,\n [styles.verticalImageFit]: verticalImageFit,\n [styles.horizontalImageFit]: horizontalImageFit,\n })}\n onLoad={(event) => handleLoad(event, index)}\n onError={() => handleLoadError(index)}\n style={imageStyle}\n data-test-id={slideVisible ? TestIds.ACTIVE_IMAGE : undefined}\n />\n </SlideInner>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slide.js","sources":["../../../src/components/image-viewer/slide.tsx"],"sourcesContent":["import React, { type FC, type ReactNode, useCallback, useContext } from 'react';\nimport cn from 'classnames';\n\nimport { Spinner } from '@alfalab/core-components-spinner';\nimport { TypographyText } from '@alfalab/core-components-typography';\n\nimport { GalleryContext } from '../../context';\nimport { type GalleryImage, type ImageMeta } from '../../types';\nimport { getImageAlt, isSmallImage, isVideo, TestIds } from '../../utils';\n\nimport { useHandleImageViewer } from './hooks';\nimport { NoImagePaths } from './paths';\nimport { Video } from './video';\n\nimport styles from './index.module.css';\n\ntype SlideInnerProps = {\n active: boolean;\n broken: boolean;\n loading: boolean;\n children: ReactNode;\n isVideoView?: boolean;\n};\n\nconst SlideInner: FC<SlideInnerProps> = ({ children, broken, loading, isVideoView }) => {\n const content = broken ? (\n <div className={styles.brokenImgWrapper}>\n <div className={styles.brokenImgIcon}>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='80'\n height='80'\n viewBox='0 0 80 80'\n fill='none'\n >\n <rect width='80' height='80' fill='none' />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d={NoImagePaths.baseImage}\n fill='#89898A'\n />\n <path d={NoImagePaths.triangleImage} fill='#89898A' />\n </svg>\n </div>\n\n <TypographyText view='primary-small' color='static-secondary-light'>\n Не удалось загрузить {isVideoView ? 'видео' : 'изображение'}\n </TypographyText>\n </div>\n ) : (\n children\n );\n\n return (\n <div className={cn(styles.slide, { [styles.slideLoading]: loading && !isVideoView })}>\n {broken ? <div className={styles.placeholder}>{content}</div> : content}\n <Spinner className={styles.spinner} preset={48} visible={loading} />\n </div>\n );\n};\n\ntype SlideProps = {\n isActive: boolean;\n image: GalleryImage;\n meta?: ImageMeta;\n containerAspectRatio: number;\n imageAspectRatio: number;\n index: number;\n containerHeight: number;\n slideVisible: boolean;\n fullScreen?: boolean;\n};\n\nexport const Slide: FC<SlideProps> = ({\n isActive,\n meta,\n containerAspectRatio,\n imageAspectRatio,\n image,\n index,\n containerHeight,\n slideVisible,\n fullScreen,\n}) => {\n const { view } = useContext(GalleryContext);\n const { handleLoad, handleLoadError } = useHandleImageViewer();\n\n const broken = Boolean(meta?.broken);\n const small = isSmallImage(meta);\n const verticalImageFit = !small && containerAspectRatio > imageAspectRatio;\n const horizontalImageFit = !small && containerAspectRatio <= imageAspectRatio;\n const imageStyle =\n fullScreen || !containerHeight ? undefined : { maxHeight: `${containerHeight}px` };\n\n const handleImageRef = useCallback(\n (node: HTMLImageElement | null) => {\n if (node?.complete && node.naturalWidth > 0 && !meta) {\n handleLoad(\n { currentTarget: node } as React.SyntheticEvent<HTMLImageElement>,\n index,\n );\n }\n },\n [handleLoad, index, meta],\n );\n\n if (isVideo(image.src)) {\n return (\n <SlideInner isVideoView={true} active={isActive} broken={broken} loading={!meta}>\n <Video\n url={image.src}\n index={index}\n isActive={isActive}\n className={cn({ [styles.fullScreenMedia]: fullScreen })}\n />\n </SlideInner>\n );\n }\n\n return (\n <SlideInner active={isActive} broken={broken} loading={!meta}>\n <img\n ref={handleImageRef}\n src={image.src}\n alt={getImageAlt(image, index)}\n className={cn({\n [styles.smallImage]: small,\n [styles.image]: !small && meta,\n [styles.mobile]: view === 'mobile',\n [styles.fullScreenMedia]: fullScreen,\n [styles.verticalImageFit]: verticalImageFit,\n [styles.horizontalImageFit]: horizontalImageFit,\n })}\n onLoad={(event) => handleLoad(event, index)}\n onError={() => handleLoadError(index)}\n style={imageStyle}\n data-content-area='true'\n data-test-id={slideVisible ? TestIds.ACTIVE_IMAGE : undefined}\n />\n </SlideInner>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,32 +1,44 @@
1
1
  :root {
2
2
  --color-static-neutral-0: #fff;
3
+ --color-static-neutral-translucent-100-inverted: rgba(214, 214, 229, 0.07);
3
4
  --color-static-neutral-translucent-700: rgba(4, 4, 21, 0.47);
4
5
  }
5
6
  :root {
6
7
  --border-radius-0: 0;
7
8
  --border-radius-24: 24px;
8
9
  }
9
- .gallery__videoWrapper_gnw2e {
10
+ .gallery__videoWrapper_yf8l7 {
10
11
  display: flex;
11
12
  align-items: center;
12
13
  justify-content: center;
13
14
  height: 100%;
14
- width: 100%;
15
- min-width: 0;
16
- min-height: 0;
15
+ width: auto;
16
+ max-width: 100%;
17
17
  position: relative;
18
+ min-width: 300px;
19
+ min-height: 200px;
20
+ }
21
+ .gallery__mobileWrapper_yf8l7 {
22
+ width: 100%;
23
+ }
24
+ .gallery__videoWrapper_yf8l7.gallery__loading_yf8l7 {
25
+ width: 100%;
26
+ aspect-ratio: 16/9;
27
+ background-color: var(--color-static-neutral-translucent-100-inverted);
28
+ border-radius: var(--border-radius-24);
29
+ align-items: center;
18
30
  }
19
- .gallery__video_gnw2e {
31
+ .gallery__video_yf8l7 {
20
32
  max-width: 100%;
21
33
  max-height: 100%;
22
34
  -o-object-fit: contain;
23
35
  object-fit: contain;
24
36
  border-radius: var(--border-radius-24);
25
37
  }
26
- .gallery__mobile_gnw2e {
38
+ .gallery__mobile_yf8l7 {
27
39
  border-radius: var(--border-radius-0);
28
40
  }
29
- .gallery__videoButton_gnw2e {
41
+ .gallery__videoButton_yf8l7 {
30
42
  position: absolute;
31
43
  top: 50%;
32
44
  left: 50%;
@@ -34,13 +46,13 @@
34
46
  z-index: 1;
35
47
  color: green;
36
48
  }
37
- .gallery__icon_gnw2e {
49
+ .gallery__icon_yf8l7 {
38
50
  color: var(--color-static-neutral-0);
39
51
  }
40
- .gallery__iconShape_gnw2e {
52
+ .gallery__iconShape_yf8l7 {
41
53
  fill: var(--color-static-neutral-translucent-700);
42
54
  }
43
- .gallery__bottomButton_gnw2e {
55
+ .gallery__bottomButton_yf8l7 {
44
56
  position: absolute;
45
57
  bottom: 48px;
46
58
  left: 32px;