@hh.ru/magritte-internal-drop-base 7.0.17 → 7.0.18
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/DropBase.d.ts +1 -5
- package/DropBase.js +1 -1
- package/index.css +1 -1
- package/index.d.ts +1 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/useArrayMemo.d.ts +3 -0
- package/useArrayMemo.js +20 -0
- package/useArrayMemo.js.map +1 -0
- package/usePlacements.d.ts +2 -0
- package/usePlacements.js +66 -0
- package/usePlacements.js.map +1 -0
package/DropBase.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ declare const DropBase: import("react").ForwardRefExoticComponent<{
|
|
|
51
51
|
onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
|
|
52
52
|
onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
53
53
|
onChangeCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
54
|
-
onBeforeInput?: import("react").
|
|
54
|
+
onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
|
|
55
55
|
onBeforeInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
56
56
|
onInput?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
57
57
|
onInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
|
|
@@ -101,8 +101,6 @@ declare const DropBase: import("react").ForwardRefExoticComponent<{
|
|
|
101
101
|
onProgressCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
102
102
|
onRateChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
103
103
|
onRateChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
104
|
-
onResize?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
105
|
-
onResizeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
106
104
|
onSeeked?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
107
105
|
onSeekedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
108
106
|
onSeeking?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
|
|
@@ -172,9 +170,7 @@ declare const DropBase: import("react").ForwardRefExoticComponent<{
|
|
|
172
170
|
onPointerCancel?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
173
171
|
onPointerCancelCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
174
172
|
onPointerEnter?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
175
|
-
onPointerEnterCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
176
173
|
onPointerLeave?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
177
|
-
onPointerLeaveCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
178
174
|
onPointerOver?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
179
175
|
onPointerOverCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
|
180
176
|
onPointerOut?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
|
package/DropBase.js
CHANGED
|
@@ -13,7 +13,7 @@ import { usePositionManager } from './positionManager.js';
|
|
|
13
13
|
import './findBestFitPlacement.js';
|
|
14
14
|
import './useMonitorResize.js';
|
|
15
15
|
|
|
16
|
-
var styles = {"drop-base":"magritte-drop-base___uJNG4_7-0-
|
|
16
|
+
var styles = {"drop-base":"magritte-drop-base___uJNG4_7-0-18","dropBase":"magritte-drop-base___uJNG4_7-0-18"};
|
|
17
17
|
|
|
18
18
|
const DropBaseComponent = ({ visible, children, arrowGuardDistance, activatorRef, preferredViewport, onClose, autoFocusWhenOpened = false, closeByClickOutside = true, animationTimeout, animationClassNames, guardDistanceToActivator = 8, guardDistanceToViewport = 24, minHeight = 200, role, widthEqualToActivator = false, allowShrinkHeightToFitIntoViewport = false, keyboardNavigationMode = null, ignoreIntersections = false, style = {}, onAppear, onBeforeExit, onAfterExit, host, placement, forceDropMetricsUpdate, lockPlacement = false, ...props }, ref) => {
|
|
19
19
|
const dropNodeRef = useRef(null);
|
package/index.css
CHANGED
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
export { DropBase } from './DropBase.js';
|
|
3
|
+
export { usePlacement } from './usePlacements.js';
|
|
3
4
|
import 'react/jsx-runtime';
|
|
4
5
|
import 'react';
|
|
5
6
|
import 'react-dom';
|
|
@@ -13,4 +14,5 @@ import './intersectionManager.js';
|
|
|
13
14
|
import './positionManager.js';
|
|
14
15
|
import './findBestFitPlacement.js';
|
|
15
16
|
import './useMonitorResize.js';
|
|
17
|
+
import './useArrayMemo.js';
|
|
16
18
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-internal-drop-base",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.18",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "4bb5448cb39f50a8b84cec5100fda12a9a45f6c1"
|
|
37
37
|
}
|
package/useArrayMemo.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
const isEqual = (first, second) => first === second || (first.length === second.length && first.every((e, i) => e === second[i]));
|
|
5
|
+
const useArrayMemo = (cb, array, ...restArgs) => {
|
|
6
|
+
const prevArrayRef = useRef(array);
|
|
7
|
+
const prevRestArgsRef = useRef(restArgs);
|
|
8
|
+
const resultRef = useRef();
|
|
9
|
+
const isArrayEqual = isEqual(prevArrayRef.current, array);
|
|
10
|
+
const isRestArgsEqual = isEqual(prevRestArgsRef.current, restArgs);
|
|
11
|
+
prevArrayRef.current = array;
|
|
12
|
+
prevRestArgsRef.current = restArgs;
|
|
13
|
+
if (resultRef.current === undefined || !isArrayEqual || !isRestArgsEqual) {
|
|
14
|
+
resultRef.current = cb();
|
|
15
|
+
}
|
|
16
|
+
return resultRef.current;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { isEqual, useArrayMemo };
|
|
20
|
+
//# sourceMappingURL=useArrayMemo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useArrayMemo.js","sources":["../src/useArrayMemo.ts"],"sourcesContent":["import { useRef } from 'react';\n\nexport const isEqual = (first: unknown[], second: unknown[]): boolean =>\n first === second || (first.length === second.length && first.every((e: unknown, i: number) => e === second[i]));\n\nconst useArrayMemo = <T, R>(cb: () => R, array: T[], ...restArgs: unknown[]): R => {\n const prevArrayRef = useRef(array);\n const prevRestArgsRef = useRef(restArgs);\n\n const resultRef = useRef<undefined | R>();\n\n const isArrayEqual = isEqual(prevArrayRef.current, array);\n const isRestArgsEqual = isEqual(prevRestArgsRef.current, restArgs);\n\n prevArrayRef.current = array;\n prevRestArgsRef.current = restArgs;\n\n if (resultRef.current === undefined || !isArrayEqual || !isRestArgsEqual) {\n resultRef.current = cb();\n }\n\n return resultRef.current;\n};\n\nexport { useArrayMemo };\n"],"names":[],"mappings":";;AAEa,MAAA,OAAO,GAAG,CAAC,KAAgB,EAAE,MAAiB,KACvD,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,CAAS,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AAE9G,MAAA,YAAY,GAAG,CAAO,EAAW,EAAE,KAAU,EAAE,GAAG,QAAmB,KAAO;AAC9E,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACnC,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEzC,IAAA,MAAM,SAAS,GAAG,MAAM,EAAiB,CAAC;IAE1C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEnE,IAAA,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;AAC7B,IAAA,eAAe,CAAC,OAAO,GAAG,QAAQ,CAAC;AAEnC,IAAA,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE;AACtE,QAAA,SAAS,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC;KAC5B;IAED,OAAO,SAAS,CAAC,OAAO,CAAC;AAC7B;;;;"}
|
package/usePlacements.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { useArrayMemo } from './useArrayMemo.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
|
|
5
|
+
const HOR_DIRECTION_ALIGNMENT_PRIORITIES = ['center', 'top', 'bottom'];
|
|
6
|
+
const VER_DIRECTION_ALIGNMENT_PRIORITIES = ['center', 'left', 'right'];
|
|
7
|
+
const PLACEMENTS_MAP = {
|
|
8
|
+
right: HOR_DIRECTION_ALIGNMENT_PRIORITIES,
|
|
9
|
+
left: HOR_DIRECTION_ALIGNMENT_PRIORITIES,
|
|
10
|
+
top: VER_DIRECTION_ALIGNMENT_PRIORITIES,
|
|
11
|
+
bottom: VER_DIRECTION_ALIGNMENT_PRIORITIES,
|
|
12
|
+
};
|
|
13
|
+
const HOR_DIRECTIONS = ['right', 'left'];
|
|
14
|
+
const VER_DIRECTIONS = ['top', 'bottom'];
|
|
15
|
+
const usePlacement = (preferredPlacements, availablePlacements, forcePlacement) => {
|
|
16
|
+
const placements = Array.isArray(preferredPlacements) ? preferredPlacements : [preferredPlacements];
|
|
17
|
+
const result = useArrayMemo(() => {
|
|
18
|
+
if (forcePlacement) {
|
|
19
|
+
return placements;
|
|
20
|
+
}
|
|
21
|
+
const result = [...placements];
|
|
22
|
+
const processedDirections = {};
|
|
23
|
+
// массив, содержащий только уникальные directions из prefferedPlacements в порядке их первого
|
|
24
|
+
// упоминания в массиве
|
|
25
|
+
const preferredDirections = placements
|
|
26
|
+
.map((placement) => placement.split('-')[0])
|
|
27
|
+
.reduce((result, direction) => {
|
|
28
|
+
if (processedDirections[direction]) {
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
processedDirections[direction] = true;
|
|
32
|
+
result.push(direction);
|
|
33
|
+
return result;
|
|
34
|
+
}, []);
|
|
35
|
+
// Если перечислены не все возможные directions добавляем недостающие
|
|
36
|
+
// причем если наиболее приоритетный direction был вертикальным, то сначала добавляем вертикальные
|
|
37
|
+
// иначе горизонтальные
|
|
38
|
+
if (preferredDirections.length < 4) {
|
|
39
|
+
const directions = HOR_DIRECTIONS.includes(preferredDirections[0])
|
|
40
|
+
? [...HOR_DIRECTIONS, ...VER_DIRECTIONS]
|
|
41
|
+
: [...VER_DIRECTIONS, ...HOR_DIRECTIONS];
|
|
42
|
+
for (const direction of directions) {
|
|
43
|
+
!preferredDirections.includes(direction) && preferredDirections.push(direction);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// проходимся по всем directions в порядке приоритета
|
|
47
|
+
// для каждого из них генерируем все placements перебирая alignment в порядке приоритета
|
|
48
|
+
// для каждого placement проверяем есть ли он в preferredPlacements и в availablePlacements
|
|
49
|
+
// если нет в preferredPlacements и есть в availablePlacements, то добавляем этот placements к результату
|
|
50
|
+
// в итоге получаем список placement отсортированный по приоритетам directions в исходном массиве
|
|
51
|
+
for (const direction of preferredDirections) {
|
|
52
|
+
const alignments = PLACEMENTS_MAP[direction];
|
|
53
|
+
for (const alignment of alignments) {
|
|
54
|
+
const placement = `${direction}-${alignment}`;
|
|
55
|
+
if (!preferredPlacements.includes(placement) && availablePlacements.has(placement)) {
|
|
56
|
+
result.push(placement);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}, placements, forcePlacement, availablePlacements);
|
|
62
|
+
return result;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { usePlacement };
|
|
66
|
+
//# sourceMappingURL=usePlacements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePlacements.js","sources":["../src/usePlacements.ts"],"sourcesContent":["import type {\n Placement,\n VerticalDirection,\n HorizontalDirection,\n AlignmentForVerticalDirection,\n AlignmentForHorizontalDirection,\n} from '@hh.ru/magritte-internal-drop-base/types';\nimport { useArrayMemo } from '@hh.ru/magritte-internal-drop-base/useArrayMemo';\n\nconst HOR_DIRECTION_ALIGNMENT_PRIORITIES = ['center', 'top', 'bottom'] as const;\nconst VER_DIRECTION_ALIGNMENT_PRIORITIES = ['center', 'left', 'right'] as const;\nconst PLACEMENTS_MAP = {\n right: HOR_DIRECTION_ALIGNMENT_PRIORITIES,\n left: HOR_DIRECTION_ALIGNMENT_PRIORITIES,\n top: VER_DIRECTION_ALIGNMENT_PRIORITIES,\n bottom: VER_DIRECTION_ALIGNMENT_PRIORITIES,\n} as const satisfies { [key in VerticalDirection]: readonly AlignmentForVerticalDirection[] } & {\n [key in HorizontalDirection]: readonly AlignmentForHorizontalDirection[];\n};\nconst HOR_DIRECTIONS: (VerticalDirection | HorizontalDirection)[] = ['right', 'left'];\nconst VER_DIRECTIONS: (VerticalDirection | HorizontalDirection)[] = ['top', 'bottom'];\n\nexport const usePlacement = (\n preferredPlacements: Placement[] | Placement,\n availablePlacements: Set<Placement>,\n forcePlacement: boolean\n): Placement[] => {\n const placements = Array.isArray(preferredPlacements) ? preferredPlacements : [preferredPlacements];\n\n const result = useArrayMemo(\n () => {\n if (forcePlacement) {\n return placements;\n }\n\n const result = [...placements];\n const processedDirections: Record<string, boolean> = {};\n\n // массив, содержащий только уникальные directions из prefferedPlacements в порядке их первого\n // упоминания в массиве\n const preferredDirections = placements\n .map((placement) => placement.split('-')[0])\n .reduce<string[]>((result, direction) => {\n if (processedDirections[direction]) {\n return result;\n }\n\n processedDirections[direction] = true;\n result.push(direction);\n return result;\n }, []) as (VerticalDirection | HorizontalDirection)[];\n\n // Если перечислены не все возможные directions добавляем недостающие\n // причем если наиболее приоритетный direction был вертикальным, то сначала добавляем вертикальные\n // иначе горизонтальные\n if (preferredDirections.length < 4) {\n const directions = HOR_DIRECTIONS.includes(preferredDirections[0])\n ? [...HOR_DIRECTIONS, ...VER_DIRECTIONS]\n : [...VER_DIRECTIONS, ...HOR_DIRECTIONS];\n for (const direction of directions) {\n !preferredDirections.includes(direction) && preferredDirections.push(direction);\n }\n }\n\n // проходимся по всем directions в порядке приоритета\n // для каждого из них генерируем все placements перебирая alignment в порядке приоритета\n // для каждого placement проверяем есть ли он в preferredPlacements и в availablePlacements\n // если нет в preferredPlacements и есть в availablePlacements, то добавляем этот placements к результату\n // в итоге получаем список placement отсортированный по приоритетам directions в исходном массиве\n for (const direction of preferredDirections) {\n const alignments = PLACEMENTS_MAP[direction];\n for (const alignment of alignments) {\n const placement = `${direction}-${alignment}` as Placement;\n if (!preferredPlacements.includes(placement) && availablePlacements.has(placement)) {\n result.push(placement);\n }\n }\n }\n\n return result;\n },\n placements,\n forcePlacement,\n availablePlacements\n );\n\n return result;\n};\n"],"names":[],"mappings":";;;AASA,MAAM,kCAAkC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAChF,MAAM,kCAAkC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAChF,MAAM,cAAc,GAAG;AACnB,IAAA,KAAK,EAAE,kCAAkC;AACzC,IAAA,IAAI,EAAE,kCAAkC;AACxC,IAAA,GAAG,EAAE,kCAAkC;AACvC,IAAA,MAAM,EAAE,kCAAkC;CAG7C,CAAC;AACF,MAAM,cAAc,GAAgD,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACtF,MAAM,cAAc,GAAgD,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAEzE,MAAA,YAAY,GAAG,CACxB,mBAA4C,EAC5C,mBAAmC,EACnC,cAAuB,KACV;AACb,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAEpG,IAAA,MAAM,MAAM,GAAG,YAAY,CACvB,MAAK;QACD,IAAI,cAAc,EAAE;AAChB,YAAA,OAAO,UAAU,CAAC;SACrB;AAED,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/B,MAAM,mBAAmB,GAA4B,EAAE,CAAC;;;QAIxD,MAAM,mBAAmB,GAAG,UAAU;AACjC,aAAA,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,aAAA,MAAM,CAAW,CAAC,MAAM,EAAE,SAAS,KAAI;AACpC,YAAA,IAAI,mBAAmB,CAAC,SAAS,CAAC,EAAE;AAChC,gBAAA,OAAO,MAAM,CAAC;aACjB;AAED,YAAA,mBAAmB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;AACtC,YAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvB,YAAA,OAAO,MAAM,CAAC;SACjB,EAAE,EAAE,CAAgD,CAAC;;;;AAK1D,QAAA,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;YAChC,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAC9D,kBAAE,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC;kBACtC,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC;AAC7C,YAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChC,gBAAA,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACnF;SACJ;;;;;;AAOD,QAAA,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE;AACzC,YAAA,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7C,YAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChC,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAG,SAAS,CAAI,CAAA,EAAA,SAAS,EAAe,CAAC;AAC3D,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AAChF,oBAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBAC1B;aACJ;SACJ;AAED,QAAA,OAAO,MAAM,CAAC;AAClB,KAAC,EACD,UAAU,EACV,cAAc,EACd,mBAAmB,CACtB,CAAC;AAEF,IAAA,OAAO,MAAM,CAAC;AAClB;;;;"}
|