@vkontakte/vkui 7.3.2 → 7.3.3
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/components/FormItem/FormItem.d.ts.map +1 -1
- package/dist/components/FormItem/FormItem.js +4 -2
- package/dist/components/FormItem/FormItem.js.map +1 -1
- package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts +1 -1
- package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
- package/dist/components/FormLayoutGroup/FormLayoutGroup.js +6 -3
- package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
- package/dist/components/Search/Search.d.ts +2 -2
- package/dist/components/Search/Search.d.ts.map +1 -1
- package/dist/components/Search/Search.js.map +1 -1
- package/dist/components/Touch/Touch.d.ts.map +1 -1
- package/dist/components/Touch/Touch.js +27 -7
- package/dist/components/Touch/Touch.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/FormItem/FormItem.js +2 -1
- package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
- package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +3 -1
- package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
- package/dist/cssm/components/Search/Search.js.map +1 -1
- package/dist/cssm/components/Touch/Touch.js +27 -7
- package/dist/cssm/components/Touch/Touch.js.map +1 -1
- package/dist/cssm/components/WriteBar/WriteBar.module.css +7 -0
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +1 -1
- package/src/components/FormItem/FormItem.tsx +2 -0
- package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +3 -0
- package/src/components/Search/Search.tsx +3 -3
- package/src/components/Touch/Touch.tsx +70 -52
- package/src/components/WriteBar/WriteBar.module.css +7 -0
- package/src/components/WriteBar/WriteBar.module.css.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -104,6 +104,7 @@ export const FormItem: React.FC<FormItemProps> & {
|
|
|
104
104
|
bottomId,
|
|
105
105
|
noPadding,
|
|
106
106
|
required = false,
|
|
107
|
+
disabled,
|
|
107
108
|
...restProps
|
|
108
109
|
}: FormItemProps) => {
|
|
109
110
|
const rootEl = useExternRef(getRootRef);
|
|
@@ -161,6 +162,7 @@ export const FormItem: React.FC<FormItemProps> & {
|
|
|
161
162
|
removePlaceholder={removePlaceholder}
|
|
162
163
|
indent={removable === 'indent'}
|
|
163
164
|
noPadding={noPadding}
|
|
165
|
+
disabled={disabled}
|
|
164
166
|
>
|
|
165
167
|
<div className={classNames(styles.removable, 'vkuiInternalFormItem__removable')}>
|
|
166
168
|
{wrappedChildren}
|
|
@@ -45,6 +45,7 @@ export const FormLayoutGroup = ({
|
|
|
45
45
|
removePlaceholder = 'Удалить',
|
|
46
46
|
onRemove,
|
|
47
47
|
getRootRef,
|
|
48
|
+
disabled,
|
|
48
49
|
...restProps
|
|
49
50
|
}: FormLayoutGroupProps): React.ReactNode => {
|
|
50
51
|
const { sizeY = 'none' } = useAdaptivity();
|
|
@@ -64,6 +65,7 @@ export const FormLayoutGroup = ({
|
|
|
64
65
|
isRemovable && classNames(styles.withRemovable, 'vkuiInternalFormLayoutGroup--removable'),
|
|
65
66
|
segmented && classNames(styles.segmented, 'vkuiInternalFormLayoutGroup--segmented'),
|
|
66
67
|
)}
|
|
68
|
+
disabled={disabled}
|
|
67
69
|
{...restProps}
|
|
68
70
|
>
|
|
69
71
|
{isRemovable ? (
|
|
@@ -76,6 +78,7 @@ export const FormLayoutGroup = ({
|
|
|
76
78
|
onRemove?.(e, rootEl.current);
|
|
77
79
|
}
|
|
78
80
|
}}
|
|
81
|
+
disabled={disabled}
|
|
79
82
|
indent={removable === 'indent'}
|
|
80
83
|
>
|
|
81
84
|
{children}
|
|
@@ -13,7 +13,7 @@ import { usePlatform } from '../../hooks/usePlatform';
|
|
|
13
13
|
import { callMultiple } from '../../lib/callMultiple';
|
|
14
14
|
import { touchEnabled } from '../../lib/touch';
|
|
15
15
|
import { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';
|
|
16
|
-
import type { HasRef, HasRootRef } from '../../types';
|
|
16
|
+
import type { HasDataAttribute, HasRef, HasRootRef } from '../../types';
|
|
17
17
|
import { Button } from '../Button/Button';
|
|
18
18
|
import { IconButton, type IconButtonProps } from '../IconButton/IconButton';
|
|
19
19
|
import { Headline } from '../Typography/Headline/Headline';
|
|
@@ -22,8 +22,8 @@ import styles from './Search.module.css';
|
|
|
22
22
|
|
|
23
23
|
export type RenderIconButtonFn = (
|
|
24
24
|
icon: React.ReactNode,
|
|
25
|
-
props?: Partial<IconButtonProps
|
|
26
|
-
) => React.
|
|
25
|
+
props?: Partial<IconButtonProps> & HasDataAttribute,
|
|
26
|
+
) => React.ReactElement;
|
|
27
27
|
|
|
28
28
|
export interface SearchProps
|
|
29
29
|
extends React.InputHTMLAttributes<HTMLInputElement>,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
+
import { useExternRef } from '../../hooks/useExternRef';
|
|
4
5
|
import { useStableCallback } from '../../hooks/useStableCallback';
|
|
5
6
|
import { getWindow, isHTMLElement, isSVGElement } from '../../lib/dom';
|
|
6
7
|
import { coordX, coordY, touchEnabled, type VKUITouchEvent } from '../../lib/touch';
|
|
8
|
+
import { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';
|
|
7
9
|
import type { HasComponent, HasRootRef } from '../../types';
|
|
8
10
|
|
|
9
11
|
/**
|
|
@@ -228,6 +230,7 @@ export const Touch = ({
|
|
|
228
230
|
stopPropagation = false,
|
|
229
231
|
...restProps
|
|
230
232
|
}: TouchProps) => {
|
|
233
|
+
const hostRef = useExternRef(getRootRef);
|
|
231
234
|
const [isTouchEnabled] = React.useState(touchEnabled);
|
|
232
235
|
const gestureRef = React.useRef<Gesture | null>(null);
|
|
233
236
|
const didSlide = React.useRef(false);
|
|
@@ -329,58 +332,58 @@ export const Touch = ({
|
|
|
329
332
|
}
|
|
330
333
|
});
|
|
331
334
|
|
|
332
|
-
const handlePointerDown = (
|
|
333
|
-
event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
335
|
+
const handlePointerDown = useStableCallback(
|
|
336
|
+
(event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement> | TouchEvent) => {
|
|
337
|
+
const nativeEvent = 'nativeEvent' in event ? event.nativeEvent : event;
|
|
338
|
+
|
|
339
|
+
gestureRef.current = initGesture(coordX(nativeEvent), coordY(nativeEvent));
|
|
340
|
+
|
|
341
|
+
const shouldCallDirectionHandlerOnlyIsSlide = false;
|
|
342
|
+
dispatchUserHandlers(
|
|
343
|
+
event,
|
|
344
|
+
gestureRef.current,
|
|
345
|
+
[onStart, onStartX, onStartY],
|
|
346
|
+
stopPropagation,
|
|
347
|
+
shouldCallDirectionHandlerOnlyIsSlide,
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
const eventOptions = { capture: useCapture, passive: false };
|
|
351
|
+
|
|
352
|
+
// FIXME: заменить touch/mouse-события ниже на pointer-события после того, как бразуеры из
|
|
353
|
+
// .browserslistrc начнут поддерживать его (см. https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#browser_compatibility).
|
|
354
|
+
if (isTouchEnabled) {
|
|
355
|
+
if (isHTMLElement(event.target) || isSVGElement(event.target)) {
|
|
356
|
+
// Тач-события не всплывают, поэтому навешиваем события на целевой элемент
|
|
357
|
+
// см. #235, #1968, https://stackoverflow.com/a/45760014
|
|
358
|
+
const target: HTMLorSVGElementWithEvents = event.target;
|
|
359
|
+
|
|
360
|
+
target.addEventListener('touchmove', handleNativePointerMove, eventOptions);
|
|
361
|
+
target.addEventListener('touchend', handleNativePointerUp, eventOptions);
|
|
362
|
+
target.addEventListener('touchcancel', handleNativePointerUp, eventOptions);
|
|
363
|
+
|
|
364
|
+
disposeTargetNativeGestureEvents.current = () => {
|
|
365
|
+
target.removeEventListener('touchmove', handleNativePointerMove, eventOptions);
|
|
366
|
+
target.removeEventListener('touchend', handleNativePointerUp, eventOptions);
|
|
367
|
+
target.removeEventListener('touchcancel', handleNativePointerUp, eventOptions);
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
} else {
|
|
371
|
+
// Используем события на Document, т.к. mouse-события на целевом элементе могут теряться при
|
|
372
|
+
// выходе за границы этого элемента.
|
|
373
|
+
const doc = getWindow(event.currentTarget).document;
|
|
374
|
+
|
|
375
|
+
doc.addEventListener('mousemove', handleNativePointerMove, eventOptions);
|
|
376
|
+
doc.addEventListener('mouseup', handleNativePointerUp, eventOptions);
|
|
377
|
+
doc.addEventListener('mouseleave', handleNativePointerUp, eventOptions);
|
|
361
378
|
|
|
362
379
|
disposeTargetNativeGestureEvents.current = () => {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
380
|
+
doc.removeEventListener('mousemove', handleNativePointerMove, eventOptions);
|
|
381
|
+
doc.removeEventListener('mouseup', handleNativePointerUp, eventOptions);
|
|
382
|
+
doc.removeEventListener('mouseleave', handleNativePointerUp, eventOptions);
|
|
366
383
|
};
|
|
367
384
|
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// выходе за границы этого элемента.
|
|
371
|
-
const doc = getWindow(event.currentTarget).document;
|
|
372
|
-
|
|
373
|
-
doc.addEventListener('mousemove', handleNativePointerMove, eventOptions);
|
|
374
|
-
doc.addEventListener('mouseup', handleNativePointerUp, eventOptions);
|
|
375
|
-
doc.addEventListener('mouseleave', handleNativePointerUp, eventOptions);
|
|
376
|
-
|
|
377
|
-
disposeTargetNativeGestureEvents.current = () => {
|
|
378
|
-
doc.removeEventListener('mousemove', handleNativePointerMove, eventOptions);
|
|
379
|
-
doc.removeEventListener('mouseup', handleNativePointerUp, eventOptions);
|
|
380
|
-
doc.removeEventListener('mouseleave', handleNativePointerUp, eventOptions);
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
};
|
|
385
|
+
},
|
|
386
|
+
);
|
|
384
387
|
|
|
385
388
|
const handlePointerEnter = onEnter
|
|
386
389
|
? (event: React.MouseEvent<HTMLElement>) => onEnter(event.nativeEvent)
|
|
@@ -421,10 +424,27 @@ export const Touch = ({
|
|
|
421
424
|
didSlide.current = false;
|
|
422
425
|
};
|
|
423
426
|
|
|
427
|
+
useIsomorphicLayoutEffect(
|
|
428
|
+
function initializeNativeTouchStartEventWithPassiveFalse() {
|
|
429
|
+
const hostEl = hostRef.current;
|
|
430
|
+
if (!hostEl || !isTouchEnabled) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const options = { capture: useCapture, passive: false };
|
|
435
|
+
hostEl.addEventListener('touchstart', handlePointerDown, options);
|
|
436
|
+
|
|
437
|
+
return () => {
|
|
438
|
+
hostEl.removeEventListener('touchstart', handlePointerDown, options);
|
|
439
|
+
};
|
|
440
|
+
},
|
|
441
|
+
[hostRef, isTouchEnabled, useCapture, handlePointerDown],
|
|
442
|
+
);
|
|
443
|
+
|
|
424
444
|
return (
|
|
425
445
|
<Component
|
|
426
446
|
{...restProps}
|
|
427
|
-
ref={
|
|
447
|
+
ref={hostRef}
|
|
428
448
|
onDragStart={handleDragStart}
|
|
429
449
|
onClickCapture={handleClickCapture}
|
|
430
450
|
// onEnter
|
|
@@ -433,9 +453,7 @@ export const Touch = ({
|
|
|
433
453
|
// onLeave
|
|
434
454
|
onPointerLeave={usePointerHover ? handlePointerLeave : undefined}
|
|
435
455
|
onMouseLeave={!usePointerHover ? handlePointerLeave : undefined}
|
|
436
|
-
// handlePointerDown
|
|
437
|
-
onTouchStartCapture={isTouchEnabled && useCapture ? handlePointerDown : undefined}
|
|
438
|
-
onTouchStart={isTouchEnabled && !useCapture ? handlePointerDown : undefined}
|
|
456
|
+
// handlePointerDown (onTouchStart устанавливается отдельно через initializeNativeTouchEventStartWithPassiveFalse)
|
|
439
457
|
onMouseDownCapture={!isTouchEnabled && useCapture ? handlePointerDown : undefined}
|
|
440
458
|
onMouseDown={!isTouchEnabled && !useCapture ? handlePointerDown : undefined}
|
|
441
459
|
/>
|
|
@@ -38,8 +38,15 @@
|
|
|
38
38
|
border: 0;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
.textarea:placeholder-shown {
|
|
42
|
+
text-overflow: ellipsis;
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
.textarea::placeholder {
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
text-overflow: ellipsis;
|
|
42
48
|
color: var(--vkui--color_text_subhead);
|
|
49
|
+
white-space: nowrap;
|
|
43
50
|
/* Для Firefox */
|
|
44
51
|
opacity: 1;
|
|
45
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["./WriteBar.module.css"],"names":["host","shadow","before","form","after","formIn","textarea","inlineAfter","ios"],"mappings":"AAAA;AAAA,E,aAAAA,M,WAAA;AAAA,E,aAIAC,Q,WAJA;AAAA,E,aAQAC,Q,WARA;AAAA,E,aASAC,M,WATA;AAAA,E,aAUAC,O,WAVA;AAAA,E,aAeAD,M,WAfA;AAAA,E,aAmBAE,Q,WAnBA;AAAA,E,aA0BAC,U,WA1BA;AAAA,E,aAwCAA,U,WAxCA;AAAA,E,
|
|
1
|
+
{"version":3,"sources":["./WriteBar.module.css"],"names":["host","shadow","before","form","after","formIn","textarea","inlineAfter","ios"],"mappings":"AAAA;AAAA,E,aAAAA,M,WAAA;AAAA,E,aAIAC,Q,WAJA;AAAA,E,aAQAC,Q,WARA;AAAA,E,aASAC,M,WATA;AAAA,E,aAUAC,O,WAVA;AAAA,E,aAeAD,M,WAfA;AAAA,E,aAmBAE,Q,WAnBA;AAAA,E,aA0BAC,U,WA1BA;AAAA,E,aAwCAA,U,WAxCA;AAAA,E,aA4CAA,U,WA5CA;AAAA,E,aAqDAA,U,WArDA;AAAA,E,aAyDAC,a,WAzDA;AAAA,E,aA8DAL,Q,WA9DA;AAAA,E,aAkEAE,O,WAlEA;AAAA,E,aAsEAE,U,WAtEA;AAAA,E,aA+EAE,K,WA/EA;AAAA,E,aAmFAA,K,WAnFA;AAAA,E,aAmFKN,Q,WAnFL;AAAA,E,aAoFAM,K,WApFA;AAAA,E,aAoFKJ,O,WApFL;AAAA,E,aAyFAI,K,WAzFA;AAAA,E,aAyFKH,Q,WAzFL;AAAA,E,aAkGAG,K,WAlGA;AAAA,E,aAkGKH,Q,WAlGL;AAAA,E,aAsGAG,K,WAtGA;AAAA,E,aAsGKD,a,WAtGL;AAAA,E,aA+GAC,K,WA/GA;AAAA,E,aA+GKF,U,WA/GL;AAAA;AAAA","file":"WriteBar.module.css.d.ts","sourceRoot":""}
|