@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.
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +12 -2
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +68 -43
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts +1 -3
- package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelectInput.js +24 -19
- package/dist/cjs/components/CustomSelect/CustomSelectInput.js.map +1 -1
- package/dist/cjs/components/ImageBase/ImageBase.js +4 -1
- package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts +12 -2
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +60 -35
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput.d.ts +1 -3
- package/dist/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput.js +24 -19
- package/dist/components/CustomSelect/CustomSelectInput.js.map +1 -1
- package/dist/components/ImageBase/ImageBase.js +4 -1
- package/dist/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/components.css +2 -2
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +100 -148
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +12 -2
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +57 -34
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts +1 -3
- package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput.js +21 -16
- package/dist/cssm/components/CustomSelect/CustomSelectInput.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput.module.css +40 -74
- package/dist/cssm/components/ImageBase/ImageBase.js +4 -1
- package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cssm/components/ImageBase/ImageBase.module.css +13 -2
- package/dist/vkui.css +2 -2
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +100 -148
- package/package.json +1 -1
- package/src/components/CustomSelect/CustomSelect.tsx +98 -47
- package/src/components/CustomSelect/CustomSelectInput.module.css +35 -55
- package/src/components/CustomSelect/CustomSelectInput.tsx +35 -24
- package/src/components/ImageBase/ImageBase.module.css +13 -2
- package/src/components/ImageBase/ImageBase.tsx +1 -1
- package/dist/cjs/components/CustomSelect/helpers.d.ts +0 -8
- package/dist/cjs/components/CustomSelect/helpers.d.ts.map +0 -1
- package/dist/cjs/components/CustomSelect/helpers.js +0 -76
- package/dist/cjs/components/CustomSelect/helpers.js.map +0 -1
- package/dist/cjs/components/CustomSelect/types.d.ts +0 -12
- package/dist/cjs/components/CustomSelect/types.d.ts.map +0 -1
- package/dist/cjs/components/CustomSelect/types.js +0 -6
- package/dist/cjs/components/CustomSelect/types.js.map +0 -1
- package/dist/components/CustomSelect/helpers.d.ts +0 -8
- package/dist/components/CustomSelect/helpers.d.ts.map +0 -1
- package/dist/components/CustomSelect/helpers.js +0 -48
- package/dist/components/CustomSelect/helpers.js.map +0 -1
- package/dist/components/CustomSelect/types.d.ts +0 -12
- package/dist/components/CustomSelect/types.d.ts.map +0 -1
- package/dist/components/CustomSelect/types.js +0 -3
- package/dist/components/CustomSelect/types.js.map +0 -1
- package/dist/cssm/components/CustomSelect/helpers.d.ts +0 -8
- package/dist/cssm/components/CustomSelect/helpers.d.ts.map +0 -1
- package/dist/cssm/components/CustomSelect/helpers.js +0 -44
- package/dist/cssm/components/CustomSelect/helpers.js.map +0 -1
- package/dist/cssm/components/CustomSelect/types.d.ts +0 -12
- package/dist/cssm/components/CustomSelect/types.d.ts.map +0 -1
- package/dist/cssm/components/CustomSelect/types.js +0 -3
- package/dist/cssm/components/CustomSelect/types.js.map +0 -1
- package/src/components/CustomSelect/helpers.tsx +0 -61
- package/src/components/CustomSelect/types.ts +0 -15
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
position: relative;
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
-
.
|
|
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:
|
|
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
|
-
.
|
|
27
|
+
.CustomSelectInput__el--cursor-pointer {
|
|
55
28
|
cursor: pointer;
|
|
56
29
|
}
|
|
57
30
|
|
|
58
|
-
.CustomSelectInput--sizeY-compact .
|
|
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 .
|
|
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 .
|
|
41
|
+
.CustomSelectInput--hasBefore .CustomSelectInput__el {
|
|
69
42
|
-webkit-padding-start: 0;
|
|
70
43
|
padding-inline-start: 0;
|
|
71
44
|
}
|
|
72
45
|
|
|
73
|
-
.CustomSelectInput--hasAfter .
|
|
46
|
+
.CustomSelectInput--hasAfter .CustomSelectInput__el {
|
|
74
47
|
-webkit-padding-end: 0;
|
|
75
48
|
padding-inline-end: 0;
|
|
76
49
|
}
|
|
77
50
|
|
|
78
|
-
.
|
|
79
|
-
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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 .
|
|
71
|
+
.CustomSelectInput--multiline .CustomSelectInput__container {
|
|
117
72
|
padding-block: 12px;
|
|
118
73
|
}
|
|
119
74
|
|
|
120
|
-
.CustomSelectInput--sizeY-compact.CustomSelectInput--multiline .
|
|
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 .
|
|
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
|
-
.
|
|
98
|
+
.CustomSelectInput__title {
|
|
149
99
|
display: block;
|
|
150
100
|
}
|
|
151
101
|
|
|
152
|
-
.CustomSelectInput:not(.CustomSelectInput--multiline) .
|
|
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--
|
|
159
|
-
|
|
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 .
|
|
164
|
-
.CustomSelectInput--align-center .
|
|
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) .
|
|
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);
|