@hh.ru/magritte-ui-modal 10.1.35 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/index.css +185 -191
  2. package/index.d.ts +5 -2
  3. package/index.js +25 -14
  4. package/index.js.map +1 -1
  5. package/index.mock.d.ts +6 -2
  6. package/index.mock.js +7 -3
  7. package/index.mock.js.map +1 -1
  8. package/internal/ModalBody.d.ts +5 -0
  9. package/internal/ModalBody.js +41 -0
  10. package/internal/ModalBody.js.map +1 -0
  11. package/internal/ModalContent.d.ts +2 -0
  12. package/internal/ModalContent.js +14 -0
  13. package/internal/ModalContent.js.map +1 -0
  14. package/internal/ModalInner.d.ts +28 -0
  15. package/internal/ModalInner.js +46 -0
  16. package/internal/ModalInner.js.map +1 -0
  17. package/internal/ModalSlotsContext.d.ts +46 -0
  18. package/internal/ModalSlotsContext.js +66 -0
  19. package/internal/ModalSlotsContext.js.map +1 -0
  20. package/internal/ModalStickyHeader.d.ts +8 -0
  21. package/internal/ModalStickyHeader.js +40 -0
  22. package/internal/ModalStickyHeader.js.map +1 -0
  23. package/internal/constants.d.ts +38 -0
  24. package/internal/constants.js +53 -0
  25. package/internal/constants.js.map +1 -0
  26. package/internal/isTreeSelectorChild.d.ts +7 -0
  27. package/internal/isTreeSelectorChild.js +13 -0
  28. package/internal/isTreeSelectorChild.js.map +1 -0
  29. package/{useModalOrder.js → internal/useModalOrder.js} +1 -1
  30. package/internal/useModalOrder.js.map +1 -0
  31. package/internal/useModalTransition.d.ts +29 -0
  32. package/internal/useModalTransition.js +85 -0
  33. package/internal/useModalTransition.js.map +1 -0
  34. package/internal/usePageHeaderScrollAnimation.d.ts +14 -0
  35. package/internal/usePageHeaderScrollAnimation.js +48 -0
  36. package/internal/usePageHeaderScrollAnimation.js.map +1 -0
  37. package/modal-Bf_KXESS.js +5 -0
  38. package/modal-Bf_KXESS.js.map +1 -0
  39. package/package.json +12 -8
  40. package/public/Modal.d.ts +10 -0
  41. package/public/Modal.js +105 -0
  42. package/public/Modal.js.map +1 -0
  43. package/public/ModalMedia.d.ts +15 -0
  44. package/public/ModalMedia.js +23 -0
  45. package/public/ModalMedia.js.map +1 -0
  46. package/public/ModalWithImage.d.ts +16 -0
  47. package/public/ModalWithImage.js +56 -0
  48. package/public/ModalWithImage.js.map +1 -0
  49. package/public/types.d.ts +40 -0
  50. package/{types.js → public/types.js} +1 -1
  51. package/Modal.d.ts +0 -3
  52. package/Modal.js +0 -271
  53. package/Modal.js.map +0 -1
  54. package/ModalContentWithHeader-DI3La66k.js +0 -150
  55. package/ModalContentWithHeader-DI3La66k.js.map +0 -1
  56. package/ModalContentWithHeader.d.ts +0 -8
  57. package/ModalContentWithHeader.js +0 -15
  58. package/ModalContentWithHeader.js.map +0 -1
  59. package/ModalHeader.d.ts +0 -6
  60. package/ModalHeader.js +0 -48
  61. package/ModalHeader.js.map +0 -1
  62. package/types.d.ts +0 -71
  63. package/useModalOrder.js.map +0 -1
  64. /package/{useModalOrder.d.ts → internal/useModalOrder.d.ts} +0 -0
  65. /package/{types.js.map → public/types.js.map} +0 -0
@@ -0,0 +1,85 @@
1
+ import './../index.css';
2
+ import { useRef, useCallback, useEffect } from 'react';
3
+ import { disableScroll } from '@hh.ru/magritte-common-modal-helper';
4
+ import { Breakpoint, useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
5
+ import { useModalOrder } from './useModalOrder.js';
6
+ import '@hh.ru/magritte-common-dom-storage';
7
+
8
+ const INVISIBLE_FOR_BREAKPOINTS = [Breakpoint.XS, Breakpoint.S];
9
+ /**
10
+ * Жизненный цикл модала вокруг `CSSTransition`: блокировка скролла страницы на время показа, возврат
11
+ * фокуса на активатор после закрытия, колбэки `onAppear/onBeforeExit/onAfterExit`, регистрация в стеке
12
+ * модалов (`useModalOrder`) и обработка смены брейкпоинта (на XS/S модал скрывается). Возвращает
13
+ * хендлеры для `CSSTransition` и флаг «скрыт на текущем брейкпоинте».
14
+ */
15
+ const useModalTransition = ({ visible, isServerEnv, showOverlay, returnFocusOnClose, onAppear, onBeforeExit, onAfterExit, modalRef, animationTimeoutExit, }) => {
16
+ const enableScrollRef = useRef();
17
+ const onAfterExitRef = useRef(onAfterExit);
18
+ const onBeforeExitRef = useRef(onBeforeExit);
19
+ onAfterExitRef.current = onAfterExit;
20
+ onBeforeExitRef.current = onBeforeExit;
21
+ const animationTimeoutExitRef = useRef(animationTimeoutExit);
22
+ animationTimeoutExitRef.current = animationTimeoutExit;
23
+ const activatorRef = useRef(null);
24
+ const onEntering = useCallback(() => {
25
+ if (returnFocusOnClose && document.activeElement instanceof HTMLElement) {
26
+ activatorRef.current = document.activeElement;
27
+ }
28
+ if (!enableScrollRef.current && showOverlay) {
29
+ enableScrollRef.current = disableScroll();
30
+ }
31
+ if (modalRef.current && !modalRef.current.contains(document.activeElement)) {
32
+ modalRef.current.focus();
33
+ }
34
+ }, [returnFocusOnClose, showOverlay, modalRef]);
35
+ const onEntered = useCallback(() => {
36
+ onAppear?.();
37
+ }, [onAppear]);
38
+ const onExit = useCallback(() => {
39
+ onBeforeExitRef.current?.();
40
+ }, []);
41
+ const onExited = useCallback(() => {
42
+ // оставляем обработку скрола еще и тут
43
+ // чтобы обработать историю со сменой breakpoint
44
+ enableScrollRef.current?.();
45
+ enableScrollRef.current = undefined;
46
+ onAfterExitRef.current?.();
47
+ if (activatorRef.current !== null && document.contains(activatorRef.current)) {
48
+ activatorRef.current?.focus();
49
+ activatorRef.current = null;
50
+ }
51
+ }, []);
52
+ useModalOrder(!!visible && !isServerEnv, modalRef);
53
+ const { breakpoint } = useBreakpoint();
54
+ useEffect(() => {
55
+ if (!visible) {
56
+ return;
57
+ }
58
+ const currentBreakpointVisible = !INVISIBLE_FOR_BREAKPOINTS.includes(breakpoint);
59
+ if (!currentBreakpointVisible) {
60
+ onExit();
61
+ onExited();
62
+ return;
63
+ }
64
+ onEntering();
65
+ // visible не должно быть в зависимостях, т.к. этот эффект обрабатывает только изменение брейкпоинта
66
+ // visible обрабатывается CSSTransition
67
+ // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps
68
+ }, [breakpoint, onEntering, onExited, onExit]);
69
+ useEffect(() => {
70
+ return () => {
71
+ enableScrollRef.current?.(animationTimeoutExitRef.current);
72
+ enableScrollRef.current = undefined;
73
+ };
74
+ }, [visible, showOverlay]);
75
+ return {
76
+ onEntering,
77
+ onEntered,
78
+ onExit,
79
+ onExited,
80
+ isHiddenForBreakpoint: INVISIBLE_FOR_BREAKPOINTS.includes(breakpoint),
81
+ };
82
+ };
83
+
84
+ export { useModalTransition };
85
+ //# sourceMappingURL=useModalTransition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useModalTransition.js","sources":["src/internal/useModalTransition.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { disableScroll, type TimeoutCallback } from '@hh.ru/magritte-common-modal-helper';\nimport { Breakpoint, useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { useModalOrder } from '@hh.ru/magritte-ui-modal/internal/useModalOrder';\n\nconst INVISIBLE_FOR_BREAKPOINTS = [Breakpoint.XS, Breakpoint.S];\n\ninterface UseModalTransitionParams {\n visible: boolean | undefined;\n isServerEnv: boolean;\n showOverlay: boolean;\n returnFocusOnClose: boolean | undefined;\n onAppear?: VoidFunction;\n onBeforeExit?: VoidFunction;\n onAfterExit?: VoidFunction;\n modalRef: RefObject<HTMLDivElement>;\n /** Длительность анимации закрытия (мс) — с ней разблокируется скролл при размонтировании. */\n animationTimeoutExit: number;\n}\n\ninterface UseModalTransitionResult {\n onEntering: VoidFunction;\n onEntered: VoidFunction;\n onExit: VoidFunction;\n onExited: VoidFunction;\n /** Текущий брейкпоинт входит в число тех, на которых модал не рендерится (XS/S). */\n isHiddenForBreakpoint: boolean;\n}\n\n/**\n * Жизненный цикл модала вокруг `CSSTransition`: блокировка скролла страницы на время показа, возврат\n * фокуса на активатор после закрытия, колбэки `onAppear/onBeforeExit/onAfterExit`, регистрация в стеке\n * модалов (`useModalOrder`) и обработка смены брейкпоинта (на XS/S модал скрывается). Возвращает\n * хендлеры для `CSSTransition` и флаг «скрыт на текущем брейкпоинте».\n */\nexport const useModalTransition = ({\n visible,\n isServerEnv,\n showOverlay,\n returnFocusOnClose,\n onAppear,\n onBeforeExit,\n onAfterExit,\n modalRef,\n animationTimeoutExit,\n}: UseModalTransitionParams): UseModalTransitionResult => {\n const enableScrollRef = useRef<TimeoutCallback>();\n const onAfterExitRef = useRef(onAfterExit);\n const onBeforeExitRef = useRef(onBeforeExit);\n onAfterExitRef.current = onAfterExit;\n onBeforeExitRef.current = onBeforeExit;\n const animationTimeoutExitRef = useRef(animationTimeoutExit);\n animationTimeoutExitRef.current = animationTimeoutExit;\n\n const activatorRef = useRef<HTMLElement | null>(null);\n\n const onEntering = useCallback(() => {\n if (returnFocusOnClose && document.activeElement instanceof HTMLElement) {\n activatorRef.current = document.activeElement;\n }\n if (!enableScrollRef.current && showOverlay) {\n enableScrollRef.current = disableScroll();\n }\n if (modalRef.current && !modalRef.current.contains(document.activeElement)) {\n modalRef.current.focus();\n }\n }, [returnFocusOnClose, showOverlay, modalRef]);\n\n const onEntered = useCallback(() => {\n onAppear?.();\n }, [onAppear]);\n\n const onExit = useCallback(() => {\n onBeforeExitRef.current?.();\n }, []);\n\n const onExited = useCallback(() => {\n // оставляем обработку скрола еще и тут\n // чтобы обработать историю со сменой breakpoint\n enableScrollRef.current?.();\n enableScrollRef.current = undefined;\n\n onAfterExitRef.current?.();\n\n if (activatorRef.current !== null && document.contains(activatorRef.current)) {\n activatorRef.current?.focus();\n activatorRef.current = null;\n }\n }, []);\n\n useModalOrder(!!visible && !isServerEnv, modalRef);\n\n const { breakpoint } = useBreakpoint();\n useEffect(() => {\n if (!visible) {\n return;\n }\n\n const currentBreakpointVisible = !INVISIBLE_FOR_BREAKPOINTS.includes(breakpoint);\n if (!currentBreakpointVisible) {\n onExit();\n onExited();\n return;\n }\n\n onEntering();\n // visible не должно быть в зависимостях, т.к. этот эффект обрабатывает только изменение брейкпоинта\n // visible обрабатывается CSSTransition\n // eslint-disable-next-line disable-autofix/react-hooks/exhaustive-deps\n }, [breakpoint, onEntering, onExited, onExit]);\n\n useEffect(() => {\n return () => {\n enableScrollRef.current?.(animationTimeoutExitRef.current);\n enableScrollRef.current = undefined;\n };\n }, [visible, showOverlay]);\n\n return {\n onEntering,\n onEntered,\n onExit,\n onExited,\n isHiddenForBreakpoint: INVISIBLE_FOR_BREAKPOINTS.includes(breakpoint),\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type RefObject } from 'react';
2
+ interface UsePageHeaderScrollAnimationParams {
3
+ overlayRef: RefObject<HTMLDivElement>;
4
+ showOverlay: boolean;
5
+ pageHeaderPadding: number;
6
+ visible: boolean | undefined;
7
+ }
8
+ /**
9
+ * Анимирует `top` оверлея при скролле страницы (только для `position=left|right` без оверлея): по мере
10
+ * прокрутки на `pageHeaderPadding` оверлей «подъезжает» под page-header от `pageHeaderPadding` к `0`.
11
+ * Использует `ScrollTimeline`, где доступен, иначе — ручную привязку к событию `scroll`.
12
+ */
13
+ export declare const usePageHeaderScrollAnimation: ({ overlayRef, showOverlay, pageHeaderPadding, visible, }: UsePageHeaderScrollAnimationParams) => void;
14
+ export {};
@@ -0,0 +1,48 @@
1
+ import './../index.css';
2
+ import { useEffect } from 'react';
3
+
4
+ /**
5
+ * Анимирует `top` оверлея при скролле страницы (только для `position=left|right` без оверлея): по мере
6
+ * прокрутки на `pageHeaderPadding` оверлей «подъезжает» под page-header от `pageHeaderPadding` к `0`.
7
+ * Использует `ScrollTimeline`, где доступен, иначе — ручную привязку к событию `scroll`.
8
+ */
9
+ const usePageHeaderScrollAnimation = ({ overlayRef, showOverlay, pageHeaderPadding, visible, }) => {
10
+ useEffect(() => {
11
+ if (showOverlay || !pageHeaderPadding || !visible) {
12
+ return void 0;
13
+ }
14
+ const hasScrollTimeline = 'ScrollTimeline' in window;
15
+ const overlay = overlayRef.current;
16
+ if (!overlay) {
17
+ return void 0;
18
+ }
19
+ let animation;
20
+ const abortController = new AbortController();
21
+ const keyframes = { top: [`${pageHeaderPadding}px`, '0px'] };
22
+ if (hasScrollTimeline) {
23
+ const timeline = new ScrollTimeline({ source: document.documentElement, axis: 'y' });
24
+ animation = overlay.animate(keyframes, {
25
+ timeline,
26
+ rangeStart: '0px',
27
+ // calc нужен для устранения бага https://issues.chromium.org/issues/40929569
28
+ rangeEnd: `calc(0% + ${pageHeaderPadding}px)`,
29
+ });
30
+ }
31
+ else {
32
+ animation = overlay.animate(keyframes, { duration: 1000, fill: 'forwards' });
33
+ animation.pause();
34
+ const { signal } = abortController;
35
+ window.addEventListener('scroll', () => {
36
+ animation.currentTime =
37
+ (Math.min(document.documentElement.scrollTop, pageHeaderPadding) / pageHeaderPadding) * 1000;
38
+ }, { signal });
39
+ }
40
+ return () => {
41
+ abortController.abort();
42
+ animation.cancel();
43
+ };
44
+ }, [overlayRef, showOverlay, pageHeaderPadding, visible]);
45
+ };
46
+
47
+ export { usePageHeaderScrollAnimation };
48
+ //# sourceMappingURL=usePageHeaderScrollAnimation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePageHeaderScrollAnimation.js","sources":["src/internal/usePageHeaderScrollAnimation.ts"],"sourcesContent":["import { type RefObject, useEffect } from 'react';\n\ninterface UsePageHeaderScrollAnimationParams {\n overlayRef: RefObject<HTMLDivElement>;\n showOverlay: boolean;\n pageHeaderPadding: number;\n visible: boolean | undefined;\n}\n\n/**\n * Анимирует `top` оверлея при скролле страницы (только для `position=left|right` без оверлея): по мере\n * прокрутки на `pageHeaderPadding` оверлей «подъезжает» под page-header от `pageHeaderPadding` к `0`.\n * Использует `ScrollTimeline`, где доступен, иначе — ручную привязку к событию `scroll`.\n */\nexport const usePageHeaderScrollAnimation = ({\n overlayRef,\n showOverlay,\n pageHeaderPadding,\n visible,\n}: UsePageHeaderScrollAnimationParams): void => {\n useEffect(() => {\n if (showOverlay || !pageHeaderPadding || !visible) {\n return void 0;\n }\n\n const hasScrollTimeline = 'ScrollTimeline' in window;\n const overlay = overlayRef.current;\n\n if (!overlay) {\n return void 0;\n }\n\n let animation: Animation;\n const abortController = new AbortController();\n const keyframes = { top: [`${pageHeaderPadding}px`, '0px'] };\n if (hasScrollTimeline) {\n const timeline = new ScrollTimeline({ source: document.documentElement, axis: 'y' });\n animation = overlay.animate(keyframes, {\n timeline,\n rangeStart: '0px',\n // calc нужен для устранения бага https://issues.chromium.org/issues/40929569\n rangeEnd: `calc(0% + ${pageHeaderPadding}px)`,\n } as KeyframeAnimationOptions);\n } else {\n animation = overlay.animate(keyframes, { duration: 1000, fill: 'forwards' });\n animation.pause();\n\n const { signal } = abortController;\n window.addEventListener(\n 'scroll',\n () => {\n animation.currentTime =\n (Math.min(document.documentElement.scrollTop, pageHeaderPadding) / pageHeaderPadding) * 1000;\n },\n { signal }\n );\n }\n\n return () => {\n abortController.abort();\n animation.cancel();\n };\n }, [overlayRef, showOverlay, pageHeaderPadding, visible]);\n};\n"],"names":[],"mappings":";;AASA;;;;AAIG;AACI,MAAM,4BAA4B,GAAG,CAAC,EACzC,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,OAAO,GAC0B,KAAU;IAC3C,SAAS,CAAC,MAAK;QACX,IAAI,WAAW,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE;YAC/C,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,MAAM,iBAAiB,GAAG,gBAAgB,IAAI,MAAM,CAAC;AACrD,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QAEnC,IAAI,CAAC,OAAO,EAAE;YACV,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,IAAI,SAAoB,CAAC;AACzB,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAC9C,QAAA,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,CAAG,EAAA,iBAAiB,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC,EAAE,CAAC;QAC7D,IAAI,iBAAiB,EAAE;AACnB,YAAA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACrF,YAAA,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE;gBACnC,QAAQ;AACR,gBAAA,UAAU,EAAE,KAAK;;gBAEjB,QAAQ,EAAE,CAAa,UAAA,EAAA,iBAAiB,CAAK,GAAA,CAAA;AACpB,aAAA,CAAC,CAAC;SAClC;aAAM;AACH,YAAA,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7E,SAAS,CAAC,KAAK,EAAE,CAAC;AAElB,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;AACnC,YAAA,MAAM,CAAC,gBAAgB,CACnB,QAAQ,EACR,MAAK;AACD,gBAAA,SAAS,CAAC,WAAW;AACjB,oBAAA,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,iBAAiB,IAAI,IAAI,CAAC;AACrG,aAAC,EACD,EAAE,MAAM,EAAE,CACb,CAAC;SACL;AAED,QAAA,OAAO,MAAK;YACR,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,SAAS,CAAC,MAAM,EAAE,CAAC;AACvB,SAAC,CAAC;KACL,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9D;;;;"}
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"sticky-header":"magritte-sticky-header___TPafy_11-0-0","stickyHeader":"magritte-sticky-header___TPafy_11-0-0","sticky-header-inner":"magritte-sticky-header-inner___u5p8h_11-0-0","stickyHeaderInner":"magritte-sticky-header-inner___u5p8h_11-0-0","modal-media":"magritte-modal-media___UqHGM_11-0-0","modalMedia":"magritte-modal-media___UqHGM_11-0-0","fixed-height":"magritte-fixed-height___wyJ7-_11-0-0","fixedHeight":"magritte-fixed-height___wyJ7-_11-0-0","contain":"magritte-contain___3QD0Z_11-0-0","cover":"magritte-cover___nry9O_11-0-0","content-overlay-top":"magritte-content-overlay-top___6snWk_11-0-0","contentOverlayTop":"magritte-content-overlay-top___6snWk_11-0-0","grow-limiter":"magritte-grow-limiter___GmpBj_11-0-0","growLimiter":"magritte-grow-limiter___GmpBj_11-0-0","modal-overlay":"magritte-modal-overlay___WwfCg_11-0-0","modalOverlay":"magritte-modal-overlay___WwfCg_11-0-0","modal-overlay-with-background":"magritte-modal-overlay-with-background___DDxJn_11-0-0","modalOverlayWithBackground":"magritte-modal-overlay-with-background___DDxJn_11-0-0","modal":"magritte-modal___C4o5U_11-0-0","modal-overlay-left":"magritte-modal-overlay-left___agPyC_11-0-0","modalOverlayLeft":"magritte-modal-overlay-left___agPyC_11-0-0","modal-overlay-right":"magritte-modal-overlay-right___-XDAx_11-0-0","modalOverlayRight":"magritte-modal-overlay-right___-XDAx_11-0-0","size-small":"magritte-size-small___cI-Ql_11-0-0","sizeSmall":"magritte-size-small___cI-Ql_11-0-0","size-medium":"magritte-size-medium___jnqfu_11-0-0","sizeMedium":"magritte-size-medium___jnqfu_11-0-0","no-vertical-paddings":"magritte-no-vertical-paddings___dxyot_11-0-0","noVerticalPaddings":"magritte-no-vertical-paddings___dxyot_11-0-0","no-horizontal-paddings":"magritte-no-horizontal-paddings___Q-i-5_11-0-0","noHorizontalPaddings":"magritte-no-horizontal-paddings___Q-i-5_11-0-0","modal-full-height":"magritte-modal-full-height___Aew5F_11-0-0","modalFullHeight":"magritte-modal-full-height___Aew5F_11-0-0","modal-with-border":"magritte-modal-with-border___KSnhf_11-0-0","modalWithBorder":"magritte-modal-with-border___KSnhf_11-0-0","modal-content-wrapper":"magritte-modal-content-wrapper___VzoTN_11-0-0","modalContentWrapper":"magritte-modal-content-wrapper___VzoTN_11-0-0","modal-footer":"magritte-modal-footer___Ha-sZ_11-0-0","modalFooter":"magritte-modal-footer___Ha-sZ_11-0-0","modal-footer-empty":"magritte-modal-footer-empty___tmH-x_11-0-0","modalFooterEmpty":"magritte-modal-footer-empty___tmH-x_11-0-0","animation-timeout":"magritte-animation-timeout___G4Hl1_11-0-0","animationTimeout":"magritte-animation-timeout___G4Hl1_11-0-0","animation-enter-center":"magritte-animation-enter-center___sq8j7_11-0-0","animationEnterCenter":"magritte-animation-enter-center___sq8j7_11-0-0","animation-enter-center-active":"magritte-animation-enter-center-active___ORYEh_11-0-0","animationEnterCenterActive":"magritte-animation-enter-center-active___ORYEh_11-0-0","animation-exit-center":"magritte-animation-exit-center___lLCX1_11-0-0","animationExitCenter":"magritte-animation-exit-center___lLCX1_11-0-0","animation-exit-center-active":"magritte-animation-exit-center-active___Ik2Yl_11-0-0","animationExitCenterActive":"magritte-animation-exit-center-active___Ik2Yl_11-0-0","animation-enter-left":"magritte-animation-enter-left___jJDlv_11-0-0","animationEnterLeft":"magritte-animation-enter-left___jJDlv_11-0-0","animation-enter-left-active":"magritte-animation-enter-left-active___-kFij_11-0-0","animationEnterLeftActive":"magritte-animation-enter-left-active___-kFij_11-0-0","animation-exit-left":"magritte-animation-exit-left___G2Plq_11-0-0","animationExitLeft":"magritte-animation-exit-left___G2Plq_11-0-0","animation-exit-left-active":"magritte-animation-exit-left-active___XW2K4_11-0-0","animationExitLeftActive":"magritte-animation-exit-left-active___XW2K4_11-0-0","animation-enter-right":"magritte-animation-enter-right___rrMS0_11-0-0","animationEnterRight":"magritte-animation-enter-right___rrMS0_11-0-0","animation-enter-right-active":"magritte-animation-enter-right-active___p7rg-_11-0-0","animationEnterRightActive":"magritte-animation-enter-right-active___p7rg-_11-0-0","animation-exit-right":"magritte-animation-exit-right___f3qIC_11-0-0","animationExitRight":"magritte-animation-exit-right___f3qIC_11-0-0","animation-exit-right-active":"magritte-animation-exit-right-active___-sG1k_11-0-0","animationExitRightActive":"magritte-animation-exit-right-active___-sG1k_11-0-0","tree-selector-container":"magritte-tree-selector-container___4cdf5_11-0-0","treeSelectorContainer":"magritte-tree-selector-container___4cdf5_11-0-0","modal-scroll-container":"magritte-modal-scroll-container___hOCdh_11-0-0","modalScrollContainer":"magritte-modal-scroll-container___hOCdh_11-0-0","nav-bar":"magritte-nav-bar___CL7d-_11-0-0","navBar":"magritte-nav-bar___CL7d-_11-0-0","header":"magritte-header___pufwA_11-0-0","static":"magritte-static___3B6cn_11-0-0","content-overlay-bottom":"magritte-content-overlay-bottom___bDuPC_11-0-0","contentOverlayBottom":"magritte-content-overlay-bottom___bDuPC_11-0-0"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=modal-Bf_KXESS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-Bf_KXESS.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-modal",
3
- "version": "10.1.35",
3
+ "version": "11.0.0",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -28,20 +28,24 @@
28
28
  "@hh.ru/magritte-common-use-multiple-refs": "1.1.11",
29
29
  "@hh.ru/magritte-common-use-no-bubbling": "1.0.8",
30
30
  "@hh.ru/magritte-design-tokens": "24.7.2",
31
+ "@hh.ru/magritte-internal-accessible-region": "1.0.3",
31
32
  "@hh.ru/magritte-internal-layer-name": "3.4.1",
32
- "@hh.ru/magritte-ui-action-bar": "5.3.32",
33
+ "@hh.ru/magritte-internal-slot-registry": "1.1.0",
34
+ "@hh.ru/magritte-ui-action-bar": "5.4.0",
33
35
  "@hh.ru/magritte-ui-breakpoint": "6.1.1",
34
- "@hh.ru/magritte-ui-content-overlay": "1.2.0",
36
+ "@hh.ru/magritte-ui-content-overlay": "1.2.1",
35
37
  "@hh.ru/magritte-ui-divider": "3.2.1",
36
38
  "@hh.ru/magritte-ui-icon": "14.2.12",
37
- "@hh.ru/magritte-ui-layer": "3.2.5",
39
+ "@hh.ru/magritte-ui-layer": "3.2.6",
40
+ "@hh.ru/magritte-ui-layout": "2.0.3",
38
41
  "@hh.ru/magritte-ui-mock-component": "1.1.7",
42
+ "@hh.ru/magritte-ui-nav-bar": "2.0.0",
39
43
  "@hh.ru/magritte-ui-progress-bar": "5.0.26",
40
44
  "@hh.ru/magritte-ui-scrollbar": "1.0.28",
41
45
  "@hh.ru/magritte-ui-textarea": "3.3.31",
42
- "@hh.ru/magritte-ui-theme-wrapper": "1.1.18",
43
- "@hh.ru/magritte-ui-title": "8.3.2",
44
- "@hh.ru/magritte-ui-tree-selector": "5.5.47"
46
+ "@hh.ru/magritte-ui-theme-wrapper": "1.1.19",
47
+ "@hh.ru/magritte-ui-title": "8.3.3",
48
+ "@hh.ru/magritte-ui-tree-selector": "5.5.48"
45
49
  },
46
50
  "peerDependencies": {
47
51
  "classnames": ">=2.3.2",
@@ -52,5 +56,5 @@
52
56
  "publishConfig": {
53
57
  "access": "public"
54
58
  },
55
- "gitHead": "31b8343d575729be9878df6f3d156992168a97b0"
59
+ "gitHead": "c04d157907ffbb3a873f8cd98fb63c4034f93f69"
56
60
  }
@@ -0,0 +1,10 @@
1
+ import { type HTMLAttributes, type ForwardRefExoticComponent, type PropsWithoutRef, type RefAttributes } from 'react';
2
+ import { type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';
3
+ import { type ModalMediaProps } from '@hh.ru/magritte-ui-modal/public/ModalMedia';
4
+ import { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';
5
+ type ModalRootProps = ModalProps & ExplicitRegionProps & Omit<HTMLAttributes<HTMLDivElement>, keyof ModalProps | 'role' | 'tabIndex' | 'className'>;
6
+ interface ModalCompound {
7
+ Media: ForwardRefExoticComponent<ModalMediaProps & RefAttributes<HTMLDivElement>>;
8
+ }
9
+ export declare const Modal: ForwardRefExoticComponent<PropsWithoutRef<ModalRootProps> & RefAttributes<HTMLDivElement>> & ModalCompound;
10
+ export {};
@@ -0,0 +1,105 @@
1
+ import './../index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { forwardRef, useState, useRef } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { CSSTransition } from 'react-transition-group';
6
+ import classnames from 'classnames';
7
+ import { useServerEnv } from '@hh.ru/magritte-common-is-server-env';
8
+ import { useKeyboardNavigation, keyboardMatch, keyboardKeys } from '@hh.ru/magritte-common-keyboard';
9
+ import { CloseByClickOutsideContext } from '@hh.ru/magritte-common-mouse/useCloseByClickOutside';
10
+ import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
11
+ import { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';
12
+ import { AccessibleRegionProvider } from '@hh.ru/magritte-internal-accessible-region';
13
+ import { Layer } from '@hh.ru/magritte-ui-layer';
14
+ import { ModalContent } from '../internal/ModalContent.js';
15
+ import { ModalInner } from '../internal/ModalInner.js';
16
+ import { ModalSlotsProvider } from '../internal/ModalSlotsContext.js';
17
+ import { getAnimationTimeout, CSS_CLASSES, noop, DEFAULT_PAGE_HEADER_PADDING } from '../internal/constants.js';
18
+ import { isTreeSelectorChild } from '../internal/isTreeSelectorChild.js';
19
+ import { useModalTransition } from '../internal/useModalTransition.js';
20
+ import { usePageHeaderScrollAnimation } from '../internal/usePageHeaderScrollAnimation.js';
21
+ import { ModalMedia } from './ModalMedia.js';
22
+ import { ThemeWrapper } from '@hh.ru/magritte-ui-theme-wrapper';
23
+ import { s as styles } from '../modal-Bf_KXESS.js';
24
+ import '@hh.ru/magritte-ui-textarea';
25
+ import '@hh.ru/magritte-ui-action-bar';
26
+ import '../internal/ModalBody.js';
27
+ import '@hh.ru/magritte-ui-content-overlay';
28
+ import '../internal/ModalStickyHeader.js';
29
+ import '@hh.ru/magritte-ui-nav-bar';
30
+ import '@hh.ru/magritte-ui-scrollbar';
31
+ import '@hh.ru/magritte-internal-slot-registry';
32
+ import '@hh.ru/magritte-design-tokens/core-tokens';
33
+ import '@hh.ru/magritte-ui-tree-selector';
34
+ import '@hh.ru/magritte-common-modal-helper';
35
+ import '@hh.ru/magritte-ui-breakpoint';
36
+ import '../internal/useModalOrder.js';
37
+ import '@hh.ru/magritte-common-dom-storage';
38
+
39
+ const Modal = forwardRef(({ visible, size = 'medium', header, footer, children, onClose = noop, host, disableVerticalPaddings = false, disableHorizontalPaddings = false, closeByClickOutside = true, onAppear, onBeforeExit, onAfterExit, position = 'center', height = position === 'center' ? 'content' : 'full-screen', minHeight, showOverlay: _showOverlay = true, pageHeaderPadding = DEFAULT_PAGE_HEADER_PADDING, returnFocusOnClose, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby, 'aria-describedby': ariaDescribedby, 'aria-description': ariaDescription, ...rest }, ref) => {
40
+ const isServerEnv = useServerEnv();
41
+ const [animationTimeout] = useState(getAnimationTimeout);
42
+ const modalRef = useRef(null);
43
+ const overlayRef = useRef(null);
44
+ const keyboardNavigationRef = useKeyboardNavigation({ enabled: visible && !isServerEnv, mode: 'loop' });
45
+ const modalRefCallback = useMultipleRefs(ref, modalRef, keyboardNavigationRef);
46
+ const showOverlay = position === 'center' || _showOverlay;
47
+ // TreeSelector сам управляет своим скроллом и должен занимать всю высоту модала.
48
+ const resolvedHeight = isTreeSelectorChild(children) ? 'full-screen' : height;
49
+ const { onEntering, onEntered, onExit, onExited, isHiddenForBreakpoint } = useModalTransition({
50
+ visible,
51
+ isServerEnv,
52
+ showOverlay,
53
+ returnFocusOnClose,
54
+ onAppear,
55
+ onBeforeExit,
56
+ onAfterExit,
57
+ modalRef,
58
+ animationTimeoutExit: animationTimeout.exit,
59
+ });
60
+ usePageHeaderScrollAnimation({
61
+ overlayRef,
62
+ showOverlay,
63
+ pageHeaderPadding,
64
+ visible: visible && !isHiddenForBreakpoint,
65
+ });
66
+ const overlayEventHandlers = useNoBubbling({
67
+ onKeyDown: (event) => {
68
+ if (keyboardMatch(event.nativeEvent, keyboardKeys.Escape)) {
69
+ onClose(event);
70
+ }
71
+ },
72
+ onMouseDown: (event) => {
73
+ if (closeByClickOutside && !modalRef.current?.contains(event.target)) {
74
+ onClose(event);
75
+ }
76
+ },
77
+ });
78
+ const overlayProps = showOverlay
79
+ ? overlayEventHandlers
80
+ : {
81
+ onKeyDown: (event) => {
82
+ if (keyboardMatch(event.nativeEvent, keyboardKeys.Escape)) {
83
+ onClose(event);
84
+ }
85
+ },
86
+ };
87
+ if (isHiddenForBreakpoint || isServerEnv) {
88
+ return null;
89
+ }
90
+ return createPortal(jsx(CSSTransition, { appear: true, in: visible && !isServerEnv, nodeRef: overlayRef, onEntering: onEntering, onEntered: onEntered, onExit: onExit, onExited: onExited, classNames: CSS_CLASSES[position], timeout: animationTimeout, unmountOnExit: true, children: jsx(ThemeWrapper, { children: (themeClass) => (jsx(Layer, { layer: "modal", children: jsx("div", { ...overlayProps, ref: overlayRef, className: classnames(styles.modalOverlay, themeClass, {
91
+ [styles.modalOverlayWithBackground]: showOverlay,
92
+ [styles.modalOverlayLeft]: position === 'left',
93
+ [styles.modalOverlayRight]: position === 'right',
94
+ }), "data-qa": "modal-overlay", children: jsx(CloseByClickOutsideContext.Provider, { value: overlayRef, children: jsx(AccessibleRegionProvider, { children: jsx(ModalSlotsProvider, { children: jsx(ModalInner, { ...rest, explicitAria: {
95
+ 'aria-label': ariaLabel,
96
+ 'aria-labelledby': ariaLabelledby,
97
+ 'aria-describedby': ariaDescribedby,
98
+ 'aria-description': ariaDescription,
99
+ }, ariaModal: visible && showOverlay && !isServerEnv, refCallback: modalRefCallback, size: size, height: resolvedHeight, minHeight: minHeight, disableVerticalPaddings: disableVerticalPaddings, disableHorizontalPaddings: disableHorizontalPaddings, showOverlay: showOverlay, header: header, footer: footer, children: jsx(ModalContent, { children: children }) }) }) }) }) }) })) }) }), host || document.body);
100
+ });
101
+ Modal.displayName = 'Modal';
102
+ Modal.Media = ModalMedia;
103
+
104
+ export { Modal };
105
+ //# sourceMappingURL=Modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.js","sources":["src/public/Modal.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n useRef,\n useState,\n type ForwardRefExoticComponent,\n type PropsWithoutRef,\n type RefAttributes,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { CSSTransition } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useServerEnv } from '@hh.ru/magritte-common-is-server-env';\nimport { keyboardMatch, keyboardKeys, useKeyboardNavigation } from '@hh.ru/magritte-common-keyboard';\nimport { CloseByClickOutsideContext } from '@hh.ru/magritte-common-mouse/useCloseByClickOutside';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';\nimport { AccessibleRegionProvider, type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport { ModalContent } from '@hh.ru/magritte-ui-modal/internal/ModalContent';\nimport { ModalInner } from '@hh.ru/magritte-ui-modal/internal/ModalInner';\nimport { ModalSlotsProvider } from '@hh.ru/magritte-ui-modal/internal/ModalSlotsContext';\nimport {\n CSS_CLASSES,\n DEFAULT_PAGE_HEADER_PADDING,\n getAnimationTimeout,\n noop,\n} from '@hh.ru/magritte-ui-modal/internal/constants';\nimport { isTreeSelectorChild } from '@hh.ru/magritte-ui-modal/internal/isTreeSelectorChild';\nimport { useModalTransition } from '@hh.ru/magritte-ui-modal/internal/useModalTransition';\nimport { usePageHeaderScrollAnimation } from '@hh.ru/magritte-ui-modal/internal/usePageHeaderScrollAnimation';\nimport { ModalMedia, type ModalMediaProps } from '@hh.ru/magritte-ui-modal/public/ModalMedia';\nimport { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';\nimport { ThemeWrapper } from '@hh.ru/magritte-ui-theme-wrapper';\n\nimport styles from '../internal/modal.less';\n\ntype ModalRootProps = ModalProps &\n ExplicitRegionProps &\n Omit<HTMLAttributes<HTMLDivElement>, keyof ModalProps | 'role' | 'tabIndex' | 'className'>;\n\ninterface ModalCompound {\n Media: ForwardRefExoticComponent<ModalMediaProps & RefAttributes<HTMLDivElement>>;\n}\n\nexport const Modal = forwardRef<HTMLDivElement, ModalRootProps>(\n (\n {\n visible,\n size = 'medium',\n header,\n footer,\n children,\n onClose = noop,\n host,\n disableVerticalPaddings = false,\n disableHorizontalPaddings = false,\n closeByClickOutside = true,\n onAppear,\n onBeforeExit,\n onAfterExit,\n position = 'center',\n height = position === 'center' ? 'content' : 'full-screen',\n minHeight,\n showOverlay: _showOverlay = true,\n pageHeaderPadding = DEFAULT_PAGE_HEADER_PADDING,\n returnFocusOnClose,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'aria-description': ariaDescription,\n ...rest\n },\n ref\n ) => {\n const isServerEnv = useServerEnv();\n const [animationTimeout] = useState(getAnimationTimeout);\n\n const modalRef = useRef<HTMLDivElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const keyboardNavigationRef = useKeyboardNavigation({ enabled: visible && !isServerEnv, mode: 'loop' });\n const modalRefCallback = useMultipleRefs(ref, modalRef, keyboardNavigationRef);\n\n const showOverlay = position === 'center' || _showOverlay;\n\n // TreeSelector сам управляет своим скроллом и должен занимать всю высоту модала.\n const resolvedHeight = isTreeSelectorChild(children) ? 'full-screen' : height;\n\n const { onEntering, onEntered, onExit, onExited, isHiddenForBreakpoint } = useModalTransition({\n visible,\n isServerEnv,\n showOverlay,\n returnFocusOnClose,\n onAppear,\n onBeforeExit,\n onAfterExit,\n modalRef,\n animationTimeoutExit: animationTimeout.exit,\n });\n\n usePageHeaderScrollAnimation({\n overlayRef,\n showOverlay,\n pageHeaderPadding,\n visible: visible && !isHiddenForBreakpoint,\n });\n\n const overlayEventHandlers = useNoBubbling({\n onKeyDown: (event) => {\n if (keyboardMatch(event.nativeEvent as KeyboardEvent, keyboardKeys.Escape)) {\n onClose(event);\n }\n },\n onMouseDown: (event) => {\n if (closeByClickOutside && !modalRef.current?.contains(event.target as HTMLElement)) {\n onClose(event);\n }\n },\n });\n const overlayProps = showOverlay\n ? overlayEventHandlers\n : {\n onKeyDown: (event: React.KeyboardEvent) => {\n if (keyboardMatch(event.nativeEvent, keyboardKeys.Escape)) {\n onClose(event);\n }\n },\n };\n\n if (isHiddenForBreakpoint || isServerEnv) {\n return null;\n }\n\n return createPortal(\n <CSSTransition\n appear\n in={visible && !isServerEnv}\n nodeRef={overlayRef}\n onEntering={onEntering}\n onEntered={onEntered}\n onExit={onExit}\n onExited={onExited}\n classNames={CSS_CLASSES[position]}\n timeout={animationTimeout}\n unmountOnExit\n >\n <ThemeWrapper>\n {(themeClass) => (\n <Layer layer=\"modal\">\n <div\n {...overlayProps}\n ref={overlayRef}\n className={classnames(styles.modalOverlay, themeClass, {\n [styles.modalOverlayWithBackground]: showOverlay,\n [styles.modalOverlayLeft]: position === 'left',\n [styles.modalOverlayRight]: position === 'right',\n })}\n data-qa=\"modal-overlay\"\n >\n <CloseByClickOutsideContext.Provider value={overlayRef}>\n <AccessibleRegionProvider>\n <ModalSlotsProvider>\n <ModalInner\n {...rest}\n explicitAria={{\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'aria-description': ariaDescription,\n }}\n ariaModal={visible && showOverlay && !isServerEnv}\n refCallback={modalRefCallback}\n size={size}\n height={resolvedHeight}\n minHeight={minHeight}\n disableVerticalPaddings={disableVerticalPaddings}\n disableHorizontalPaddings={disableHorizontalPaddings}\n showOverlay={showOverlay}\n header={header}\n footer={footer}\n >\n <ModalContent>{children}</ModalContent>\n </ModalInner>\n </ModalSlotsProvider>\n </AccessibleRegionProvider>\n </CloseByClickOutsideContext.Provider>\n </div>\n </Layer>\n )}\n </ThemeWrapper>\n </CSSTransition>,\n host || document.body\n );\n }\n) as ForwardRefExoticComponent<PropsWithoutRef<ModalRootProps> & RefAttributes<HTMLDivElement>> & ModalCompound;\n\nModal.displayName = 'Modal';\nModal.Media = ModalMedia;\n"],"names":["_jsx"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { HTMLAttributes, PropsWithChildren } from 'react';
2
+ export interface ModalMediaProps extends HTMLAttributes<HTMLDivElement>, PropsWithChildren {
3
+ /** Соотношение сторон блока (ширина / высота). Игнорируется, если задан `height`. По умолчанию `1.9`, либо `auto` при наличии `children` */
4
+ ratio?: number;
5
+ /** Фиксированная высота в пикселях. Имеет приоритет перед `ratio` */
6
+ height?: number;
7
+ /** URL фонового изображения */
8
+ backgroundUrl?: string;
9
+ /**
10
+ * Способ вписывания фонового изображения в блок
11
+ * @default cover
12
+ */
13
+ imageSize?: 'cover' | 'contain';
14
+ }
15
+ export declare const ModalMedia: import("react").ForwardRefExoticComponent<ModalMediaProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,23 @@
1
+ import './../index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { forwardRef } from 'react';
4
+ import classnames from 'classnames';
5
+ import { s as styles } from '../modal-Bf_KXESS.js';
6
+
7
+ const ModalMedia = forwardRef(({ ratio, height, backgroundUrl, className, style, children, imageSize = 'cover', ...rest }, ref) => {
8
+ const defaultRatio = children ? 'auto' : 1.9;
9
+ return (jsx("div", { ...rest, ref: ref, className: classnames(className, styles.modalMedia, {
10
+ [styles.fixedHeight]: !!height,
11
+ [styles.cover]: imageSize === 'cover',
12
+ [styles.contain]: imageSize === 'contain',
13
+ }), style: {
14
+ ...style,
15
+ '--ratio': ratio ?? defaultRatio,
16
+ '--img-url': backgroundUrl ? `url(${backgroundUrl})` : 'none',
17
+ '--height': height ? `${height}px` : 'auto',
18
+ }, children: children }));
19
+ });
20
+ ModalMedia.displayName = 'ModalMedia';
21
+
22
+ export { ModalMedia };
23
+ //# sourceMappingURL=ModalMedia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalMedia.js","sources":["src/public/ModalMedia.tsx"],"sourcesContent":["import { type CSSProperties, forwardRef, HTMLAttributes, PropsWithChildren } from 'react';\nimport classNames from 'classnames';\n\nimport styles from '../internal/modal.less';\n\nexport interface ModalMediaProps extends HTMLAttributes<HTMLDivElement>, PropsWithChildren {\n /** Соотношение сторон блока (ширина / высота). Игнорируется, если задан `height`. По умолчанию `1.9`, либо `auto` при наличии `children` */\n ratio?: number;\n /** Фиксированная высота в пикселях. Имеет приоритет перед `ratio` */\n height?: number;\n /** URL фонового изображения */\n backgroundUrl?: string;\n /**\n * Способ вписывания фонового изображения в блок\n * @default cover\n */\n imageSize?: 'cover' | 'contain';\n}\n\nexport const ModalMedia = forwardRef<HTMLDivElement, ModalMediaProps>(\n ({ ratio, height, backgroundUrl, className, style, children, imageSize = 'cover', ...rest }, ref) => {\n const defaultRatio = children ? 'auto' : 1.9;\n\n return (\n <div\n {...rest}\n ref={ref}\n className={classNames(className, styles.modalMedia, {\n [styles.fixedHeight]: !!height,\n [styles.cover]: imageSize === 'cover',\n [styles.contain]: imageSize === 'contain',\n })}\n style={\n {\n ...style,\n '--ratio': ratio ?? defaultRatio,\n '--img-url': backgroundUrl ? `url(${backgroundUrl})` : 'none',\n '--height': height ? `${height}px` : 'auto',\n } as CSSProperties\n }\n >\n {children}\n </div>\n );\n }\n);\n\nModalMedia.displayName = 'ModalMedia';\n"],"names":["_jsx","classNames"],"mappings":";;;;;AAmBO,MAAM,UAAU,GAAG,UAAU,CAChC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,KAAI;IAChG,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC;AAE7C,IAAA,QACIA,GACQ,CAAA,KAAA,EAAA,EAAA,GAAA,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAEC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;AAChD,YAAA,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM;AAC9B,YAAA,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,KAAK,OAAO;AACrC,YAAA,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS;SAC5C,CAAC,EACF,KAAK,EACD;AACI,YAAA,GAAG,KAAK;YACR,SAAS,EAAE,KAAK,IAAI,YAAY;YAChC,WAAW,EAAE,aAAa,GAAG,CAAO,IAAA,EAAA,aAAa,CAAG,CAAA,CAAA,GAAG,MAAM;YAC7D,UAAU,EAAE,MAAM,GAAG,CAAG,EAAA,MAAM,CAAI,EAAA,CAAA,GAAG,MAAM;SAC7B,EAGrB,QAAA,EAAA,QAAQ,EACP,CAAA,EACR;AACN,CAAC,EACH;AAEF,UAAU,CAAC,WAAW,GAAG,YAAY;;;;"}
@@ -0,0 +1,16 @@
1
+ import { type ForwardRefExoticComponent, type HTMLAttributes, type PropsWithoutRef, type ReactNode, type RefAttributes } from 'react';
2
+ import { type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';
3
+ import { type ModalMediaProps } from '@hh.ru/magritte-ui-modal/public/ModalMedia';
4
+ import { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';
5
+ export interface ModalWithImageProps extends ModalProps {
6
+ /** Изображение (медиа), располагается над контентом */
7
+ image?: ReactNode;
8
+ /** Заголовок, располагается над контентом */
9
+ title?: ReactNode;
10
+ }
11
+ type ModalWithImageRootProps = ModalWithImageProps & ExplicitRegionProps & Omit<HTMLAttributes<HTMLDivElement>, keyof ModalWithImageProps | 'role' | 'tabIndex' | 'className'>;
12
+ interface ModalWithImageCompound {
13
+ Media: ForwardRefExoticComponent<ModalMediaProps & RefAttributes<HTMLDivElement>>;
14
+ }
15
+ export declare const ModalWithImage: ForwardRefExoticComponent<PropsWithoutRef<ModalWithImageRootProps> & RefAttributes<HTMLDivElement>> & ModalWithImageCompound;
16
+ export {};
@@ -0,0 +1,56 @@
1
+ import './../index.css';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { forwardRef } from 'react';
4
+ import { Flex } from '@hh.ru/magritte-ui-layout';
5
+ import { Modal } from './Modal.js';
6
+ import { ModalMedia } from './ModalMedia.js';
7
+ import { NavBarDefaultPropsContext } from '@hh.ru/magritte-ui-nav-bar';
8
+ import { TitleDefaultPropsContext } from '@hh.ru/magritte-ui-title';
9
+ import 'react-dom';
10
+ import 'react-transition-group';
11
+ import 'classnames';
12
+ import '@hh.ru/magritte-common-is-server-env';
13
+ import '@hh.ru/magritte-common-keyboard';
14
+ import '@hh.ru/magritte-common-mouse/useCloseByClickOutside';
15
+ import '@hh.ru/magritte-common-use-multiple-refs';
16
+ import '@hh.ru/magritte-common-use-no-bubbling';
17
+ import '@hh.ru/magritte-internal-accessible-region';
18
+ import '@hh.ru/magritte-ui-layer';
19
+ import '../internal/ModalContent.js';
20
+ import '../internal/isTreeSelectorChild.js';
21
+ import '@hh.ru/magritte-ui-tree-selector';
22
+ import '@hh.ru/magritte-ui-textarea';
23
+ import '../modal-Bf_KXESS.js';
24
+ import '../internal/ModalInner.js';
25
+ import '@hh.ru/magritte-ui-action-bar';
26
+ import '../internal/ModalBody.js';
27
+ import '@hh.ru/magritte-ui-content-overlay';
28
+ import '../internal/ModalSlotsContext.js';
29
+ import '@hh.ru/magritte-internal-slot-registry';
30
+ import '../internal/ModalStickyHeader.js';
31
+ import '@hh.ru/magritte-ui-scrollbar';
32
+ import '../internal/constants.js';
33
+ import '@hh.ru/magritte-design-tokens/core-tokens';
34
+ import '../internal/useModalTransition.js';
35
+ import '@hh.ru/magritte-common-modal-helper';
36
+ import '@hh.ru/magritte-ui-breakpoint';
37
+ import '../internal/useModalOrder.js';
38
+ import '@hh.ru/magritte-common-dom-storage';
39
+ import '../internal/usePageHeaderScrollAnimation.js';
40
+ import '@hh.ru/magritte-ui-theme-wrapper';
41
+
42
+ const NAV_BAR_DEFAULT_PROPS = {
43
+ overlay: true,
44
+ snapScroll: false,
45
+ transparent: 'start',
46
+ };
47
+ const TITLE_DEFAULT_PROPS = {
48
+ size: 'medium',
49
+ alignment: 'center',
50
+ };
51
+ const ModalWithImage = forwardRef(({ image, title, children, ...rest }, ref) => (jsx(NavBarDefaultPropsContext, { rootProps: NAV_BAR_DEFAULT_PROPS, children: jsxs(Modal, { ...rest, ref: ref, children: [image, (!!title || !!children) && (jsxs(Flex, { gap: 24, direction: "column", my: 24, children: [!!title && (jsx("div", { children: jsx(TitleDefaultPropsContext, { props: TITLE_DEFAULT_PROPS, children: title }) })), !!children && jsx("div", { children: children })] }))] }) })));
52
+ ModalWithImage.displayName = 'ModalWithImage';
53
+ ModalWithImage.Media = ModalMedia;
54
+
55
+ export { ModalWithImage };
56
+ //# sourceMappingURL=ModalWithImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalWithImage.js","sources":["src/public/ModalWithImage.tsx"],"sourcesContent":["import {\n forwardRef,\n type ForwardRefExoticComponent,\n type HTMLAttributes,\n type PropsWithoutRef,\n type ReactNode,\n type RefAttributes,\n} from 'react';\n\nimport { type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';\nimport { Flex } from '@hh.ru/magritte-ui-layout';\nimport { Modal } from '@hh.ru/magritte-ui-modal/public/Modal';\nimport { ModalMedia, type ModalMediaProps } from '@hh.ru/magritte-ui-modal/public/ModalMedia';\nimport { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';\nimport { NavBarDefaultPropsContext } from '@hh.ru/magritte-ui-nav-bar';\nimport { TitleDefaultPropsContext } from '@hh.ru/magritte-ui-title';\n\nexport interface ModalWithImageProps extends ModalProps {\n /** Изображение (медиа), располагается над контентом */\n image?: ReactNode;\n /** Заголовок, располагается над контентом */\n title?: ReactNode;\n}\n\nconst NAV_BAR_DEFAULT_PROPS = {\n overlay: true,\n snapScroll: false,\n transparent: 'start',\n} as const;\n\nconst TITLE_DEFAULT_PROPS = {\n size: 'medium',\n alignment: 'center',\n} as const;\n\ntype ModalWithImageRootProps = ModalWithImageProps &\n ExplicitRegionProps &\n Omit<HTMLAttributes<HTMLDivElement>, keyof ModalWithImageProps | 'role' | 'tabIndex' | 'className'>;\n\ninterface ModalWithImageCompound {\n Media: ForwardRefExoticComponent<ModalMediaProps & RefAttributes<HTMLDivElement>>;\n}\n\nexport const ModalWithImage = forwardRef<HTMLDivElement, ModalWithImageRootProps>(\n ({ image, title, children, ...rest }, ref) => (\n <NavBarDefaultPropsContext rootProps={NAV_BAR_DEFAULT_PROPS}>\n <Modal {...rest} ref={ref}>\n {image}\n {(!!title || !!children) && (\n <Flex gap={24} direction=\"column\" my={24}>\n {!!title && (\n <div>\n <TitleDefaultPropsContext props={TITLE_DEFAULT_PROPS}>{title}</TitleDefaultPropsContext>\n </div>\n )}\n {!!children && <div>{children}</div>}\n </Flex>\n )}\n </Modal>\n </NavBarDefaultPropsContext>\n )\n) as ForwardRefExoticComponent<PropsWithoutRef<ModalWithImageRootProps> & RefAttributes<HTMLDivElement>> &\n ModalWithImageCompound;\n\nModalWithImage.displayName = 'ModalWithImage';\nModalWithImage.Media = ModalMedia;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,qBAAqB,GAAG;AAC1B,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,WAAW,EAAE,OAAO;CACd,CAAC;AAEX,MAAM,mBAAmB,GAAG;AACxB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,SAAS,EAAE,QAAQ;CACb,CAAC;MAUE,cAAc,GAAG,UAAU,CACpC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,MACrCA,IAAC,yBAAyB,EAAA,EAAC,SAAS,EAAE,qBAAqB,YACvDC,IAAC,CAAA,KAAK,EAAK,EAAA,GAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAA,QAAA,EAAA,CACpB,KAAK,EACL,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,MACnBA,KAAC,IAAI,EAAA,EAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAC,QAAQ,EAAC,EAAE,EAAE,EAAE,EAAA,QAAA,EAAA,CACnC,CAAC,CAAC,KAAK,KACJD,GACI,CAAA,KAAA,EAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,wBAAwB,EAAC,EAAA,KAAK,EAAE,mBAAmB,EAAA,QAAA,EAAG,KAAK,EAA4B,CAAA,EAAA,CACtF,CACT,EACA,CAAC,CAAC,QAAQ,IAAIA,GAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAM,QAAQ,EAAO,CAAA,CAAA,EAAA,CACjC,CACV,CACG,EAAA,CAAA,EAAA,CACgB,CAC/B,EAEsB;AAE3B,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC;AAC9C,cAAc,CAAC,KAAK,GAAG,UAAU;;;;"}
@@ -0,0 +1,40 @@
1
+ import { PropsWithChildren, ReactNode, SyntheticEvent } from 'react';
2
+ export type ModalHeight = 'content' | 'full-screen' | number;
3
+ export interface ModalProps extends PropsWithChildren {
4
+ /** Шапка модала (обычно `NavBar`). Рендерится sticky-хедером, прижатым к верху */
5
+ header?: ReactNode;
6
+ /** Футер модала (обычно `ActionBar`). Рендерится прижатым к низу вне скролл-зоны */
7
+ footer?: ReactNode;
8
+ /** Обработчик нажатия на кнопку закрытия */
9
+ onClose?: (event?: SyntheticEvent) => void;
10
+ /** Флаг управляющий видимостью модала */
11
+ visible?: boolean;
12
+ /** Размер */
13
+ size?: 'large' | 'medium' | 'small';
14
+ /** Хост для отрисовки модала */
15
+ host?: HTMLElement;
16
+ /** Флаг, отключающий верхний и нижний паддинги контента */
17
+ disableVerticalPaddings?: boolean;
18
+ /** Флаг, отключающий левый и правый паддинги контента */
19
+ disableHorizontalPaddings?: boolean;
20
+ /** Флаг управляющий закрытием при клике вне Modal */
21
+ closeByClickOutside?: boolean;
22
+ /** Колбек, который будет вызван после завершения анимации открытия */
23
+ onAppear?: VoidFunction;
24
+ /** Колбек, который будет вызван перед началом анимации закрытия */
25
+ onBeforeExit?: VoidFunction;
26
+ /** Колбек, который будет вызван после анимации закрытия */
27
+ onAfterExit?: VoidFunction;
28
+ /** Высота (по контенту, во весь экран или фиксированная в пикселях) */
29
+ height?: ModalHeight;
30
+ /** Минимальная высота в пикселях. Имеет приоритет перед height. */
31
+ minHeight?: number;
32
+ /** Положение компонента на экране, определяет дефолтное значение пропа height */
33
+ position?: 'center' | 'left' | 'right';
34
+ /** Показывать ли оверлей, применяется только если position=left|right */
35
+ showOverlay?: boolean;
36
+ /** Отступ от верхнего края экрана под навигацию, применяется только если position=left|right и showOverlay=false */
37
+ pageHeaderPadding?: number;
38
+ /** Возвращать ли фокус на активный элемент после закрытия модала, по умолчанию `true` */
39
+ returnFocusOnClose?: boolean;
40
+ }
@@ -1,3 +1,3 @@
1
- import './index.css';
1
+ import './../index.css';
2
2
 
3
3
  //# sourceMappingURL=types.js.map
package/Modal.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { HTMLAttributes } from 'react';
2
- import { ModalHeaderProps } from '@hh.ru/magritte-ui-modal/types';
3
- export declare const Modal: import("react").ForwardRefExoticComponent<import("@hh.ru/magritte-ui-modal/types").ModalBaseProps & ModalHeaderProps & Omit<HTMLAttributes<HTMLDivElement>, keyof ModalHeaderProps | "className" | "role" | keyof import("@hh.ru/magritte-ui-modal/types").ModalBaseProps | "tabindex" | "aria-labeledby"> & import("react").RefAttributes<HTMLDivElement>>;