@hh.ru/magritte-ui-menu 1.0.46 → 1.0.48

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/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from '@hh.ru/magritte-ui-menu/Menu';
2
- export * from '@hh.ru/magritte-ui-menu/types';
1
+ export * from './Menu';
2
+ export * from './types';
package/index.js CHANGED
@@ -24,7 +24,7 @@ import './useSubmenuSafeZone.js';
24
24
  import '@hh.ru/magritte-common-func-utils';
25
25
  import './safeZone.js';
26
26
  import '@hh.ru/magritte-ui-switch';
27
- import './menu-MA0FnVsV.js';
27
+ import './menu-C3Ujgi4a.js';
28
28
  import './QuickAction.js';
29
29
  import './QuickActions.js';
30
30
  import './SectionHeader.js';
package/index.mock.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from '@hh.ru/magritte-ui-menu/types';
1
+ export * from './types';
2
2
  export declare const Menu: import("react").ForwardRefExoticComponent<Record<string, unknown>> & {
3
3
  BottomSheet: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
4
4
  Divider: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
package/index.mock.js CHANGED
@@ -1,21 +1,21 @@
1
1
  import './index.css';
2
2
  import { mockComponent } from '@hh.ru/magritte-ui-mock-component';
3
3
 
4
- const BottomSheet = mockComponent('Menu.BottomSheet', undefined, { withChildren: true });
5
- const Divider = mockComponent('Menu.Divider', undefined);
6
- const Drop = mockComponent('Menu.Drop', undefined, { withChildren: true });
7
- const Item = mockComponent('Menu.Item', undefined, { withChildren: true });
8
- const QuickAction = mockComponent('Menu.QuickAction', undefined, { withChildren: true });
9
- const QuickActions = mockComponent('Menu.QuickActions', undefined, { withChildren: true });
10
- const SectionHeader = mockComponent('Menu.SectionHeader', undefined, { withChildren: true });
11
- const Menu = Object.assign(mockComponent('Menu', undefined, { withChildren: true }), {
12
- BottomSheet,
13
- Divider,
14
- Drop,
15
- Item,
16
- QuickAction,
17
- QuickActions,
18
- SectionHeader,
4
+ const BottomSheet = mockComponent("Menu.BottomSheet", void 0, { withChildren: true });
5
+ const Divider = mockComponent("Menu.Divider", void 0);
6
+ const Drop = mockComponent("Menu.Drop", void 0, { withChildren: true });
7
+ const Item = mockComponent("Menu.Item", void 0, { withChildren: true });
8
+ const QuickAction = mockComponent("Menu.QuickAction", void 0, { withChildren: true });
9
+ const QuickActions = mockComponent("Menu.QuickActions", void 0, { withChildren: true });
10
+ const SectionHeader = mockComponent("Menu.SectionHeader", void 0, { withChildren: true });
11
+ const Menu = Object.assign(mockComponent("Menu", void 0, { withChildren: true }), {
12
+ BottomSheet,
13
+ Divider,
14
+ Drop,
15
+ Item,
16
+ QuickAction,
17
+ QuickActions,
18
+ SectionHeader
19
19
  });
20
20
 
21
21
  export { Menu };
package/index.mock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mock.js","sources":["src/index.mock.ts"],"sourcesContent":["import { mockComponent } from '@hh.ru/magritte-ui-mock-component';\n\nexport * from '@hh.ru/magritte-ui-menu/types';\n\nconst BottomSheet = mockComponent('Menu.BottomSheet', undefined, { withChildren: true });\n\nconst Divider = mockComponent('Menu.Divider', undefined);\n\nconst Drop = mockComponent('Menu.Drop', undefined, { withChildren: true });\n\nconst Item = mockComponent('Menu.Item', undefined, { withChildren: true });\n\nconst QuickAction = mockComponent('Menu.QuickAction', undefined, { withChildren: true });\n\nconst QuickActions = mockComponent('Menu.QuickActions', undefined, { withChildren: true });\n\nconst SectionHeader = mockComponent('Menu.SectionHeader', undefined, { withChildren: true });\n\nexport const Menu = Object.assign(mockComponent('Menu', undefined, { withChildren: true }), {\n BottomSheet,\n Divider,\n Drop,\n Item,\n QuickAction,\n QuickActions,\n SectionHeader,\n});\n"],"names":[],"mappings":";;AAIA,MAAM,WAAW,GAAG,aAAa,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzF,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAEzD,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3E,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3E,MAAM,WAAW,GAAG,aAAa,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzF,MAAM,YAAY,GAAG,aAAa,CAAC,mBAAmB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3F,MAAM,aAAa,GAAG,aAAa,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;MAEhF,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;IACxF,WAAW;IACX,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,WAAW;IACX,YAAY;IACZ,aAAa;AAChB,CAAA;;;;"}
1
+ {"version":3,"file":"index.mock.js","sources":["src/index.mock.ts"],"sourcesContent":["import { mockComponent } from '@hh.ru/magritte-ui-mock-component';\n\nexport * from '@hh.ru/magritte-ui-menu/types';\n\nconst BottomSheet = mockComponent('Menu.BottomSheet', undefined, { withChildren: true });\n\nconst Divider = mockComponent('Menu.Divider', undefined);\n\nconst Drop = mockComponent('Menu.Drop', undefined, { withChildren: true });\n\nconst Item = mockComponent('Menu.Item', undefined, { withChildren: true });\n\nconst QuickAction = mockComponent('Menu.QuickAction', undefined, { withChildren: true });\n\nconst QuickActions = mockComponent('Menu.QuickActions', undefined, { withChildren: true });\n\nconst SectionHeader = mockComponent('Menu.SectionHeader', undefined, { withChildren: true });\n\nexport const Menu = Object.assign(mockComponent('Menu', undefined, { withChildren: true }), {\n BottomSheet,\n Divider,\n Drop,\n Item,\n QuickAction,\n QuickActions,\n SectionHeader,\n});\n"],"names":[],"mappings":";;AAIA,MAAM,cAAc,aAAc,CAAA,kBAAA,EAAoB,QAAW,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AAEvF,MAAM,OAAA,GAAU,aAAc,CAAA,cAAA,EAAgB,KAAS,CAAA,CAAA,CAAA;AAEvD,MAAM,OAAO,aAAc,CAAA,WAAA,EAAa,QAAW,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AAEzE,MAAM,OAAO,aAAc,CAAA,WAAA,EAAa,QAAW,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AAEzE,MAAM,cAAc,aAAc,CAAA,kBAAA,EAAoB,QAAW,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AAEvF,MAAM,eAAe,aAAc,CAAA,mBAAA,EAAqB,QAAW,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AAEzF,MAAM,gBAAgB,aAAc,CAAA,oBAAA,EAAsB,QAAW,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AAE9E,MAAA,IAAA,GAAO,MAAO,CAAA,MAAA,CAAO,aAAc,CAAA,MAAA,EAAQ,QAAW,EAAE,YAAA,EAAc,IAAK,EAAC,CAAG,EAAA;AAAA,EACxF,WAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AACJ,CAAC;;;;"}
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"disabled":"magritte-disabled___ZuG-J_1-0-48","drop-content-margin":"magritte-drop-content-margin___q01ll_1-0-48","dropContentMargin":"magritte-drop-content-margin___q01ll_1-0-48","item":"magritte-item___HyDAw_1-0-48","neutral":"magritte-neutral___WyGeQ_1-0-48","negative":"magritte-negative___F7a0c_1-0-48","item-icon":"magritte-item-icon___yCv9l_1-0-48","itemIcon":"magritte-item-icon___yCv9l_1-0-48","item-text":"magritte-item-text___GL3A5_1-0-48","itemText":"magritte-item-text___GL3A5_1-0-48","item-tag":"magritte-item-tag___KX5wL_1-0-48","itemTag":"magritte-item-tag___KX5wL_1-0-48","item-right-content":"magritte-item-right-content___U2hc1_1-0-48","itemRightContent":"magritte-item-right-content___U2hc1_1-0-48","mobile-menu-container":"magritte-mobile-menu-container___zlY08_1-0-48","mobileMenuContainer":"magritte-mobile-menu-container___zlY08_1-0-48","mobile-main-menu-container":"magritte-mobile-main-menu-container___fOW3d_1-0-48","mobileMainMenuContainer":"magritte-mobile-main-menu-container___fOW3d_1-0-48","mobile-submenu-container":"magritte-mobile-submenu-container___od1Ev_1-0-48","mobileSubmenuContainer":"magritte-mobile-submenu-container___od1Ev_1-0-48","mobile-menu-container-slide":"magritte-mobile-menu-container-slide___HXiEx_1-0-48","mobileMenuContainerSlide":"magritte-mobile-menu-container-slide___HXiEx_1-0-48","quick-actions":"magritte-quick-actions___HvUJ3_1-0-48","quickActions":"magritte-quick-actions___HvUJ3_1-0-48","quick-action":"magritte-quick-action___1K5Ip_1-0-48","quickAction":"magritte-quick-action___1K5Ip_1-0-48","quick-action-text":"magritte-quick-action-text___diFW5_1-0-48","quickActionText":"magritte-quick-action-text___diFW5_1-0-48"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=menu-C3Ujgi4a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-C3Ujgi4a.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-menu",
3
- "version": "1.0.46",
3
+ "version": "1.0.48",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -23,18 +23,18 @@
23
23
  "@hh.ru/magritte-common-keyboard": "4.3.6",
24
24
  "@hh.ru/magritte-common-use-disabled": "1.0.16",
25
25
  "@hh.ru/magritte-common-use-multiple-refs": "1.1.12",
26
- "@hh.ru/magritte-design-tokens": "25.1.1",
27
- "@hh.ru/magritte-ui-bottom-sheet": "9.4.47",
26
+ "@hh.ru/magritte-design-tokens": "26.0.1",
27
+ "@hh.ru/magritte-ui-bottom-sheet": "9.4.49",
28
28
  "@hh.ru/magritte-ui-breakpoint": "6.1.2",
29
- "@hh.ru/magritte-ui-divider": "3.2.10",
30
- "@hh.ru/magritte-ui-drop": "12.3.59",
31
- "@hh.ru/magritte-ui-icon": "15.1.3",
29
+ "@hh.ru/magritte-ui-divider": "3.2.12",
30
+ "@hh.ru/magritte-ui-drop": "12.3.61",
31
+ "@hh.ru/magritte-ui-icon": "15.1.5",
32
32
  "@hh.ru/magritte-ui-mock-component": "1.1.8",
33
- "@hh.ru/magritte-ui-nav-bar": "2.0.19",
34
- "@hh.ru/magritte-ui-section-header": "1.1.9",
35
- "@hh.ru/magritte-ui-switch": "3.1.39",
36
- "@hh.ru/magritte-ui-tag": "5.4.1",
37
- "@hh.ru/magritte-ui-typography": "5.3.14"
33
+ "@hh.ru/magritte-ui-nav-bar": "2.0.21",
34
+ "@hh.ru/magritte-ui-section-header": "1.1.11",
35
+ "@hh.ru/magritte-ui-switch": "3.1.41",
36
+ "@hh.ru/magritte-ui-tag": "5.4.3",
37
+ "@hh.ru/magritte-ui-typography": "5.3.16"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "classnames": ">=2.3.2",
@@ -44,5 +44,5 @@
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "46d606980abbb523a41afba452c0a852ee902864"
47
+ "gitHead": "f6539d7a0e7cd42dd851458db1de04a748bbee03"
48
48
  }
package/safeZone.js CHANGED
@@ -1,68 +1,36 @@
1
1
  import './index.css';
2
- /**
3
- * Геометрия «безопасного треугольника» (подменю с учётом направления курсора).
4
- *
5
- * Пока подменю открыто и курсор уходит с родительского пункта, подменю должно
6
- * оставаться открытым, если курсор движется в его сторону. «Движение в сторону»
7
- * моделируется треугольником: его вершина — предыдущая позиция курсора, а
8
- * основание — ближайшая к родительскому меню грань подменю. Если текущая позиция
9
- * курсора попадает внутрь этого треугольника, считаем, что курсор движется
10
- * к подменю.
11
- *
12
- * Эти хелперы намеренно чистые (без DOM и без React), чтобы их можно было
13
- * тестировать изолированно. У аргументов типа `DOMRect` читаются только
14
- * `left`/`right`/`top`/`bottom`, поэтому подойдёт любой похожий на прямоугольник
15
- * объект.
16
- */
17
- /** Минимальный квадрат смещения курсора, при котором пересчитываем направление (4px). */
18
2
  const MIN_MOUSE_MOVE_SQUARED = 16;
19
- /**
20
- * Знак векторного произведения (A - B) и (P - B): показывает, с какой стороны
21
- * от прямой B → A лежит точка P. Условие `>= 0` относит точку на прямой к «плюсу».
22
- */
23
3
  const pointSignRelativeToEdge = (P, A, B) => {
24
- return (A.x - B.x) * (P.y - B.y) >= (P.x - B.x) * (A.y - B.y);
4
+ return (A.x - B.x) * (P.y - B.y) >= (P.x - B.x) * (A.y - B.y);
25
5
  };
26
- /** Лежит ли точка P внутри треугольника A, B, C (включая границу). */
27
6
  const isPointInsideTriangle = (P, A, B, C) => {
28
- const values = [
29
- pointSignRelativeToEdge(P, A, B),
30
- pointSignRelativeToEdge(P, B, C),
31
- pointSignRelativeToEdge(P, C, A),
32
- ];
33
- return (values[0] && values[1] && values[2]) || (!values[0] && !values[1] && !values[2]);
7
+ const values = [
8
+ pointSignRelativeToEdge(P, A, B),
9
+ pointSignRelativeToEdge(P, B, C),
10
+ pointSignRelativeToEdge(P, C, A)
11
+ ];
12
+ return values[0] && values[1] && values[2] || !values[0] && !values[1] && !values[2];
34
13
  };
35
- /**
36
- * Вертикальная грань подменю, обращённая к родительскому меню. Если подменю
37
- * открыто вправо (его правая грань выходит за правую грань дропа), ближайшая
38
- * грань — левая сторона подменю; иначе подменю открыто влево, и ближайшая
39
- * грань — правая сторона подменю.
40
- */
41
14
  const findNearestSubmenuEdge = (dropCoords, submenuCoords) => {
42
- if (submenuCoords.right > dropCoords.right) {
43
- return [
44
- { x: submenuCoords.left, y: submenuCoords.top },
45
- { x: submenuCoords.left, y: submenuCoords.bottom },
46
- ];
47
- }
15
+ if (submenuCoords.right > dropCoords.right) {
48
16
  return [
49
- { x: submenuCoords.right, y: submenuCoords.top },
50
- { x: submenuCoords.right, y: submenuCoords.bottom },
17
+ { x: submenuCoords.left, y: submenuCoords.top },
18
+ { x: submenuCoords.left, y: submenuCoords.bottom }
51
19
  ];
20
+ }
21
+ return [
22
+ { x: submenuCoords.right, y: submenuCoords.top },
23
+ { x: submenuCoords.right, y: submenuCoords.bottom }
24
+ ];
52
25
  };
53
- /** Сместился ли курсор с прошлой выборки достаточно, чтобы пересчитать направление. */
54
26
  const hasMovedEnough = (prev, current) => {
55
- const deltaX = current.x - prev.x;
56
- const deltaY = current.y - prev.y;
57
- return deltaX * deltaX + deltaY * deltaY >= MIN_MOUSE_MOVE_SQUARED;
27
+ const deltaX = current.x - prev.x;
28
+ const deltaY = current.y - prev.y;
29
+ return deltaX * deltaX + deltaY * deltaY >= MIN_MOUSE_MOVE_SQUARED;
58
30
  };
59
- /**
60
- * Движется ли курсор, переместившись из `prev` в `current`, в сторону подменю,
61
- * заданного `submenuCoords` (относительно родительского `dropCoords`).
62
- */
63
31
  const isMovingTowardsSubmenu = (prev, current, dropCoords, submenuCoords) => {
64
- const [edgeStart, edgeEnd] = findNearestSubmenuEdge(dropCoords, submenuCoords);
65
- return isPointInsideTriangle(current, prev, edgeStart, edgeEnd);
32
+ const [edgeStart, edgeEnd] = findNearestSubmenuEdge(dropCoords, submenuCoords);
33
+ return isPointInsideTriangle(current, prev, edgeStart, edgeEnd);
66
34
  };
67
35
 
68
36
  export { MIN_MOUSE_MOVE_SQUARED, findNearestSubmenuEdge, hasMovedEnough, isMovingTowardsSubmenu, isPointInsideTriangle, pointSignRelativeToEdge };
package/safeZone.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"safeZone.js","sources":["src/safeZone.ts"],"sourcesContent":["/**\n * Геометрия «безопасного треугольника» (подменю с учётом направления курсора).\n *\n * Пока подменю открыто и курсор уходит с родительского пункта, подменю должно\n * оставаться открытым, если курсор движется в его сторону. «Движение в сторону»\n * моделируется треугольником: его вершина — предыдущая позиция курсора, а\n * основание — ближайшая к родительскому меню грань подменю. Если текущая позиция\n * курсора попадает внутрь этого треугольника, считаем, что курсор движется\n * к подменю.\n *\n * Эти хелперы намеренно чистые (без DOM и без React), чтобы их можно было\n * тестировать изолированно. У аргументов типа `DOMRect` читаются только\n * `left`/`right`/`top`/`bottom`, поэтому подойдёт любой похожий на прямоугольник\n * объект.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** Минимальный квадрат смещения курсора, при котором пересчитываем направление (4px). */\nexport const MIN_MOUSE_MOVE_SQUARED = 16;\n\n/**\n * Знак векторного произведения (A - B) и (P - B): показывает, с какой стороны\n * от прямой B → A лежит точка P. Условие `>= 0` относит точку на прямой к «плюсу».\n */\nexport const pointSignRelativeToEdge = (P: Point, A: Point, B: Point): boolean => {\n return (A.x - B.x) * (P.y - B.y) >= (P.x - B.x) * (A.y - B.y);\n};\n\n/** Лежит ли точка P внутри треугольника A, B, C (включая границу). */\nexport const isPointInsideTriangle = (P: Point, A: Point, B: Point, C: Point): boolean => {\n const values = [\n pointSignRelativeToEdge(P, A, B),\n pointSignRelativeToEdge(P, B, C),\n pointSignRelativeToEdge(P, C, A),\n ];\n return (values[0] && values[1] && values[2]) || (!values[0] && !values[1] && !values[2]);\n};\n\n/**\n * Вертикальная грань подменю, обращённая к родительскому меню. Если подменю\n * открыто вправо (его правая грань выходит за правую грань дропа), ближайшая\n * грань — левая сторона подменю; иначе подменю открыто влево, и ближайшая\n * грань — правая сторона подменю.\n */\nexport const findNearestSubmenuEdge = (dropCoords: DOMRect, submenuCoords: DOMRect): [Point, Point] => {\n if (submenuCoords.right > dropCoords.right) {\n return [\n { x: submenuCoords.left, y: submenuCoords.top },\n { x: submenuCoords.left, y: submenuCoords.bottom },\n ];\n }\n return [\n { x: submenuCoords.right, y: submenuCoords.top },\n { x: submenuCoords.right, y: submenuCoords.bottom },\n ];\n};\n\n/** Сместился ли курсор с прошлой выборки достаточно, чтобы пересчитать направление. */\nexport const hasMovedEnough = (prev: Point, current: Point): boolean => {\n const deltaX = current.x - prev.x;\n const deltaY = current.y - prev.y;\n return deltaX * deltaX + deltaY * deltaY >= MIN_MOUSE_MOVE_SQUARED;\n};\n\n/**\n * Движется ли курсор, переместившись из `prev` в `current`, в сторону подменю,\n * заданного `submenuCoords` (относительно родительского `dropCoords`).\n */\nexport const isMovingTowardsSubmenu = (\n prev: Point,\n current: Point,\n dropCoords: DOMRect,\n submenuCoords: DOMRect\n): boolean => {\n const [edgeStart, edgeEnd] = findNearestSubmenuEdge(dropCoords, submenuCoords);\n return isPointInsideTriangle(current, prev, edgeStart, edgeEnd);\n};\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;AAcG;AAOH;AACO,MAAM,sBAAsB,GAAG,GAAG;AAEzC;;;AAGG;AACU,MAAA,uBAAuB,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,CAAQ,KAAa;AAC7E,IAAA,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,EAAE;AAEF;AACO,MAAM,qBAAqB,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,CAAQ,EAAE,CAAQ,KAAa;AACrF,IAAA,MAAM,MAAM,GAAG;AACX,QAAA,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChC,QAAA,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChC,QAAA,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACnC,CAAC;AACF,IAAA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,EAAE;AAEF;;;;;AAKG;MACU,sBAAsB,GAAG,CAAC,UAAmB,EAAE,aAAsB,KAAoB;IAClG,IAAI,aAAa,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE;QACxC,OAAO;YACH,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE;YAC/C,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE;SACrD,CAAC;KACL;IACD,OAAO;QACH,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE;QAChD,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE;KACtD,CAAC;AACN,EAAE;AAEF;MACa,cAAc,GAAG,CAAC,IAAW,EAAE,OAAc,KAAa;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,OAAO,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,sBAAsB,CAAC;AACvE,EAAE;AAEF;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CAClC,IAAW,EACX,OAAc,EACd,UAAmB,EACnB,aAAsB,KACb;AACT,IAAA,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,sBAAsB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC/E,OAAO,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACpE;;;;"}
1
+ {"version":3,"file":"safeZone.js","sources":["src/safeZone.ts"],"sourcesContent":["/**\n * Геометрия «безопасного треугольника» (подменю с учётом направления курсора).\n *\n * Пока подменю открыто и курсор уходит с родительского пункта, подменю должно\n * оставаться открытым, если курсор движется в его сторону. «Движение в сторону»\n * моделируется треугольником: его вершина — предыдущая позиция курсора, а\n * основание — ближайшая к родительскому меню грань подменю. Если текущая позиция\n * курсора попадает внутрь этого треугольника, считаем, что курсор движется\n * к подменю.\n *\n * Эти хелперы намеренно чистые (без DOM и без React), чтобы их можно было\n * тестировать изолированно. У аргументов типа `DOMRect` читаются только\n * `left`/`right`/`top`/`bottom`, поэтому подойдёт любой похожий на прямоугольник\n * объект.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** Минимальный квадрат смещения курсора, при котором пересчитываем направление (4px). */\nexport const MIN_MOUSE_MOVE_SQUARED = 16;\n\n/**\n * Знак векторного произведения (A - B) и (P - B): показывает, с какой стороны\n * от прямой B → A лежит точка P. Условие `>= 0` относит точку на прямой к «плюсу».\n */\nexport const pointSignRelativeToEdge = (P: Point, A: Point, B: Point): boolean => {\n return (A.x - B.x) * (P.y - B.y) >= (P.x - B.x) * (A.y - B.y);\n};\n\n/** Лежит ли точка P внутри треугольника A, B, C (включая границу). */\nexport const isPointInsideTriangle = (P: Point, A: Point, B: Point, C: Point): boolean => {\n const values = [\n pointSignRelativeToEdge(P, A, B),\n pointSignRelativeToEdge(P, B, C),\n pointSignRelativeToEdge(P, C, A),\n ];\n return (values[0] && values[1] && values[2]) || (!values[0] && !values[1] && !values[2]);\n};\n\n/**\n * Вертикальная грань подменю, обращённая к родительскому меню. Если подменю\n * открыто вправо (его правая грань выходит за правую грань дропа), ближайшая\n * грань — левая сторона подменю; иначе подменю открыто влево, и ближайшая\n * грань — правая сторона подменю.\n */\nexport const findNearestSubmenuEdge = (dropCoords: DOMRect, submenuCoords: DOMRect): [Point, Point] => {\n if (submenuCoords.right > dropCoords.right) {\n return [\n { x: submenuCoords.left, y: submenuCoords.top },\n { x: submenuCoords.left, y: submenuCoords.bottom },\n ];\n }\n return [\n { x: submenuCoords.right, y: submenuCoords.top },\n { x: submenuCoords.right, y: submenuCoords.bottom },\n ];\n};\n\n/** Сместился ли курсор с прошлой выборки достаточно, чтобы пересчитать направление. */\nexport const hasMovedEnough = (prev: Point, current: Point): boolean => {\n const deltaX = current.x - prev.x;\n const deltaY = current.y - prev.y;\n return deltaX * deltaX + deltaY * deltaY >= MIN_MOUSE_MOVE_SQUARED;\n};\n\n/**\n * Движется ли курсор, переместившись из `prev` в `current`, в сторону подменю,\n * заданного `submenuCoords` (относительно родительского `dropCoords`).\n */\nexport const isMovingTowardsSubmenu = (\n prev: Point,\n current: Point,\n dropCoords: DOMRect,\n submenuCoords: DOMRect\n): boolean => {\n const [edgeStart, edgeEnd] = findNearestSubmenuEdge(dropCoords, submenuCoords);\n return isPointInsideTriangle(current, prev, edgeStart, edgeEnd);\n};\n"],"names":[],"mappings":"AAsBO,MAAM,sBAAyB,GAAA,GAAA;AAM/B,MAAM,uBAA0B,GAAA,CAAC,CAAU,EAAA,CAAA,EAAU,CAAsB,KAAA;AAC9E,EAAA,OAAA,CAAQ,CAAE,CAAA,CAAA,GAAI,CAAE,CAAA,CAAA,KAAM,EAAE,CAAI,GAAA,CAAA,CAAE,CAAO,CAAA,IAAA,CAAA,CAAA,CAAE,CAAI,GAAA,CAAA,CAAE,CAAM,KAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA;AAC/D,EAAA;AAGO,MAAM,qBAAwB,GAAA,CAAC,CAAU,EAAA,CAAA,EAAU,GAAU,CAAsB,KAAA;AACtF,EAAA,MAAM,MAAS,GAAA;AAAA,IACX,uBAAA,CAAwB,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,IAC/B,uBAAA,CAAwB,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,IAC/B,uBAAA,CAAwB,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,GACnC,CAAA;AACA,EAAA,OAAQ,OAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,IAAO,CAAC,MAAO,CAAA,CAAC,KAAK,CAAC,MAAA,CAAO,CAAC,CAAK,IAAA,CAAC,OAAO,CAAC,CAAA,CAAA;AAC1F,EAAA;AAQa,MAAA,sBAAA,GAAyB,CAAC,UAAA,EAAqB,aAA2C,KAAA;AACnG,EAAI,IAAA,aAAA,CAAc,KAAQ,GAAA,UAAA,CAAW,KAAO,EAAA;AACxC,IAAO,OAAA;AAAA,MACH,EAAE,CAAG,EAAA,aAAA,CAAc,IAAM,EAAA,CAAA,EAAG,cAAc,GAAI,EAAA;AAAA,MAC9C,EAAE,CAAG,EAAA,aAAA,CAAc,IAAM,EAAA,CAAA,EAAG,cAAc,MAAO,EAAA;AAAA,KACrD,CAAA;AAAA,GACJ;AACA,EAAO,OAAA;AAAA,IACH,EAAE,CAAG,EAAA,aAAA,CAAc,KAAO,EAAA,CAAA,EAAG,cAAc,GAAI,EAAA;AAAA,IAC/C,EAAE,CAAG,EAAA,aAAA,CAAc,KAAO,EAAA,CAAA,EAAG,cAAc,MAAO,EAAA;AAAA,GACtD,CAAA;AACJ,EAAA;AAGa,MAAA,cAAA,GAAiB,CAAC,IAAA,EAAa,OAA4B,KAAA;AACpE,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,CAAA,GAAI,IAAK,CAAA,CAAA,CAAA;AAChC,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,CAAA,GAAI,IAAK,CAAA,CAAA,CAAA;AAChC,EAAO,OAAA,MAAA,GAAS,MAAS,GAAA,MAAA,GAAS,MAAU,IAAA,sBAAA,CAAA;AAChD,EAAA;AAMO,MAAM,sBAAyB,GAAA,CAClC,IACA,EAAA,OAAA,EACA,YACA,aACU,KAAA;AACV,EAAA,MAAM,CAAC,SAAW,EAAA,OAAO,CAAI,GAAA,sBAAA,CAAuB,YAAY,aAAa,CAAA,CAAA;AAC7E,EAAA,OAAO,qBAAsB,CAAA,OAAA,EAAS,IAAM,EAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAClE;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { type RefObject } from 'react';
2
- import { type Point } from '@hh.ru/magritte-ui-menu/safeZone';
2
+ import { type Point } from './safeZone';
3
3
  export declare const MOUSE_MOVE_THROTTLE_MS = 50;
4
4
  export declare const SCROLL_THROTTLE_MS = 300;
5
5
  export declare const SUBMENU_CLOSE_DELAY_MS = 300;
@@ -6,99 +6,99 @@ import { hasMovedEnough, isMovingTowardsSubmenu } from './safeZone.js';
6
6
  const MOUSE_MOVE_THROTTLE_MS = 50;
7
7
  const SCROLL_THROTTLE_MS = 300;
8
8
  const SUBMENU_CLOSE_DELAY_MS = 300;
9
- /**
10
- * Держит подменю открытым, пока курсор движется в его сторону, иначе планирует
11
- * отложенное закрытие. Инкапсулирует подписку на DOM-события, кэширование
12
- * координат, троттлинг и учёт таймера закрытия, чтобы это поведение можно было
13
- * проверять независимо от компонента `MenuItem`.
14
- */
15
- const useSubmenuSafeZone = ({ active, dropContainer, itemRef, submenuRef, onClose, }) => {
16
- const stateRef = useRef({
17
- dropCoords: null,
18
- prevMouseCoords: null,
19
- submenuCoords: null,
20
- });
21
- const closeTimeoutRef = useRef(null);
22
- // Храним в ref, чтобы новая ссылка `onClose` на каждом рендере не заставляла
23
- // эффект переподписывать слушатели.
24
- const onCloseRef = useRef(onClose);
25
- onCloseRef.current = onClose;
26
- const cancelPendingClose = useCallback(() => {
27
- if (closeTimeoutRef.current !== null) {
28
- clearTimeout(closeTimeoutRef.current);
29
- closeTimeoutRef.current = null;
9
+ const useSubmenuSafeZone = ({
10
+ active,
11
+ dropContainer,
12
+ itemRef,
13
+ submenuRef,
14
+ onClose
15
+ }) => {
16
+ const stateRef = useRef({
17
+ dropCoords: null,
18
+ prevMouseCoords: null,
19
+ submenuCoords: null
20
+ });
21
+ const closeTimeoutRef = useRef(null);
22
+ const onCloseRef = useRef(onClose);
23
+ onCloseRef.current = onClose;
24
+ const cancelPendingClose = useCallback(() => {
25
+ if (closeTimeoutRef.current !== null) {
26
+ clearTimeout(closeTimeoutRef.current);
27
+ closeTimeoutRef.current = null;
28
+ }
29
+ }, []);
30
+ const trackPointer = useCallback((point) => {
31
+ stateRef.current.prevMouseCoords = point;
32
+ }, []);
33
+ useEffect(() => {
34
+ if (!active || !dropContainer || !itemRef.current || !submenuRef.current) {
35
+ return void 0;
36
+ }
37
+ const scheduleClose = () => {
38
+ if (closeTimeoutRef.current === null) {
39
+ closeTimeoutRef.current = setTimeout(() => {
40
+ closeTimeoutRef.current = null;
41
+ onCloseRef.current();
42
+ }, SUBMENU_CLOSE_DELAY_MS);
43
+ }
44
+ };
45
+ const checkIfMouseIsMovingTowardsSubmenu = throttle((event) => {
46
+ const currentMouseCoords = { x: event.clientX, y: event.clientY };
47
+ const isMouseOverItemOrSubmenu = itemRef.current?.contains(event.target) || submenuRef.current?.contains(event.target);
48
+ if (isMouseOverItemOrSubmenu) {
49
+ cancelPendingClose();
50
+ } else if (stateRef.current.dropCoords !== null && stateRef.current.prevMouseCoords !== null && stateRef.current.submenuCoords !== null) {
51
+ if (!hasMovedEnough(stateRef.current.prevMouseCoords, currentMouseCoords)) {
52
+ return;
53
+ }
54
+ const movingTowardsSubmenu = isMovingTowardsSubmenu(
55
+ stateRef.current.prevMouseCoords,
56
+ currentMouseCoords,
57
+ stateRef.current.dropCoords,
58
+ stateRef.current.submenuCoords
59
+ );
60
+ if (movingTowardsSubmenu) {
61
+ cancelPendingClose();
62
+ } else {
63
+ scheduleClose();
30
64
  }
31
- }, []);
32
- const trackPointer = useCallback((point) => {
33
- stateRef.current.prevMouseCoords = point;
34
- }, []);
35
- useEffect(() => {
36
- if (!active || !dropContainer || !itemRef.current || !submenuRef.current) {
37
- return void 0;
65
+ }
66
+ stateRef.current.prevMouseCoords = currentMouseCoords;
67
+ }, MOUSE_MOVE_THROTTLE_MS);
68
+ const checkIfMouseIsOverItemOrSubmenu = throttle(() => {
69
+ if (stateRef.current.prevMouseCoords !== null) {
70
+ const elementUnderMouse = document.elementFromPoint(
71
+ stateRef.current.prevMouseCoords.x,
72
+ stateRef.current.prevMouseCoords.y
73
+ );
74
+ const isMouseOverItemOrSubmenu = itemRef.current?.contains(elementUnderMouse) || submenuRef.current?.contains(elementUnderMouse);
75
+ if (isMouseOverItemOrSubmenu) {
76
+ cancelPendingClose();
77
+ } else {
78
+ scheduleClose();
38
79
  }
39
- const scheduleClose = () => {
40
- if (closeTimeoutRef.current === null) {
41
- closeTimeoutRef.current = setTimeout(() => {
42
- closeTimeoutRef.current = null;
43
- onCloseRef.current();
44
- }, SUBMENU_CLOSE_DELAY_MS);
45
- }
46
- };
47
- const checkIfMouseIsMovingTowardsSubmenu = throttle((event) => {
48
- const currentMouseCoords = { x: event.clientX, y: event.clientY };
49
- const isMouseOverItemOrSubmenu = itemRef.current?.contains(event.target) ||
50
- submenuRef.current?.contains(event.target);
51
- if (isMouseOverItemOrSubmenu) {
52
- cancelPendingClose();
53
- }
54
- else if (stateRef.current.dropCoords !== null &&
55
- stateRef.current.prevMouseCoords !== null &&
56
- stateRef.current.submenuCoords !== null) {
57
- if (!hasMovedEnough(stateRef.current.prevMouseCoords, currentMouseCoords)) {
58
- return;
59
- }
60
- const movingTowardsSubmenu = isMovingTowardsSubmenu(stateRef.current.prevMouseCoords, currentMouseCoords, stateRef.current.dropCoords, stateRef.current.submenuCoords);
61
- if (movingTowardsSubmenu) {
62
- cancelPendingClose();
63
- }
64
- else {
65
- scheduleClose();
66
- }
67
- }
68
- stateRef.current.prevMouseCoords = currentMouseCoords;
69
- }, MOUSE_MOVE_THROTTLE_MS);
70
- const checkIfMouseIsOverItemOrSubmenu = throttle(() => {
71
- if (stateRef.current.prevMouseCoords !== null) {
72
- const elementUnderMouse = document.elementFromPoint(stateRef.current.prevMouseCoords.x, stateRef.current.prevMouseCoords.y);
73
- const isMouseOverItemOrSubmenu = itemRef.current?.contains(elementUnderMouse) || submenuRef.current?.contains(elementUnderMouse);
74
- if (isMouseOverItemOrSubmenu) {
75
- cancelPendingClose();
76
- }
77
- else {
78
- scheduleClose();
79
- }
80
- }
81
- }, SCROLL_THROTTLE_MS);
82
- document.addEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);
83
- dropContainer.addEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);
84
- document.addEventListener('scroll', checkIfMouseIsOverItemOrSubmenu, { capture: true, passive: true });
85
- stateRef.current.dropCoords = dropContainer.getBoundingClientRect();
86
- stateRef.current.submenuCoords = submenuRef.current.getBoundingClientRect();
87
- return () => {
88
- document.removeEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);
89
- dropContainer.removeEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);
90
- document.removeEventListener('scroll', checkIfMouseIsOverItemOrSubmenu, { capture: true });
91
- checkIfMouseIsMovingTowardsSubmenu.cancel();
92
- checkIfMouseIsOverItemOrSubmenu.cancel();
93
- cancelPendingClose();
94
- stateRef.current = {
95
- dropCoords: null,
96
- prevMouseCoords: null,
97
- submenuCoords: null,
98
- };
99
- };
100
- }, [active, dropContainer, itemRef, submenuRef, cancelPendingClose]);
101
- return { trackPointer, cancelPendingClose };
80
+ }
81
+ }, SCROLL_THROTTLE_MS);
82
+ document.addEventListener("mousemove", checkIfMouseIsMovingTowardsSubmenu);
83
+ dropContainer.addEventListener("mousemove", checkIfMouseIsMovingTowardsSubmenu);
84
+ document.addEventListener("scroll", checkIfMouseIsOverItemOrSubmenu, { capture: true, passive: true });
85
+ stateRef.current.dropCoords = dropContainer.getBoundingClientRect();
86
+ stateRef.current.submenuCoords = submenuRef.current.getBoundingClientRect();
87
+ return () => {
88
+ document.removeEventListener("mousemove", checkIfMouseIsMovingTowardsSubmenu);
89
+ dropContainer.removeEventListener("mousemove", checkIfMouseIsMovingTowardsSubmenu);
90
+ document.removeEventListener("scroll", checkIfMouseIsOverItemOrSubmenu, { capture: true });
91
+ checkIfMouseIsMovingTowardsSubmenu.cancel();
92
+ checkIfMouseIsOverItemOrSubmenu.cancel();
93
+ cancelPendingClose();
94
+ stateRef.current = {
95
+ dropCoords: null,
96
+ prevMouseCoords: null,
97
+ submenuCoords: null
98
+ };
99
+ };
100
+ }, [active, dropContainer, itemRef, submenuRef, cancelPendingClose]);
101
+ return { trackPointer, cancelPendingClose };
102
102
  };
103
103
 
104
104
  export { MOUSE_MOVE_THROTTLE_MS, SCROLL_THROTTLE_MS, SUBMENU_CLOSE_DELAY_MS, useSubmenuSafeZone };
@@ -1 +1 @@
1
- {"version":3,"file":"useSubmenuSafeZone.js","sources":["src/useSubmenuSafeZone.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { throttle } from '@hh.ru/magritte-common-func-utils';\nimport { type Point, hasMovedEnough, isMovingTowardsSubmenu } from '@hh.ru/magritte-ui-menu/safeZone';\n\nexport const MOUSE_MOVE_THROTTLE_MS = 50;\nexport const SCROLL_THROTTLE_MS = 300;\nexport const SUBMENU_CLOSE_DELAY_MS = 300;\n\ninterface UseSubmenuSafeZoneParams {\n /** Активно ли отслеживание безопасной зоны (подменю открыто). */\n active: boolean;\n /** Скролл-контейнер, в котором рендерится родительское меню. */\n dropContainer: HTMLElement | null;\n /** Элемент родительского пункта меню. */\n itemRef: RefObject<HTMLElement | null>;\n /** Элемент дропа подменю. */\n submenuRef: RefObject<HTMLElement | null>;\n /** Вызывается, когда безопасная зона решает, что подменю нужно закрыть. */\n onClose: () => void;\n}\n\ninterface UseSubmenuSafeZoneResult {\n /** Запоминает последнюю позицию курсора (вызывать из обработчиков указателя пункта). */\n trackPointer: (point: Point) => void;\n /** Отменяет запланированное закрытие (вызывать при (пере)открытии подменю). */\n cancelPendingClose: () => void;\n}\n\n/**\n * Держит подменю открытым, пока курсор движется в его сторону, иначе планирует\n * отложенное закрытие. Инкапсулирует подписку на DOM-события, кэширование\n * координат, троттлинг и учёт таймера закрытия, чтобы это поведение можно было\n * проверять независимо от компонента `MenuItem`.\n */\nexport const useSubmenuSafeZone = ({\n active,\n dropContainer,\n itemRef,\n submenuRef,\n onClose,\n}: UseSubmenuSafeZoneParams): UseSubmenuSafeZoneResult => {\n const stateRef = useRef<{\n dropCoords: DOMRect | null;\n prevMouseCoords: Point | null;\n submenuCoords: DOMRect | null;\n }>({\n dropCoords: null,\n prevMouseCoords: null,\n submenuCoords: null,\n });\n\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Храним в ref, чтобы новая ссылка `onClose` на каждом рендере не заставляла\n // эффект переподписывать слушатели.\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n const cancelPendingClose = useCallback(() => {\n if (closeTimeoutRef.current !== null) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n }, []);\n\n const trackPointer = useCallback((point: Point) => {\n stateRef.current.prevMouseCoords = point;\n }, []);\n\n useEffect(() => {\n if (!active || !dropContainer || !itemRef.current || !submenuRef.current) {\n return void 0;\n }\n\n const scheduleClose = () => {\n if (closeTimeoutRef.current === null) {\n closeTimeoutRef.current = setTimeout(() => {\n closeTimeoutRef.current = null;\n onCloseRef.current();\n }, SUBMENU_CLOSE_DELAY_MS);\n }\n };\n\n const checkIfMouseIsMovingTowardsSubmenu = throttle((event: MouseEvent) => {\n const currentMouseCoords: Point = { x: event.clientX, y: event.clientY };\n\n const isMouseOverItemOrSubmenu =\n itemRef.current?.contains(event.target as HTMLElement) ||\n submenuRef.current?.contains(event.target as HTMLElement);\n\n if (isMouseOverItemOrSubmenu) {\n cancelPendingClose();\n } else if (\n stateRef.current.dropCoords !== null &&\n stateRef.current.prevMouseCoords !== null &&\n stateRef.current.submenuCoords !== null\n ) {\n if (!hasMovedEnough(stateRef.current.prevMouseCoords, currentMouseCoords)) {\n return;\n }\n\n const movingTowardsSubmenu = isMovingTowardsSubmenu(\n stateRef.current.prevMouseCoords,\n currentMouseCoords,\n stateRef.current.dropCoords,\n stateRef.current.submenuCoords\n );\n\n if (movingTowardsSubmenu) {\n cancelPendingClose();\n } else {\n scheduleClose();\n }\n }\n\n stateRef.current.prevMouseCoords = currentMouseCoords;\n }, MOUSE_MOVE_THROTTLE_MS);\n\n const checkIfMouseIsOverItemOrSubmenu = throttle(() => {\n if (stateRef.current.prevMouseCoords !== null) {\n const elementUnderMouse = document.elementFromPoint(\n stateRef.current.prevMouseCoords.x,\n stateRef.current.prevMouseCoords.y\n );\n\n const isMouseOverItemOrSubmenu =\n itemRef.current?.contains(elementUnderMouse) || submenuRef.current?.contains(elementUnderMouse);\n\n if (isMouseOverItemOrSubmenu) {\n cancelPendingClose();\n } else {\n scheduleClose();\n }\n }\n }, SCROLL_THROTTLE_MS);\n\n document.addEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n dropContainer.addEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n document.addEventListener('scroll', checkIfMouseIsOverItemOrSubmenu, { capture: true, passive: true });\n\n stateRef.current.dropCoords = dropContainer.getBoundingClientRect();\n stateRef.current.submenuCoords = submenuRef.current.getBoundingClientRect();\n\n return () => {\n document.removeEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n dropContainer.removeEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n document.removeEventListener('scroll', checkIfMouseIsOverItemOrSubmenu, { capture: true });\n checkIfMouseIsMovingTowardsSubmenu.cancel();\n checkIfMouseIsOverItemOrSubmenu.cancel();\n\n cancelPendingClose();\n\n stateRef.current = {\n dropCoords: null,\n prevMouseCoords: null,\n submenuCoords: null,\n };\n };\n }, [active, dropContainer, itemRef, submenuRef, cancelPendingClose]);\n\n return { trackPointer, cancelPendingClose };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSubmenuSafeZone.js","sources":["src/useSubmenuSafeZone.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { throttle } from '@hh.ru/magritte-common-func-utils';\nimport { type Point, hasMovedEnough, isMovingTowardsSubmenu } from '@hh.ru/magritte-ui-menu/safeZone';\n\nexport const MOUSE_MOVE_THROTTLE_MS = 50;\nexport const SCROLL_THROTTLE_MS = 300;\nexport const SUBMENU_CLOSE_DELAY_MS = 300;\n\ninterface UseSubmenuSafeZoneParams {\n /** Активно ли отслеживание безопасной зоны (подменю открыто). */\n active: boolean;\n /** Скролл-контейнер, в котором рендерится родительское меню. */\n dropContainer: HTMLElement | null;\n /** Элемент родительского пункта меню. */\n itemRef: RefObject<HTMLElement | null>;\n /** Элемент дропа подменю. */\n submenuRef: RefObject<HTMLElement | null>;\n /** Вызывается, когда безопасная зона решает, что подменю нужно закрыть. */\n onClose: () => void;\n}\n\ninterface UseSubmenuSafeZoneResult {\n /** Запоминает последнюю позицию курсора (вызывать из обработчиков указателя пункта). */\n trackPointer: (point: Point) => void;\n /** Отменяет запланированное закрытие (вызывать при (пере)открытии подменю). */\n cancelPendingClose: () => void;\n}\n\n/**\n * Держит подменю открытым, пока курсор движется в его сторону, иначе планирует\n * отложенное закрытие. Инкапсулирует подписку на DOM-события, кэширование\n * координат, троттлинг и учёт таймера закрытия, чтобы это поведение можно было\n * проверять независимо от компонента `MenuItem`.\n */\nexport const useSubmenuSafeZone = ({\n active,\n dropContainer,\n itemRef,\n submenuRef,\n onClose,\n}: UseSubmenuSafeZoneParams): UseSubmenuSafeZoneResult => {\n const stateRef = useRef<{\n dropCoords: DOMRect | null;\n prevMouseCoords: Point | null;\n submenuCoords: DOMRect | null;\n }>({\n dropCoords: null,\n prevMouseCoords: null,\n submenuCoords: null,\n });\n\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Храним в ref, чтобы новая ссылка `onClose` на каждом рендере не заставляла\n // эффект переподписывать слушатели.\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n const cancelPendingClose = useCallback(() => {\n if (closeTimeoutRef.current !== null) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n }, []);\n\n const trackPointer = useCallback((point: Point) => {\n stateRef.current.prevMouseCoords = point;\n }, []);\n\n useEffect(() => {\n if (!active || !dropContainer || !itemRef.current || !submenuRef.current) {\n return void 0;\n }\n\n const scheduleClose = () => {\n if (closeTimeoutRef.current === null) {\n closeTimeoutRef.current = setTimeout(() => {\n closeTimeoutRef.current = null;\n onCloseRef.current();\n }, SUBMENU_CLOSE_DELAY_MS);\n }\n };\n\n const checkIfMouseIsMovingTowardsSubmenu = throttle((event: MouseEvent) => {\n const currentMouseCoords: Point = { x: event.clientX, y: event.clientY };\n\n const isMouseOverItemOrSubmenu =\n itemRef.current?.contains(event.target as HTMLElement) ||\n submenuRef.current?.contains(event.target as HTMLElement);\n\n if (isMouseOverItemOrSubmenu) {\n cancelPendingClose();\n } else if (\n stateRef.current.dropCoords !== null &&\n stateRef.current.prevMouseCoords !== null &&\n stateRef.current.submenuCoords !== null\n ) {\n if (!hasMovedEnough(stateRef.current.prevMouseCoords, currentMouseCoords)) {\n return;\n }\n\n const movingTowardsSubmenu = isMovingTowardsSubmenu(\n stateRef.current.prevMouseCoords,\n currentMouseCoords,\n stateRef.current.dropCoords,\n stateRef.current.submenuCoords\n );\n\n if (movingTowardsSubmenu) {\n cancelPendingClose();\n } else {\n scheduleClose();\n }\n }\n\n stateRef.current.prevMouseCoords = currentMouseCoords;\n }, MOUSE_MOVE_THROTTLE_MS);\n\n const checkIfMouseIsOverItemOrSubmenu = throttle(() => {\n if (stateRef.current.prevMouseCoords !== null) {\n const elementUnderMouse = document.elementFromPoint(\n stateRef.current.prevMouseCoords.x,\n stateRef.current.prevMouseCoords.y\n );\n\n const isMouseOverItemOrSubmenu =\n itemRef.current?.contains(elementUnderMouse) || submenuRef.current?.contains(elementUnderMouse);\n\n if (isMouseOverItemOrSubmenu) {\n cancelPendingClose();\n } else {\n scheduleClose();\n }\n }\n }, SCROLL_THROTTLE_MS);\n\n document.addEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n dropContainer.addEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n document.addEventListener('scroll', checkIfMouseIsOverItemOrSubmenu, { capture: true, passive: true });\n\n stateRef.current.dropCoords = dropContainer.getBoundingClientRect();\n stateRef.current.submenuCoords = submenuRef.current.getBoundingClientRect();\n\n return () => {\n document.removeEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n dropContainer.removeEventListener('mousemove', checkIfMouseIsMovingTowardsSubmenu);\n document.removeEventListener('scroll', checkIfMouseIsOverItemOrSubmenu, { capture: true });\n checkIfMouseIsMovingTowardsSubmenu.cancel();\n checkIfMouseIsOverItemOrSubmenu.cancel();\n\n cancelPendingClose();\n\n stateRef.current = {\n dropCoords: null,\n prevMouseCoords: null,\n submenuCoords: null,\n };\n };\n }, [active, dropContainer, itemRef, submenuRef, cancelPendingClose]);\n\n return { trackPointer, cancelPendingClose };\n};\n"],"names":[],"mappings":";;;;AAKO,MAAM,sBAAyB,GAAA,GAAA;AAC/B,MAAM,kBAAqB,GAAA,IAAA;AAC3B,MAAM,sBAAyB,GAAA,IAAA;AA4B/B,MAAM,qBAAqB,CAAC;AAAA,EAC/B,MAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AACJ,CAA0D,KAAA;AACtD,EAAA,MAAM,WAAW,MAId,CAAA;AAAA,IACC,UAAY,EAAA,IAAA;AAAA,IACZ,eAAiB,EAAA,IAAA;AAAA,IACjB,aAAe,EAAA,IAAA;AAAA,GAClB,CAAA,CAAA;AAED,EAAM,MAAA,eAAA,GAAkB,OAA6C,IAAI,CAAA,CAAA;AAIzE,EAAM,MAAA,UAAA,GAAa,OAAO,OAAO,CAAA,CAAA;AACjC,EAAA,UAAA,CAAW,OAAU,GAAA,OAAA,CAAA;AAErB,EAAM,MAAA,kBAAA,GAAqB,YAAY,MAAM;AACzC,IAAI,IAAA,eAAA,CAAgB,YAAY,IAAM,EAAA;AAClC,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA,CAAA;AACpC,MAAA,eAAA,CAAgB,OAAU,GAAA,IAAA,CAAA;AAAA,KAC9B;AAAA,GACJ,EAAG,EAAE,CAAA,CAAA;AAEL,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,CAAC,KAAiB,KAAA;AAC/C,IAAA,QAAA,CAAS,QAAQ,eAAkB,GAAA,KAAA,CAAA;AAAA,GACvC,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACZ,IAAI,IAAA,CAAC,UAAU,CAAC,aAAA,IAAiB,CAAC,OAAQ,CAAA,OAAA,IAAW,CAAC,UAAA,CAAW,OAAS,EAAA;AACtE,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACX;AAEA,IAAA,MAAM,gBAAgB,MAAM;AACxB,MAAI,IAAA,eAAA,CAAgB,YAAY,IAAM,EAAA;AAClC,QAAgB,eAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AACvC,UAAA,eAAA,CAAgB,OAAU,GAAA,IAAA,CAAA;AAC1B,UAAA,UAAA,CAAW,OAAQ,EAAA,CAAA;AAAA,WACpB,sBAAsB,CAAA,CAAA;AAAA,OAC7B;AAAA,KACJ,CAAA;AAEA,IAAM,MAAA,kCAAA,GAAqC,QAAS,CAAA,CAAC,KAAsB,KAAA;AACvE,MAAA,MAAM,qBAA4B,EAAE,CAAA,EAAG,MAAM,OAAS,EAAA,CAAA,EAAG,MAAM,OAAQ,EAAA,CAAA;AAEvE,MAAM,MAAA,wBAAA,GACF,OAAQ,CAAA,OAAA,EAAS,QAAS,CAAA,KAAA,CAAM,MAAqB,CAAA,IACrD,UAAW,CAAA,OAAA,EAAS,QAAS,CAAA,KAAA,CAAM,MAAqB,CAAA,CAAA;AAE5D,MAAA,IAAI,wBAA0B,EAAA;AAC1B,QAAmB,kBAAA,EAAA,CAAA;AAAA,OAEnB,MAAA,IAAA,QAAA,CAAS,OAAQ,CAAA,UAAA,KAAe,IAChC,IAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,KAAoB,IACrC,IAAA,QAAA,CAAS,OAAQ,CAAA,aAAA,KAAkB,IACrC,EAAA;AACE,QAAA,IAAI,CAAC,cAAe,CAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,EAAiB,kBAAkB,CAAG,EAAA;AACvE,UAAA,OAAA;AAAA,SACJ;AAEA,QAAA,MAAM,oBAAuB,GAAA,sBAAA;AAAA,UACzB,SAAS,OAAQ,CAAA,eAAA;AAAA,UACjB,kBAAA;AAAA,UACA,SAAS,OAAQ,CAAA,UAAA;AAAA,UACjB,SAAS,OAAQ,CAAA,aAAA;AAAA,SACrB,CAAA;AAEA,QAAA,IAAI,oBAAsB,EAAA;AACtB,UAAmB,kBAAA,EAAA,CAAA;AAAA,SAChB,MAAA;AACH,UAAc,aAAA,EAAA,CAAA;AAAA,SAClB;AAAA,OACJ;AAEA,MAAA,QAAA,CAAS,QAAQ,eAAkB,GAAA,kBAAA,CAAA;AAAA,OACpC,sBAAsB,CAAA,CAAA;AAEzB,IAAM,MAAA,+BAAA,GAAkC,SAAS,MAAM;AACnD,MAAI,IAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,KAAoB,IAAM,EAAA;AAC3C,QAAA,MAAM,oBAAoB,QAAS,CAAA,gBAAA;AAAA,UAC/B,QAAA,CAAS,QAAQ,eAAgB,CAAA,CAAA;AAAA,UACjC,QAAA,CAAS,QAAQ,eAAgB,CAAA,CAAA;AAAA,SACrC,CAAA;AAEA,QAAM,MAAA,wBAAA,GACF,QAAQ,OAAS,EAAA,QAAA,CAAS,iBAAiB,CAAK,IAAA,UAAA,CAAW,OAAS,EAAA,QAAA,CAAS,iBAAiB,CAAA,CAAA;AAElG,QAAA,IAAI,wBAA0B,EAAA;AAC1B,UAAmB,kBAAA,EAAA,CAAA;AAAA,SAChB,MAAA;AACH,UAAc,aAAA,EAAA,CAAA;AAAA,SAClB;AAAA,OACJ;AAAA,OACD,kBAAkB,CAAA,CAAA;AAErB,IAAS,QAAA,CAAA,gBAAA,CAAiB,aAAa,kCAAkC,CAAA,CAAA;AACzE,IAAc,aAAA,CAAA,gBAAA,CAAiB,aAAa,kCAAkC,CAAA,CAAA;AAC9E,IAAS,QAAA,CAAA,gBAAA,CAAiB,UAAU,+BAAiC,EAAA,EAAE,SAAS,IAAM,EAAA,OAAA,EAAS,MAAM,CAAA,CAAA;AAErG,IAAS,QAAA,CAAA,OAAA,CAAQ,UAAa,GAAA,aAAA,CAAc,qBAAsB,EAAA,CAAA;AAClE,IAAA,QAAA,CAAS,OAAQ,CAAA,aAAA,GAAgB,UAAW,CAAA,OAAA,CAAQ,qBAAsB,EAAA,CAAA;AAE1E,IAAA,OAAO,MAAM;AACT,MAAS,QAAA,CAAA,mBAAA,CAAoB,aAAa,kCAAkC,CAAA,CAAA;AAC5E,MAAc,aAAA,CAAA,mBAAA,CAAoB,aAAa,kCAAkC,CAAA,CAAA;AACjF,MAAA,QAAA,CAAS,oBAAoB,QAAU,EAAA,+BAAA,EAAiC,EAAE,OAAA,EAAS,MAAM,CAAA,CAAA;AACzF,MAAA,kCAAA,CAAmC,MAAO,EAAA,CAAA;AAC1C,MAAA,+BAAA,CAAgC,MAAO,EAAA,CAAA;AAEvC,MAAmB,kBAAA,EAAA,CAAA;AAEnB,MAAA,QAAA,CAAS,OAAU,GAAA;AAAA,QACf,UAAY,EAAA,IAAA;AAAA,QACZ,eAAiB,EAAA,IAAA;AAAA,QACjB,aAAe,EAAA,IAAA;AAAA,OACnB,CAAA;AAAA,KACJ,CAAA;AAAA,KACD,CAAC,MAAA,EAAQ,eAAe,OAAS,EAAA,UAAA,EAAY,kBAAkB,CAAC,CAAA,CAAA;AAEnE,EAAO,OAAA,EAAE,cAAc,kBAAmB,EAAA,CAAA;AAC9C;;;;"}
package/menu-MA0FnVsV.js DELETED
@@ -1,5 +0,0 @@
1
- import './index.css';
2
- var styles = {"disabled":"magritte-disabled___ZuG-J_1-0-46","drop-content-margin":"magritte-drop-content-margin___q01ll_1-0-46","dropContentMargin":"magritte-drop-content-margin___q01ll_1-0-46","item":"magritte-item___HyDAw_1-0-46","neutral":"magritte-neutral___WyGeQ_1-0-46","negative":"magritte-negative___F7a0c_1-0-46","item-icon":"magritte-item-icon___yCv9l_1-0-46","itemIcon":"magritte-item-icon___yCv9l_1-0-46","item-text":"magritte-item-text___GL3A5_1-0-46","itemText":"magritte-item-text___GL3A5_1-0-46","item-tag":"magritte-item-tag___KX5wL_1-0-46","itemTag":"magritte-item-tag___KX5wL_1-0-46","item-right-content":"magritte-item-right-content___U2hc1_1-0-46","itemRightContent":"magritte-item-right-content___U2hc1_1-0-46","mobile-menu-container":"magritte-mobile-menu-container___zlY08_1-0-46","mobileMenuContainer":"magritte-mobile-menu-container___zlY08_1-0-46","mobile-main-menu-container":"magritte-mobile-main-menu-container___fOW3d_1-0-46","mobileMainMenuContainer":"magritte-mobile-main-menu-container___fOW3d_1-0-46","mobile-submenu-container":"magritte-mobile-submenu-container___od1Ev_1-0-46","mobileSubmenuContainer":"magritte-mobile-submenu-container___od1Ev_1-0-46","mobile-menu-container-slide":"magritte-mobile-menu-container-slide___HXiEx_1-0-46","mobileMenuContainerSlide":"magritte-mobile-menu-container-slide___HXiEx_1-0-46","quick-actions":"magritte-quick-actions___HvUJ3_1-0-46","quickActions":"magritte-quick-actions___HvUJ3_1-0-46","quick-action":"magritte-quick-action___1K5Ip_1-0-46","quickAction":"magritte-quick-action___1K5Ip_1-0-46","quick-action-text":"magritte-quick-action-text___diFW5_1-0-46","quickActionText":"magritte-quick-action-text___diFW5_1-0-46"};
3
-
4
- export { styles as s };
5
- //# sourceMappingURL=menu-MA0FnVsV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu-MA0FnVsV.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}