@vkontakte/vkui 6.5.2 → 6.5.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 (70) hide show
  1. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +12 -2
  2. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  3. package/dist/cjs/components/CustomSelect/CustomSelect.js +68 -43
  4. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  5. package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts +1 -3
  6. package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  7. package/dist/cjs/components/CustomSelect/CustomSelectInput.js +24 -19
  8. package/dist/cjs/components/CustomSelect/CustomSelectInput.js.map +1 -1
  9. package/dist/cjs/components/ImageBase/ImageBase.js +4 -1
  10. package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
  11. package/dist/components/CustomSelect/CustomSelect.d.ts +12 -2
  12. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  13. package/dist/components/CustomSelect/CustomSelect.js +60 -35
  14. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  15. package/dist/components/CustomSelect/CustomSelectInput.d.ts +1 -3
  16. package/dist/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  17. package/dist/components/CustomSelect/CustomSelectInput.js +24 -19
  18. package/dist/components/CustomSelect/CustomSelectInput.js.map +1 -1
  19. package/dist/components/ImageBase/ImageBase.js +4 -1
  20. package/dist/components/ImageBase/ImageBase.js.map +1 -1
  21. package/dist/components.css +2 -2
  22. package/dist/components.css.map +1 -1
  23. package/dist/components.js.tmp +100 -148
  24. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +12 -2
  25. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  26. package/dist/cssm/components/CustomSelect/CustomSelect.js +57 -34
  27. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  28. package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts +1 -3
  29. package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  30. package/dist/cssm/components/CustomSelect/CustomSelectInput.js +21 -16
  31. package/dist/cssm/components/CustomSelect/CustomSelectInput.js.map +1 -1
  32. package/dist/cssm/components/CustomSelect/CustomSelectInput.module.css +40 -74
  33. package/dist/cssm/components/ImageBase/ImageBase.js +4 -1
  34. package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
  35. package/dist/cssm/components/ImageBase/ImageBase.module.css +13 -2
  36. package/dist/vkui.css +2 -2
  37. package/dist/vkui.css.map +1 -1
  38. package/dist/vkui.js.tmp +100 -148
  39. package/package.json +1 -1
  40. package/src/components/CustomSelect/CustomSelect.tsx +98 -47
  41. package/src/components/CustomSelect/CustomSelectInput.module.css +35 -55
  42. package/src/components/CustomSelect/CustomSelectInput.tsx +35 -24
  43. package/src/components/ImageBase/ImageBase.module.css +13 -2
  44. package/src/components/ImageBase/ImageBase.tsx +1 -1
  45. package/dist/cjs/components/CustomSelect/helpers.d.ts +0 -8
  46. package/dist/cjs/components/CustomSelect/helpers.d.ts.map +0 -1
  47. package/dist/cjs/components/CustomSelect/helpers.js +0 -76
  48. package/dist/cjs/components/CustomSelect/helpers.js.map +0 -1
  49. package/dist/cjs/components/CustomSelect/types.d.ts +0 -12
  50. package/dist/cjs/components/CustomSelect/types.d.ts.map +0 -1
  51. package/dist/cjs/components/CustomSelect/types.js +0 -6
  52. package/dist/cjs/components/CustomSelect/types.js.map +0 -1
  53. package/dist/components/CustomSelect/helpers.d.ts +0 -8
  54. package/dist/components/CustomSelect/helpers.d.ts.map +0 -1
  55. package/dist/components/CustomSelect/helpers.js +0 -48
  56. package/dist/components/CustomSelect/helpers.js.map +0 -1
  57. package/dist/components/CustomSelect/types.d.ts +0 -12
  58. package/dist/components/CustomSelect/types.d.ts.map +0 -1
  59. package/dist/components/CustomSelect/types.js +0 -3
  60. package/dist/components/CustomSelect/types.js.map +0 -1
  61. package/dist/cssm/components/CustomSelect/helpers.d.ts +0 -8
  62. package/dist/cssm/components/CustomSelect/helpers.d.ts.map +0 -1
  63. package/dist/cssm/components/CustomSelect/helpers.js +0 -44
  64. package/dist/cssm/components/CustomSelect/helpers.js.map +0 -1
  65. package/dist/cssm/components/CustomSelect/types.d.ts +0 -12
  66. package/dist/cssm/components/CustomSelect/types.d.ts.map +0 -1
  67. package/dist/cssm/components/CustomSelect/types.js +0 -3
  68. package/dist/cssm/components/CustomSelect/types.js.map +0 -1
  69. package/src/components/CustomSelect/helpers.tsx +0 -61
  70. package/src/components/CustomSelect/types.ts +0 -15
@@ -2,10 +2,11 @@
2
2
  position: relative;
3
3
  }
4
4
 
5
- .CustomSelectInput__input {
5
+ .CustomSelectInput__el {
6
6
  position: absolute;
7
7
  inset-block-start: 0;
8
8
  inset-inline-start: 0;
9
+ z-index: var(--vkui_internal--z_index_form_field_element);
9
10
  inline-size: 100%;
10
11
  block-size: var(--vkui--size_field_height--regular);
11
12
  line-height: var(--vkui--size_field_height--regular);
@@ -17,112 +18,66 @@
17
18
  -webkit-appearance: none;
18
19
  -moz-appearance: none;
19
20
  appearance: none;
20
- color: inherit;
21
+ color: var(--vkui--color_text_primary);
21
22
  padding-block: 0;
22
23
  padding-inline: 12px;
23
24
  background: transparent;
24
- /*
25
- * По типy option.label может принимать React-компонент,
26
- * но React-компонент нельзя отрендерить как value в input.
27
- * Поэтому мы всегда стараемся прятать input и поверх рисовать конейнер,
28
- * в который можно положить label как строку или как React-компонент.
29
- * В то же время у input в value лежит текстовое представление
30
- * React компонента специально для скринридера.
31
- */
32
- opacity: 0;
33
- }
34
-
35
- /*
36
- * Но в режиме searchable, в фокусе мы наоборот, намеренно показываем
37
- * input и прячем декоративный label, так как нам важно дать пользователю
38
- * возможность изменить значение input для поиска.
39
- * А пользователям скринридера надо дать возможность прочитать выбранное значение.
40
- */
41
-
42
- .CustomSelectInput__input:not(:-moz-read-only):focus {
43
- opacity: 1;
44
- }
45
-
46
- .CustomSelectInput__input:not(:read-only):focus {
47
- opacity: 1;
48
- }
49
-
50
- .CustomSelectInput__input:-moz-read-only:not(:disabled) {
51
- cursor: pointer;
52
25
  }
53
26
 
54
- .CustomSelectInput__input:read-only:not(:disabled) {
27
+ .CustomSelectInput__el--cursor-pointer {
55
28
  cursor: pointer;
56
29
  }
57
30
 
58
- .CustomSelectInput--sizeY-compact .CustomSelectInput__input {
31
+ .CustomSelectInput--sizeY-compact .CustomSelectInput__el {
59
32
  block-size: var(--vkui--size_field_height--compact);
60
33
  }
61
34
 
62
35
  @media (pointer: fine) and (min-width: 768px),(max-height: 414.9px) {
63
- .CustomSelectInput--sizeY-none .CustomSelectInput__input {
36
+ .CustomSelectInput--sizeY-none .CustomSelectInput__el {
64
37
  block-size: var(--vkui--size_field_height--compact);
65
38
  }
66
39
  }
67
40
 
68
- .CustomSelectInput--hasBefore .CustomSelectInput__input {
41
+ .CustomSelectInput--hasBefore .CustomSelectInput__el {
69
42
  -webkit-padding-start: 0;
70
43
  padding-inline-start: 0;
71
44
  }
72
45
 
73
- .CustomSelectInput--hasAfter .CustomSelectInput__input {
46
+ .CustomSelectInput--hasAfter .CustomSelectInput__el {
74
47
  -webkit-padding-end: 0;
75
48
  padding-inline-end: 0;
76
49
  }
77
50
 
78
- .CustomSelectInput__input::-ms-input-placeholder {
79
- color: var(--vkui--color_text_secondary);
80
- /* Для Firefox: взято из Input.module.css */
81
- opacity: 1;
82
- }
83
-
84
- .CustomSelectInput__input::placeholder {
85
- color: var(--vkui--color_text_secondary);
86
- /* Для Firefox: взято из Input.module.css */
87
- opacity: 1;
51
+ .CustomSelectInput__el:disabled {
52
+ opacity: var(--vkui--opacity_disable_accessibility);
88
53
  }
89
54
 
90
- .CustomSelectInput__label-wrapper {
55
+ .CustomSelectInput__container {
56
+ z-index: var(--vkui_internal--z_index_form_field_element);
91
57
  inline-size: 100%;
92
58
  max-block-size: 100%;
93
59
  padding-inline: 12px 0;
60
+ color: var(--vkui--color_text_primary);
94
61
  box-sizing: border-box;
95
62
  overflow: hidden;
96
63
  pointer-events: none;
97
64
  }
98
65
 
99
- .CustomSelectInput__input:focus:not(:-moz-read-only) ~ .CustomSelectInput__label-wrapper {
100
- display: none;
101
- }
102
-
103
- .CustomSelectInput__input:focus:not(:read-only) ~ .CustomSelectInput__label-wrapper {
104
- display: none;
105
- }
106
-
107
- .CustomSelectInput__input:disabled ~ .CustomSelectInput__label-wrapper {
108
- opacity: var(--vkui--opacity_disable_accessibility);
109
- }
110
-
111
- .CustomSelectInput--hasBefore .CustomSelectInput__label-wrapper {
66
+ .CustomSelectInput--hasBefore .CustomSelectInput__container {
112
67
  -webkit-padding-start: 0;
113
68
  padding-inline-start: 0;
114
69
  }
115
70
 
116
- .CustomSelectInput--multiline .CustomSelectInput__label-wrapper {
71
+ .CustomSelectInput--multiline .CustomSelectInput__container {
117
72
  padding-block: 12px;
118
73
  }
119
74
 
120
- .CustomSelectInput--sizeY-compact.CustomSelectInput--multiline .CustomSelectInput__label-wrapper {
75
+ .CustomSelectInput--sizeY-compact.CustomSelectInput--multiline .CustomSelectInput__container {
121
76
  padding-block: 8px;
122
77
  }
123
78
 
124
79
  @media (pointer: fine) and (min-width: 768px),(max-height: 414.9px) {
125
- .CustomSelectInput--sizeY-none.CustomSelectInput--multiline .CustomSelectInput__label-wrapper {
80
+ .CustomSelectInput--sizeY-none.CustomSelectInput--multiline .CustomSelectInput__container {
126
81
  padding-block: 8px;
127
82
  }
128
83
  }
@@ -134,34 +89,45 @@
134
89
  align-items: center;
135
90
  flex: 1;
136
91
  overflow: hidden;
137
- color: var(--vkui--color_text_primary);
138
- }
139
-
140
- .CustomSelectInput--empty .CustomSelectInput__label-wrapper {
141
- color: var(--vkui--color_text_secondary);
142
92
  }
143
93
 
144
94
  .CustomSelectInput--hasBefore .CustomSelectInput__input-group {
145
95
  border-radius: 0;
146
96
  }
147
97
 
148
- .CustomSelectInput__label {
98
+ .CustomSelectInput__title {
149
99
  display: block;
150
100
  }
151
101
 
152
- .CustomSelectInput:not(.CustomSelectInput--multiline) .CustomSelectInput__label {
102
+ .CustomSelectInput:not(.CustomSelectInput--multiline) .CustomSelectInput__title {
153
103
  overflow: hidden;
154
104
  white-space: nowrap;
155
105
  text-overflow: ellipsis;
156
106
  }
157
107
 
158
- .CustomSelectInput--align-right .CustomSelectInput__label,
159
- .CustomSelectInput--align-right .CustomSelectInput__input {
108
+ .CustomSelectInput--empty .CustomSelectInput__title {
109
+ color: var(--vkui--color_text_secondary);
110
+ }
111
+
112
+ /* Для доступности placeholder в инпуте задан, но визуально не виден, потому что
113
+ * для комфортного управления видом плейсходера мы рендерим его отдельно, так же как и лэйбл
114
+ */
115
+
116
+ .CustomSelectInput__el::-ms-input-placeholder {
117
+ opacity: 0;
118
+ }
119
+
120
+ .CustomSelectInput__el::placeholder {
121
+ opacity: 0;
122
+ }
123
+
124
+ .CustomSelectInput--align-right .CustomSelectInput__title,
125
+ .CustomSelectInput--align-right .CustomSelectInput__el {
160
126
  text-align: end;
161
127
  }
162
128
 
163
- .CustomSelectInput--align-center .CustomSelectInput__label,
164
- .CustomSelectInput--align-center .CustomSelectInput__input {
129
+ .CustomSelectInput--align-center .CustomSelectInput__title,
130
+ .CustomSelectInput--align-center .CustomSelectInput__el {
165
131
  text-align: center;
166
132
  }
167
133
 
@@ -172,7 +138,7 @@
172
138
 
173
139
  /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
174
140
 
175
- :global(.vkuiInternalCalendarHeader__picker) .CustomSelectInput__label-wrapper {
141
+ :global(.vkuiInternalCalendarHeader__picker) .CustomSelectInput__container {
176
142
  -webkit-padding-end: 4px;
177
143
  padding-inline-end: 4px;
178
144
  }
@@ -130,7 +130,10 @@ const sizeToNumber = (size)=>{
130
130
  className: styles['ImageBase__fallback'],
131
131
  children: fallbackIcon
132
132
  }),
133
- children,
133
+ children && /*#__PURE__*/ _jsx("div", {
134
+ className: styles['ImageBase__children'],
135
+ children: children
136
+ }),
134
137
  !noBorder && /*#__PURE__*/ _jsx("div", {
135
138
  "aria-hidden": true,
136
139
  className: styles['ImageBase__border']
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ImageBase/ImageBase.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { minOr } from '../../lib/comparing';\nimport { getFetchPriorityProp } from '../../lib/utils';\nimport type { AnchorHTMLAttributesOnly, HasRef, HasRootRef, LiteralUnion } from '../../types';\nimport { Clickable } from '../Clickable/Clickable';\nimport { ImageBaseBadge, type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';\nimport { ImageBaseOverlay, type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';\nimport { ImageBaseContext } from './context';\nimport type { ImageBaseContextProps, ImageBaseExpectedIconProps, ImageBaseSize } from './types';\nimport { validateFallbackIcon, validateSize } from './validators';\nimport styles from './ImageBase.module.css';\n\nexport type {\n ImageBaseSize,\n ImageBaseExpectedIconProps,\n ImageBaseBadgeProps,\n ImageBaseOverlayProps,\n ImageBaseContextProps,\n};\n\nexport {\n getBadgeIconSizeByImageBaseSize,\n getFallbackIconSizeByImageBaseSize,\n getOverlayIconSizeByImageBaseSize,\n} from './helpers';\n\nexport { ImageBaseContext };\n\n/**\n * Размер по умолчанию.\n */\nconst defaultSize = 24;\n\nexport interface ImageBaseProps\n extends React.ImgHTMLAttributes<HTMLElement>,\n AnchorHTMLAttributesOnly,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLImageElement> {\n /**\n * Задаёт размер картинки.\n *\n * Используйте размеры заданные дизайн-системой `16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 56 | 64 | 72 | 80 | 88 | 96`.\n *\n * > ⚠️ Использование кастомного размера – это пограничный кейс.\n */\n size?: LiteralUnion<ImageBaseSize, number>;\n /**\n * Ширина изображения\n */\n widthSize?: number | string;\n /**\n * Высота изображения\n */\n heightSize?: number | string;\n /**\n * Отключает обводку.\n */\n noBorder?: boolean;\n /**\n * Фолбек на случай, если картинка не прогрузилась.\n *\n * > 📝 Нужный для `<ImageBase size={...} />` размер можно узнать из функции `getFallbackIconSizeByImageBaseSize()`.\n *\n * > Предпочтительней использовать иконки из `@vkontakte/icons`.\n *\n * > 📊️ Если вы хотите передать кастомную иконку, то следует именовать её по шаблону `Icon<size><name>`. Или же\n * > чтобы в неё был передан параметр `width`. Тогда мы сможем выводить в консоль подсказку правильного ли размера вы\n * > использовали иконку.\n *\n * > ⚠️ Может перекрывать `children`.\n */\n fallbackIcon?: React.ReactElement<ImageBaseExpectedIconProps>;\n /**\n * Отключает фон, заданный по умолчанию. Полезен для отображения картинок с прозрачностью.\n * @since 5.10.0\n */\n withTransparentBackground?: boolean;\n /**\n * Пользовательское значения стиля object-fit\n * Подробнее можно почитать в [документации](https://developer.mozilla.org/ru/docs/Web/CSS/object-fit)\n */\n objectFit?: React.CSSProperties['objectFit'];\n /**\n * Флаг для сохранения пропорций картинки.\n * Для корректной работы необходимо задать размеры хотя бы одной стороны картинки\n */\n keepAspectRatio?: boolean;\n}\n\nconst getObjectFitClassName = (objectFit: React.CSSProperties['objectFit']) => {\n switch (objectFit) {\n case 'contain':\n return styles['ImageBase__img--objectFit-contain'];\n case 'cover':\n return styles['ImageBase__img--objectFit-cover'];\n case 'none':\n return styles['ImageBase__img--objectFit-none'];\n case 'scale-down':\n return styles['ImageBase__img--objectFit-scaleDown'];\n }\n return undefined;\n};\n\nconst parsePx = (value: string): number | undefined => {\n if (value.endsWith('px')) {\n return parseInt(value);\n }\n return undefined;\n};\n\nconst sizeToNumber = (size: number | string | undefined): number | undefined => {\n if (typeof size === 'string') {\n return parsePx(size);\n }\n return size;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ImageBase\n */\nexport const ImageBase: React.FC<ImageBaseProps> & {\n Badge: typeof ImageBaseBadge;\n Overlay: typeof ImageBaseOverlay;\n} = ({\n alt,\n crossOrigin,\n decoding,\n loading,\n referrerPolicy,\n sizes,\n src,\n srcSet,\n useMap,\n fetchPriority,\n getRef,\n size: sizeProp,\n width: widthImg,\n height: heightImg,\n widthSize,\n heightSize,\n style,\n noBorder = false,\n fallbackIcon: fallbackIconProp,\n children,\n onLoad,\n onError,\n withTransparentBackground,\n objectFit = 'cover',\n keepAspectRatio = false,\n ...restProps\n}: ImageBaseProps) => {\n const size = sizeProp ?? minOr([sizeToNumber(widthSize), sizeToNumber(heightSize)], defaultSize);\n\n const width = widthSize ?? (keepAspectRatio ? undefined : size);\n const height = heightSize ?? (keepAspectRatio ? undefined : size);\n\n const [loaded, setLoaded] = React.useState(false);\n const [failed, setFailed] = React.useState(false);\n\n const hasSrc = src || srcSet;\n const needShowFallbackIcon = (failed || !hasSrc) && React.isValidElement(fallbackIconProp);\n\n const fallbackIcon = needShowFallbackIcon ? fallbackIconProp : null;\n\n if (process.env.NODE_ENV === 'development') {\n validateSize(size);\n if (fallbackIcon) {\n validateFallbackIcon(size, { name: 'fallbackIcon', value: fallbackIcon });\n }\n }\n\n const handleImageLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n if (loaded) {\n return;\n }\n\n setLoaded(true);\n setFailed(false);\n onLoad?.(event);\n };\n\n const handleImageError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(false);\n setFailed(true);\n onError?.(event);\n };\n\n const imgRef = useExternRef(getRef);\n const isOnLoadStatusCheckedRef = React.useRef(false);\n React.useEffect(\n function dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater() {\n if (isOnLoadStatusCheckedRef.current) {\n return;\n }\n isOnLoadStatusCheckedRef.current = true;\n\n if (imgRef.current && imgRef.current.complete && !loaded) {\n const event = new Event('load');\n imgRef.current.dispatchEvent(event);\n }\n },\n [imgRef, loaded],\n );\n\n return (\n <ImageBaseContext.Provider value={{ size }}>\n <Clickable\n style={{ width, height, ...style }}\n baseClassName={classNames(\n styles['ImageBase'],\n loaded && styles['ImageBase--loaded'],\n withTransparentBackground && styles['ImageBase--transparent-background'],\n )}\n {...restProps}\n >\n {hasSrc && (\n <img\n ref={imgRef}\n alt={alt}\n className={classNames(\n styles['ImageBase__img'],\n getObjectFitClassName(objectFit),\n keepAspectRatio && styles['ImageBase__img--keepRatio'],\n )}\n crossOrigin={crossOrigin}\n decoding={decoding}\n loading={loading}\n referrerPolicy={referrerPolicy}\n style={\n keepAspectRatio\n ? {\n width: widthImg || width,\n height: heightImg || height,\n }\n : undefined\n }\n sizes={sizes}\n src={src}\n srcSet={srcSet}\n useMap={useMap}\n width={widthImg}\n height={heightImg}\n onLoad={handleImageLoad}\n onError={handleImageError}\n {...getFetchPriorityProp(fetchPriority)}\n />\n )}\n {fallbackIcon && <div className={styles['ImageBase__fallback']}>{fallbackIcon}</div>}\n {children}\n {!noBorder && <div aria-hidden className={styles['ImageBase__border']} />}\n </Clickable>\n </ImageBaseContext.Provider>\n );\n};\n\nImageBase.displayName = 'ImageBase';\n\nImageBase.Badge = ImageBaseBadge;\nImageBase.Badge.displayName = 'ImageBase.Badge';\n\nImageBase.Overlay = ImageBaseOverlay;\nImageBase.Overlay.displayName = 'ImageBase.Overlay';\n"],"names":["React","classNames","useExternRef","minOr","getFetchPriorityProp","Clickable","ImageBaseBadge","ImageBaseOverlay","ImageBaseContext","validateFallbackIcon","validateSize","styles","getBadgeIconSizeByImageBaseSize","getFallbackIconSizeByImageBaseSize","getOverlayIconSizeByImageBaseSize","defaultSize","getObjectFitClassName","objectFit","undefined","parsePx","value","endsWith","parseInt","sizeToNumber","size","ImageBase","alt","crossOrigin","decoding","loading","referrerPolicy","sizes","src","srcSet","useMap","fetchPriority","getRef","sizeProp","width","widthImg","height","heightImg","widthSize","heightSize","style","noBorder","fallbackIcon","fallbackIconProp","children","onLoad","onError","withTransparentBackground","keepAspectRatio","restProps","loaded","setLoaded","useState","failed","setFailed","hasSrc","needShowFallbackIcon","isValidElement","process","env","NODE_ENV","name","handleImageLoad","event","handleImageError","imgRef","isOnLoadStatusCheckedRef","useRef","useEffect","dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater","current","complete","Event","dispatchEvent","Provider","baseClassName","img","ref","className","div","aria-hidden","displayName","Badge","Overlay"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/ImageBase/ImageBase.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { minOr } from '../../lib/comparing';\nimport { getFetchPriorityProp } from '../../lib/utils';\nimport type { AnchorHTMLAttributesOnly, HasRef, HasRootRef, LiteralUnion } from '../../types';\nimport { Clickable } from '../Clickable/Clickable';\nimport { ImageBaseBadge, type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';\nimport { ImageBaseOverlay, type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';\nimport { ImageBaseContext } from './context';\nimport type { ImageBaseContextProps, ImageBaseExpectedIconProps, ImageBaseSize } from './types';\nimport { validateFallbackIcon, validateSize } from './validators';\nimport styles from './ImageBase.module.css';\n\nexport type {\n ImageBaseSize,\n ImageBaseExpectedIconProps,\n ImageBaseBadgeProps,\n ImageBaseOverlayProps,\n ImageBaseContextProps,\n};\n\nexport {\n getBadgeIconSizeByImageBaseSize,\n getFallbackIconSizeByImageBaseSize,\n getOverlayIconSizeByImageBaseSize,\n} from './helpers';\n\nexport { ImageBaseContext };\n\n/**\n * Размер по умолчанию.\n */\nconst defaultSize = 24;\n\nexport interface ImageBaseProps\n extends React.ImgHTMLAttributes<HTMLElement>,\n AnchorHTMLAttributesOnly,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLImageElement> {\n /**\n * Задаёт размер картинки.\n *\n * Используйте размеры заданные дизайн-системой `16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 56 | 64 | 72 | 80 | 88 | 96`.\n *\n * > ⚠️ Использование кастомного размера – это пограничный кейс.\n */\n size?: LiteralUnion<ImageBaseSize, number>;\n /**\n * Ширина изображения\n */\n widthSize?: number | string;\n /**\n * Высота изображения\n */\n heightSize?: number | string;\n /**\n * Отключает обводку.\n */\n noBorder?: boolean;\n /**\n * Фолбек на случай, если картинка не прогрузилась.\n *\n * > 📝 Нужный для `<ImageBase size={...} />` размер можно узнать из функции `getFallbackIconSizeByImageBaseSize()`.\n *\n * > Предпочтительней использовать иконки из `@vkontakte/icons`.\n *\n * > 📊️ Если вы хотите передать кастомную иконку, то следует именовать её по шаблону `Icon<size><name>`. Или же\n * > чтобы в неё был передан параметр `width`. Тогда мы сможем выводить в консоль подсказку правильного ли размера вы\n * > использовали иконку.\n *\n * > ⚠️ Может перекрывать `children`.\n */\n fallbackIcon?: React.ReactElement<ImageBaseExpectedIconProps>;\n /**\n * Отключает фон, заданный по умолчанию. Полезен для отображения картинок с прозрачностью.\n * @since 5.10.0\n */\n withTransparentBackground?: boolean;\n /**\n * Пользовательское значения стиля object-fit\n * Подробнее можно почитать в [документации](https://developer.mozilla.org/ru/docs/Web/CSS/object-fit)\n */\n objectFit?: React.CSSProperties['objectFit'];\n /**\n * Флаг для сохранения пропорций картинки.\n * Для корректной работы необходимо задать размеры хотя бы одной стороны картинки\n */\n keepAspectRatio?: boolean;\n}\n\nconst getObjectFitClassName = (objectFit: React.CSSProperties['objectFit']) => {\n switch (objectFit) {\n case 'contain':\n return styles['ImageBase__img--objectFit-contain'];\n case 'cover':\n return styles['ImageBase__img--objectFit-cover'];\n case 'none':\n return styles['ImageBase__img--objectFit-none'];\n case 'scale-down':\n return styles['ImageBase__img--objectFit-scaleDown'];\n }\n return undefined;\n};\n\nconst parsePx = (value: string): number | undefined => {\n if (value.endsWith('px')) {\n return parseInt(value);\n }\n return undefined;\n};\n\nconst sizeToNumber = (size: number | string | undefined): number | undefined => {\n if (typeof size === 'string') {\n return parsePx(size);\n }\n return size;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ImageBase\n */\nexport const ImageBase: React.FC<ImageBaseProps> & {\n Badge: typeof ImageBaseBadge;\n Overlay: typeof ImageBaseOverlay;\n} = ({\n alt,\n crossOrigin,\n decoding,\n loading,\n referrerPolicy,\n sizes,\n src,\n srcSet,\n useMap,\n fetchPriority,\n getRef,\n size: sizeProp,\n width: widthImg,\n height: heightImg,\n widthSize,\n heightSize,\n style,\n noBorder = false,\n fallbackIcon: fallbackIconProp,\n children,\n onLoad,\n onError,\n withTransparentBackground,\n objectFit = 'cover',\n keepAspectRatio = false,\n ...restProps\n}: ImageBaseProps) => {\n const size = sizeProp ?? minOr([sizeToNumber(widthSize), sizeToNumber(heightSize)], defaultSize);\n\n const width = widthSize ?? (keepAspectRatio ? undefined : size);\n const height = heightSize ?? (keepAspectRatio ? undefined : size);\n\n const [loaded, setLoaded] = React.useState(false);\n const [failed, setFailed] = React.useState(false);\n\n const hasSrc = src || srcSet;\n const needShowFallbackIcon = (failed || !hasSrc) && React.isValidElement(fallbackIconProp);\n\n const fallbackIcon = needShowFallbackIcon ? fallbackIconProp : null;\n\n if (process.env.NODE_ENV === 'development') {\n validateSize(size);\n if (fallbackIcon) {\n validateFallbackIcon(size, { name: 'fallbackIcon', value: fallbackIcon });\n }\n }\n\n const handleImageLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n if (loaded) {\n return;\n }\n\n setLoaded(true);\n setFailed(false);\n onLoad?.(event);\n };\n\n const handleImageError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(false);\n setFailed(true);\n onError?.(event);\n };\n\n const imgRef = useExternRef(getRef);\n const isOnLoadStatusCheckedRef = React.useRef(false);\n React.useEffect(\n function dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater() {\n if (isOnLoadStatusCheckedRef.current) {\n return;\n }\n isOnLoadStatusCheckedRef.current = true;\n\n if (imgRef.current && imgRef.current.complete && !loaded) {\n const event = new Event('load');\n imgRef.current.dispatchEvent(event);\n }\n },\n [imgRef, loaded],\n );\n\n return (\n <ImageBaseContext.Provider value={{ size }}>\n <Clickable\n style={{ width, height, ...style }}\n baseClassName={classNames(\n styles['ImageBase'],\n loaded && styles['ImageBase--loaded'],\n withTransparentBackground && styles['ImageBase--transparent-background'],\n )}\n {...restProps}\n >\n {hasSrc && (\n <img\n ref={imgRef}\n alt={alt}\n className={classNames(\n styles['ImageBase__img'],\n getObjectFitClassName(objectFit),\n keepAspectRatio && styles['ImageBase__img--keepRatio'],\n )}\n crossOrigin={crossOrigin}\n decoding={decoding}\n loading={loading}\n referrerPolicy={referrerPolicy}\n style={\n keepAspectRatio\n ? {\n width: widthImg || width,\n height: heightImg || height,\n }\n : undefined\n }\n sizes={sizes}\n src={src}\n srcSet={srcSet}\n useMap={useMap}\n width={widthImg}\n height={heightImg}\n onLoad={handleImageLoad}\n onError={handleImageError}\n {...getFetchPriorityProp(fetchPriority)}\n />\n )}\n {fallbackIcon && <div className={styles['ImageBase__fallback']}>{fallbackIcon}</div>}\n {children && <div className={styles['ImageBase__children']}>{children}</div>}\n {!noBorder && <div aria-hidden className={styles['ImageBase__border']} />}\n </Clickable>\n </ImageBaseContext.Provider>\n );\n};\n\nImageBase.displayName = 'ImageBase';\n\nImageBase.Badge = ImageBaseBadge;\nImageBase.Badge.displayName = 'ImageBase.Badge';\n\nImageBase.Overlay = ImageBaseOverlay;\nImageBase.Overlay.displayName = 'ImageBase.Overlay';\n"],"names":["React","classNames","useExternRef","minOr","getFetchPriorityProp","Clickable","ImageBaseBadge","ImageBaseOverlay","ImageBaseContext","validateFallbackIcon","validateSize","styles","getBadgeIconSizeByImageBaseSize","getFallbackIconSizeByImageBaseSize","getOverlayIconSizeByImageBaseSize","defaultSize","getObjectFitClassName","objectFit","undefined","parsePx","value","endsWith","parseInt","sizeToNumber","size","ImageBase","alt","crossOrigin","decoding","loading","referrerPolicy","sizes","src","srcSet","useMap","fetchPriority","getRef","sizeProp","width","widthImg","height","heightImg","widthSize","heightSize","style","noBorder","fallbackIcon","fallbackIconProp","children","onLoad","onError","withTransparentBackground","keepAspectRatio","restProps","loaded","setLoaded","useState","failed","setFailed","hasSrc","needShowFallbackIcon","isValidElement","process","env","NODE_ENV","name","handleImageLoad","event","handleImageError","imgRef","isOnLoadStatusCheckedRef","useRef","useEffect","dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater","current","complete","Event","dispatchEvent","Provider","baseClassName","img","ref","className","div","aria-hidden","displayName","Badge","Overlay"],"mappings":"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"}
@@ -16,14 +16,25 @@
16
16
  background-color: transparent;
17
17
  }
18
18
 
19
+ .ImageBase__children,
19
20
  .ImageBase__border {
20
- pointer-events: none;
21
21
  position: absolute;
22
- z-index: var(--vkui_internal--z_index_image_base_border);
23
22
  inset-inline-start: 0;
24
23
  inset-block-start: 0;
25
24
  inline-size: 100%;
26
25
  block-size: 100%;
26
+ }
27
+
28
+ .ImageBase__children {
29
+ display: inherit;
30
+ align-items: inherit;
31
+ justify-content: inherit;
32
+ border-radius: inherit;
33
+ }
34
+
35
+ .ImageBase__border {
36
+ pointer-events: none;
37
+ z-index: var(--vkui_internal--z_index_image_base_border);
27
38
  box-sizing: border-box;
28
39
  transform-origin: left top;
29
40
  border: var(--vkui--size_border--regular) solid var(--vkui--color_image_border_alpha);