@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 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").FormEventHandler<HTMLDivElement> | undefined;
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-17","dropBase":"magritte-drop-base___uJNG4_7-0-17"};
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
@@ -1,4 +1,4 @@
1
- .magritte-drop-base___uJNG4_7-0-17{
1
+ .magritte-drop-base___uJNG4_7-0-18{
2
2
  position:absolute;
3
3
  outline:none;
4
4
  }
package/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from '@hh.ru/magritte-internal-drop-base/DropBase';
2
2
  export * from '@hh.ru/magritte-internal-drop-base/types';
3
+ export * from '@hh.ru/magritte-internal-drop-base/usePlacements';
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.17",
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": "669ee43046224945e90495ba7f31c22996a92d4a"
36
+ "gitHead": "4bb5448cb39f50a8b84cec5100fda12a9a45f6c1"
37
37
  }
@@ -0,0 +1,3 @@
1
+ export declare const isEqual: (first: unknown[], second: unknown[]) => boolean;
2
+ declare const useArrayMemo: <T, R>(cb: () => R, array: T[], ...restArgs: unknown[]) => R;
3
+ export { useArrayMemo };
@@ -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;;;;"}
@@ -0,0 +1,2 @@
1
+ import type { Placement } from '@hh.ru/magritte-internal-drop-base/types';
2
+ export declare const usePlacement: (preferredPlacements: Placement[] | Placement, availablePlacements: Set<Placement>, forcePlacement: boolean) => Placement[];
@@ -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;;;;"}