@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.
Files changed (32) hide show
  1. package/dist/components/FormItem/FormItem.d.ts.map +1 -1
  2. package/dist/components/FormItem/FormItem.js +4 -2
  3. package/dist/components/FormItem/FormItem.js.map +1 -1
  4. package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts +1 -1
  5. package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
  6. package/dist/components/FormLayoutGroup/FormLayoutGroup.js +6 -3
  7. package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  8. package/dist/components/Search/Search.d.ts +2 -2
  9. package/dist/components/Search/Search.d.ts.map +1 -1
  10. package/dist/components/Search/Search.js.map +1 -1
  11. package/dist/components/Touch/Touch.d.ts.map +1 -1
  12. package/dist/components/Touch/Touch.js +27 -7
  13. package/dist/components/Touch/Touch.js.map +1 -1
  14. package/dist/components.css +1 -1
  15. package/dist/components.css.map +1 -1
  16. package/dist/cssm/components/FormItem/FormItem.js +2 -1
  17. package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
  18. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +3 -1
  19. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  20. package/dist/cssm/components/Search/Search.js.map +1 -1
  21. package/dist/cssm/components/Touch/Touch.js +27 -7
  22. package/dist/cssm/components/Touch/Touch.js.map +1 -1
  23. package/dist/cssm/components/WriteBar/WriteBar.module.css +7 -0
  24. package/dist/vkui.css +1 -1
  25. package/dist/vkui.css.map +1 -1
  26. package/package.json +1 -1
  27. package/src/components/FormItem/FormItem.tsx +2 -0
  28. package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +3 -0
  29. package/src/components/Search/Search.tsx +3 -3
  30. package/src/components/Touch/Touch.tsx +70 -52
  31. package/src/components/WriteBar/WriteBar.module.css +7 -0
  32. package/src/components/WriteBar/WriteBar.module.css.d.ts.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "type": "module",
3
- "version": "7.3.2",
3
+ "version": "7.3.3",
4
4
  "name": "@vkontakte/vkui",
5
5
  "description": "VKUI library",
6
6
  "module": "./dist/index.js",
@@ -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.ReactNode;
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
- const nativeEvent = event.nativeEvent;
336
-
337
- gestureRef.current = initGesture(coordX(nativeEvent), coordY(nativeEvent));
338
-
339
- const shouldCallDirectionHandlerOnlyIsSlide = false;
340
- dispatchUserHandlers(
341
- event,
342
- gestureRef.current,
343
- [onStart, onStartX, onStartY],
344
- stopPropagation,
345
- shouldCallDirectionHandlerOnlyIsSlide,
346
- );
347
-
348
- const eventOptions = { capture: useCapture, passive: false };
349
-
350
- // FIXME: заменить touch/mouse-события ниже на pointer-события после того, как бразуеры из
351
- // .browserslistrc начнут поддерживать его (см. https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#browser_compatibility).
352
- if (isTouchEnabled) {
353
- if (isHTMLElement(event.target) || isSVGElement(event.target)) {
354
- // Тач-события не всплывают, поэтому навешиваем события на целевой элемент
355
- // см. #235, #1968, https://stackoverflow.com/a/45760014
356
- const target: HTMLorSVGElementWithEvents = event.target;
357
-
358
- target.addEventListener('touchmove', handleNativePointerMove, eventOptions);
359
- target.addEventListener('touchend', handleNativePointerUp, eventOptions);
360
- target.addEventListener('touchcancel', handleNativePointerUp, eventOptions);
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
- target.removeEventListener('touchmove', handleNativePointerMove, eventOptions);
364
- target.removeEventListener('touchend', handleNativePointerUp, eventOptions);
365
- target.removeEventListener('touchcancel', handleNativePointerUp, eventOptions);
380
+ doc.removeEventListener('mousemove', handleNativePointerMove, eventOptions);
381
+ doc.removeEventListener('mouseup', handleNativePointerUp, eventOptions);
382
+ doc.removeEventListener('mouseleave', handleNativePointerUp, eventOptions);
366
383
  };
367
384
  }
368
- } else {
369
- // Используем события на Document, т.к. mouse-события на целевом элементе могут теряться при
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={getRootRef}
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,aA8CAA,U,WA9CA;AAAA,E,aAkDAC,a,WAlDA;AAAA,E,aAuDAL,Q,WAvDA;AAAA,E,aA2DAE,O,WA3DA;AAAA,E,aA+DAE,U,WA/DA;AAAA,E,aAwEAE,K,WAxEA;AAAA,E,aA4EAA,K,WA5EA;AAAA,E,aA4EKN,Q,WA5EL;AAAA,E,aA6EAM,K,WA7EA;AAAA,E,aA6EKJ,O,WA7EL;AAAA,E,aAkFAI,K,WAlFA;AAAA,E,aAkFKH,Q,WAlFL;AAAA,E,aA2FAG,K,WA3FA;AAAA,E,aA2FKH,Q,WA3FL;AAAA,E,aA+FAG,K,WA/FA;AAAA,E,aA+FKD,a,WA/FL;AAAA,E,aAwGAC,K,WAxGA;AAAA,E,aAwGKF,U,WAxGL;AAAA;AAAA","file":"WriteBar.module.css.d.ts","sourceRoot":""}
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":""}