@hh.ru/magritte-ui-modal 11.0.41 → 11.0.42

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 (45) hide show
  1. package/actionBarDefaults.d.ts +2 -2
  2. package/actionBarDefaults.js +3 -17
  3. package/actionBarDefaults.js.map +1 -1
  4. package/index.css +121 -121
  5. package/index.d.ts +5 -5
  6. package/index.js +1 -1
  7. package/index.mock.js +5 -5
  8. package/index.mock.js.map +1 -1
  9. package/internal/ModalBody.js +42 -24
  10. package/internal/ModalBody.js.map +1 -1
  11. package/internal/ModalContent.js +2 -2
  12. package/internal/ModalContent.js.map +1 -1
  13. package/internal/ModalInner.d.ts +1 -1
  14. package/internal/ModalInner.js +46 -26
  15. package/internal/ModalInner.js.map +1 -1
  16. package/internal/ModalSlotsContext.js +34 -52
  17. package/internal/ModalSlotsContext.js.map +1 -1
  18. package/internal/ModalStickyHeader.js +27 -23
  19. package/internal/ModalStickyHeader.js.map +1 -1
  20. package/internal/constants.js +33 -42
  21. package/internal/constants.js.map +1 -1
  22. package/internal/isTreeSelectorChild.js +0 -5
  23. package/internal/isTreeSelectorChild.js.map +1 -1
  24. package/internal/useModalOrder.js +69 -76
  25. package/internal/useModalOrder.js.map +1 -1
  26. package/internal/useModalTransition.js +71 -72
  27. package/internal/useModalTransition.js.map +1 -1
  28. package/internal/usePageHeaderScrollAnimation.js +42 -42
  29. package/internal/usePageHeaderScrollAnimation.js.map +1 -1
  30. package/modal-BQNvAaFW.js +5 -0
  31. package/modal-BQNvAaFW.js.map +1 -0
  32. package/package.json +13 -13
  33. package/public/Modal.d.ts +2 -2
  34. package/public/Modal.js +119 -51
  35. package/public/Modal.js.map +1 -1
  36. package/public/ModalMedia.js +26 -15
  37. package/public/ModalMedia.js.map +1 -1
  38. package/public/ModalWithImage.d.ts +2 -2
  39. package/public/ModalWithImage.js +11 -3
  40. package/public/ModalWithImage.js.map +1 -1
  41. package/withImageDefaults.d.ts +3 -3
  42. package/withImageDefaults.js +5 -18
  43. package/withImageDefaults.js.map +1 -1
  44. package/modal-Df_WVial.js +0 -5
  45. package/modal-Df_WVial.js.map +0 -1
@@ -7,34 +7,52 @@ import { useContentOverlay, ContentOverlayRoot } from '@hh.ru/magritte-ui-conten
7
7
  import { useRegisterTopOverlayCandidate, TOP_OVERLAY_PRIORITY, useResolvedTopOverlayElement } from './ModalSlotsContext.js';
8
8
  import { ModalStickyHeader } from './ModalStickyHeader.js';
9
9
  import { useScrollbar, Scrollbar } from '@hh.ru/magritte-ui-scrollbar';
10
- import { s as styles } from '../modal-Df_WVial.js';
10
+ import { s as styles } from '../modal-BQNvAaFW.js';
11
11
  import '@hh.ru/magritte-internal-slot-registry';
12
12
  import '@hh.ru/magritte-ui-nav-bar';
13
13
 
14
14
  const ModalBody = ({ children, scrollContainerRef, header }) => {
15
- const hasHeader = header != null;
16
- const contentContainerRef = useRef(null);
17
- const contentOverlay = useContentOverlay();
18
- // Контейнер слота `top` тела модала — нужен только когда хедера (`header`) нет: тогда верхний оверлей
19
- // живёт в начале скролл-контента. Если хедер есть — контейнер предоставляет он (навбар или его запасной
20
- // div), и тело своего кандидата не регистрирует. Реф безопасно вызывать всегда: пока его div не
21
- // отрендерен (`hasHeader`), нода не привязывается и регистрация не происходит.
22
- const bodyFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.bodyFallback);
23
- // Резолвим элемент-победитель и подменяем им слот `top` в контейнерах ContentOverlay (единственный
24
- // писатель — без гонок и без затирания в null: кандидаты сосуществуют, выбирается максимум приоритета).
25
- const resolvedTopElement = useResolvedTopOverlayElement();
26
- const containers = useMemo(() => ({ ...contentOverlay, top: resolvedTopElement }), [contentOverlay, resolvedTopElement]);
27
- // `offsetTop` скроллбара меряем от того же резолвнутого top-overlay элемента (bottomAttachment навбара /
28
- // запасной div хедера). Он позиционируется по визуальному низу хедера и переживает overlay-навбар (когда
29
- // его обёртка схлопывается в 0), поэтому работает надёжно независимо от того, как и где выставлен overlay
30
- // — в отличие от flow-маркера, который уезжал бы вместе со схлопнутым навбаром.
31
- const headerBottomRef = useMemo(() => ({ current: resolvedTopElement }), [resolvedTopElement]);
32
- const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({
33
- axis: 'vertical',
34
- offsetTop: hasHeader ? headerBottomRef : 24,
35
- });
36
- const contentContainerRefCallback = useMultipleRefs(contentContainerRef, scrollbar.scrollContainerRef, scrollContainerRef);
37
- return (jsx(Fragment, { children: jsx("div", { className: classnames(styles.modalContentWrapper, scrollbar.hoverContainerCssClass), children: jsx(ContentOverlayRoot, { containers: containers, children: jsxs(Fragment, { children: [jsxs("div", { className: classnames(styles.modalScrollContainer), ref: contentContainerRefCallback, "data-qa": "modal-content-scroll-container", children: [hasHeader ? (jsx(ModalStickyHeader, { children: header })) : (jsx("div", { ref: bodyFallbackRef, className: classnames(styles.contentOverlayTop, styles.static) })), children, jsx("div", { ref: contentOverlay.bottomRef, className: styles.contentOverlayBottom })] }), hasVerticalScroll && jsx(Scrollbar, { ...verticalScrollbarProps })] }) }) }) }));
15
+ const hasHeader = header != null;
16
+ const contentContainerRef = useRef(null);
17
+ const contentOverlay = useContentOverlay();
18
+ const bodyFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.bodyFallback);
19
+ const resolvedTopElement = useResolvedTopOverlayElement();
20
+ const containers = useMemo(
21
+ () => ({ ...contentOverlay, top: resolvedTopElement }),
22
+ [contentOverlay, resolvedTopElement]
23
+ );
24
+ const headerBottomRef = useMemo(() => ({ current: resolvedTopElement }), [resolvedTopElement]);
25
+ const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({
26
+ axis: "vertical",
27
+ offsetTop: hasHeader ? headerBottomRef : 24
28
+ });
29
+ const contentContainerRefCallback = useMultipleRefs(
30
+ contentContainerRef,
31
+ scrollbar.scrollContainerRef,
32
+ scrollContainerRef
33
+ );
34
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: classnames(styles.modalContentWrapper, scrollbar.hoverContainerCssClass), children: /* @__PURE__ */ jsx(ContentOverlayRoot, { containers, children: /* @__PURE__ */ jsxs(Fragment, { children: [
35
+ /* @__PURE__ */ jsxs(
36
+ "div",
37
+ {
38
+ className: classnames(styles.modalScrollContainer),
39
+ ref: contentContainerRefCallback,
40
+ "data-qa": "modal-content-scroll-container",
41
+ children: [
42
+ hasHeader ? /* @__PURE__ */ jsx(ModalStickyHeader, { children: header }) : /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ ref: bodyFallbackRef,
46
+ className: classnames(styles.contentOverlayTop, styles.static)
47
+ }
48
+ ),
49
+ children,
50
+ /* @__PURE__ */ jsx("div", { ref: contentOverlay.bottomRef, className: styles.contentOverlayBottom })
51
+ ]
52
+ }
53
+ ),
54
+ hasVerticalScroll && /* @__PURE__ */ jsx(Scrollbar, { ...verticalScrollbarProps })
55
+ ] }) }) }) });
38
56
  };
39
57
 
40
58
  export { ModalBody };
@@ -1 +1 @@
1
- {"version":3,"file":"ModalBody.js","sources":["src/internal/ModalBody.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, type ReactNode, type RefCallback, useMemo, useRef } from 'react';\nimport classnames from 'classnames';\n\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { ContentOverlayRoot, useContentOverlay } from '@hh.ru/magritte-ui-content-overlay';\nimport {\n TOP_OVERLAY_PRIORITY,\n useRegisterTopOverlayCandidate,\n useResolvedTopOverlayElement,\n} from '@hh.ru/magritte-ui-modal/internal/ModalSlotsContext';\nimport { ModalStickyHeader } from '@hh.ru/magritte-ui-modal/internal/ModalStickyHeader';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\n\nimport styles from './modal.less';\n\nexport const ModalBody: FC<\n PropsWithChildren<{\n header: ReactNode;\n scrollContainerRef?: RefCallback<HTMLDivElement>;\n }>\n> = ({ children, scrollContainerRef, header }) => {\n const hasHeader = header != null;\n const contentContainerRef = useRef<HTMLDivElement>(null);\n const contentOverlay = useContentOverlay();\n\n // Контейнер слота `top` тела модала — нужен только когда хедера (`header`) нет: тогда верхний оверлей\n // живёт в начале скролл-контента. Если хедер есть — контейнер предоставляет он (навбар или его запасной\n // div), и тело своего кандидата не регистрирует. Реф безопасно вызывать всегда: пока его div не\n // отрендерен (`hasHeader`), нода не привязывается и регистрация не происходит.\n const bodyFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.bodyFallback);\n\n // Резолвим элемент-победитель и подменяем им слот `top` в контейнерах ContentOverlay (единственный\n // писатель — без гонок и без затирания в null: кандидаты сосуществуют, выбирается максимум приоритета).\n const resolvedTopElement = useResolvedTopOverlayElement();\n const containers = useMemo(\n () => ({ ...contentOverlay, top: resolvedTopElement }),\n [contentOverlay, resolvedTopElement]\n );\n\n // `offsetTop` скроллбара меряем от того же резолвнутого top-overlay элемента (bottomAttachment навбара /\n // запасной div хедера). Он позиционируется по визуальному низу хедера и переживает overlay-навбар (когда\n // его обёртка схлопывается в 0), поэтому работает надёжно независимо от того, как и где выставлен overlay\n // — в отличие от flow-маркера, который уезжал бы вместе со схлопнутым навбаром.\n const headerBottomRef = useMemo(() => ({ current: resolvedTopElement }), [resolvedTopElement]);\n\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({\n axis: 'vertical',\n offsetTop: hasHeader ? headerBottomRef : 24,\n });\n const contentContainerRefCallback = useMultipleRefs(\n contentContainerRef,\n scrollbar.scrollContainerRef,\n scrollContainerRef\n );\n\n return (\n <>\n <div className={classnames(styles.modalContentWrapper, scrollbar.hoverContainerCssClass)}>\n <ContentOverlayRoot containers={containers}>\n <>\n <div\n className={classnames(styles.modalScrollContainer)}\n ref={contentContainerRefCallback}\n data-qa=\"modal-content-scroll-container\"\n >\n {/*\n * Хедер (sticky) либо запасной контейнер слота `top` тела — взаимоисключающе.\n * Когда хедер есть, контейнер слота `top` даёт он сам (навбар → запасной div хедера,\n * резолв по приоритету в реестре); когда хедера нет — его берёт на себя этот div тела.\n */}\n {hasHeader ? (\n <ModalStickyHeader>{header}</ModalStickyHeader>\n ) : (\n <div\n ref={bodyFallbackRef}\n className={classnames(styles.contentOverlayTop, styles.static)}\n />\n )}\n {children}\n <div ref={contentOverlay.bottomRef} className={styles.contentOverlayBottom} />\n </div>\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </>\n </ContentOverlayRoot>\n </div>\n </>\n );\n};\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;;AAeO,MAAM,SAAS,GAKlB,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAI;AAC7C,IAAA,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,CAAC;AACjC,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AACzD,IAAA,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;;;;;IAM3C,MAAM,eAAe,GAAG,8BAA8B,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;;;AAI1F,IAAA,MAAM,kBAAkB,GAAG,4BAA4B,EAAE,CAAC;IAC1D,MAAM,UAAU,GAAG,OAAO,CACtB,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,EACtD,CAAC,cAAc,EAAE,kBAAkB,CAAC,CACvC,CAAC;;;;;AAMF,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE/F,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC;AAC7E,QAAA,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,SAAS,GAAG,eAAe,GAAG,EAAE;AAC9C,KAAA,CAAC,CAAC;AACH,IAAA,MAAM,2BAA2B,GAAG,eAAe,CAC/C,mBAAmB,EACnB,SAAS,CAAC,kBAAkB,EAC5B,kBAAkB,CACrB,CAAC;IAEF,QACIA,0BACIA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,mBAAmB,EAAE,SAAS,CAAC,sBAAsB,CAAC,EAAA,QAAA,EACpFA,GAAC,CAAA,kBAAkB,IAAC,UAAU,EAAE,UAAU,EAAA,QAAA,EACtCC,IACI,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CAAAD,IAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAClD,GAAG,EAAE,2BAA2B,EAAA,SAAA,EACxB,gCAAgC,EAOvC,QAAA,EAAA,CAAA,SAAS,IACND,IAAC,iBAAiB,EAAA,EAAA,QAAA,EAAE,MAAM,EAAA,CAAqB,KAE/CA,aACI,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,GAChE,CACL,EACA,QAAQ,EACTA,GAAK,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,oBAAoB,EAAA,CAAI,CAC5E,EAAA,CAAA,EACL,iBAAiB,IAAIA,GAAA,CAAC,SAAS,EAAA,EAAA,GAAK,sBAAsB,EAAA,CAAI,IAChE,EACc,CAAA,EAAA,CACnB,EACP,CAAA,EACL;AACN;;;;"}
1
+ {"version":3,"file":"ModalBody.js","sources":["src/internal/ModalBody.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, type ReactNode, type RefCallback, useMemo, useRef } from 'react';\nimport classnames from 'classnames';\n\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { ContentOverlayRoot, useContentOverlay } from '@hh.ru/magritte-ui-content-overlay';\nimport {\n TOP_OVERLAY_PRIORITY,\n useRegisterTopOverlayCandidate,\n useResolvedTopOverlayElement,\n} from '@hh.ru/magritte-ui-modal/internal/ModalSlotsContext';\nimport { ModalStickyHeader } from '@hh.ru/magritte-ui-modal/internal/ModalStickyHeader';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\n\nimport styles from './modal.less';\n\nexport const ModalBody: FC<\n PropsWithChildren<{\n header: ReactNode;\n scrollContainerRef?: RefCallback<HTMLDivElement>;\n }>\n> = ({ children, scrollContainerRef, header }) => {\n const hasHeader = header != null;\n const contentContainerRef = useRef<HTMLDivElement>(null);\n const contentOverlay = useContentOverlay();\n\n // Контейнер слота `top` тела модала — нужен только когда хедера (`header`) нет: тогда верхний оверлей\n // живёт в начале скролл-контента. Если хедер есть — контейнер предоставляет он (навбар или его запасной\n // div), и тело своего кандидата не регистрирует. Реф безопасно вызывать всегда: пока его div не\n // отрендерен (`hasHeader`), нода не привязывается и регистрация не происходит.\n const bodyFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.bodyFallback);\n\n // Резолвим элемент-победитель и подменяем им слот `top` в контейнерах ContentOverlay (единственный\n // писатель — без гонок и без затирания в null: кандидаты сосуществуют, выбирается максимум приоритета).\n const resolvedTopElement = useResolvedTopOverlayElement();\n const containers = useMemo(\n () => ({ ...contentOverlay, top: resolvedTopElement }),\n [contentOverlay, resolvedTopElement]\n );\n\n // `offsetTop` скроллбара меряем от того же резолвнутого top-overlay элемента (bottomAttachment навбара /\n // запасной div хедера). Он позиционируется по визуальному низу хедера и переживает overlay-навбар (когда\n // его обёртка схлопывается в 0), поэтому работает надёжно независимо от того, как и где выставлен overlay\n // — в отличие от flow-маркера, который уезжал бы вместе со схлопнутым навбаром.\n const headerBottomRef = useMemo(() => ({ current: resolvedTopElement }), [resolvedTopElement]);\n\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({\n axis: 'vertical',\n offsetTop: hasHeader ? headerBottomRef : 24,\n });\n const contentContainerRefCallback = useMultipleRefs(\n contentContainerRef,\n scrollbar.scrollContainerRef,\n scrollContainerRef\n );\n\n return (\n <>\n <div className={classnames(styles.modalContentWrapper, scrollbar.hoverContainerCssClass)}>\n <ContentOverlayRoot containers={containers}>\n <>\n <div\n className={classnames(styles.modalScrollContainer)}\n ref={contentContainerRefCallback}\n data-qa=\"modal-content-scroll-container\"\n >\n {/*\n * Хедер (sticky) либо запасной контейнер слота `top` тела — взаимоисключающе.\n * Когда хедер есть, контейнер слота `top` даёт он сам (навбар → запасной div хедера,\n * резолв по приоритету в реестре); когда хедера нет — его берёт на себя этот div тела.\n */}\n {hasHeader ? (\n <ModalStickyHeader>{header}</ModalStickyHeader>\n ) : (\n <div\n ref={bodyFallbackRef}\n className={classnames(styles.contentOverlayTop, styles.static)}\n />\n )}\n {children}\n <div ref={contentOverlay.bottomRef} className={styles.contentOverlayBottom} />\n </div>\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </>\n </ContentOverlayRoot>\n </div>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAeO,MAAM,YAKT,CAAC,EAAE,QAAU,EAAA,kBAAA,EAAoB,QAAa,KAAA;AAC9C,EAAA,MAAM,YAAY,MAAU,IAAA,IAAA,CAAA;AAC5B,EAAM,MAAA,mBAAA,GAAsB,OAAuB,IAAI,CAAA,CAAA;AACvD,EAAA,MAAM,iBAAiB,iBAAkB,EAAA,CAAA;AAMzC,EAAM,MAAA,eAAA,GAAkB,8BAA+B,CAAA,oBAAA,CAAqB,YAAY,CAAA,CAAA;AAIxF,EAAA,MAAM,qBAAqB,4BAA6B,EAAA,CAAA;AACxD,EAAA,MAAM,UAAa,GAAA,OAAA;AAAA,IACf,OAAO,EAAE,GAAG,cAAA,EAAgB,KAAK,kBAAmB,EAAA,CAAA;AAAA,IACpD,CAAC,gBAAgB,kBAAkB,CAAA;AAAA,GACvC,CAAA;AAMA,EAAM,MAAA,eAAA,GAAkB,QAAQ,OAAO,EAAE,SAAS,kBAAmB,EAAA,CAAA,EAAI,CAAC,kBAAkB,CAAC,CAAA,CAAA;AAE7F,EAAA,MAAM,EAAE,iBAAmB,EAAA,sBAAA,EAAwB,GAAG,SAAA,KAAc,YAAa,CAAA;AAAA,IAC7E,IAAM,EAAA,UAAA;AAAA,IACN,SAAA,EAAW,YAAY,eAAkB,GAAA,EAAA;AAAA,GAC5C,CAAA,CAAA;AACD,EAAA,MAAM,2BAA8B,GAAA,eAAA;AAAA,IAChC,mBAAA;AAAA,IACA,SAAU,CAAA,kBAAA;AAAA,IACV,kBAAA;AAAA,GACJ,CAAA;AAEA,EAAA,uBAEQ,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,UAAW,CAAA,MAAA,CAAO,mBAAqB,EAAA,SAAA,CAAU,sBAAsB,CAAA,EACnF,QAAC,kBAAA,GAAA,CAAA,kBAAA,EAAA,EAAmB,YAChB,QACI,kBAAA,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,UAAW,CAAA,MAAA,CAAO,oBAAoB,CAAA;AAAA,QACjD,GAAK,EAAA,2BAAA;AAAA,QACL,SAAQ,EAAA,gCAAA;AAAA,QAOP,QAAA,EAAA;AAAA,UACG,SAAA,mBAAA,GAAA,CAAC,iBAAmB,EAAA,EAAA,QAAA,EAAA,MAAA,EAAO,CAE3B,mBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACG,GAAK,EAAA,eAAA;AAAA,cACL,SAAW,EAAA,UAAA,CAAW,MAAO,CAAA,iBAAA,EAAmB,OAAO,MAAM,CAAA;AAAA,aAAA;AAAA,WACjE;AAAA,UAEH,QAAA;AAAA,8BACA,KAAI,EAAA,EAAA,GAAA,EAAK,eAAe,SAAW,EAAA,SAAA,EAAW,OAAO,oBAAsB,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAChF;AAAA,IACC,iBAAqB,oBAAA,GAAA,CAAC,SAAW,EAAA,EAAA,GAAG,sBAAwB,EAAA,CAAA;AAAA,GACjE,EAAA,CAAA,EACJ,GACJ,CACJ,EAAA,CAAA,CAAA;AAER;;;;"}
@@ -2,12 +2,12 @@ import './../index.css';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
  import { isTreeSelectorChild } from './isTreeSelectorChild.js';
4
4
  import { TextAreaGrowLimiter } from '@hh.ru/magritte-ui-textarea';
5
- import { s as styles } from '../modal-Df_WVial.js';
5
+ import { s as styles } from '../modal-BQNvAaFW.js';
6
6
  import 'react';
7
7
  import '@hh.ru/magritte-ui-tree-selector';
8
8
 
9
9
  const ModalContent = ({ children }) => {
10
- return isTreeSelectorChild(children) ? (jsx("div", { className: styles.treeSelectorContainer, children: children })) : (jsx(TextAreaGrowLimiter, { className: styles.growLimiter, children: children }));
10
+ return isTreeSelectorChild(children) ? /* @__PURE__ */ jsx("div", { className: styles.treeSelectorContainer, children }) : /* @__PURE__ */ jsx(TextAreaGrowLimiter, { className: styles.growLimiter, children });
11
11
  };
12
12
 
13
13
  export { ModalContent };
@@ -1 +1 @@
1
- {"version":3,"file":"ModalContent.js","sources":["src/internal/ModalContent.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren } from 'react';\n\nimport { isTreeSelectorChild } from '@hh.ru/magritte-ui-modal/internal/isTreeSelectorChild';\nimport { TextAreaGrowLimiter } from '@hh.ru/magritte-ui-textarea';\n\nimport styles from './modal.less';\n\nexport const ModalContent: FC<PropsWithChildren> = ({ children }) => {\n return isTreeSelectorChild(children) ? (\n <div className={styles.treeSelectorContainer}>{children}</div>\n ) : (\n <TextAreaGrowLimiter className={styles.growLimiter}>{children}</TextAreaGrowLimiter>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;MAOa,YAAY,GAA0B,CAAC,EAAE,QAAQ,EAAE,KAAI;AAChE,IAAA,OAAO,mBAAmB,CAAC,QAAQ,CAAC,IAChCA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,qBAAqB,YAAG,QAAQ,EAAA,CAAO,KAE9DA,GAAA,CAAC,mBAAmB,EAAC,EAAA,SAAS,EAAE,MAAM,CAAC,WAAW,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAuB,CACvF,CAAC;AACN;;;;"}
1
+ {"version":3,"file":"ModalContent.js","sources":["src/internal/ModalContent.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren } from 'react';\n\nimport { isTreeSelectorChild } from '@hh.ru/magritte-ui-modal/internal/isTreeSelectorChild';\nimport { TextAreaGrowLimiter } from '@hh.ru/magritte-ui-textarea';\n\nimport styles from './modal.less';\n\nexport const ModalContent: FC<PropsWithChildren> = ({ children }) => {\n return isTreeSelectorChild(children) ? (\n <div className={styles.treeSelectorContainer}>{children}</div>\n ) : (\n <TextAreaGrowLimiter className={styles.growLimiter}>{children}</TextAreaGrowLimiter>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAOO,MAAM,YAAsC,GAAA,CAAC,EAAE,QAAA,EAAe,KAAA;AACjE,EAAA,OAAO,mBAAoB,CAAA,QAAQ,CAC/B,mBAAA,GAAA,CAAC,SAAI,SAAW,EAAA,MAAA,CAAO,qBAAwB,EAAA,QAAA,EAAS,oBAEvD,GAAA,CAAA,mBAAA,EAAA,EAAoB,SAAW,EAAA,MAAA,CAAO,aAAc,QAAS,EAAA,CAAA,CAAA;AAEtE;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { type FC, type HTMLAttributes, type ReactNode, type Ref } from 'react';
2
2
  import { type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';
3
- import { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';
3
+ import { type ModalProps } from '../public/types';
4
4
  export interface ModalInnerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
5
5
  explicitAria: ExplicitRegionProps;
6
6
  ariaModal: boolean | undefined;
@@ -7,7 +7,7 @@ import { ActionBarDefaultPropsContext } from '@hh.ru/magritte-ui-action-bar';
7
7
  import { MODAL_ACTION_BAR_DEFAULTS } from '../actionBarDefaults.js';
8
8
  import { ModalBody } from './ModalBody.js';
9
9
  import { NavBar } from '@hh.ru/magritte-ui-nav-bar';
10
- import { s as styles } from '../modal-Df_WVial.js';
10
+ import { s as styles } from '../modal-BQNvAaFW.js';
11
11
  import '@hh.ru/magritte-common-use-multiple-refs';
12
12
  import '@hh.ru/magritte-ui-content-overlay';
13
13
  import './ModalSlotsContext.js';
@@ -16,31 +16,51 @@ import './ModalStickyHeader.js';
16
16
  import '@hh.ru/magritte-ui-scrollbar';
17
17
 
18
18
  const ACTION_BAR_DEFAULT_PROPS = MODAL_ACTION_BAR_DEFAULTS;
19
- /**
20
- * Внутренний контейнер модала — сам `role="dialog"`-узел. Рендерится **под** `AccessibleRegionProvider`
21
- * и `ModalSlotsProvider`, что и делает его отдельным компонентом:
22
- * `useAccessibleRegionProps` видит заголовок/подзаголовок, зарегистрированные потомками
23
- * (`NavBar.TitleContainer` в проп `header`), и выставляет `aria-labelledby` / `aria-describedby`
24
- * (явные `aria-*` пропы при этом всё перекрывают).
25
- *
26
- * Футер приходит пропом и рендерится здесь — вне скролл-зоны, прижатым к низу. От его наличия зависят
27
- * классы паддингов и нижний divider контента (его прячем, когда у `ActionBar` футера есть progress bar).
28
- */
29
- const ModalInner = ({ explicitAria, ariaModal, refCallback, size, height, minHeight, disableVerticalPaddings, disableHorizontalPaddings, showOverlay, header, footer, children, ...rest }) => {
30
- const aria = useAccessibleRegionProps(explicitAria);
31
- const [scrollContainer, setScrollContainer] = useState(null);
32
- const actionBarDefaultProps = useMemo(() => ({ ...ACTION_BAR_DEFAULT_PROPS, scrollContainer }), [scrollContainer]);
33
- return (jsxs("div", { ...rest, ...aria, "aria-modal": ariaModal, role: "dialog", ref: refCallback, tabIndex: -1, className: classnames(styles.modal, {
34
- [styles.sizeSmall]: size === 'small',
35
- [styles.sizeMedium]: size === 'medium',
36
- [styles.modalFullHeight]: height === 'full-screen',
37
- [styles.noVerticalPaddings]: disableVerticalPaddings,
38
- [styles.noHorizontalPaddings]: disableHorizontalPaddings,
39
- [styles.modalWithBorder]: !showOverlay,
40
- }), style: {
41
- height: typeof height === 'number' ? `${height}px` : undefined,
42
- minHeight: typeof minHeight === 'number' ? `min(calc(100vh - 12px * 2), ${minHeight}px)` : undefined,
43
- }, children: [jsx(NavBar.TriggerProvider, { children: jsx(ModalBody, { header: header, scrollContainerRef: setScrollContainer, children: children }) }), footer ? (jsx("div", { className: styles.modalFooter, "data-qa": "modal-footer", children: jsx(ActionBarDefaultPropsContext, { props: actionBarDefaultProps, children: footer }) })) : (jsx("div", { className: classnames(styles.modalFooter, styles.modalFooterEmpty) }))] }));
19
+ const ModalInner = ({
20
+ explicitAria,
21
+ ariaModal,
22
+ refCallback,
23
+ size,
24
+ height,
25
+ minHeight,
26
+ disableVerticalPaddings,
27
+ disableHorizontalPaddings,
28
+ showOverlay,
29
+ header,
30
+ footer,
31
+ children,
32
+ ...rest
33
+ }) => {
34
+ const aria = useAccessibleRegionProps(explicitAria);
35
+ const [scrollContainer, setScrollContainer] = useState(null);
36
+ const actionBarDefaultProps = useMemo(() => ({ ...ACTION_BAR_DEFAULT_PROPS, scrollContainer }), [scrollContainer]);
37
+ return /* @__PURE__ */ jsxs(
38
+ "div",
39
+ {
40
+ ...rest,
41
+ ...aria,
42
+ "aria-modal": ariaModal,
43
+ role: "dialog",
44
+ ref: refCallback,
45
+ tabIndex: -1,
46
+ className: classnames(styles.modal, {
47
+ [styles.sizeSmall]: size === "small",
48
+ [styles.sizeMedium]: size === "medium",
49
+ [styles.modalFullHeight]: height === "full-screen",
50
+ [styles.noVerticalPaddings]: disableVerticalPaddings,
51
+ [styles.noHorizontalPaddings]: disableHorizontalPaddings,
52
+ [styles.modalWithBorder]: !showOverlay
53
+ }),
54
+ style: {
55
+ height: typeof height === "number" ? `${height}px` : void 0,
56
+ minHeight: typeof minHeight === "number" ? `min(calc(100vh - 12px * 2), ${minHeight}px)` : void 0
57
+ },
58
+ children: [
59
+ /* @__PURE__ */ jsx(NavBar.TriggerProvider, { children: /* @__PURE__ */ jsx(ModalBody, { header, scrollContainerRef: setScrollContainer, children }) }),
60
+ footer ? /* @__PURE__ */ jsx("div", { className: styles.modalFooter, "data-qa": "modal-footer", children: /* @__PURE__ */ jsx(ActionBarDefaultPropsContext, { props: actionBarDefaultProps, children: footer }) }) : /* @__PURE__ */ jsx("div", { className: classnames(styles.modalFooter, styles.modalFooterEmpty) })
61
+ ]
62
+ }
63
+ );
44
64
  };
45
65
 
46
66
  export { ModalInner };
@@ -1 +1 @@
1
- {"version":3,"file":"ModalInner.js","sources":["src/internal/ModalInner.tsx"],"sourcesContent":["import { type FC, type HTMLAttributes, type ReactNode, type Ref, useMemo, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { useAccessibleRegionProps, type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';\nimport { ActionBarDefaultPropsContext, type ActionBarProps } from '@hh.ru/magritte-ui-action-bar';\nimport { MODAL_ACTION_BAR_DEFAULTS } from '@hh.ru/magritte-ui-modal/actionBarDefaults';\nimport { ModalBody } from '@hh.ru/magritte-ui-modal/internal/ModalBody';\nimport { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';\nimport { NavBar } from '@hh.ru/magritte-ui-nav-bar';\n\nimport styles from './modal.less';\n\nconst ACTION_BAR_DEFAULT_PROPS: Partial<ActionBarProps> = MODAL_ACTION_BAR_DEFAULTS;\n\nexport interface ModalInnerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n explicitAria: ExplicitRegionProps;\n ariaModal: boolean | undefined;\n refCallback: Ref<HTMLDivElement>;\n size: NonNullable<ModalProps['size']>;\n height: ModalProps['height'];\n minHeight: ModalProps['minHeight'];\n disableVerticalPaddings: boolean;\n disableHorizontalPaddings: boolean;\n showOverlay: boolean;\n header: ReactNode;\n footer: ReactNode;\n children: ReactNode;\n}\n\n/**\n * Внутренний контейнер модала — сам `role=\"dialog\"`-узел. Рендерится **под** `AccessibleRegionProvider`\n * и `ModalSlotsProvider`, что и делает его отдельным компонентом:\n * `useAccessibleRegionProps` видит заголовок/подзаголовок, зарегистрированные потомками\n * (`NavBar.TitleContainer` в проп `header`), и выставляет `aria-labelledby` / `aria-describedby`\n * (явные `aria-*` пропы при этом всё перекрывают).\n *\n * Футер приходит пропом и рендерится здесь — вне скролл-зоны, прижатым к низу. От его наличия зависят\n * классы паддингов и нижний divider контента (его прячем, когда у `ActionBar` футера есть progress bar).\n */\nexport const ModalInner: FC<ModalInnerProps> = ({\n explicitAria,\n ariaModal,\n refCallback,\n size,\n height,\n minHeight,\n disableVerticalPaddings,\n disableHorizontalPaddings,\n showOverlay,\n header,\n footer,\n children,\n ...rest\n}) => {\n const aria = useAccessibleRegionProps(explicitAria);\n\n const [scrollContainer, setScrollContainer] = useState<HTMLElement | null>(null);\n const actionBarDefaultProps = useMemo(() => ({ ...ACTION_BAR_DEFAULT_PROPS, scrollContainer }), [scrollContainer]);\n\n return (\n <div\n {...rest}\n {...aria}\n aria-modal={ariaModal}\n role=\"dialog\"\n ref={refCallback}\n tabIndex={-1}\n className={classnames(styles.modal, {\n [styles.sizeSmall]: size === 'small',\n [styles.sizeMedium]: size === 'medium',\n [styles.modalFullHeight]: height === 'full-screen',\n [styles.noVerticalPaddings]: disableVerticalPaddings,\n [styles.noHorizontalPaddings]: disableHorizontalPaddings,\n [styles.modalWithBorder]: !showOverlay,\n })}\n style={{\n height: typeof height === 'number' ? `${height}px` : undefined,\n minHeight: typeof minHeight === 'number' ? `min(calc(100vh - 12px * 2), ${minHeight}px)` : undefined,\n }}\n >\n <NavBar.TriggerProvider>\n <ModalBody header={header} scrollContainerRef={setScrollContainer}>\n {children}\n </ModalBody>\n </NavBar.TriggerProvider>\n {footer ? (\n <div className={styles.modalFooter} data-qa=\"modal-footer\">\n <ActionBarDefaultPropsContext props={actionBarDefaultProps}>{footer}</ActionBarDefaultPropsContext>\n </div>\n ) : (\n <div className={classnames(styles.modalFooter, styles.modalFooterEmpty)} />\n )}\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;AAYA,MAAM,wBAAwB,GAA4B,yBAAyB,CAAC;AAiBpF;;;;;;;;;AASG;AACI,MAAM,UAAU,GAAwB,CAAC,EAC5C,YAAY,EACZ,SAAS,EACT,WAAW,EACX,IAAI,EACJ,MAAM,EACN,SAAS,EACT,uBAAuB,EACvB,yBAAyB,EACzB,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,GAAG,IAAI,EACV,KAAI;AACD,IAAA,MAAM,IAAI,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IAEpD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IACjF,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,wBAAwB,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;AAEnH,IAAA,QACIA,IAAA,CAAA,KAAA,EAAA,EAAA,GACQ,IAAI,EAAA,GACJ,IAAI,EAAA,YAAA,EACI,SAAS,EACrB,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE;AAChC,YAAA,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,KAAK,OAAO;AACpC,YAAA,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,KAAK,QAAQ;AACtC,YAAA,CAAC,MAAM,CAAC,eAAe,GAAG,MAAM,KAAK,aAAa;AAClD,YAAA,CAAC,MAAM,CAAC,kBAAkB,GAAG,uBAAuB;AACpD,YAAA,CAAC,MAAM,CAAC,oBAAoB,GAAG,yBAAyB;AACxD,YAAA,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,WAAW;SACzC,CAAC,EACF,KAAK,EAAE;AACH,YAAA,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,GAAG,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI,GAAG,SAAS;AAC9D,YAAA,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,GAAG,CAAA,4BAAA,EAA+B,SAAS,CAAA,GAAA,CAAK,GAAG,SAAS;AACvG,SAAA,EAAA,QAAA,EAAA,CAEDC,GAAC,CAAA,MAAM,CAAC,eAAe,EACnB,EAAA,QAAA,EAAAA,GAAA,CAAC,SAAS,EAAA,EAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAC5D,QAAA,EAAA,QAAQ,EACD,CAAA,EAAA,CACS,EACxB,MAAM,IACHA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,WAAW,EAAU,SAAA,EAAA,cAAc,EACtD,QAAA,EAAAA,GAAA,CAAC,4BAA4B,EAAA,EAAC,KAAK,EAAE,qBAAqB,EAAA,QAAA,EAAG,MAAM,EAAA,CAAgC,EACjG,CAAA,KAENA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAA,CAAI,CAC9E,CAAA,EAAA,CACC,EACR;AACN;;;;"}
1
+ {"version":3,"file":"ModalInner.js","sources":["src/internal/ModalInner.tsx"],"sourcesContent":["import { type FC, type HTMLAttributes, type ReactNode, type Ref, useMemo, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { useAccessibleRegionProps, type ExplicitRegionProps } from '@hh.ru/magritte-internal-accessible-region';\nimport { ActionBarDefaultPropsContext, type ActionBarProps } from '@hh.ru/magritte-ui-action-bar';\nimport { MODAL_ACTION_BAR_DEFAULTS } from '@hh.ru/magritte-ui-modal/actionBarDefaults';\nimport { ModalBody } from '@hh.ru/magritte-ui-modal/internal/ModalBody';\nimport { type ModalProps } from '@hh.ru/magritte-ui-modal/public/types';\nimport { NavBar } from '@hh.ru/magritte-ui-nav-bar';\n\nimport styles from './modal.less';\n\nconst ACTION_BAR_DEFAULT_PROPS: Partial<ActionBarProps> = MODAL_ACTION_BAR_DEFAULTS;\n\nexport interface ModalInnerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n explicitAria: ExplicitRegionProps;\n ariaModal: boolean | undefined;\n refCallback: Ref<HTMLDivElement>;\n size: NonNullable<ModalProps['size']>;\n height: ModalProps['height'];\n minHeight: ModalProps['minHeight'];\n disableVerticalPaddings: boolean;\n disableHorizontalPaddings: boolean;\n showOverlay: boolean;\n header: ReactNode;\n footer: ReactNode;\n children: ReactNode;\n}\n\n/**\n * Внутренний контейнер модала — сам `role=\"dialog\"`-узел. Рендерится **под** `AccessibleRegionProvider`\n * и `ModalSlotsProvider`, что и делает его отдельным компонентом:\n * `useAccessibleRegionProps` видит заголовок/подзаголовок, зарегистрированные потомками\n * (`NavBar.TitleContainer` в проп `header`), и выставляет `aria-labelledby` / `aria-describedby`\n * (явные `aria-*` пропы при этом всё перекрывают).\n *\n * Футер приходит пропом и рендерится здесь — вне скролл-зоны, прижатым к низу. От его наличия зависят\n * классы паддингов и нижний divider контента (его прячем, когда у `ActionBar` футера есть progress bar).\n */\nexport const ModalInner: FC<ModalInnerProps> = ({\n explicitAria,\n ariaModal,\n refCallback,\n size,\n height,\n minHeight,\n disableVerticalPaddings,\n disableHorizontalPaddings,\n showOverlay,\n header,\n footer,\n children,\n ...rest\n}) => {\n const aria = useAccessibleRegionProps(explicitAria);\n\n const [scrollContainer, setScrollContainer] = useState<HTMLElement | null>(null);\n const actionBarDefaultProps = useMemo(() => ({ ...ACTION_BAR_DEFAULT_PROPS, scrollContainer }), [scrollContainer]);\n\n return (\n <div\n {...rest}\n {...aria}\n aria-modal={ariaModal}\n role=\"dialog\"\n ref={refCallback}\n tabIndex={-1}\n className={classnames(styles.modal, {\n [styles.sizeSmall]: size === 'small',\n [styles.sizeMedium]: size === 'medium',\n [styles.modalFullHeight]: height === 'full-screen',\n [styles.noVerticalPaddings]: disableVerticalPaddings,\n [styles.noHorizontalPaddings]: disableHorizontalPaddings,\n [styles.modalWithBorder]: !showOverlay,\n })}\n style={{\n height: typeof height === 'number' ? `${height}px` : undefined,\n minHeight: typeof minHeight === 'number' ? `min(calc(100vh - 12px * 2), ${minHeight}px)` : undefined,\n }}\n >\n <NavBar.TriggerProvider>\n <ModalBody header={header} scrollContainerRef={setScrollContainer}>\n {children}\n </ModalBody>\n </NavBar.TriggerProvider>\n {footer ? (\n <div className={styles.modalFooter} data-qa=\"modal-footer\">\n <ActionBarDefaultPropsContext props={actionBarDefaultProps}>{footer}</ActionBarDefaultPropsContext>\n </div>\n ) : (\n <div className={classnames(styles.modalFooter, styles.modalFooterEmpty)} />\n )}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAYA,MAAM,wBAAoD,GAAA,yBAAA,CAAA;AA2BnD,MAAM,aAAkC,CAAC;AAAA,EAC5C,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,uBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG,IAAA;AACP,CAAM,KAAA;AACF,EAAM,MAAA,IAAA,GAAO,yBAAyB,YAAY,CAAA,CAAA;AAElD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAA6B,IAAI,CAAA,CAAA;AAC/E,EAAM,MAAA,qBAAA,GAAwB,OAAQ,CAAA,OAAO,EAAE,GAAG,0BAA0B,eAAgB,EAAA,CAAA,EAAI,CAAC,eAAe,CAAC,CAAA,CAAA;AAEjH,EACI,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACH,GAAG,IAAA;AAAA,MACJ,YAAY,EAAA,SAAA;AAAA,MACZ,IAAK,EAAA,QAAA;AAAA,MACL,GAAK,EAAA,WAAA;AAAA,MACL,QAAU,EAAA,CAAA,CAAA;AAAA,MACV,SAAA,EAAW,UAAW,CAAA,MAAA,CAAO,KAAO,EAAA;AAAA,QAChC,CAAC,MAAA,CAAO,SAAS,GAAG,IAAS,KAAA,OAAA;AAAA,QAC7B,CAAC,MAAA,CAAO,UAAU,GAAG,IAAS,KAAA,QAAA;AAAA,QAC9B,CAAC,MAAA,CAAO,eAAe,GAAG,MAAW,KAAA,aAAA;AAAA,QACrC,CAAC,MAAO,CAAA,kBAAkB,GAAG,uBAAA;AAAA,QAC7B,CAAC,MAAO,CAAA,oBAAoB,GAAG,yBAAA;AAAA,QAC/B,CAAC,MAAA,CAAO,eAAe,GAAG,CAAC,WAAA;AAAA,OAC9B,CAAA;AAAA,MACD,KAAO,EAAA;AAAA,QACH,QAAQ,OAAO,MAAA,KAAW,QAAW,GAAA,CAAA,EAAG,MAAM,CAAO,EAAA,CAAA,GAAA,KAAA,CAAA;AAAA,QACrD,WAAW,OAAO,SAAA,KAAc,QAAW,GAAA,CAAA,4BAAA,EAA+B,SAAS,CAAQ,GAAA,CAAA,GAAA,KAAA,CAAA;AAAA,OAC/F;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,MAAA,CAAO,iBAAP,EACG,QAAA,kBAAA,GAAA,CAAC,aAAU,MAAgB,EAAA,kBAAA,EAAoB,kBAC1C,EAAA,QAAA,EACL,CACJ,EAAA,CAAA;AAAA,QACC,MAAA,uBACI,KAAI,EAAA,EAAA,SAAA,EAAW,OAAO,WAAa,EAAA,SAAA,EAAQ,cACxC,EAAA,QAAA,kBAAA,GAAA,CAAC,4BAA6B,EAAA,EAAA,KAAA,EAAO,uBAAwB,QAAO,EAAA,MAAA,EAAA,CAAA,EACxE,CAEA,mBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,WAAW,MAAO,CAAA,WAAA,EAAa,MAAO,CAAA,gBAAgB,CAAG,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAEjF,CAAA;AAER;;;;"}
@@ -2,64 +2,46 @@ import './../index.css';
2
2
  import { useCallback, useSyncExternalStore } from 'react';
3
3
  import { createSlotRegistry } from '@hh.ru/magritte-internal-slot-registry';
4
4
 
5
- /**
6
- * Приоритеты кандидатов на слот `top`. Чем больше число — тем выше приоритет: резолвер выбирает
7
- * смонтированного кандидата с максимальным приоритетом.
8
- */
9
5
  const TOP_OVERLAY_PRIORITY = {
10
- /** Запасной контейнер в теле модала. Низший приоритет — на случай, когда хедера нет вовсе. */
11
- bodyFallback: 0,
12
- /** Запасной контейнер внутри sticky-хедера, когда внутри хедера нет навбара. */
13
- headerFallback: 1,
14
- /** Контейнер, прицепленный к нижнему краю навбара (`bottomAttachment`). Высший приоритет. */
15
- navBar: 2,
6
+ /** Запасной контейнер в теле модала. Низший приоритет — на случай, когда хедера нет вовсе. */
7
+ bodyFallback: 0,
8
+ /** Запасной контейнер внутри sticky-хедера, когда внутри хедера нет навбара. */
9
+ headerFallback: 1,
10
+ /** Контейнер, прицепленный к нижнему краю навбара (`bottomAttachment`). Высший приоритет. */
11
+ navBar: 2
16
12
  };
17
- const { SlotRegistryProvider: ModalSlotsProvider, useSlotRegistry: useModalSlots } = createSlotRegistry('ModalSlots');
18
- const noop = () => undefined;
19
- /**
20
- * Стабильные токены регистранта по приоритету (индекс = `priority`).
21
- * Это безопасно: в пределах одного модала на приоритет приходится не более одного кандидата
22
- * (роли-синглтоны), а разные модалы пишут в разные сторы, где токен адресует свою запись независимо.
23
- */
13
+ const { SlotRegistryProvider: ModalSlotsProvider, useSlotRegistry: useModalSlots } = createSlotRegistry("ModalSlots");
14
+ const noop = () => void 0;
24
15
  const TOP_OVERLAY_TOKENS = [{}, {}, {}];
25
- /**
26
- * Возвращает стабильный callback-реф, который регистрирует свою DOM-ноду как кандидата слота `top`
27
- * с приоритетом `priority` напрямую в slot-registry (и снимает регистрацию, когда нода отвязывается).
28
- * Не держит стейт и не ре-рендерит сам компонент-регистрант — перерисовывается только потребитель
29
- * (`useResolvedTopOverlayElement` в `ModalBody`).
30
- */
31
16
  const useRegisterTopOverlayCandidate = (priority) => {
32
- const store = useModalSlots();
33
- const token = TOP_OVERLAY_TOKENS[priority];
34
- return useCallback((element) => {
35
- if (element) {
36
- store?.register('topOverlayContainer', token, { priority, element });
37
- }
38
- else {
39
- store?.unregister('topOverlayContainer', token);
40
- }
41
- }, [store, token, priority]);
17
+ const store = useModalSlots();
18
+ const token = TOP_OVERLAY_TOKENS[priority];
19
+ return useCallback(
20
+ (element) => {
21
+ if (element) {
22
+ store?.register("topOverlayContainer", token, { priority, element });
23
+ } else {
24
+ store?.unregister("topOverlayContainer", token);
25
+ }
26
+ },
27
+ [store, token, priority]
28
+ );
42
29
  };
43
- /**
44
- * Реактивно отдаёт DOM-элемент кандидата с наибольшим приоритетом, зарегистрированного в слоте
45
- * `topOverlayContainer`. Возвращает `null`, пока нет ни одного живого кандидата. Возвращаемое значение —
46
- * сам элемент (стабильная ссылка), поэтому кэшировать снапшот не нужно: `useSyncExternalStore` не зациклит.
47
- */
48
30
  const useResolvedTopOverlayElement = () => {
49
- const store = useModalSlots();
50
- const subscribe = useCallback((listener) => store?.subscribe(listener) ?? noop, [store]);
51
- const getSnapshot = useCallback(() => {
52
- let bestElement = null;
53
- let bestPriority = -Infinity;
54
- (store?.getAll('topOverlayContainer') ?? []).forEach(({ priority, element }) => {
55
- if (priority > bestPriority) {
56
- bestElement = element;
57
- bestPriority = priority;
58
- }
59
- });
60
- return bestElement;
61
- }, [store]);
62
- return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
31
+ const store = useModalSlots();
32
+ const subscribe = useCallback((listener) => store?.subscribe(listener) ?? noop, [store]);
33
+ const getSnapshot = useCallback(() => {
34
+ let bestElement = null;
35
+ let bestPriority = -Infinity;
36
+ (store?.getAll("topOverlayContainer") ?? []).forEach(({ priority, element }) => {
37
+ if (priority > bestPriority) {
38
+ bestElement = element;
39
+ bestPriority = priority;
40
+ }
41
+ });
42
+ return bestElement;
43
+ }, [store]);
44
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
63
45
  };
64
46
 
65
47
  export { ModalSlotsProvider, TOP_OVERLAY_PRIORITY, useModalSlots, useRegisterTopOverlayCandidate, useResolvedTopOverlayElement };
@@ -1 +1 @@
1
- {"version":3,"file":"ModalSlotsContext.js","sources":["src/internal/ModalSlotsContext.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore, type RefCallback } from 'react';\n\nimport { createSlotRegistry } from '@hh.ru/magritte-internal-slot-registry';\n\n/**\n * Реестр контейнера слота `top` `ContentOverlay` модала. Это единственная точка композиции, которую\n * нельзя выразить пропами: кандидаты (контейнер у нижнего края навбара, запасной `div` хедера, запасной\n * `div` тела) рождаются глубоко в поддереве, их наличие/тип статически неизвестны, и побеждает\n * смонтированный кандидат с наибольшим `priority` — см. `useResolvedTopOverlayElement`.\n */\nexport interface TopOverlayCandidate {\n priority: number;\n element: HTMLElement;\n}\n\nexport interface ModalSlots {\n /**\n * Кандидаты на контейнер слота `top` `ContentOverlay`. Одновременно живёт несколько регистрантов —\n * побеждает кандидат с максимальным приоритетом.\n */\n topOverlayContainer: TopOverlayCandidate;\n}\n\n/**\n * Приоритеты кандидатов на слот `top`. Чем больше число — тем выше приоритет: резолвер выбирает\n * смонтированного кандидата с максимальным приоритетом.\n */\nexport const TOP_OVERLAY_PRIORITY = {\n /** Запасной контейнер в теле модала. Низший приоритет — на случай, когда хедера нет вовсе. */\n bodyFallback: 0,\n /** Запасной контейнер внутри sticky-хедера, когда внутри хедера нет навбара. */\n headerFallback: 1,\n /** Контейнер, прицепленный к нижнему краю навбара (`bottomAttachment`). Высший приоритет. */\n navBar: 2,\n} as const;\n\nexport const { SlotRegistryProvider: ModalSlotsProvider, useSlotRegistry: useModalSlots } =\n createSlotRegistry<ModalSlots>('ModalSlots');\n\nconst noop = (): void => undefined;\n\n/**\n * Стабильные токены регистранта по приоритету (индекс = `priority`).\n * Это безопасно: в пределах одного модала на приоритет приходится не более одного кандидата\n * (роли-синглтоны), а разные модалы пишут в разные сторы, где токен адресует свою запись независимо.\n */\nconst TOP_OVERLAY_TOKENS: readonly object[] = [{}, {}, {}];\n\n/**\n * Возвращает стабильный callback-реф, который регистрирует свою DOM-ноду как кандидата слота `top`\n * с приоритетом `priority` напрямую в slot-registry (и снимает регистрацию, когда нода отвязывается).\n * Не держит стейт и не ре-рендерит сам компонент-регистрант — перерисовывается только потребитель\n * (`useResolvedTopOverlayElement` в `ModalBody`).\n */\nexport const useRegisterTopOverlayCandidate = (priority: number): RefCallback<HTMLElement> => {\n const store = useModalSlots();\n const token = TOP_OVERLAY_TOKENS[priority];\n\n return useCallback(\n (element: HTMLElement | null) => {\n if (element) {\n store?.register('topOverlayContainer', token, { priority, element });\n } else {\n store?.unregister('topOverlayContainer', token);\n }\n },\n [store, token, priority]\n );\n};\n\n/**\n * Реактивно отдаёт DOM-элемент кандидата с наибольшим приоритетом, зарегистрированного в слоте\n * `topOverlayContainer`. Возвращает `null`, пока нет ни одного живого кандидата. Возвращаемое значение —\n * сам элемент (стабильная ссылка), поэтому кэшировать снапшот не нужно: `useSyncExternalStore` не зациклит.\n */\nexport const useResolvedTopOverlayElement = (): HTMLElement | null => {\n const store = useModalSlots();\n\n const subscribe = useCallback((listener: () => void) => store?.subscribe(listener) ?? noop, [store]);\n\n const getSnapshot = useCallback(() => {\n let bestElement: HTMLElement | null = null;\n let bestPriority = -Infinity;\n (store?.getAll('topOverlayContainer') ?? []).forEach(({ priority, element }) => {\n if (priority > bestPriority) {\n bestElement = element;\n bestPriority = priority;\n }\n });\n return bestElement;\n }, [store]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n"],"names":[],"mappings":";;;AAuBA;;;AAGG;AACU,MAAA,oBAAoB,GAAG;;AAEhC,IAAA,YAAY,EAAE,CAAC;;AAEf,IAAA,cAAc,EAAE,CAAC;;AAEjB,IAAA,MAAM,EAAE,CAAC;EACF;AAEE,MAAA,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,GACrF,kBAAkB,CAAa,YAAY,EAAE;AAEjD,MAAM,IAAI,GAAG,MAAY,SAAS,CAAC;AAEnC;;;;AAIG;AACH,MAAM,kBAAkB,GAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAE3D;;;;;AAKG;AACU,MAAA,8BAA8B,GAAG,CAAC,QAAgB,KAA8B;AACzF,IAAA,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;AAC9B,IAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE3C,IAAA,OAAO,WAAW,CACd,CAAC,OAA2B,KAAI;QAC5B,IAAI,OAAO,EAAE;AACT,YAAA,KAAK,EAAE,QAAQ,CAAC,qBAAqB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;SACxE;aAAM;AACH,YAAA,KAAK,EAAE,UAAU,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;SACnD;KACJ,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAC3B,CAAC;AACN,EAAE;AAEF;;;;AAIG;AACI,MAAM,4BAA4B,GAAG,MAAyB;AACjE,IAAA,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,QAAoB,KAAK,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAErG,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAK;QACjC,IAAI,WAAW,GAAuB,IAAI,CAAC;AAC3C,QAAA,IAAI,YAAY,GAAG,CAAC,QAAQ,CAAC;AAC7B,QAAA,CAAC,KAAK,EAAE,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAI;AAC3E,YAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;gBACzB,WAAW,GAAG,OAAO,CAAC;gBACtB,YAAY,GAAG,QAAQ,CAAC;aAC3B;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,WAAW,CAAC;AACvB,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACrE;;;;"}
1
+ {"version":3,"file":"ModalSlotsContext.js","sources":["src/internal/ModalSlotsContext.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore, type RefCallback } from 'react';\n\nimport { createSlotRegistry } from '@hh.ru/magritte-internal-slot-registry';\n\n/**\n * Реестр контейнера слота `top` `ContentOverlay` модала. Это единственная точка композиции, которую\n * нельзя выразить пропами: кандидаты (контейнер у нижнего края навбара, запасной `div` хедера, запасной\n * `div` тела) рождаются глубоко в поддереве, их наличие/тип статически неизвестны, и побеждает\n * смонтированный кандидат с наибольшим `priority` — см. `useResolvedTopOverlayElement`.\n */\nexport interface TopOverlayCandidate {\n priority: number;\n element: HTMLElement;\n}\n\nexport interface ModalSlots {\n /**\n * Кандидаты на контейнер слота `top` `ContentOverlay`. Одновременно живёт несколько регистрантов —\n * побеждает кандидат с максимальным приоритетом.\n */\n topOverlayContainer: TopOverlayCandidate;\n}\n\n/**\n * Приоритеты кандидатов на слот `top`. Чем больше число — тем выше приоритет: резолвер выбирает\n * смонтированного кандидата с максимальным приоритетом.\n */\nexport const TOP_OVERLAY_PRIORITY = {\n /** Запасной контейнер в теле модала. Низший приоритет — на случай, когда хедера нет вовсе. */\n bodyFallback: 0,\n /** Запасной контейнер внутри sticky-хедера, когда внутри хедера нет навбара. */\n headerFallback: 1,\n /** Контейнер, прицепленный к нижнему краю навбара (`bottomAttachment`). Высший приоритет. */\n navBar: 2,\n} as const;\n\nexport const { SlotRegistryProvider: ModalSlotsProvider, useSlotRegistry: useModalSlots } =\n createSlotRegistry<ModalSlots>('ModalSlots');\n\nconst noop = (): void => undefined;\n\n/**\n * Стабильные токены регистранта по приоритету (индекс = `priority`).\n * Это безопасно: в пределах одного модала на приоритет приходится не более одного кандидата\n * (роли-синглтоны), а разные модалы пишут в разные сторы, где токен адресует свою запись независимо.\n */\nconst TOP_OVERLAY_TOKENS: readonly object[] = [{}, {}, {}];\n\n/**\n * Возвращает стабильный callback-реф, который регистрирует свою DOM-ноду как кандидата слота `top`\n * с приоритетом `priority` напрямую в slot-registry (и снимает регистрацию, когда нода отвязывается).\n * Не держит стейт и не ре-рендерит сам компонент-регистрант — перерисовывается только потребитель\n * (`useResolvedTopOverlayElement` в `ModalBody`).\n */\nexport const useRegisterTopOverlayCandidate = (priority: number): RefCallback<HTMLElement> => {\n const store = useModalSlots();\n const token = TOP_OVERLAY_TOKENS[priority];\n\n return useCallback(\n (element: HTMLElement | null) => {\n if (element) {\n store?.register('topOverlayContainer', token, { priority, element });\n } else {\n store?.unregister('topOverlayContainer', token);\n }\n },\n [store, token, priority]\n );\n};\n\n/**\n * Реактивно отдаёт DOM-элемент кандидата с наибольшим приоритетом, зарегистрированного в слоте\n * `topOverlayContainer`. Возвращает `null`, пока нет ни одного живого кандидата. Возвращаемое значение —\n * сам элемент (стабильная ссылка), поэтому кэшировать снапшот не нужно: `useSyncExternalStore` не зациклит.\n */\nexport const useResolvedTopOverlayElement = (): HTMLElement | null => {\n const store = useModalSlots();\n\n const subscribe = useCallback((listener: () => void) => store?.subscribe(listener) ?? noop, [store]);\n\n const getSnapshot = useCallback(() => {\n let bestElement: HTMLElement | null = null;\n let bestPriority = -Infinity;\n (store?.getAll('topOverlayContainer') ?? []).forEach(({ priority, element }) => {\n if (priority > bestPriority) {\n bestElement = element;\n bestPriority = priority;\n }\n });\n return bestElement;\n }, [store]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n};\n"],"names":[],"mappings":";;;AA2BO,MAAM,oBAAuB,GAAA;AAAA;AAAA,EAEhC,YAAc,EAAA,CAAA;AAAA;AAAA,EAEd,cAAgB,EAAA,CAAA;AAAA;AAAA,EAEhB,MAAQ,EAAA,CAAA;AACZ,EAAA;AAEO,MAAM,EAAE,oBAAsB,EAAA,kBAAA,EAAoB,iBAAiB,aAAc,EAAA,GACpF,mBAA+B,YAAY,EAAA;AAE/C,MAAM,OAAO,MAAY,KAAA,CAAA,CAAA;AAOzB,MAAM,qBAAwC,CAAC,IAAI,EAAC,EAAG,EAAE,CAAA,CAAA;AAQ5C,MAAA,8BAAA,GAAiC,CAAC,QAA+C,KAAA;AAC1F,EAAA,MAAM,QAAQ,aAAc,EAAA,CAAA;AAC5B,EAAM,MAAA,KAAA,GAAQ,mBAAmB,QAAQ,CAAA,CAAA;AAEzC,EAAO,OAAA,WAAA;AAAA,IACH,CAAC,OAAgC,KAAA;AAC7B,MAAA,IAAI,OAAS,EAAA;AACT,QAAA,KAAA,EAAO,SAAS,qBAAuB,EAAA,KAAA,EAAO,EAAE,QAAA,EAAU,SAAS,CAAA,CAAA;AAAA,OAChE,MAAA;AACH,QAAO,KAAA,EAAA,UAAA,CAAW,uBAAuB,KAAK,CAAA,CAAA;AAAA,OAClD;AAAA,KACJ;AAAA,IACA,CAAC,KAAO,EAAA,KAAA,EAAO,QAAQ,CAAA;AAAA,GAC3B,CAAA;AACJ,EAAA;AAOO,MAAM,+BAA+B,MAA0B;AAClE,EAAA,MAAM,QAAQ,aAAc,EAAA,CAAA;AAE5B,EAAM,MAAA,SAAA,GAAY,WAAY,CAAA,CAAC,QAAyB,KAAA,KAAA,EAAO,SAAU,CAAA,QAAQ,CAAK,IAAA,IAAA,EAAM,CAAC,KAAK,CAAC,CAAA,CAAA;AAEnG,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AAClC,IAAA,IAAI,WAAkC,GAAA,IAAA,CAAA;AACtC,IAAA,IAAI,YAAe,GAAA,CAAA,QAAA,CAAA;AACnB,IAAC,CAAA,KAAA,EAAO,MAAO,CAAA,qBAAqB,CAAK,IAAA,EAAI,EAAA,OAAA,CAAQ,CAAC,EAAE,QAAU,EAAA,OAAA,EAAc,KAAA;AAC5E,MAAA,IAAI,WAAW,YAAc,EAAA;AACzB,QAAc,WAAA,GAAA,OAAA,CAAA;AACd,QAAe,YAAA,GAAA,QAAA,CAAA;AAAA,OACnB;AAAA,KACH,CAAA,CAAA;AACD,IAAO,OAAA,WAAA,CAAA;AAAA,GACX,EAAG,CAAC,KAAK,CAAC,CAAA,CAAA;AAEV,EAAO,OAAA,oBAAA,CAAqB,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AACnE;;;;"}
@@ -4,37 +4,41 @@ import { useMemo } from 'react';
4
4
  import classnames from 'classnames';
5
5
  import { useRegisterTopOverlayCandidate, TOP_OVERLAY_PRIORITY } from './ModalSlotsContext.js';
6
6
  import { NavBarDefaultPropsContext } from '@hh.ru/magritte-ui-nav-bar';
7
- import { s as styles } from '../modal-Df_WVial.js';
7
+ import { s as styles } from '../modal-BQNvAaFW.js';
8
8
  import '@hh.ru/magritte-internal-slot-registry';
9
9
 
10
10
  const NAV_BAR_ACTIONS_DEFAULT_PROPS = {
11
- verticalAlign: 'top',
11
+ verticalAlign: "top"
12
12
  };
13
13
  const NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS = {
14
- borderRadius: 12,
15
- padding: 8,
14
+ borderRadius: 12,
15
+ padding: 8
16
16
  };
17
- const NAV_BAR_ROOT_DEFAULT_PROPS = { showDivider: 'with-scroll', snapScroll: false };
18
- /**
19
- * Sticky-хедер модала. Нижний край хедера (для `offsetTop` скроллбара и контейнера top-overlay) берётся
20
- * из `bottomAttachment` навбара / запасного `div` хедера — они позиционируются по визуальному низу хедера
21
- * и переживают overlay-навбар (когда его обёртка схлопывается в 0), поэтому отдельный flow-маркер не нужен.
22
- */
17
+ const NAV_BAR_ROOT_DEFAULT_PROPS = { showDivider: "with-scroll", snapScroll: false };
23
18
  const ModalStickyHeader = ({ children }) => {
24
- // Хедер предлагает в слот `top` двух кандидатов: контейнер у нижнего края навбара (если навбар внутри
25
- // есть) и собственный запасной `div`. Каждый реф регистрирует свою ноду в общем реестре
26
- // `topOverlayContainer` (победитель резолвится по приоритету в ModalBody): навбар важнее запасного
27
- // `div` хедера, а тот — важнее запасного `div` тела. Незадействованный кандидат (например навбар, когда
28
- // навбара нет) просто не монтируется → его реф не срабатывает → он не регистрируется и не участвует.
29
- const navBarRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.navBar);
30
- const headerFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.headerFallback);
31
- const navBarRootProps = useMemo(() => ({
32
- ...NAV_BAR_ROOT_DEFAULT_PROPS,
33
- bottomAttachment: jsx("div", { ref: navBarRef, className: classnames(styles.contentOverlayTop, styles.navBar) }),
34
- }), [navBarRef]);
35
- return (jsx("div", { className: styles.stickyHeader, children: jsxs("div", { className: styles.stickyHeaderInner, children: [jsx(NavBarDefaultPropsContext, { rootProps: navBarRootProps, actionsProps: NAV_BAR_ACTIONS_DEFAULT_PROPS, actionsIconsProps: NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS, children: children }), jsx("div", { ref: headerFallbackRef, className: classnames(styles.contentOverlayTop, styles.header) })] }) }));
19
+ const navBarRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.navBar);
20
+ const headerFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.headerFallback);
21
+ const navBarRootProps = useMemo(
22
+ () => ({
23
+ ...NAV_BAR_ROOT_DEFAULT_PROPS,
24
+ bottomAttachment: /* @__PURE__ */ jsx("div", { ref: navBarRef, className: classnames(styles.contentOverlayTop, styles.navBar) })
25
+ }),
26
+ [navBarRef]
27
+ );
28
+ return /* @__PURE__ */ jsx("div", { className: styles.stickyHeader, children: /* @__PURE__ */ jsxs("div", { className: styles.stickyHeaderInner, children: [
29
+ /* @__PURE__ */ jsx(
30
+ NavBarDefaultPropsContext,
31
+ {
32
+ rootProps: navBarRootProps,
33
+ actionsProps: NAV_BAR_ACTIONS_DEFAULT_PROPS,
34
+ actionsIconsProps: NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS,
35
+ children
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx("div", { ref: headerFallbackRef, className: classnames(styles.contentOverlayTop, styles.header) })
39
+ ] }) });
36
40
  };
37
- ModalStickyHeader.displayName = 'ModalStickyHeader';
41
+ ModalStickyHeader.displayName = "ModalStickyHeader";
38
42
 
39
43
  export { ModalStickyHeader };
40
44
  //# sourceMappingURL=ModalStickyHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModalStickyHeader.js","sources":["src/internal/ModalStickyHeader.tsx"],"sourcesContent":["import { type FC, PropsWithChildren, useMemo } from 'react';\nimport classnames from 'classnames';\n\nimport { type IconProps } from '@hh.ru/magritte-ui-icon';\nimport {\n TOP_OVERLAY_PRIORITY,\n useRegisterTopOverlayCandidate,\n} from '@hh.ru/magritte-ui-modal/internal/ModalSlotsContext';\nimport { type NavBarProps, NavBarDefaultPropsContext, type ActionsProps } from '@hh.ru/magritte-ui-nav-bar';\n\nimport styles from './modal.less';\n\nconst NAV_BAR_ACTIONS_DEFAULT_PROPS: Partial<ActionsProps> = {\n verticalAlign: 'top',\n};\n\nconst NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS: Partial<IconProps> = {\n borderRadius: 12,\n padding: 8,\n};\n\nconst NAV_BAR_ROOT_DEFAULT_PROPS = { showDivider: 'with-scroll', snapScroll: false } as const;\n\nexport type ModalStickyHeaderProps = PropsWithChildren;\n\n/**\n * Sticky-хедер модала. Нижний край хедера (для `offsetTop` скроллбара и контейнера top-overlay) берётся\n * из `bottomAttachment` навбара / запасного `div` хедера — они позиционируются по визуальному низу хедера\n * и переживают overlay-навбар (когда его обёртка схлопывается в 0), поэтому отдельный flow-маркер не нужен.\n */\nexport const ModalStickyHeader: FC<ModalStickyHeaderProps> = ({ children }) => {\n // Хедер предлагает в слот `top` двух кандидатов: контейнер у нижнего края навбара (если навбар внутри\n // есть) и собственный запасной `div`. Каждый реф регистрирует свою ноду в общем реестре\n // `topOverlayContainer` (победитель резолвится по приоритету в ModalBody): навбар важнее запасного\n // `div` хедера, а тот — важнее запасного `div` тела. Незадействованный кандидат (например навбар, когда\n // навбара нет) просто не монтируется → его реф не срабатывает → он не регистрируется и не участвует.\n const navBarRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.navBar);\n const headerFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.headerFallback);\n\n const navBarRootProps = useMemo<Partial<NavBarProps>>(\n () => ({\n ...NAV_BAR_ROOT_DEFAULT_PROPS,\n bottomAttachment: <div ref={navBarRef} className={classnames(styles.contentOverlayTop, styles.navBar)} />,\n }),\n [navBarRef]\n );\n\n return (\n <div className={styles.stickyHeader}>\n {/*\n * Отрицательные марджины-«вылет» хедера висят на этом внутреннем статичном элементе, а не на\n * самом sticky-хедере. Причина — баг WebKit/Safari: для `position: sticky` отрицательные\n * марджины попадают в scrollable-overflow скролл-контейнера (для статичных элементов — нет),\n * из-за чего в Safari появляется фантомный горизонтальный скролл.\n */}\n <div className={styles.stickyHeaderInner}>\n <NavBarDefaultPropsContext\n rootProps={navBarRootProps}\n actionsProps={NAV_BAR_ACTIONS_DEFAULT_PROPS}\n actionsIconsProps={NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS}\n >\n {children}\n </NavBarDefaultPropsContext>\n <div ref={headerFallbackRef} className={classnames(styles.contentOverlayTop, styles.header)} />\n </div>\n </div>\n );\n};\n\nModalStickyHeader.displayName = 'ModalStickyHeader';\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;AAYA,MAAM,6BAA6B,GAA0B;AACzD,IAAA,aAAa,EAAE,KAAK;CACvB,CAAC;AAEF,MAAM,mCAAmC,GAAuB;AAC5D,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,OAAO,EAAE,CAAC;CACb,CAAC;AAEF,MAAM,0BAA0B,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAW,CAAC;AAI9F;;;;AAIG;MACU,iBAAiB,GAA+B,CAAC,EAAE,QAAQ,EAAE,KAAI;;;;;;IAM1E,MAAM,SAAS,GAAG,8BAA8B,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC9E,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;AAE9F,IAAA,MAAM,eAAe,GAAG,OAAO,CAC3B,OAAO;AACH,QAAA,GAAG,0BAA0B;AAC7B,QAAA,gBAAgB,EAAEA,GAAK,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAI,CAAA;AAC5G,KAAA,CAAC,EACF,CAAC,SAAS,CAAC,CACd,CAAC;IAEF,QACIA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAO/BC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,iBAAiB,EAAA,QAAA,EAAA,CACpCD,GAAC,CAAA,yBAAyB,EACtB,EAAA,SAAS,EAAE,eAAe,EAC1B,YAAY,EAAE,6BAA6B,EAC3C,iBAAiB,EAAE,mCAAmC,EAAA,QAAA,EAErD,QAAQ,EAAA,CACe,EAC5BA,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAI,CAAA,CAAA,EAAA,CAC7F,EACJ,CAAA,EACR;AACN,EAAE;AAEF,iBAAiB,CAAC,WAAW,GAAG,mBAAmB;;;;"}
1
+ {"version":3,"file":"ModalStickyHeader.js","sources":["src/internal/ModalStickyHeader.tsx"],"sourcesContent":["import { type FC, PropsWithChildren, useMemo } from 'react';\nimport classnames from 'classnames';\n\nimport { type IconProps } from '@hh.ru/magritte-ui-icon';\nimport {\n TOP_OVERLAY_PRIORITY,\n useRegisterTopOverlayCandidate,\n} from '@hh.ru/magritte-ui-modal/internal/ModalSlotsContext';\nimport { type NavBarProps, NavBarDefaultPropsContext, type ActionsProps } from '@hh.ru/magritte-ui-nav-bar';\n\nimport styles from './modal.less';\n\nconst NAV_BAR_ACTIONS_DEFAULT_PROPS: Partial<ActionsProps> = {\n verticalAlign: 'top',\n};\n\nconst NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS: Partial<IconProps> = {\n borderRadius: 12,\n padding: 8,\n};\n\nconst NAV_BAR_ROOT_DEFAULT_PROPS = { showDivider: 'with-scroll', snapScroll: false } as const;\n\nexport type ModalStickyHeaderProps = PropsWithChildren;\n\n/**\n * Sticky-хедер модала. Нижний край хедера (для `offsetTop` скроллбара и контейнера top-overlay) берётся\n * из `bottomAttachment` навбара / запасного `div` хедера — они позиционируются по визуальному низу хедера\n * и переживают overlay-навбар (когда его обёртка схлопывается в 0), поэтому отдельный flow-маркер не нужен.\n */\nexport const ModalStickyHeader: FC<ModalStickyHeaderProps> = ({ children }) => {\n // Хедер предлагает в слот `top` двух кандидатов: контейнер у нижнего края навбара (если навбар внутри\n // есть) и собственный запасной `div`. Каждый реф регистрирует свою ноду в общем реестре\n // `topOverlayContainer` (победитель резолвится по приоритету в ModalBody): навбар важнее запасного\n // `div` хедера, а тот — важнее запасного `div` тела. Незадействованный кандидат (например навбар, когда\n // навбара нет) просто не монтируется → его реф не срабатывает → он не регистрируется и не участвует.\n const navBarRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.navBar);\n const headerFallbackRef = useRegisterTopOverlayCandidate(TOP_OVERLAY_PRIORITY.headerFallback);\n\n const navBarRootProps = useMemo<Partial<NavBarProps>>(\n () => ({\n ...NAV_BAR_ROOT_DEFAULT_PROPS,\n bottomAttachment: <div ref={navBarRef} className={classnames(styles.contentOverlayTop, styles.navBar)} />,\n }),\n [navBarRef]\n );\n\n return (\n <div className={styles.stickyHeader}>\n {/*\n * Отрицательные марджины-«вылет» хедера висят на этом внутреннем статичном элементе, а не на\n * самом sticky-хедере. Причина — баг WebKit/Safari: для `position: sticky` отрицательные\n * марджины попадают в scrollable-overflow скролл-контейнера (для статичных элементов — нет),\n * из-за чего в Safari появляется фантомный горизонтальный скролл.\n */}\n <div className={styles.stickyHeaderInner}>\n <NavBarDefaultPropsContext\n rootProps={navBarRootProps}\n actionsProps={NAV_BAR_ACTIONS_DEFAULT_PROPS}\n actionsIconsProps={NAV_BAR_ACTIONS_ICONS_DEFAULT_PROPS}\n >\n {children}\n </NavBarDefaultPropsContext>\n <div ref={headerFallbackRef} className={classnames(styles.contentOverlayTop, styles.header)} />\n </div>\n </div>\n );\n};\n\nModalStickyHeader.displayName = 'ModalStickyHeader';\n"],"names":[],"mappings":";;;;;;;;AAYA,MAAM,6BAAuD,GAAA;AAAA,EACzD,aAAe,EAAA,KAAA;AACnB,CAAA,CAAA;AAEA,MAAM,mCAA0D,GAAA;AAAA,EAC5D,YAAc,EAAA,EAAA;AAAA,EACd,OAAS,EAAA,CAAA;AACb,CAAA,CAAA;AAEA,MAAM,0BAA6B,GAAA,EAAE,WAAa,EAAA,aAAA,EAAe,YAAY,KAAM,EAAA,CAAA;AAS5E,MAAM,iBAAgD,GAAA,CAAC,EAAE,QAAA,EAAe,KAAA;AAM3E,EAAM,MAAA,SAAA,GAAY,8BAA+B,CAAA,oBAAA,CAAqB,MAAM,CAAA,CAAA;AAC5E,EAAM,MAAA,iBAAA,GAAoB,8BAA+B,CAAA,oBAAA,CAAqB,cAAc,CAAA,CAAA;AAE5F,EAAA,MAAM,eAAkB,GAAA,OAAA;AAAA,IACpB,OAAO;AAAA,MACH,GAAG,0BAAA;AAAA,MACH,gBAAA,kBAAmB,GAAA,CAAA,KAAA,EAAA,EAAI,GAAK,EAAA,SAAA,EAAW,SAAW,EAAA,UAAA,CAAW,MAAO,CAAA,iBAAA,EAAmB,MAAO,CAAA,MAAM,CAAG,EAAA,CAAA;AAAA,KAC3G,CAAA;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,GACd,CAAA;AAEA,EACI,uBAAA,GAAA,CAAC,SAAI,SAAW,EAAA,MAAA,CAAO,cAOnB,QAAC,kBAAA,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,iBACnB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,yBAAA;AAAA,MAAA;AAAA,QACG,SAAW,EAAA,eAAA;AAAA,QACX,YAAc,EAAA,6BAAA;AAAA,QACd,iBAAmB,EAAA,mCAAA;AAAA,QAElB,QAAA;AAAA,OAAA;AAAA,KACL;AAAA,oBACA,GAAA,CAAC,KAAI,EAAA,EAAA,GAAA,EAAK,iBAAmB,EAAA,SAAA,EAAW,WAAW,MAAO,CAAA,iBAAA,EAAmB,MAAO,CAAA,MAAM,CAAG,EAAA,CAAA;AAAA,GAAA,EACjG,CACJ,EAAA,CAAA,CAAA;AAER,EAAA;AAEA,iBAAA,CAAkB,WAAc,GAAA,mBAAA;;;;"}