@vkontakte/vkui 6.1.1 → 6.1.2
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/Clickable/useState.d.ts.map +1 -1
- package/dist/cjs/components/Clickable/useState.js +7 -6
- package/dist/cjs/components/Clickable/useState.js.map +1 -1
- package/dist/cjs/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
- package/dist/cjs/components/CustomScrollView/CustomScrollView.js +8 -1
- package/dist/cjs/components/CustomScrollView/CustomScrollView.js.map +1 -1
- package/dist/cjs/components/FocusTrap/FocusTrap.d.ts +2 -2
- package/dist/cjs/components/FocusTrap/FocusTrap.d.ts.map +1 -1
- package/dist/cjs/components/FocusTrap/FocusTrap.js +36 -11
- package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
- package/dist/cjs/components/Select/Select.d.ts +1 -1
- package/dist/cjs/components/Select/Select.d.ts.map +1 -1
- package/dist/cjs/components/Select/Select.js +12 -6
- package/dist/cjs/components/Select/Select.js.map +1 -1
- package/dist/cjs/components/Spacing/Spacing.d.ts +16 -5
- package/dist/cjs/components/Spacing/Spacing.d.ts.map +1 -1
- package/dist/cjs/components/Spacing/Spacing.js +38 -31
- package/dist/cjs/components/Spacing/Spacing.js.map +1 -1
- package/dist/cjs/components/ToolButton/ToolButton.d.ts +5 -0
- package/dist/cjs/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/cjs/components/ToolButton/ToolButton.js +2 -1
- package/dist/cjs/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/cjs/hooks/useResizeObserver.d.ts +6 -0
- package/dist/cjs/hooks/useResizeObserver.d.ts.map +1 -0
- package/dist/cjs/hooks/useResizeObserver.js +32 -0
- package/dist/cjs/hooks/useResizeObserver.js.map +1 -0
- package/dist/cjs/lib/floating/customResizeObserver.d.ts.map +1 -1
- package/dist/cjs/lib/floating/customResizeObserver.js +2 -1
- package/dist/cjs/lib/floating/customResizeObserver.js.map +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
- package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/components/Clickable/useState.d.ts.map +1 -1
- package/dist/components/Clickable/useState.js +7 -6
- package/dist/components/Clickable/useState.js.map +1 -1
- package/dist/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
- package/dist/components/CustomScrollView/CustomScrollView.js +8 -1
- package/dist/components/CustomScrollView/CustomScrollView.js.map +1 -1
- package/dist/components/FocusTrap/FocusTrap.d.ts +2 -2
- package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
- package/dist/components/FocusTrap/FocusTrap.js +37 -11
- package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
- package/dist/components/Select/Select.d.ts +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +12 -6
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Spacing/Spacing.d.ts +16 -5
- package/dist/components/Spacing/Spacing.d.ts.map +1 -1
- package/dist/components/Spacing/Spacing.js +33 -28
- package/dist/components/Spacing/Spacing.js.map +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts +5 -0
- package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/components/ToolButton/ToolButton.js +2 -1
- package/dist/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/components.css +4 -4
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +461 -330
- package/dist/cssm/components/Clickable/useState.d.ts.map +1 -1
- package/dist/cssm/components/Clickable/useState.js +7 -6
- package/dist/cssm/components/Clickable/useState.js.map +1 -1
- package/dist/cssm/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
- package/dist/cssm/components/CustomScrollView/CustomScrollView.js +8 -1
- package/dist/cssm/components/CustomScrollView/CustomScrollView.js.map +1 -1
- package/dist/cssm/components/CustomScrollView/CustomScrollView.module.css +4 -0
- package/dist/cssm/components/FocusTrap/FocusTrap.d.ts +2 -2
- package/dist/cssm/components/FocusTrap/FocusTrap.d.ts.map +1 -1
- package/dist/cssm/components/FocusTrap/FocusTrap.js +37 -11
- package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
- package/dist/cssm/components/Select/Select.d.ts +1 -1
- package/dist/cssm/components/Select/Select.d.ts.map +1 -1
- package/dist/cssm/components/Select/Select.js +8 -5
- package/dist/cssm/components/Select/Select.js.map +1 -1
- package/dist/cssm/components/Spacing/Spacing.d.ts +16 -5
- package/dist/cssm/components/Spacing/Spacing.d.ts.map +1 -1
- package/dist/cssm/components/Spacing/Spacing.js +31 -30
- package/dist/cssm/components/Spacing/Spacing.js.map +1 -1
- package/dist/cssm/components/Spacing/Spacing.module.css +44 -0
- package/dist/cssm/components/ToolButton/ToolButton.d.ts +5 -0
- package/dist/cssm/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/cssm/components/ToolButton/ToolButton.js +2 -1
- package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/cssm/components/ToolButton/ToolButton.module.css +6 -20
- package/dist/cssm/hooks/useResizeObserver.d.ts +6 -0
- package/dist/cssm/hooks/useResizeObserver.d.ts.map +1 -0
- package/dist/cssm/hooks/useResizeObserver.js +23 -0
- package/dist/cssm/hooks/useResizeObserver.js.map +1 -0
- package/dist/cssm/lib/floating/customResizeObserver.d.ts.map +1 -1
- package/dist/cssm/lib/floating/customResizeObserver.js +2 -1
- package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/cssm/styles/adaptivity.module.css +1 -2
- package/dist/hooks/useResizeObserver.d.ts +6 -0
- package/dist/hooks/useResizeObserver.d.ts.map +1 -0
- package/dist/hooks/useResizeObserver.js +23 -0
- package/dist/hooks/useResizeObserver.js.map +1 -0
- package/dist/lib/floating/customResizeObserver.d.ts.map +1 -1
- package/dist/lib/floating/customResizeObserver.js +2 -1
- package/dist/lib/floating/customResizeObserver.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +11 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/vkui.css +4 -4
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +461 -330
- package/package.json +1 -1
- package/src/components/Clickable/useState.tsx +16 -6
- package/src/components/CustomScrollView/CustomScrollView.module.css +4 -0
- package/src/components/CustomScrollView/CustomScrollView.tsx +7 -1
- package/src/components/FocusTrap/FocusTrap.tsx +54 -20
- package/src/components/Select/Select.tsx +12 -5
- package/src/components/Spacing/Spacing.module.css +44 -0
- package/src/components/Spacing/Spacing.tsx +38 -34
- package/src/components/ToolButton/ToolButton.module.css +4 -14
- package/src/components/ToolButton/ToolButton.tsx +7 -2
- package/src/hooks/useResizeObserver.ts +30 -0
- package/src/lib/floating/customResizeObserver.ts +10 -1
- package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +11 -1
- package/src/styles/adaptivity.module.css +1 -2
|
@@ -4,6 +4,11 @@ export interface ToolButtonProps extends TappableProps, AdaptiveIconRendererProp
|
|
|
4
4
|
mode?: 'primary' | 'secondary' | 'tertiary' | 'outline';
|
|
5
5
|
appearance?: 'accent' | 'neutral';
|
|
6
6
|
direction?: 'row' | 'column';
|
|
7
|
+
/**
|
|
8
|
+
* Задаёт `50%` закругления для контейнера.
|
|
9
|
+
*
|
|
10
|
+
* > Note: игнорируется при передаче `children`.
|
|
11
|
+
*/
|
|
7
12
|
rounded?: boolean;
|
|
8
13
|
}
|
|
9
14
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolButton.d.ts","sourceRoot":"","sources":["../../../../src/components/ToolButton/ToolButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,yBAAyB,EAC1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAY,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAyB/D,MAAM,WAAW,eAAgB,SAAQ,aAAa,EAAE,yBAAyB;IAC/E,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,mHAWpB,eAAe,4CA0BjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ToolButton.d.ts","sourceRoot":"","sources":["../../../../src/components/ToolButton/ToolButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,yBAAyB,EAC1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAY,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAyB/D,MAAM,WAAW,eAAgB,SAAQ,aAAa,EAAE,yBAAyB;IAC/E,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,mHAWpB,eAAe,4CA0BjB,CAAC"}
|
|
@@ -20,7 +20,7 @@ const stylesDirection = {
|
|
|
20
20
|
};
|
|
21
21
|
const sizeYClassNames = {
|
|
22
22
|
none: styles['ToolButton--sizeY-none'],
|
|
23
|
-
|
|
23
|
+
regular: styles['ToolButton--sizeY-regular']
|
|
24
24
|
};
|
|
25
25
|
/**
|
|
26
26
|
* Кнопки, которые используются для вызова инструмента, вставки аттачей или
|
|
@@ -45,6 +45,7 @@ const sizeYClassNames = {
|
|
|
45
45
|
IconRegular: IconRegular
|
|
46
46
|
}),
|
|
47
47
|
hasChildren && /*#__PURE__*/ _jsx("span", {
|
|
48
|
+
className: styles['ToolButton__text'],
|
|
48
49
|
children: children
|
|
49
50
|
})
|
|
50
51
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ToolButton/ToolButton.tsx"],"sourcesContent":["import { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport {\n AdaptiveIconRenderer,\n AdaptiveIconRendererProps,\n} from '../AdaptiveIconRenderer/AdaptiveIconRenderer';\nimport { Tappable, TappableProps } from '../Tappable/Tappable';\nimport styles from './ToolButton.module.css';\n\nconst stylesMode = {\n primary: styles['ToolButton--mode-primary'],\n secondary: styles['ToolButton--mode-secondary'],\n tertiary: styles['ToolButton--mode-tertiary'],\n outline: styles['ToolButton--mode-outline'],\n};\n\nconst stylesAppearance = {\n accent: styles['ToolButton--appearance-accent'],\n neutral: styles['ToolButton--appearance-neutral'],\n};\n\nconst stylesDirection = {\n row: styles['ToolButton--direction-row'],\n column: styles['ToolButton--direction-column'],\n};\n\nconst sizeYClassNames = {\n none: styles['ToolButton--sizeY-none'],\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ToolButton/ToolButton.tsx"],"sourcesContent":["import { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport {\n AdaptiveIconRenderer,\n AdaptiveIconRendererProps,\n} from '../AdaptiveIconRenderer/AdaptiveIconRenderer';\nimport { Tappable, TappableProps } from '../Tappable/Tappable';\nimport styles from './ToolButton.module.css';\n\nconst stylesMode = {\n primary: styles['ToolButton--mode-primary'],\n secondary: styles['ToolButton--mode-secondary'],\n tertiary: styles['ToolButton--mode-tertiary'],\n outline: styles['ToolButton--mode-outline'],\n};\n\nconst stylesAppearance = {\n accent: styles['ToolButton--appearance-accent'],\n neutral: styles['ToolButton--appearance-neutral'],\n};\n\nconst stylesDirection = {\n row: styles['ToolButton--direction-row'],\n column: styles['ToolButton--direction-column'],\n};\n\nconst sizeYClassNames = {\n none: styles['ToolButton--sizeY-none'],\n regular: styles['ToolButton--sizeY-regular'],\n};\n\nexport interface ToolButtonProps extends TappableProps, AdaptiveIconRendererProps {\n mode?: 'primary' | 'secondary' | 'tertiary' | 'outline';\n appearance?: 'accent' | 'neutral';\n direction?: 'row' | 'column';\n /**\n * Задаёт `50%` закругления для контейнера.\n *\n * > Note: игнорируется при передаче `children`.\n */\n rounded?: boolean;\n}\n\n/**\n * Кнопки, которые используются для вызова инструмента, вставки аттачей или\n * для форматирования. Их можно использовать как кнопки для разового действия\n * или для включения/выключения режима.\n *\n * @see https://vkcom.github.io/VKUI/#/ToolButton\n */\nexport const ToolButton = ({\n mode = 'primary',\n appearance = 'accent',\n direction = 'row',\n onClick = noop,\n className,\n children,\n IconCompact,\n IconRegular,\n rounded,\n ...restProps\n}: ToolButtonProps) => {\n const { sizeY = 'none' } = useAdaptivity();\n const hasChildren = hasReactNode(children);\n\n return (\n <Tappable\n hoverMode={styles['ToolButton--hover']}\n activeMode={styles['ToolButton--active']}\n Component={restProps.href ? 'a' : 'button'}\n focusVisibleMode=\"outside\"\n onClick={onClick}\n className={classNames(\n className,\n styles['ToolButton'],\n rounded && !hasChildren && styles['ToolButton--rounded'],\n stylesMode[mode],\n stylesAppearance[appearance],\n stylesDirection[direction],\n sizeY !== 'compact' && sizeYClassNames[sizeY],\n )}\n {...restProps}\n >\n <AdaptiveIconRenderer IconCompact={IconCompact} IconRegular={IconRegular} />\n {hasChildren && <span className={styles['ToolButton__text']}>{children}</span>}\n </Tappable>\n );\n};\n"],"names":["classNames","hasReactNode","noop","useAdaptivity","AdaptiveIconRenderer","Tappable","styles","stylesMode","primary","secondary","tertiary","outline","stylesAppearance","accent","neutral","stylesDirection","row","column","sizeYClassNames","none","regular","ToolButton","mode","appearance","direction","onClick","className","children","IconCompact","IconRegular","rounded","restProps","sizeY","hasChildren","hoverMode","activeMode","Component","href","focusVisibleMode","span"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";AAAA,SAASA,UAAU,EAAEC,YAAY,EAAEC,IAAI,QAAQ,kBAAkB;AACjE,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SACEC,oBAAoB,QAEf,+CAA+C;AACtD,SAASC,QAAQ,QAAuB,uBAAuB;AAC/D,OAAOC,YAAY,0BAA0B;AAE7C,MAAMC,aAAa;IACjBC,SAASF,MAAM,CAAC,2BAA2B;IAC3CG,WAAWH,MAAM,CAAC,6BAA6B;IAC/CI,UAAUJ,MAAM,CAAC,4BAA4B;IAC7CK,SAASL,MAAM,CAAC,2BAA2B;AAC7C;AAEA,MAAMM,mBAAmB;IACvBC,QAAQP,MAAM,CAAC,gCAAgC;IAC/CQ,SAASR,MAAM,CAAC,iCAAiC;AACnD;AAEA,MAAMS,kBAAkB;IACtBC,KAAKV,MAAM,CAAC,4BAA4B;IACxCW,QAAQX,MAAM,CAAC,+BAA+B;AAChD;AAEA,MAAMY,kBAAkB;IACtBC,MAAMb,MAAM,CAAC,yBAAyB;IACtCc,SAASd,MAAM,CAAC,4BAA4B;AAC9C;AAcA;;;;;;CAMC,GACD,OAAO,MAAMe,aAAa,CAAC,EACzBC,OAAO,SAAS,EAChBC,aAAa,QAAQ,EACrBC,YAAY,KAAK,EACjBC,UAAUvB,IAAI,EACdwB,SAAS,EACTC,QAAQ,EACRC,WAAW,EACXC,WAAW,EACXC,OAAO,EACP,GAAGC,WACa;IAChB,MAAM,EAAEC,QAAQ,MAAM,EAAE,GAAG7B;IAC3B,MAAM8B,cAAchC,aAAa0B;IAEjC,qBACE,MAACtB;QACC6B,WAAW5B,MAAM,CAAC,oBAAoB;QACtC6B,YAAY7B,MAAM,CAAC,qBAAqB;QACxC8B,WAAWL,UAAUM,IAAI,GAAG,MAAM;QAClCC,kBAAiB;QACjBb,SAASA;QACTC,WAAW1B,WACT0B,WACApB,MAAM,CAAC,aAAa,EACpBwB,WAAW,CAACG,eAAe3B,MAAM,CAAC,sBAAsB,EACxDC,UAAU,CAACe,KAAK,EAChBV,gBAAgB,CAACW,WAAW,EAC5BR,eAAe,CAACS,UAAU,EAC1BQ,UAAU,aAAad,eAAe,CAACc,MAAM;QAE9C,GAAGD,SAAS;;0BAEb,KAAC3B;gBAAqBwB,aAAaA;gBAAaC,aAAaA;;YAC5DI,6BAAe,KAACM;gBAAKb,WAAWpB,MAAM,CAAC,mBAAmB;0BAAGqB;;;;AAGpE,EAAE"}
|
|
@@ -49,30 +49,16 @@
|
|
|
49
49
|
flex-direction: column;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-webkit-margin-end: 4px;
|
|
56
|
-
margin-inline-end: 4px;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.ToolButton--direction-row > *:last-child {
|
|
60
|
-
-webkit-margin-end: 0;
|
|
61
|
-
margin-inline-end: 0;
|
|
52
|
+
.ToolButton--direction-row .ToolButton__text {
|
|
53
|
+
-webkit-margin-start: 4px;
|
|
54
|
+
margin-inline-start: 4px;
|
|
62
55
|
}
|
|
63
56
|
|
|
64
|
-
.ToolButton--direction-column
|
|
65
|
-
-webkit-margin-
|
|
66
|
-
margin-block-
|
|
57
|
+
.ToolButton--direction-column .ToolButton__text {
|
|
58
|
+
-webkit-margin-before: 4px;
|
|
59
|
+
margin-block-start: 4px;
|
|
67
60
|
}
|
|
68
61
|
|
|
69
|
-
.ToolButton--direction-column > *:last-child {
|
|
70
|
-
-webkit-margin-after: 0;
|
|
71
|
-
margin-block-end: 0;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/* stylelint-enable selector-max-universal */
|
|
75
|
-
|
|
76
62
|
/* ToolButton's backgrounds */
|
|
77
63
|
|
|
78
64
|
/* Mode = Primary */
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Хук вызывает переданный коллбэк при изменении размеров элемента.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useResizeObserver(ref: React.MutableRefObject<HTMLElement | null>, callback: (element: HTMLElement) => void): void;
|
|
6
|
+
//# sourceMappingURL=useResizeObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResizeObserver.d.ts","sourceRoot":"","sources":["../../../src/hooks/useResizeObserver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,EAC/C,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,QAmBzC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { CustomResizeObserver } from '../lib/floating/customResizeObserver';
|
|
3
|
+
import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
|
|
4
|
+
import { useStableCallback } from './useStableCallback';
|
|
5
|
+
/**
|
|
6
|
+
* Хук вызывает переданный коллбэк при изменении размеров элемента.
|
|
7
|
+
*/ export function useResizeObserver(ref, callback) {
|
|
8
|
+
const stableCallback = useStableCallback(callback);
|
|
9
|
+
useIsomorphicLayoutEffect(function addResizeObserverHandler() {
|
|
10
|
+
/* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */ if (!ref.current) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const element = ref.current;
|
|
14
|
+
const observer = new CustomResizeObserver(()=>stableCallback(element));
|
|
15
|
+
observer.observe(element);
|
|
16
|
+
observer.appendToTheDOM();
|
|
17
|
+
return ()=>observer.disconnect();
|
|
18
|
+
}, [
|
|
19
|
+
ref
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=useResizeObserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useResizeObserver.ts"],"sourcesContent":["import * as React from 'react';\nimport { CustomResizeObserver } from '../lib/floating/customResizeObserver';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\nimport { useStableCallback } from './useStableCallback';\n\n/**\n * Хук вызывает переданный коллбэк при изменении размеров элемента.\n */\nexport function useResizeObserver(\n ref: React.MutableRefObject<HTMLElement | null>,\n callback: (element: HTMLElement) => void,\n) {\n const stableCallback = useStableCallback(callback);\n\n useIsomorphicLayoutEffect(\n function addResizeObserverHandler() {\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!ref.current) {\n return;\n }\n const element = ref.current;\n const observer = new CustomResizeObserver(() => stableCallback(element));\n observer.observe(element);\n observer.appendToTheDOM();\n\n return () => observer.disconnect();\n },\n [ref],\n );\n}\n"],"names":["React","CustomResizeObserver","useIsomorphicLayoutEffect","useStableCallback","useResizeObserver","ref","callback","stableCallback","addResizeObserverHandler","current","element","observer","observe","appendToTheDOM","disconnect"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,oBAAoB,QAAQ,uCAAuC;AAC5E,SAASC,yBAAyB,QAAQ,mCAAmC;AAC7E,SAASC,iBAAiB,QAAQ,sBAAsB;AAExD;;CAEC,GACD,OAAO,SAASC,kBACdC,GAA+C,EAC/CC,QAAwC;IAExC,MAAMC,iBAAiBJ,kBAAkBG;IAEzCJ,0BACE,SAASM;QACP,6EAA6E,GAC7E,IAAI,CAACH,IAAII,OAAO,EAAE;YAChB;QACF;QACA,MAAMC,UAAUL,IAAII,OAAO;QAC3B,MAAME,WAAW,IAAIV,qBAAqB,IAAMM,eAAeG;QAC/DC,SAASC,OAAO,CAACF;QACjBC,SAASE,cAAc;QAEvB,OAAO,IAAMF,SAASG,UAAU;IAClC,GACA;QAACT;KAAI;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customResizeObserver.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/customResizeObserver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"customResizeObserver.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/customResizeObserver.ts"],"names":[],"mappings":"AAsCA,qBAAa,oBAAoB;IAOnB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAN3C,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,WAAW,CAAC;QACpB,MAAM,EAAE,iBAAiB,CAAC;KAC3B,CAAC,CAAM;IACR,wBAAwB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;gBAE5B,cAAc,EAAE,MAAM,IAAI;IAIvD,OAAO,CAAC,OAAO,EAAE,WAAW;IAO5B,cAAc;IAYd,kBAAkB,CAAC,OAAO,EAAE,WAAW;IAUvC,4BAA4B,CAAC,OAAO,EAAE,WAAW;IAWjD,UAAU;CAeX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n 'position'
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n | 'position'\n | 'left'\n | 'top'\n | 'zIndex'\n | 'width'\n | 'height'\n | 'pointerEvents'\n | 'opacity'\n | 'border'\n> = {\n position: 'absolute',\n left: '0',\n top: '0',\n zIndex: '-1',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n opacity: '0',\n border: '0',\n};\n\n/*\n * Специальный CustomResizeObserver как fallback для ResizeObserver\n * Используется для вызова update() функции (перерисовка плавающего окна) floating-ui\n * при изменении размера reference или floating элементов.\n *\n * По умолчанию пытаемся нарисовать скрытый, абсолютно позиционированный относительно\n * наблюдаемого элемента iframe.\n * В случае же, если наблюдаемый элемент имеет position: static, то правильно спозиционировать\n * iframe у нас не получится, поэтому в такой ситуации мы используем MutationObserver.\n *\n * Использовать только MutationObserver мы не можем, потому что с помощью него нельзя отследить\n * изменение размера вызванное переполнением текста.\n *\n * Применяется только если нету поддержики или полифила ResizeObserver.\n * */\nexport class CustomResizeObserver {\n records: Array<{\n target: HTMLElement;\n iframe: HTMLIFrameElement;\n }> = [];\n mutationObserverFallback: MutationObserver | null = null;\n\n constructor(private readonly updateFunction: () => void) {\n this.updateFunction = updateFunction;\n }\n\n observe(element: HTMLElement) {\n if (isPositioned(element)) {\n return this.observeUsingIframe(element);\n }\n return this.observeUsingMutationObserver(element);\n }\n\n appendToTheDOM() {\n for (let record of this.records) {\n record.target.appendChild(record.iframe);\n }\n\n for (let record of this.records) {\n if (record.iframe.contentWindow) {\n record.iframe.contentWindow.addEventListener('resize', this.updateFunction);\n }\n }\n }\n\n observeUsingIframe(element: HTMLElement) {\n const iframe = element.ownerDocument.createElement('iframe');\n iframe.src = 'javascript:void(0)';\n iframe.ariaHidden = 'true';\n iframe.tabIndex = -1;\n Object.assign(iframe.style, defaultIframeStyles);\n\n this.records.push({ target: element, iframe });\n }\n\n observeUsingMutationObserver(element: HTMLElement) {\n if (!this.mutationObserverFallback) {\n this.mutationObserverFallback = new MutationObserver(this.updateFunction);\n }\n\n this.mutationObserverFallback.observe(element, {\n childList: true,\n subtree: true,\n });\n }\n\n disconnect() {\n this.records.map(({ target, iframe }) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.removeEventListener('resize', this.updateFunction);\n }\n\n target.removeChild(iframe);\n });\n this.records = [];\n\n if (this.mutationObserverFallback) {\n this.mutationObserverFallback.disconnect();\n }\n this.mutationObserverFallback = null;\n }\n}\n\nfunction isPositioned(element: HTMLElement): boolean {\n return getComputedStyle(element).position !== 'static';\n}\n"],"names":["defaultIframeStyles","position","left","top","zIndex","width","height","pointerEvents","opacity","border","CustomResizeObserver","records","mutationObserverFallback","constructor","updateFunction","observe","element","isPositioned","observeUsingIframe","observeUsingMutationObserver","appendToTheDOM","record","target","appendChild","iframe","contentWindow","addEventListener","ownerDocument","createElement","src","ariaHidden","tabIndex","Object","assign","style","push","MutationObserver","childList","subtree","disconnect","map","removeEventListener","removeChild","getComputedStyle"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,MAAMA,sBAWF;IACFC,UAAU;IACVC,MAAM;IACNC,KAAK;IACLC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,eAAe;IACfC,SAAS;IACTC,QAAQ;AACV;AAEA;;;;;;;;;;;;;;GAcG,GACH,OAAO,MAAMC;;IACXC,QAGQ;IACRC,yBAAyD;IAEzDC,YAAY,AAAiBC,cAA0B,CAAE;aAA5BA,iBAAAA;aAN7BH,UAGK,EAAE;aACPC,2BAAoD;QAGlD,IAAI,CAACE,cAAc,GAAGA;IACxB;IAEAC,QAAQC,OAAoB,EAAE;QAC5B,IAAIC,aAAaD,UAAU;YACzB,OAAO,IAAI,CAACE,kBAAkB,CAACF;QACjC;QACA,OAAO,IAAI,CAACG,4BAA4B,CAACH;IAC3C;IAEAI,iBAAiB;QACf,KAAK,IAAIC,UAAU,IAAI,CAACV,OAAO,CAAE;YAC/BU,OAAOC,MAAM,CAACC,WAAW,CAACF,OAAOG,MAAM;QACzC;QAEA,KAAK,IAAIH,UAAU,IAAI,CAACV,OAAO,CAAE;YAC/B,IAAIU,OAAOG,MAAM,CAACC,aAAa,EAAE;gBAC/BJ,OAAOG,MAAM,CAACC,aAAa,CAACC,gBAAgB,CAAC,UAAU,IAAI,CAACZ,cAAc;YAC5E;QACF;IACF;IAEAI,mBAAmBF,OAAoB,EAAE;QACvC,MAAMQ,SAASR,QAAQW,aAAa,CAACC,aAAa,CAAC;QACnDJ,OAAOK,GAAG,GAAG;QACbL,OAAOM,UAAU,GAAG;QACpBN,OAAOO,QAAQ,GAAG,CAAC;QACnBC,OAAOC,MAAM,CAACT,OAAOU,KAAK,EAAElC;QAE5B,IAAI,CAACW,OAAO,CAACwB,IAAI,CAAC;YAAEb,QAAQN;YAASQ;QAAO;IAC9C;IAEAL,6BAA6BH,OAAoB,EAAE;QACjD,IAAI,CAAC,IAAI,CAACJ,wBAAwB,EAAE;YAClC,IAAI,CAACA,wBAAwB,GAAG,IAAIwB,iBAAiB,IAAI,CAACtB,cAAc;QAC1E;QAEA,IAAI,CAACF,wBAAwB,CAACG,OAAO,CAACC,SAAS;YAC7CqB,WAAW;YACXC,SAAS;QACX;IACF;IAEAC,aAAa;QACX,IAAI,CAAC5B,OAAO,CAAC6B,GAAG,CAAC,CAAC,EAAElB,MAAM,EAAEE,MAAM,EAAE;YAClC,IAAIA,OAAOC,aAAa,EAAE;gBACxBD,OAAOC,aAAa,CAACgB,mBAAmB,CAAC,UAAU,IAAI,CAAC3B,cAAc;YACxE;YAEAQ,OAAOoB,WAAW,CAAClB;QACrB;QACA,IAAI,CAACb,OAAO,GAAG,EAAE;QAEjB,IAAI,IAAI,CAACC,wBAAwB,EAAE;YACjC,IAAI,CAACA,wBAAwB,CAAC2B,UAAU;QAC1C;QACA,IAAI,CAAC3B,wBAAwB,GAAG;IAClC;AACF;AAEA,SAASK,aAAaD,OAAoB;IACxC,OAAO2B,iBAAiB3B,SAASf,QAAQ,KAAK;AAChD"}
|
package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,4QAqBrC,gCAAgC,KAAG,kCAAkC,CAAC,
|
|
1
|
+
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,4QAqBrC,gCAAgC,KAAG,kCAAkC,CAAC,CA2TxE,CAAC"}
|
|
@@ -55,7 +55,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
55
55
|
});
|
|
56
56
|
const commitShownLocalState = React.useCallback((nextShown, reason)=>{
|
|
57
57
|
setShownLocalState((prevState)=>{
|
|
58
|
-
if (prevState.shown !== nextShown) {
|
|
58
|
+
if (prevState.shown !== nextShown || prevState.reason !== reason) {
|
|
59
59
|
return {
|
|
60
60
|
shown: nextShown,
|
|
61
61
|
reason
|
|
@@ -79,6 +79,11 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
79
79
|
commitShownLocalState
|
|
80
80
|
]);
|
|
81
81
|
const handleFocusOnReference = useStableCallback(()=>{
|
|
82
|
+
// Повторный вызов события фокуса - следствие клика на reference-элемент
|
|
83
|
+
if (shownLocalState.shown) {
|
|
84
|
+
commitShownLocalState(false, 'focus');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
82
87
|
if (blockFocusRef.current) {
|
|
83
88
|
/* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */ blockFocusRef.current = false;
|
|
84
89
|
return;
|
|
@@ -109,6 +114,11 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
109
114
|
});
|
|
110
115
|
});
|
|
111
116
|
const handleClickOnReference = useStableCallback(()=>{
|
|
117
|
+
// Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов
|
|
118
|
+
if (shownLocalState.reason === 'focus') {
|
|
119
|
+
commitShownLocalState(shownLocalState.shown, 'click');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
112
122
|
commitShownLocalState(!shownLocalState.shown, 'click');
|
|
113
123
|
});
|
|
114
124
|
const handleClickOnReferenceForOnlyClose = useStableCallback(()=>{
|
package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback(() => {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(() => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (shownLocalState.reason !== 'focus' && shownLocalState.reason !== 'click') {\n hideWithDelay();\n }\n }\n });\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["React","debounce","getWindow","isHTMLElement","useCustomEnsuredControl","useGlobalOnClickOutside","useStableCallback","contains","getActiveElementByAnotherElement","useIsomorphicLayoutEffect","autoUpdateFloatingElement","useFloating","convertFloatingDataToReactCSSProperties","DEFAULT_TRIGGER","useResolveTriggerType","whileElementsMounted","args","elementResize","useFloatingWithInteractions","trigger","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","memoizedValue","useMemo","undefined","shownLocalState","setShownLocalState","value","defaultValue","onChange","reason","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","x","y","strategy","refs","middlewareData","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","win","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce } from '@vkontakte/vkjs';\nimport { getWindow, isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useCustomEnsuredControl } from '../../../hooks/useEnsuredControl';\nimport { useGlobalOnClickOutside } from '../../../hooks/useGlobalOnClickOutside';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { contains, getActiveElementByAnotherElement } from '../../dom';\nimport { useIsomorphicLayoutEffect } from '../../useIsomorphicLayoutEffect';\nimport { autoUpdateFloatingElement, useFloating } from '../adapters';\nimport { convertFloatingDataToReactCSSProperties } from '../functions';\nimport { type UseFloatingOptions } from '../types/common';\nimport { DEFAULT_TRIGGER } from './constants';\nimport type {\n FloatingProps,\n ReferenceProps,\n ShownChangeReason,\n UseFloatingWithInteractionsProps,\n UseFloatingWithInteractionsReturn,\n} from './types';\nimport { useResolveTriggerType } from './useResolveTriggerType';\n\ntype LocalState = { shown: boolean; reason?: ShownChangeReason };\n\nconst whileElementsMounted: UseFloatingOptions['whileElementsMounted'] = (...args) =>\n /* istanbul ignore next: не знаю как проверить */\n autoUpdateFloatingElement(...args, { elementResize: true });\n\n/**\n * @private\n */\nexport const useFloatingWithInteractions = <T extends HTMLElement = HTMLElement>({\n trigger = DEFAULT_TRIGGER,\n\n // UseFloating\n placement: placementProp = 'bottom',\n middlewares,\n hoverDelay = 0,\n closeAfterClick = false,\n\n // disables\n disabled = false,\n disableInteractive = false,\n disableCloseOnClickOutside = false,\n disableCloseOnEscKey = false,\n\n // uncontrolled\n defaultShown = false,\n\n // controlled\n shown: shownProp,\n onShownChange: onShownChangeProp,\n}: UseFloatingWithInteractionsProps): UseFloatingWithInteractionsReturn<T> => {\n const memoizedValue = React.useMemo(\n () => (shownProp !== undefined ? { shown: shownProp } : undefined),\n [shownProp],\n );\n const [shownLocalState, setShownLocalState] = useCustomEnsuredControl<LocalState>({\n value: memoizedValue,\n disabled,\n defaultValue: { shown: defaultShown },\n onChange: useStableCallback(({ shown, reason }) => {\n if (onShownChangeProp) {\n onShownChangeProp(shown, reason);\n }\n }),\n });\n const [shownFinalState, setShownFinalState] = React.useState(() => shownLocalState.shown);\n const [willBeHide, setWillBeHide] = React.useState(false);\n\n const hasCSSAnimation = React.useRef(false);\n\n const blockMouseEnterRef = React.useRef(false);\n const blockFocusRef = React.useRef(false);\n const blurTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>();\n\n const handleCloseOnReferenceClickOutsideDisabled =\n disabled || disableCloseOnClickOutside || willBeHide || !shownLocalState.shown;\n const handleCloseOnFloatingClickOutsideDisabled =\n disableInteractive || handleCloseOnReferenceClickOutsideDisabled;\n\n const { triggerOnFocus, triggerOnClick, triggerOnHover } = useResolveTriggerType(trigger);\n\n // Библиотека `floating-ui`\n const { placement, x, y, strategy, refs, middlewareData } = useFloating<T>({\n strategy: 'fixed',\n placement: placementProp,\n middleware: middlewares,\n whileElementsMounted,\n });\n\n const commitShownLocalState = React.useCallback(\n (nextShown: boolean, reason: ShownChangeReason) => {\n setShownLocalState((prevState) => {\n if (prevState.shown !== nextShown || prevState.reason !== reason) {\n return {\n shown: nextShown,\n reason,\n };\n }\n /* istanbul ignore next: страховка, если вдруг на момент вызова обновления состояния, оно уже будет актуальным */\n return prevState;\n });\n },\n [setShownLocalState],\n );\n\n const [mouseEnterDelay, mouseLeaveDelay] =\n typeof hoverDelay === 'number' ? [hoverDelay, hoverDelay] : hoverDelay;\n\n const showWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(true, 'hover'), mouseEnterDelay),\n [mouseEnterDelay, commitShownLocalState],\n );\n\n const hideWithDelay = React.useMemo(\n () => debounce(() => commitShownLocalState(false, 'hover'), mouseLeaveDelay),\n [mouseLeaveDelay, commitShownLocalState],\n );\n\n const handleFocusOnReference = useStableCallback(() => {\n // Повторный вызов события фокуса - следствие клика на reference-элемент\n if (shownLocalState.shown) {\n commitShownLocalState(false, 'focus');\n return;\n }\n if (blockFocusRef.current) {\n /* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */\n blockFocusRef.current = false;\n return;\n }\n\n commitShownLocalState(true, 'focus');\n });\n\n const handleBlurOnReference = useStableCallback((event: React.FocusEvent) => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (!shownLocalState.shown) {\n clearTimeout(blurTimeoutRef.current);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n blurTimeoutRef.current = setTimeout(function waitWindowBlurFire() {\n const reference = refs.reference.current;\n // Если пользователь покинул текущее окно в открытом состоянии, то\n // не закрываем всплывающий элемент.\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (!relatedTarget && getActiveElementByAnotherElement(reference) === reference) {\n /* istanbul ignore next */\n return;\n }\n\n // Если пользователь нажал на всплывающий элемент, то не закрываем всплывающий элемент.\n // Note: для этого элемент должен быть фокусируемый (например, за счёт `tabindex=\"-1\"`).\n if (contains(refs.floating.current, relatedTarget) || contains(reference, relatedTarget)) {\n return;\n }\n\n commitShownLocalState(false, 'focus');\n });\n });\n\n const handleClickOnReference = useStableCallback(() => {\n // Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов\n if (shownLocalState.reason === 'focus') {\n commitShownLocalState(shownLocalState.shown, 'click');\n return;\n }\n commitShownLocalState(!shownLocalState.shown, 'click');\n });\n\n const handleClickOnReferenceForOnlyClose = useStableCallback(() => {\n blockMouseEnterRef.current = true;\n commitShownLocalState(false, 'click');\n });\n\n const handleMouseEnterOnBoth = useStableCallback(() => {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (!blockMouseEnterRef.current && !shownLocalState.shown) {\n showWithDelay();\n }\n });\n\n const handleMouseLeaveOnBothForHoverAndFocusStates = useStableCallback(() => {\n blockFocusRef.current = false;\n blockMouseEnterRef.current = false;\n\n if (triggerOnHover) {\n showWithDelay.cancel();\n hideWithDelay.cancel();\n\n if (shownLocalState.reason !== 'focus' && shownLocalState.reason !== 'click') {\n hideWithDelay();\n }\n }\n });\n\n const handleFloatingAnimationStart = () => {\n hasCSSAnimation.current = true;\n };\n\n const handleFloatingAnimationEnd = () => {\n if (willBeHide) {\n setShownFinalState(false);\n setWillBeHide(false);\n }\n };\n\n const handleOnClose = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'callback');\n }, [commitShownLocalState]);\n\n const handleRestoreFocus = React.useCallback(\n () => (triggerOnFocus ? blockFocusRef.current : true),\n [triggerOnFocus],\n );\n\n const handleEscapeKeyDown = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'escape-key');\n }, [commitShownLocalState]);\n\n const handleClickOutside = React.useCallback(() => {\n blockFocusRef.current = true;\n commitShownLocalState(false, 'click-outside');\n }, [commitShownLocalState]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n handleCloseOnReferenceClickOutsideDisabled ? null : refs.reference,\n handleCloseOnFloatingClickOutsideDisabled ? null : refs.floating,\n );\n\n useIsomorphicLayoutEffect(\n /**\n * Если пользователь покинул активное окно и:\n * 1. целевой элемент был в состоянии фокуса;\n * 2. всплывающий элемент был закрытом состоянии;\n * то фокус должен быть заблокирован, когда пользователь вернётся обратно. Иначе покажется\n * всплывающий элемент.\n */\n function setGlobalBlurForTriggerOnFocus() {\n if (!triggerOnFocus || !refs.reference.current) {\n return;\n }\n\n const handleGlobalBlur = () => {\n /* istanbul ignore next */\n const reference = refs.reference.current;\n /* istanbul ignore if: не умеем симулировать уход из текущего окна */\n if (\n !shownLocalState.shown &&\n isHTMLElement(reference) &&\n reference === getActiveElementByAnotherElement(reference)\n ) {\n /* istanbul ignore next */\n blockFocusRef.current = true;\n }\n };\n\n const win = getWindow(refs.reference.current);\n win.addEventListener('blur', handleGlobalBlur);\n return () => {\n win.removeEventListener('blur', handleGlobalBlur);\n };\n },\n [triggerOnFocus, refs.reference, shownLocalState],\n );\n\n useIsomorphicLayoutEffect(\n function resolveShownStates() {\n if (willBeHide || shownLocalState.shown === shownFinalState) {\n return;\n }\n\n if (shownLocalState.shown) {\n setShownFinalState(true);\n } else if (hasCSSAnimation.current && !willBeHide) {\n setWillBeHide(true);\n } else {\n setShownFinalState(false);\n }\n\n return () => {\n clearTimeout(blurTimeoutRef.current);\n };\n },\n [shownLocalState, shownFinalState, willBeHide],\n );\n\n const referencePropsRef = React.useRef<ReferenceProps>({});\n const floatingPropsRef = React.useRef<FloatingProps>({ style: {} });\n\n if (shownFinalState) {\n floatingPropsRef.current.style = convertFloatingDataToReactCSSProperties(\n strategy,\n x,\n y,\n undefined,\n middlewareData,\n );\n\n if (disableInteractive) {\n floatingPropsRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (triggerOnFocus) {\n referencePropsRef.current.onFocus = handleFocusOnReference;\n referencePropsRef.current.onBlur = handleBlurOnReference;\n }\n\n if (triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReference;\n }\n\n if (triggerOnHover) {\n referencePropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n\n if (closeAfterClick && !triggerOnClick) {\n referencePropsRef.current.onClick = handleClickOnReferenceForOnlyClose;\n }\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseOver = handleMouseEnterOnBoth;\n }\n }\n\n if (triggerOnHover || triggerOnFocus) {\n referencePropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n\n if (!disableInteractive) {\n floatingPropsRef.current.onMouseLeave = handleMouseLeaveOnBothForHoverAndFocusStates;\n }\n }\n\n if (shownFinalState) {\n floatingPropsRef.current.onAnimationStart = handleFloatingAnimationStart;\n floatingPropsRef.current.onAnimationEnd = handleFloatingAnimationEnd;\n }\n\n return {\n placement,\n shown: shownFinalState,\n willBeHide,\n refs,\n referenceProps: referencePropsRef.current,\n floatingProps: floatingPropsRef.current,\n middlewareData,\n onClose: handleOnClose,\n // FocusTrap уже определяет нажатие на ESC, поэтому название события содержит конкретный код\n // кнопки вместо просто onKeyDown.\n onEscapeKeyDown: !shownFinalState || disableCloseOnEscKey ? undefined : handleEscapeKeyDown,\n // [Обход баги с FocusTrap]\n //\n // Если сфокусироваться на целевой элемент через нажатие, а потом нажать в область за пределами\n // целевого и всплывающего элемента, то появляется моргание из-за того, что FocusTrap\n // восстанавливает фокус, из-за чего всплывающий элемент снова показывается за счёт\n // `handleFocusOnReference`, а потом скрывается за счёт `handleBlurOnReference`.\n onRestoreFocus: handleRestoreFocus,\n };\n};\n"],"names":["React","debounce","getWindow","isHTMLElement","useCustomEnsuredControl","useGlobalOnClickOutside","useStableCallback","contains","getActiveElementByAnotherElement","useIsomorphicLayoutEffect","autoUpdateFloatingElement","useFloating","convertFloatingDataToReactCSSProperties","DEFAULT_TRIGGER","useResolveTriggerType","whileElementsMounted","args","elementResize","useFloatingWithInteractions","trigger","placement","placementProp","middlewares","hoverDelay","closeAfterClick","disabled","disableInteractive","disableCloseOnClickOutside","disableCloseOnEscKey","defaultShown","shown","shownProp","onShownChange","onShownChangeProp","memoizedValue","useMemo","undefined","shownLocalState","setShownLocalState","value","defaultValue","onChange","reason","shownFinalState","setShownFinalState","useState","willBeHide","setWillBeHide","hasCSSAnimation","useRef","blockMouseEnterRef","blockFocusRef","blurTimeoutRef","handleCloseOnReferenceClickOutsideDisabled","handleCloseOnFloatingClickOutsideDisabled","triggerOnFocus","triggerOnClick","triggerOnHover","x","y","strategy","refs","middlewareData","middleware","commitShownLocalState","useCallback","nextShown","prevState","mouseEnterDelay","mouseLeaveDelay","showWithDelay","hideWithDelay","handleFocusOnReference","current","handleBlurOnReference","event","clearTimeout","relatedTarget","setTimeout","waitWindowBlurFire","reference","floating","handleClickOnReference","handleClickOnReferenceForOnlyClose","handleMouseEnterOnBoth","cancel","handleMouseLeaveOnBothForHoverAndFocusStates","handleFloatingAnimationStart","handleFloatingAnimationEnd","handleOnClose","handleRestoreFocus","handleEscapeKeyDown","handleClickOutside","setGlobalBlurForTriggerOnFocus","handleGlobalBlur","win","addEventListener","removeEventListener","resolveShownStates","referencePropsRef","floatingPropsRef","style","pointerEvents","onFocus","onBlur","onClick","onMouseOver","onMouseLeave","onAnimationStart","onAnimationEnd","referenceProps","floatingProps","onClose","onEscapeKeyDown","onRestoreFocus"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,SAASC,SAAS,EAAEC,aAAa,QAAQ,wCAAwC;AACjF,SAASC,uBAAuB,QAAQ,mCAAmC;AAC3E,SAASC,uBAAuB,QAAQ,yCAAyC;AACjF,SAASC,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,QAAQ,EAAEC,gCAAgC,QAAQ,YAAY;AACvE,SAASC,yBAAyB,QAAQ,kCAAkC;AAC5E,SAASC,yBAAyB,EAAEC,WAAW,QAAQ,cAAc;AACrE,SAASC,uCAAuC,QAAQ,eAAe;AAEvE,SAASC,eAAe,QAAQ,cAAc;AAQ9C,SAASC,qBAAqB,QAAQ,0BAA0B;AAIhE,MAAMC,uBAAmE,CAAC,GAAGC,OAC3E,+CAA+C,GAC/CN,6BAA6BM,MAAM;QAAEC,eAAe;IAAK;AAE3D;;CAEC,GACD,OAAO,MAAMC,8BAA8B,CAAsC,EAC/EC,UAAUN,eAAe,EAEzB,cAAc;AACdO,WAAWC,gBAAgB,QAAQ,EACnCC,WAAW,EACXC,aAAa,CAAC,EACdC,kBAAkB,KAAK,EAEvB,WAAW;AACXC,WAAW,KAAK,EAChBC,qBAAqB,KAAK,EAC1BC,6BAA6B,KAAK,EAClCC,uBAAuB,KAAK,EAE5B,eAAe;AACfC,eAAe,KAAK,EAEpB,aAAa;AACbC,OAAOC,SAAS,EAChBC,eAAeC,iBAAiB,EACC;IACjC,MAAMC,gBAAgBlC,MAAMmC,OAAO,CACjC,IAAOJ,cAAcK,YAAY;YAAEN,OAAOC;QAAU,IAAIK,WACxD;QAACL;KAAU;IAEb,MAAM,CAACM,iBAAiBC,mBAAmB,GAAGlC,wBAAoC;QAChFmC,OAAOL;QACPT;QACAe,cAAc;YAAEV,OAAOD;QAAa;QACpCY,UAAUnC,kBAAkB,CAAC,EAAEwB,KAAK,EAAEY,MAAM,EAAE;YAC5C,IAAIT,mBAAmB;gBACrBA,kBAAkBH,OAAOY;YAC3B;QACF;IACF;IACA,MAAM,CAACC,iBAAiBC,mBAAmB,GAAG5C,MAAM6C,QAAQ,CAAC,IAAMR,gBAAgBP,KAAK;IACxF,MAAM,CAACgB,YAAYC,cAAc,GAAG/C,MAAM6C,QAAQ,CAAC;IAEnD,MAAMG,kBAAkBhD,MAAMiD,MAAM,CAAC;IAErC,MAAMC,qBAAqBlD,MAAMiD,MAAM,CAAC;IACxC,MAAME,gBAAgBnD,MAAMiD,MAAM,CAAC;IACnC,MAAMG,iBAAiBpD,MAAMiD,MAAM;IAEnC,MAAMI,6CACJ5B,YAAYE,8BAA8BmB,cAAc,CAACT,gBAAgBP,KAAK;IAChF,MAAMwB,4CACJ5B,sBAAsB2B;IAExB,MAAM,EAAEE,cAAc,EAAEC,cAAc,EAAEC,cAAc,EAAE,GAAG3C,sBAAsBK;IAEjF,2BAA2B;IAC3B,MAAM,EAAEC,SAAS,EAAEsC,CAAC,EAAEC,CAAC,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,cAAc,EAAE,GAAGnD,YAAe;QACzEiD,UAAU;QACVxC,WAAWC;QACX0C,YAAYzC;QACZP;IACF;IAEA,MAAMiD,wBAAwBhE,MAAMiE,WAAW,CAC7C,CAACC,WAAoBxB;QACnBJ,mBAAmB,CAAC6B;YAClB,IAAIA,UAAUrC,KAAK,KAAKoC,aAAaC,UAAUzB,MAAM,KAAKA,QAAQ;gBAChE,OAAO;oBACLZ,OAAOoC;oBACPxB;gBACF;YACF;YACA,+GAA+G,GAC/G,OAAOyB;QACT;IACF,GACA;QAAC7B;KAAmB;IAGtB,MAAM,CAAC8B,iBAAiBC,gBAAgB,GACtC,OAAO9C,eAAe,WAAW;QAACA;QAAYA;KAAW,GAAGA;IAE9D,MAAM+C,gBAAgBtE,MAAMmC,OAAO,CACjC,IAAMlC,SAAS,IAAM+D,sBAAsB,MAAM,UAAUI,kBAC3D;QAACA;QAAiBJ;KAAsB;IAG1C,MAAMO,gBAAgBvE,MAAMmC,OAAO,CACjC,IAAMlC,SAAS,IAAM+D,sBAAsB,OAAO,UAAUK,kBAC5D;QAACA;QAAiBL;KAAsB;IAG1C,MAAMQ,yBAAyBlE,kBAAkB;QAC/C,wEAAwE;QACxE,IAAI+B,gBAAgBP,KAAK,EAAE;YACzBkC,sBAAsB,OAAO;YAC7B;QACF;QACA,IAAIb,cAAcsB,OAAO,EAAE;YACzB,oFAAoF,GACpFtB,cAAcsB,OAAO,GAAG;YACxB;QACF;QAEAT,sBAAsB,MAAM;IAC9B;IAEA,MAAMU,wBAAwBpE,kBAAkB,CAACqE;QAC/CxB,cAAcsB,OAAO,GAAG;QACxBvB,mBAAmBuB,OAAO,GAAG;QAE7B,IAAI,CAACpC,gBAAgBP,KAAK,EAAE;YAC1B8C,aAAaxB,eAAeqB,OAAO;YACnC;QACF;QAEA,MAAMI,gBAAgBF,MAAME,aAAa;QACzCzB,eAAeqB,OAAO,GAAGK,WAAW,SAASC;YAC3C,MAAMC,YAAYnB,KAAKmB,SAAS,CAACP,OAAO;YACxC,kEAAkE;YAClE,oCAAoC;YACpC,mEAAmE,GACnE,IAAI,CAACI,iBAAiBrE,iCAAiCwE,eAAeA,WAAW;gBAC/E,wBAAwB,GACxB;YACF;YAEA,uFAAuF;YACvF,wFAAwF;YACxF,IAAIzE,SAASsD,KAAKoB,QAAQ,CAACR,OAAO,EAAEI,kBAAkBtE,SAASyE,WAAWH,gBAAgB;gBACxF;YACF;YAEAb,sBAAsB,OAAO;QAC/B;IACF;IAEA,MAAMkB,yBAAyB5E,kBAAkB;QAC/C,8FAA8F;QAC9F,IAAI+B,gBAAgBK,MAAM,KAAK,SAAS;YACtCsB,sBAAsB3B,gBAAgBP,KAAK,EAAE;YAC7C;QACF;QACAkC,sBAAsB,CAAC3B,gBAAgBP,KAAK,EAAE;IAChD;IAEA,MAAMqD,qCAAqC7E,kBAAkB;QAC3D4C,mBAAmBuB,OAAO,GAAG;QAC7BT,sBAAsB,OAAO;IAC/B;IAEA,MAAMoB,yBAAyB9E,kBAAkB;QAC/CgE,cAAce,MAAM;QACpBd,cAAcc,MAAM;QAEpB,IAAI,CAACnC,mBAAmBuB,OAAO,IAAI,CAACpC,gBAAgBP,KAAK,EAAE;YACzDwC;QACF;IACF;IAEA,MAAMgB,+CAA+ChF,kBAAkB;QACrE6C,cAAcsB,OAAO,GAAG;QACxBvB,mBAAmBuB,OAAO,GAAG;QAE7B,IAAIhB,gBAAgB;YAClBa,cAAce,MAAM;YACpBd,cAAcc,MAAM;YAEpB,IAAIhD,gBAAgBK,MAAM,KAAK,WAAWL,gBAAgBK,MAAM,KAAK,SAAS;gBAC5E6B;YACF;QACF;IACF;IAEA,MAAMgB,+BAA+B;QACnCvC,gBAAgByB,OAAO,GAAG;IAC5B;IAEA,MAAMe,6BAA6B;QACjC,IAAI1C,YAAY;YACdF,mBAAmB;YACnBG,cAAc;QAChB;IACF;IAEA,MAAM0C,gBAAgBzF,MAAMiE,WAAW,CAAC;QACtCd,cAAcsB,OAAO,GAAG;QACxBT,sBAAsB,OAAO;IAC/B,GAAG;QAACA;KAAsB;IAE1B,MAAM0B,qBAAqB1F,MAAMiE,WAAW,CAC1C,IAAOV,iBAAiBJ,cAAcsB,OAAO,GAAG,MAChD;QAAClB;KAAe;IAGlB,MAAMoC,sBAAsB3F,MAAMiE,WAAW,CAAC;QAC5Cd,cAAcsB,OAAO,GAAG;QACxBT,sBAAsB,OAAO;IAC/B,GAAG;QAACA;KAAsB;IAE1B,MAAM4B,qBAAqB5F,MAAMiE,WAAW,CAAC;QAC3Cd,cAAcsB,OAAO,GAAG;QACxBT,sBAAsB,OAAO;IAC/B,GAAG;QAACA;KAAsB;IAE1B3D,wBACEuF,oBACAvC,6CAA6C,OAAOQ,KAAKmB,SAAS,EAClE1B,4CAA4C,OAAOO,KAAKoB,QAAQ;IAGlExE,0BACE;;;;;;KAMC,GACD,SAASoF;QACP,IAAI,CAACtC,kBAAkB,CAACM,KAAKmB,SAAS,CAACP,OAAO,EAAE;YAC9C;QACF;QAEA,MAAMqB,mBAAmB;YACvB,wBAAwB,GACxB,MAAMd,YAAYnB,KAAKmB,SAAS,CAACP,OAAO;YACxC,mEAAmE,GACnE,IACE,CAACpC,gBAAgBP,KAAK,IACtB3B,cAAc6E,cACdA,cAAcxE,iCAAiCwE,YAC/C;gBACA,wBAAwB,GACxB7B,cAAcsB,OAAO,GAAG;YAC1B;QACF;QAEA,MAAMsB,MAAM7F,UAAU2D,KAAKmB,SAAS,CAACP,OAAO;QAC5CsB,IAAIC,gBAAgB,CAAC,QAAQF;QAC7B,OAAO;YACLC,IAAIE,mBAAmB,CAAC,QAAQH;QAClC;IACF,GACA;QAACvC;QAAgBM,KAAKmB,SAAS;QAAE3C;KAAgB;IAGnD5B,0BACE,SAASyF;QACP,IAAIpD,cAAcT,gBAAgBP,KAAK,KAAKa,iBAAiB;YAC3D;QACF;QAEA,IAAIN,gBAAgBP,KAAK,EAAE;YACzBc,mBAAmB;QACrB,OAAO,IAAII,gBAAgByB,OAAO,IAAI,CAAC3B,YAAY;YACjDC,cAAc;QAChB,OAAO;YACLH,mBAAmB;QACrB;QAEA,OAAO;YACLgC,aAAaxB,eAAeqB,OAAO;QACrC;IACF,GACA;QAACpC;QAAiBM;QAAiBG;KAAW;IAGhD,MAAMqD,oBAAoBnG,MAAMiD,MAAM,CAAiB,CAAC;IACxD,MAAMmD,mBAAmBpG,MAAMiD,MAAM,CAAgB;QAAEoD,OAAO,CAAC;IAAE;IAEjE,IAAI1D,iBAAiB;QACnByD,iBAAiB3B,OAAO,CAAC4B,KAAK,GAAGzF,wCAC/BgD,UACAF,GACAC,GACAvB,WACA0B;QAGF,IAAIpC,oBAAoB;YACtB0E,iBAAiB3B,OAAO,CAAC4B,KAAK,CAACC,aAAa,GAAG;QACjD;IACF;IAEA,IAAI/C,gBAAgB;QAClB4C,kBAAkB1B,OAAO,CAAC8B,OAAO,GAAG/B;QACpC2B,kBAAkB1B,OAAO,CAAC+B,MAAM,GAAG9B;IACrC;IAEA,IAAIlB,gBAAgB;QAClB2C,kBAAkB1B,OAAO,CAACgC,OAAO,GAAGvB;IACtC;IAEA,IAAIzB,gBAAgB;QAClB0C,kBAAkB1B,OAAO,CAACiC,WAAW,GAAGtB;QAExC,IAAI5D,mBAAmB,CAACgC,gBAAgB;YACtC2C,kBAAkB1B,OAAO,CAACgC,OAAO,GAAGtB;QACtC;QAEA,IAAI,CAACzD,oBAAoB;YACvB0E,iBAAiB3B,OAAO,CAACiC,WAAW,GAAGtB;QACzC;IACF;IAEA,IAAI3B,kBAAkBF,gBAAgB;QACpC4C,kBAAkB1B,OAAO,CAACkC,YAAY,GAAGrB;QAEzC,IAAI,CAAC5D,oBAAoB;YACvB0E,iBAAiB3B,OAAO,CAACkC,YAAY,GAAGrB;QAC1C;IACF;IAEA,IAAI3C,iBAAiB;QACnByD,iBAAiB3B,OAAO,CAACmC,gBAAgB,GAAGrB;QAC5Ca,iBAAiB3B,OAAO,CAACoC,cAAc,GAAGrB;IAC5C;IAEA,OAAO;QACLpE;QACAU,OAAOa;QACPG;QACAe;QACAiD,gBAAgBX,kBAAkB1B,OAAO;QACzCsC,eAAeX,iBAAiB3B,OAAO;QACvCX;QACAkD,SAASvB;QACT,4FAA4F;QAC5F,kCAAkC;QAClCwB,iBAAiB,CAACtE,mBAAmBf,uBAAuBQ,YAAYuD;QACxE,2BAA2B;QAC3B,EAAE;QACF,+FAA+F;QAC/F,qFAAqF;QACrF,mFAAmF;QACnF,gFAAgF;QAChFuB,gBAAgBxB;IAClB;AACF,EAAE"}
|
|
@@ -77,8 +77,7 @@ Note: В начале классов разделить (`-`), чтобы кра
|
|
|
77
77
|
|
|
78
78
|
.-deviceType--mobile-forced,
|
|
79
79
|
.-deviceType--desktop-forced {
|
|
80
|
-
/*
|
|
81
|
-
display: none !important;
|
|
80
|
+
/* Пустой класс для CSS Modules (см. CONTRIBUTING.md) */
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
@media (min-width: 768px) and (pointer: fine),(min-width: 768px) and (min-height: 720px) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Хук вызывает переданный коллбэк при изменении размеров элемента.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useResizeObserver(ref: React.MutableRefObject<HTMLElement | null>, callback: (element: HTMLElement) => void): void;
|
|
6
|
+
//# sourceMappingURL=useResizeObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResizeObserver.d.ts","sourceRoot":"","sources":["../../src/hooks/useResizeObserver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,EAC/C,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,QAmBzC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { CustomResizeObserver } from '../lib/floating/customResizeObserver';
|
|
3
|
+
import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
|
|
4
|
+
import { useStableCallback } from './useStableCallback';
|
|
5
|
+
/**
|
|
6
|
+
* Хук вызывает переданный коллбэк при изменении размеров элемента.
|
|
7
|
+
*/ export function useResizeObserver(ref, callback) {
|
|
8
|
+
const stableCallback = useStableCallback(callback);
|
|
9
|
+
useIsomorphicLayoutEffect(function addResizeObserverHandler() {
|
|
10
|
+
/* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */ if (!ref.current) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const element = ref.current;
|
|
14
|
+
const observer = new CustomResizeObserver(()=>stableCallback(element));
|
|
15
|
+
observer.observe(element);
|
|
16
|
+
observer.appendToTheDOM();
|
|
17
|
+
return ()=>observer.disconnect();
|
|
18
|
+
}, [
|
|
19
|
+
ref
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=useResizeObserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useResizeObserver.ts"],"sourcesContent":["import * as React from 'react';\nimport { CustomResizeObserver } from '../lib/floating/customResizeObserver';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\nimport { useStableCallback } from './useStableCallback';\n\n/**\n * Хук вызывает переданный коллбэк при изменении размеров элемента.\n */\nexport function useResizeObserver(\n ref: React.MutableRefObject<HTMLElement | null>,\n callback: (element: HTMLElement) => void,\n) {\n const stableCallback = useStableCallback(callback);\n\n useIsomorphicLayoutEffect(\n function addResizeObserverHandler() {\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!ref.current) {\n return;\n }\n const element = ref.current;\n const observer = new CustomResizeObserver(() => stableCallback(element));\n observer.observe(element);\n observer.appendToTheDOM();\n\n return () => observer.disconnect();\n },\n [ref],\n );\n}\n"],"names":["React","CustomResizeObserver","useIsomorphicLayoutEffect","useStableCallback","useResizeObserver","ref","callback","stableCallback","addResizeObserverHandler","current","element","observer","observe","appendToTheDOM","disconnect"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,oBAAoB,QAAQ,uCAAuC;AAC5E,SAASC,yBAAyB,QAAQ,mCAAmC;AAC7E,SAASC,iBAAiB,QAAQ,sBAAsB;AAExD;;CAEC,GACD,OAAO,SAASC,kBACdC,GAA+C,EAC/CC,QAAwC;IAExC,MAAMC,iBAAiBJ,kBAAkBG;IAEzCJ,0BACE,SAASM;QACP,6EAA6E,GAC7E,IAAI,CAACH,IAAII,OAAO,EAAE;YAChB;QACF;QACA,MAAMC,UAAUL,IAAII,OAAO;QAC3B,MAAME,WAAW,IAAIV,qBAAqB,IAAMM,eAAeG;QAC/DC,SAASC,OAAO,CAACF;QACjBC,SAASE,cAAc;QAEvB,OAAO,IAAMF,SAASG,UAAU;IAClC,GACA;QAACT;KAAI;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customResizeObserver.d.ts","sourceRoot":"","sources":["../../../src/lib/floating/customResizeObserver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"customResizeObserver.d.ts","sourceRoot":"","sources":["../../../src/lib/floating/customResizeObserver.ts"],"names":[],"mappings":"AAsCA,qBAAa,oBAAoB;IAOnB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAN3C,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,WAAW,CAAC;QACpB,MAAM,EAAE,iBAAiB,CAAC;KAC3B,CAAC,CAAM;IACR,wBAAwB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;gBAE5B,cAAc,EAAE,MAAM,IAAI;IAIvD,OAAO,CAAC,OAAO,EAAE,WAAW;IAO5B,cAAc;IAYd,kBAAkB,CAAC,OAAO,EAAE,WAAW;IAUvC,4BAA4B,CAAC,OAAO,EAAE,WAAW;IAWjD,UAAU;CAeX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n 'position'
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n | 'position'\n | 'left'\n | 'top'\n | 'zIndex'\n | 'width'\n | 'height'\n | 'pointerEvents'\n | 'opacity'\n | 'border'\n> = {\n position: 'absolute',\n left: '0',\n top: '0',\n zIndex: '-1',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n opacity: '0',\n border: '0',\n};\n\n/*\n * Специальный CustomResizeObserver как fallback для ResizeObserver\n * Используется для вызова update() функции (перерисовка плавающего окна) floating-ui\n * при изменении размера reference или floating элементов.\n *\n * По умолчанию пытаемся нарисовать скрытый, абсолютно позиционированный относительно\n * наблюдаемого элемента iframe.\n * В случае же, если наблюдаемый элемент имеет position: static, то правильно спозиционировать\n * iframe у нас не получится, поэтому в такой ситуации мы используем MutationObserver.\n *\n * Использовать только MutationObserver мы не можем, потому что с помощью него нельзя отследить\n * изменение размера вызванное переполнением текста.\n *\n * Применяется только если нету поддержики или полифила ResizeObserver.\n * */\nexport class CustomResizeObserver {\n records: Array<{\n target: HTMLElement;\n iframe: HTMLIFrameElement;\n }> = [];\n mutationObserverFallback: MutationObserver | null = null;\n\n constructor(private readonly updateFunction: () => void) {\n this.updateFunction = updateFunction;\n }\n\n observe(element: HTMLElement) {\n if (isPositioned(element)) {\n return this.observeUsingIframe(element);\n }\n return this.observeUsingMutationObserver(element);\n }\n\n appendToTheDOM() {\n for (let record of this.records) {\n record.target.appendChild(record.iframe);\n }\n\n for (let record of this.records) {\n if (record.iframe.contentWindow) {\n record.iframe.contentWindow.addEventListener('resize', this.updateFunction);\n }\n }\n }\n\n observeUsingIframe(element: HTMLElement) {\n const iframe = element.ownerDocument.createElement('iframe');\n iframe.src = 'javascript:void(0)';\n iframe.ariaHidden = 'true';\n iframe.tabIndex = -1;\n Object.assign(iframe.style, defaultIframeStyles);\n\n this.records.push({ target: element, iframe });\n }\n\n observeUsingMutationObserver(element: HTMLElement) {\n if (!this.mutationObserverFallback) {\n this.mutationObserverFallback = new MutationObserver(this.updateFunction);\n }\n\n this.mutationObserverFallback.observe(element, {\n childList: true,\n subtree: true,\n });\n }\n\n disconnect() {\n this.records.map(({ target, iframe }) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.removeEventListener('resize', this.updateFunction);\n }\n\n target.removeChild(iframe);\n });\n this.records = [];\n\n if (this.mutationObserverFallback) {\n this.mutationObserverFallback.disconnect();\n }\n this.mutationObserverFallback = null;\n }\n}\n\nfunction isPositioned(element: HTMLElement): boolean {\n return getComputedStyle(element).position !== 'static';\n}\n"],"names":["defaultIframeStyles","position","left","top","zIndex","width","height","pointerEvents","opacity","border","CustomResizeObserver","observe","element","isPositioned","observeUsingIframe","observeUsingMutationObserver","appendToTheDOM","record","records","target","appendChild","iframe","contentWindow","addEventListener","updateFunction","ownerDocument","createElement","src","ariaHidden","tabIndex","Object","assign","style","push","mutationObserverFallback","MutationObserver","childList","subtree","disconnect","map","removeEventListener","removeChild","constructor","getComputedStyle"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";AAAA,MAAMA,sBAWF;IACFC,UAAU;IACVC,MAAM;IACNC,KAAK;IACLC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,eAAe;IACfC,SAAS;IACTC,QAAQ;AACV;AAEA;;;;;;;;;;;;;;GAcG,GACH,OAAO,MAAMC;IAWXC,QAAQC,OAAoB,EAAE;QAC5B,IAAIC,aAAaD,UAAU;YACzB,OAAO,IAAI,CAACE,kBAAkB,CAACF;QACjC;QACA,OAAO,IAAI,CAACG,4BAA4B,CAACH;IAC3C;IAEAI,iBAAiB;QACf,KAAK,IAAIC,UAAU,IAAI,CAACC,OAAO,CAAE;YAC/BD,OAAOE,MAAM,CAACC,WAAW,CAACH,OAAOI,MAAM;QACzC;QAEA,KAAK,IAAIJ,UAAU,IAAI,CAACC,OAAO,CAAE;YAC/B,IAAID,OAAOI,MAAM,CAACC,aAAa,EAAE;gBAC/BL,OAAOI,MAAM,CAACC,aAAa,CAACC,gBAAgB,CAAC,UAAU,IAAI,CAACC,cAAc;YAC5E;QACF;IACF;IAEAV,mBAAmBF,OAAoB,EAAE;QACvC,MAAMS,SAAST,QAAQa,aAAa,CAACC,aAAa,CAAC;QACnDL,OAAOM,GAAG,GAAG;QACbN,OAAOO,UAAU,GAAG;QACpBP,OAAOQ,QAAQ,GAAG,CAAC;QACnBC,OAAOC,MAAM,CAACV,OAAOW,KAAK,EAAEhC;QAE5B,IAAI,CAACkB,OAAO,CAACe,IAAI,CAAC;YAAEd,QAAQP;YAASS;QAAO;IAC9C;IAEAN,6BAA6BH,OAAoB,EAAE;QACjD,IAAI,CAAC,IAAI,CAACsB,wBAAwB,EAAE;YAClC,IAAI,CAACA,wBAAwB,GAAG,IAAIC,iBAAiB,IAAI,CAACX,cAAc;QAC1E;QAEA,IAAI,CAACU,wBAAwB,CAACvB,OAAO,CAACC,SAAS;YAC7CwB,WAAW;YACXC,SAAS;QACX;IACF;IAEAC,aAAa;QACX,IAAI,CAACpB,OAAO,CAACqB,GAAG,CAAC,CAAC,EAAEpB,MAAM,EAAEE,MAAM,EAAE;YAClC,IAAIA,OAAOC,aAAa,EAAE;gBACxBD,OAAOC,aAAa,CAACkB,mBAAmB,CAAC,UAAU,IAAI,CAAChB,cAAc;YACxE;YAEAL,OAAOsB,WAAW,CAACpB;QACrB;QACA,IAAI,CAACH,OAAO,GAAG,EAAE;QAEjB,IAAI,IAAI,CAACgB,wBAAwB,EAAE;YACjC,IAAI,CAACA,wBAAwB,CAACI,UAAU;QAC1C;QACA,IAAI,CAACJ,wBAAwB,GAAG;IAClC;IA1DAQ,YAAY,AAAiBlB,cAA0B,CAAE;;QANzDN,uBAAAA,WAAAA,KAAAA;QAIAgB,uBAAAA,4BAAAA,KAAAA;aAE6BV,iBAAAA;aAN7BN,UAGK,EAAE;aACPgB,2BAAoD;QAGlD,IAAI,CAACV,cAAc,GAAGA;IACxB;AAyDF;AAEA,SAASX,aAAaD,OAAoB;IACxC,OAAO+B,iBAAiB/B,SAASX,QAAQ,KAAK;AAChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,4QAqBrC,gCAAgC,KAAG,kCAAkC,CAAC,
|
|
1
|
+
{"version":3,"file":"useFloatingWithInteractions.d.ts","sourceRoot":"","sources":["../../../../src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,eAAO,MAAM,2BAA2B,4QAqBrC,gCAAgC,KAAG,kCAAkC,CAAC,CA2TxE,CAAC"}
|
|
@@ -55,7 +55,7 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
55
55
|
});
|
|
56
56
|
const commitShownLocalState = React.useCallback((nextShown, reason)=>{
|
|
57
57
|
setShownLocalState((prevState)=>{
|
|
58
|
-
if (prevState.shown !== nextShown) {
|
|
58
|
+
if (prevState.shown !== nextShown || prevState.reason !== reason) {
|
|
59
59
|
return {
|
|
60
60
|
shown: nextShown,
|
|
61
61
|
reason
|
|
@@ -79,6 +79,11 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
79
79
|
commitShownLocalState
|
|
80
80
|
]);
|
|
81
81
|
const handleFocusOnReference = useStableCallback(()=>{
|
|
82
|
+
// Повторный вызов события фокуса - следствие клика на reference-элемент
|
|
83
|
+
if (shownLocalState.shown) {
|
|
84
|
+
commitShownLocalState(false, 'focus');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
82
87
|
if (blockFocusRef.current) {
|
|
83
88
|
/* istanbul ignore next: в Jest не воспроизводится баг на вебе (cм. onRestoreFocus) */ blockFocusRef.current = false;
|
|
84
89
|
return;
|
|
@@ -109,6 +114,11 @@ shown: shownProp, onShownChange: onShownChangeProp })=>{
|
|
|
109
114
|
});
|
|
110
115
|
});
|
|
111
116
|
const handleClickOnReference = useStableCallback(()=>{
|
|
117
|
+
// Предыдущий триггер (фокус) уже вызвал открытие/закрытие всплывающего окна, игнорируем вызов
|
|
118
|
+
if (shownLocalState.reason === 'focus') {
|
|
119
|
+
commitShownLocalState(shownLocalState.shown, 'click');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
112
122
|
commitShownLocalState(!shownLocalState.shown, 'click');
|
|
113
123
|
});
|
|
114
124
|
const handleClickOnReferenceForOnlyClose = useStableCallback(()=>{
|