@hh.ru/magritte-ui-nav-bar 1.3.24 → 1.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/NavBar.js CHANGED
@@ -1,20 +1,134 @@
1
1
  import './../index.css';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
- import 'classnames';
5
- import 'motion/react';
6
- import '@hh.ru/magritte-ui-divider';
7
- import '@hh.ru/magritte-ui-layer';
8
- import '../internal/MetricsProvider.js';
9
- import '../internal/useAnimationRanges.js';
10
- import '../internal/useBindScrollToAnimationProgress.js';
11
- import '../internal/useNavBarMetrics.js';
12
- import '../internal/useResetFocus.js';
13
- import '../internal/useScrollAdapter.js';
14
- import '../internal/useSnapScroll.js';
15
- import '../internal/useSyncMotionValue.js';
16
- import '../internal/utils.js';
17
- export { N as NavBar, u as useNavBarContext } from '../NavBar-Cp0mcX9W.js';
18
- import 'motion';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import React, { useRef, useLayoutEffect, Children } from 'react';
4
+ import classNames from 'classnames';
5
+ import { frame, motion } from 'motion/react';
6
+ import { Divider } from '@hh.ru/magritte-ui-divider';
7
+ import { Layer } from '@hh.ru/magritte-ui-layer';
8
+ import { MetricsProvider } from '../internal/MetricsProvider.js';
9
+ import { NavBarContext } from '../internal/NavBarContext.js';
10
+ import { useAnimationRanges } from '../internal/useAnimationRanges.js';
11
+ import { useBindScrollToAnimationProgress } from '../internal/useBindScrollToAnimationProgress.js';
12
+ import { useNavBarMetrics } from '../internal/useNavBarMetrics.js';
13
+ import { useResetFocus } from '../internal/useResetFocus.js';
14
+ import { useScrollAdapter } from '../internal/useScrollAdapter.js';
15
+ import { useSnapScroll } from '../internal/useSnapScroll.js';
16
+ import { useSyncMotionValue } from '../internal/useSyncMotionValue.js';
17
+ import { useInitOnce, scheduleMicro, scheduleMacro, remap } from '../internal/utils.js';
18
+ import { isPaneElement, ExternalPane } from './Pane.js';
19
+ import { useNavBarRootDefaultProps } from './defaultProps.js';
20
+ import { s as styles } from '../nav-bar-CmjjkPy6.js';
19
21
  import '@hh.ru/magritte-internal-custom-scroll';
22
+ import 'motion';
23
+ import '../internal/MorphStore.js';
24
+ import '../internal/KeyedSubscriptions.js';
25
+ import '../internal/PaneStore.js';
26
+ import './EnvironmentFingerprintNode.js';
27
+ import './LayoutStage.js';
28
+ import '@hh.ru/magritte-common-use-when-font-loaded';
29
+ import './Stage.js';
30
+ import '../internal/useInert.js';
31
+ import '@hh.ru/magritte-internal-default-props-context';
32
+
33
+ const NavBar = (props) => {
34
+ const defaultProps = useNavBarRootDefaultProps();
35
+ const { children, transparent = false, startTriggerPosition = 'start', endTriggerPosition, overlay = false, snapScroll: scrollSnapping = true, showDivider = false, animationProgress, } = { ...defaultProps, ...props };
36
+ const paneStoreRegistry = useInitOnce(() => new Set());
37
+ const prevFullHeight = useRef(0);
38
+ const rootRef = useRef(null);
39
+ const [scrollAdapter, scrollPosition] = useScrollAdapter(rootRef);
40
+ const [getMetrics, invalidateMetrics] = useNavBarMetrics(paneStoreRegistry, rootRef, scrollAdapter);
41
+ const [getAnimationRanges, invalidateAnimationRanges] = useAnimationRanges(paneStoreRegistry, getMetrics);
42
+ const [bindScrollToAnimation, getClosestStops, totalAnimationProgress, dividerStyle] = useBindScrollToAnimationProgress(scrollPosition, getMetrics, getAnimationRanges, scrollAdapter, startTriggerPosition, endTriggerPosition);
43
+ const snapScroll = useSnapScroll(scrollPosition, totalAnimationProgress, scrollAdapter, getClosestStops, scrollSnapping);
44
+ // При получении размеров важно дождаться применения MotionValue к DOM, поэтому используем frame.render
45
+ const bindScrollToAnimationScheduled = useInitOnce(() => scheduleMicro(() => frame.render(bindScrollToAnimation)));
46
+ useResetFocus(rootRef, totalAnimationProgress);
47
+ useSyncMotionValue(totalAnimationProgress, animationProgress);
48
+ const dividerVisibility =
49
+ // eslint-disable-next-line no-nested-ternary
50
+ showDivider === 'with-scroll' ? dividerStyle.visibility : showDivider ? 'visible' : 'hidden';
51
+ const registerPaneStore = useInitOnce(() => {
52
+ const subscriptions = [];
53
+ const updateAnimationParams = () => {
54
+ subscriptions.length = 0;
55
+ invalidateMetrics();
56
+ invalidateAnimationRanges();
57
+ bindScrollToAnimationScheduled();
58
+ const navBarMetrics = getMetrics();
59
+ const fullPanesStartHeight = navBarMetrics.bottom - navBarMetrics.top;
60
+ let scroll = scrollAdapter.getScrollTop();
61
+ if (prevFullHeight.current !== null && scroll !== 0) {
62
+ const heightDelta = fullPanesStartHeight - prevFullHeight.current;
63
+ scroll += heightDelta;
64
+ requestAnimationFrame(() => {
65
+ scrollPosition.jump(scrollAdapter.getScrollTop() - 1);
66
+ scrollPosition.jump(scrollAdapter.getScrollTop());
67
+ });
68
+ }
69
+ const animationRanges = getAnimationRanges();
70
+ [...paneStoreRegistry.values()].forEach((paneStore) => {
71
+ const range = animationRanges.get(paneStore.get('id'));
72
+ if (!range) {
73
+ return;
74
+ }
75
+ const remapFn = remap(range[0] === 0 && range[1] === 0
76
+ ? [0, 1]
77
+ : [range[0] / navBarMetrics.animationHeight, range[1] / navBarMetrics.animationHeight], [0, 1]);
78
+ const motionValue = paneStore.get('motionValue');
79
+ motionValue.set(remapFn(totalAnimationProgress.get()));
80
+ subscriptions.push(totalAnimationProgress.on('change', (value) => motionValue.set(remapFn(value))));
81
+ });
82
+ prevFullHeight.current = fullPanesStartHeight;
83
+ };
84
+ // основной триггер запуска updateAnimationParams это изменения размеров, обработка которых происходит
85
+ // в очереди микрозадач, поэтому откладываем запуск функции до перехдоа к макрозадачам, чтобы сократить
86
+ // количество вызовов при массовых изменениях
87
+ const onChange = scheduleMacro(updateAnimationParams);
88
+ return (paneStore) => {
89
+ const unsubscribe = paneStore.onChange(['startHeight', 'endHeight', 'top', 'foldable', 'animated'], onChange);
90
+ paneStoreRegistry.add(paneStore);
91
+ return () => {
92
+ paneStoreRegistry.delete(paneStore);
93
+ unsubscribe();
94
+ };
95
+ };
96
+ });
97
+ useLayoutEffect(() => {
98
+ bindScrollToAnimation();
99
+ snapScroll();
100
+ if (!rootRef.current || (typeof startTriggerPosition === 'string' && !endTriggerPosition)) {
101
+ return void 0;
102
+ }
103
+ return scrollAdapter.onResize(bindScrollToAnimationScheduled);
104
+ }, [
105
+ startTriggerPosition,
106
+ endTriggerPosition,
107
+ bindScrollToAnimation,
108
+ bindScrollToAnimationScheduled,
109
+ snapScroll,
110
+ scrollAdapter,
111
+ ]);
112
+ // Оборачиваем потомков, не являющихся Pane, в Pane и вкладываем панели друг в друга через проп nextPane
113
+ const childrenArray = Children.toArray(children);
114
+ const nested = isPaneElement(childrenArray[0]) ? (childrenArray.reduceRight((acc, child) => {
115
+ if (!isPaneElement(child)) {
116
+ return acc;
117
+ }
118
+ // cloneElement сужает конструктор до InternalPaneProps, поэтому возвращаем к PaneElement
119
+ return React.cloneElement(child, {
120
+ ...child.props,
121
+ nextPane: acc,
122
+ });
123
+ }, null)) : (jsx(ExternalPane, { children: children }));
124
+ return (jsx(Layer, { layer: "navigation-bar", children: jsx(MetricsProvider, { className: classNames(styles.navBar, {
125
+ [styles.navbarTransparentStart]: transparent === 'start',
126
+ [styles.navbarTransparentEnd]: transparent === 'end',
127
+ [styles.navbarNotTransparent]: !transparent,
128
+ [styles.navbarTransparent]: transparent === true,
129
+ [styles.navBarOverlay]: overlay,
130
+ }), ref: rootRef, measureClassName: styles.metricsMode, children: jsx("div", { className: styles.navBarOverlayWrapper, children: jsxs("div", { className: styles.navBarContentContainer, children: [jsx(motion.div, { style: { '--magritte-ui-navbar-animation-progress': totalAnimationProgress }, className: styles.navBarPanesContainer, children: jsx(NavBarContext.Provider, { value: registerPaneStore, children: nested }) }), jsx(motion.div, { className: styles.dividerContainer, style: { ...dividerStyle, visibility: dividerVisibility }, children: jsx(Divider, {}) })] }) }) }) }));
131
+ };
132
+
133
+ export { NavBar };
20
134
  //# sourceMappingURL=NavBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavBar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"NavBar.js","sources":["src/public/NavBar.tsx"],"sourcesContent":["import React, { Children, type ReactNode, type RefObject, useLayoutEffect, useRef, type FC } from 'react';\nimport classNames from 'classnames';\nimport { motion, type MotionStyle, MotionValue, frame } from 'motion/react';\n\nimport { Divider, type ShowDivider } from '@hh.ru/magritte-ui-divider';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport { MetricsProvider } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { NavBarContext } from '@hh.ru/magritte-ui-nav-bar/internal/NavBarContext';\nimport { PaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useAnimationRanges } from '@hh.ru/magritte-ui-nav-bar/internal/useAnimationRanges';\nimport { useBindScrollToAnimationProgress } from '@hh.ru/magritte-ui-nav-bar/internal/useBindScrollToAnimationProgress';\nimport { useNavBarMetrics } from '@hh.ru/magritte-ui-nav-bar/internal/useNavBarMetrics';\nimport { useResetFocus } from '@hh.ru/magritte-ui-nav-bar/internal/useResetFocus';\nimport { useScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\nimport { useSnapScroll } from '@hh.ru/magritte-ui-nav-bar/internal/useSnapScroll';\nimport { useSyncMotionValue } from '@hh.ru/magritte-ui-nav-bar/internal/useSyncMotionValue';\nimport { remap, scheduleMicro, scheduleMacro, useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport {\n type PaneElement,\n type InternalPaneProps,\n ExternalPane,\n isPaneElement,\n} from '@hh.ru/magritte-ui-nav-bar/public/Pane';\nimport { useNavBarRootDefaultProps } from '@hh.ru/magritte-ui-nav-bar/public/defaultProps';\n\nimport styles from './nav-bar.less';\n\nexport interface NavBarProps {\n /**\n * В качестве потомков могут передаваться компоненты <Pane /> или произвольные элементы,\n * которые будут автоматически обёрнуты в <Pane />.\n */\n children: ReactNode;\n /**\n * Управляет режимом прозрачности:\n * -- Прозрачность отключена (`false`)\n * -- Прозрачный всегда (`true`)\n * -- Прозрачный в начале анимации (`start`)\n * -- Прозрачный в конце анимации (`end`)\n * @default false\n */\n transparent?: 'start' | 'end' | boolean;\n /**\n * Управляет позицией триггера начала анимации\n * @default start\n */\n startTriggerPosition?: 'start' | 'full-area' | RefObject<HTMLElement | null>;\n /**\n * Управляет позицией триггера конца анимации. Если не передан вычисляется автоматически на основе изменения\n * высоты навбара в процессе анимации и позиции триггера начала анмиации. Если передано число, то интерпретируется\n * как отступ в пикселях от позиции триггера старта анимации.\n */\n endTriggerPosition?: RefObject<HTMLElement | null> | number;\n /**\n * Включает режим когда NavBar не занимает место в лейауте и контент располагается под ним.\n * @default false\n */\n overlay?: boolean;\n /**\n * Управляет режимом автодоскролла. По умолчанию включен.\n * @default true\n */\n snapScroll?: boolean;\n /**\n * Управляет режимом отображения дивайдера:\n * - `false` дивайдер отключен\n * - `always` дивайдер отображается постоянно\n * - `with-scroll` дивайдер отображается только когда контент подскроллен под NavBar\n * @default false\n */\n showDivider?: ShowDivider;\n /**\n * Принимает MotionValue значение которого будет обновляться синхронно с анимацией всего NavBar.\n * Прогресс анимации представляется в виде числа 0..1\n * Предназначен для синхронизации внешних анимаций с анимациями NavBar.\n */\n animationProgress?: MotionValue<number>;\n}\n\nexport const NavBar: FC<NavBarProps> = (props) => {\n const defaultProps = useNavBarRootDefaultProps();\n const {\n children,\n transparent = false,\n startTriggerPosition = 'start',\n endTriggerPosition,\n overlay = false,\n snapScroll: scrollSnapping = true,\n showDivider = false,\n animationProgress,\n } = { ...defaultProps, ...props };\n const paneStoreRegistry = useInitOnce(() => new Set<PaneStore>());\n const prevFullHeight = useRef<null | number>(0);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const [scrollAdapter, scrollPosition] = useScrollAdapter(rootRef);\n const [getMetrics, invalidateMetrics] = useNavBarMetrics(paneStoreRegistry, rootRef, scrollAdapter);\n const [getAnimationRanges, invalidateAnimationRanges] = useAnimationRanges(paneStoreRegistry, getMetrics);\n const [bindScrollToAnimation, getClosestStops, totalAnimationProgress, dividerStyle] =\n useBindScrollToAnimationProgress(\n scrollPosition,\n getMetrics,\n getAnimationRanges,\n scrollAdapter,\n startTriggerPosition,\n endTriggerPosition\n );\n const snapScroll = useSnapScroll(\n scrollPosition,\n totalAnimationProgress,\n scrollAdapter,\n getClosestStops,\n scrollSnapping\n );\n\n // При получении размеров важно дождаться применения MotionValue к DOM, поэтому используем frame.render\n const bindScrollToAnimationScheduled = useInitOnce(() => scheduleMicro(() => frame.render(bindScrollToAnimation)));\n useResetFocus(rootRef, totalAnimationProgress);\n useSyncMotionValue(totalAnimationProgress, animationProgress);\n\n const dividerVisibility =\n // eslint-disable-next-line no-nested-ternary\n showDivider === 'with-scroll' ? dividerStyle.visibility : showDivider ? 'visible' : 'hidden';\n\n const registerPaneStore = useInitOnce(() => {\n const subscriptions: VoidFunction[] = [];\n\n const updateAnimationParams = () => {\n subscriptions.length = 0;\n invalidateMetrics();\n invalidateAnimationRanges();\n bindScrollToAnimationScheduled();\n const navBarMetrics = getMetrics();\n const fullPanesStartHeight = navBarMetrics.bottom - navBarMetrics.top;\n\n let scroll = scrollAdapter.getScrollTop();\n if (prevFullHeight.current !== null && scroll !== 0) {\n const heightDelta = fullPanesStartHeight - prevFullHeight.current;\n scroll += heightDelta;\n\n requestAnimationFrame(() => {\n scrollPosition.jump(scrollAdapter.getScrollTop() - 1);\n scrollPosition.jump(scrollAdapter.getScrollTop());\n });\n }\n\n const animationRanges = getAnimationRanges();\n [...paneStoreRegistry.values()].forEach((paneStore) => {\n const range = animationRanges.get(paneStore.get('id'));\n if (!range) {\n return;\n }\n const remapFn = remap(\n range[0] === 0 && range[1] === 0\n ? [0, 1]\n : [range[0] / navBarMetrics.animationHeight, range[1] / navBarMetrics.animationHeight],\n [0, 1]\n );\n const motionValue = paneStore.get('motionValue');\n motionValue.set(remapFn(totalAnimationProgress.get()));\n subscriptions.push(totalAnimationProgress.on('change', (value) => motionValue.set(remapFn(value))));\n });\n\n prevFullHeight.current = fullPanesStartHeight;\n };\n\n // основной триггер запуска updateAnimationParams это изменения размеров, обработка которых происходит\n // в очереди микрозадач, поэтому откладываем запуск функции до перехдоа к макрозадачам, чтобы сократить\n // количество вызовов при массовых изменениях\n const onChange = scheduleMacro(updateAnimationParams);\n\n return (paneStore: PaneStore) => {\n const unsubscribe = paneStore.onChange(\n ['startHeight', 'endHeight', 'top', 'foldable', 'animated'],\n onChange\n );\n paneStoreRegistry.add(paneStore);\n return () => {\n paneStoreRegistry.delete(paneStore);\n unsubscribe();\n };\n };\n });\n\n useLayoutEffect(() => {\n bindScrollToAnimation();\n snapScroll();\n if (!rootRef.current || (typeof startTriggerPosition === 'string' && !endTriggerPosition)) {\n return void 0;\n }\n return scrollAdapter.onResize(bindScrollToAnimationScheduled);\n }, [\n startTriggerPosition,\n endTriggerPosition,\n bindScrollToAnimation,\n bindScrollToAnimationScheduled,\n snapScroll,\n scrollAdapter,\n ]);\n\n // Оборачиваем потомков, не являющихся Pane, в Pane и вкладываем панели друг в друга через проп nextPane\n const childrenArray = Children.toArray(children);\n const nested = isPaneElement(childrenArray[0]) ? (\n childrenArray.reduceRight<PaneElement | null>((acc, child) => {\n if (!isPaneElement(child)) {\n return acc;\n }\n // cloneElement сужает конструктор до InternalPaneProps, поэтому возвращаем к PaneElement\n return React.cloneElement<InternalPaneProps>(child, {\n ...child.props,\n nextPane: acc,\n }) as PaneElement;\n }, null)\n ) : (\n <ExternalPane>{children}</ExternalPane>\n );\n\n return (\n <Layer layer=\"navigation-bar\">\n <MetricsProvider\n className={classNames(styles.navBar, {\n [styles.navbarTransparentStart]: transparent === 'start',\n [styles.navbarTransparentEnd]: transparent === 'end',\n [styles.navbarNotTransparent]: !transparent,\n [styles.navbarTransparent]: transparent === true,\n [styles.navBarOverlay]: overlay,\n })}\n ref={rootRef}\n measureClassName={styles.metricsMode}\n >\n <div className={styles.navBarOverlayWrapper}>\n <div className={styles.navBarContentContainer}>\n <motion.div\n style={{ '--magritte-ui-navbar-animation-progress': totalAnimationProgress } as MotionStyle}\n className={styles.navBarPanesContainer}\n >\n <NavBarContext.Provider value={registerPaneStore}>{nested}</NavBarContext.Provider>\n </motion.div>\n <motion.div\n className={styles.dividerContainer}\n style={{ ...dividerStyle, visibility: dividerVisibility }}\n >\n <Divider />\n </motion.div>\n </div>\n </div>\n </MetricsProvider>\n </Layer>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+Ea,MAAA,MAAM,GAAoB,CAAC,KAAK,KAAI;AAC7C,IAAA,MAAM,YAAY,GAAG,yBAAyB,EAAE,CAAC;AACjD,IAAA,MAAM,EACF,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,oBAAoB,GAAG,OAAO,EAC9B,kBAAkB,EAClB,OAAO,GAAG,KAAK,EACf,UAAU,EAAE,cAAc,GAAG,IAAI,EACjC,WAAW,GAAG,KAAK,EACnB,iBAAiB,GACpB,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,CAAC;IAClC,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,IAAI,GAAG,EAAa,CAAC,CAAC;AAClE,IAAA,MAAM,cAAc,GAAG,MAAM,CAAgB,CAAC,CAAC,CAAC;AAChD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE7C,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAClE,IAAA,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,GAAG,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACpG,IAAA,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,GAAG,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC1G,MAAM,CAAC,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,YAAY,CAAC,GAChF,gCAAgC,CAC5B,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,CACrB,CAAC;AACN,IAAA,MAAM,UAAU,GAAG,aAAa,CAC5B,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,cAAc,CACjB,CAAC;;IAGF,MAAM,8BAA8B,GAAG,WAAW,CAAC,MAAM,aAAa,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;AACnH,IAAA,aAAa,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAC/C,IAAA,kBAAkB,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;AAE9D,IAAA,MAAM,iBAAiB;;IAEnB,WAAW,KAAK,aAAa,GAAG,YAAY,CAAC,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjG,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAK;QACvC,MAAM,aAAa,GAAmB,EAAE,CAAC;QAEzC,MAAM,qBAAqB,GAAG,MAAK;AAC/B,YAAA,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,YAAA,iBAAiB,EAAE,CAAC;AACpB,YAAA,yBAAyB,EAAE,CAAC;AAC5B,YAAA,8BAA8B,EAAE,CAAC;AACjC,YAAA,MAAM,aAAa,GAAG,UAAU,EAAE,CAAC;YACnC,MAAM,oBAAoB,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC;AAEtE,YAAA,IAAI,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;YAC1C,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,KAAK,CAAC,EAAE;AACjD,gBAAA,MAAM,WAAW,GAAG,oBAAoB,GAAG,cAAc,CAAC,OAAO,CAAC;gBAClE,MAAM,IAAI,WAAW,CAAC;gBAEtB,qBAAqB,CAAC,MAAK;oBACvB,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtD,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;AACtD,iBAAC,CAAC,CAAC;aACN;AAED,YAAA,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;AAC7C,YAAA,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;AAClD,gBAAA,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvD,IAAI,CAAC,KAAK,EAAE;oBACR,OAAO;iBACV;AACD,gBAAA,MAAM,OAAO,GAAG,KAAK,CACjB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5B,sBAAE,CAAC,CAAC,EAAE,CAAC,CAAC;sBACN,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,eAAe,CAAC,EAC1F,CAAC,CAAC,EAAE,CAAC,CAAC,CACT,CAAC;gBACF,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACjD,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACvD,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxG,aAAC,CAAC,CAAC;AAEH,YAAA,cAAc,CAAC,OAAO,GAAG,oBAAoB,CAAC;AAClD,SAAC,CAAC;;;;AAKF,QAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAEtD,OAAO,CAAC,SAAoB,KAAI;YAC5B,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAClC,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,EAC3D,QAAQ,CACX,CAAC;AACF,YAAA,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC,YAAA,OAAO,MAAK;AACR,gBAAA,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACpC,gBAAA,WAAW,EAAE,CAAC;AAClB,aAAC,CAAC;AACN,SAAC,CAAC;AACN,KAAC,CAAC,CAAC;IAEH,eAAe,CAAC,MAAK;AACjB,QAAA,qBAAqB,EAAE,CAAC;AACxB,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,oBAAoB,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,EAAE;YACvF,OAAO,KAAK,CAAC,CAAC;SACjB;AACD,QAAA,OAAO,aAAa,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;AAClE,KAAC,EAAE;QACC,oBAAoB;QACpB,kBAAkB;QAClB,qBAAqB;QACrB,8BAA8B;QAC9B,UAAU;QACV,aAAa;AAChB,KAAA,CAAC,CAAC;;IAGH,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAC1C,aAAa,CAAC,WAAW,CAAqB,CAAC,GAAG,EAAE,KAAK,KAAI;AACzD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,GAAG,CAAC;SACd;;AAED,QAAA,OAAO,KAAK,CAAC,YAAY,CAAoB,KAAK,EAAE;YAChD,GAAG,KAAK,CAAC,KAAK;AACd,YAAA,QAAQ,EAAE,GAAG;AAChB,SAAA,CAAgB,CAAC;AACtB,KAAC,EAAE,IAAI,CAAC,KAERA,GAAA,CAAC,YAAY,EAAA,EAAA,QAAA,EAAE,QAAQ,EAAA,CAAgB,CAC1C,CAAC;AAEF,IAAA,QACIA,GAAC,CAAA,KAAK,IAAC,KAAK,EAAC,gBAAgB,EACzB,QAAA,EAAAA,GAAA,CAAC,eAAe,EAAA,EACZ,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE;AACjC,gBAAA,CAAC,MAAM,CAAC,sBAAsB,GAAG,WAAW,KAAK,OAAO;AACxD,gBAAA,CAAC,MAAM,CAAC,oBAAoB,GAAG,WAAW,KAAK,KAAK;AACpD,gBAAA,CAAC,MAAM,CAAC,oBAAoB,GAAG,CAAC,WAAW;AAC3C,gBAAA,CAAC,MAAM,CAAC,iBAAiB,GAAG,WAAW,KAAK,IAAI;AAChD,gBAAA,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO;AAClC,aAAA,CAAC,EACF,GAAG,EAAE,OAAO,EACZ,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAEpC,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,oBAAoB,EAAA,QAAA,EACvCC,cAAK,SAAS,EAAE,MAAM,CAAC,sBAAsB,EACzC,QAAA,EAAA,CAAAD,GAAA,CAAC,MAAM,CAAC,GAAG,IACP,KAAK,EAAE,EAAE,yCAAyC,EAAE,sBAAsB,EAAiB,EAC3F,SAAS,EAAE,MAAM,CAAC,oBAAoB,EAAA,QAAA,EAEtCA,GAAC,CAAA,aAAa,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,iBAAiB,YAAG,MAAM,EAAA,CAA0B,GAC1E,EACbA,GAAA,CAAC,MAAM,CAAC,GAAG,IACP,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAClC,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAEzDA,GAAC,CAAA,OAAO,KAAG,EACF,CAAA,CAAA,EAAA,CACX,GACJ,EACQ,CAAA,EAAA,CACd,EACV;AACN;;;;"}
package/public/Pane.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type FC, type JSXElementConstructor, type PropsWithChildren, type ReactElement } from 'react';
1
+ import { type FC, type ReactNode, type JSXElementConstructor, type PropsWithChildren, type ReactElement } from 'react';
2
2
  import { type MotionValue } from 'motion/react';
3
3
  export type InternalPaneProps = PropsWithChildren<{
4
4
  foldable?: boolean;
@@ -20,3 +20,4 @@ export type ExternalPaneProps = PropsWithChildren<{
20
20
  export type PaneElement = ReactElement<ExternalPaneProps, JSXElementConstructor<ExternalPaneProps>>;
21
21
  export declare const Pane: FC<InternalPaneProps>;
22
22
  export declare const ExternalPane: FC<PropsWithChildren<ExternalPaneProps>>;
23
+ export declare const isPaneElement: (node: ReactNode) => node is PaneElement;
package/public/Pane.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import './../index.css';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { Children, isValidElement, cloneElement } from 'react';
3
+ import { isValidElement, Children, cloneElement } from 'react';
4
4
  import classNames from 'classnames';
5
5
  import { useMotionValue, motion } from 'motion/react';
6
6
  import { MorphStoreProvider } from '../internal/MorphStore.js';
@@ -10,21 +10,13 @@ import { useInitOnce, useStoreSyncedTransform, lerp } from '../internal/utils.js
10
10
  import { EnvironmentFingerprintProvider } from './EnvironmentFingerprintNode.js';
11
11
  import { LayoutStage } from './LayoutStage.js';
12
12
  import { Stage } from './Stage.js';
13
- import { s as styles } from '../NavBar-Cp0mcX9W.js';
13
+ import { s as styles } from '../nav-bar-CmjjkPy6.js';
14
14
  import '../internal/KeyedSubscriptions.js';
15
15
  import 'motion';
16
+ import '../internal/NavBarContext.js';
16
17
  import '../internal/MetricsProvider.js';
17
18
  import '@hh.ru/magritte-common-use-when-font-loaded';
18
19
  import '../internal/useInert.js';
19
- import '@hh.ru/magritte-ui-divider';
20
- import '@hh.ru/magritte-ui-layer';
21
- import '../internal/useAnimationRanges.js';
22
- import '../internal/useBindScrollToAnimationProgress.js';
23
- import '../internal/useNavBarMetrics.js';
24
- import '../internal/useResetFocus.js';
25
- import '../internal/useScrollAdapter.js';
26
- import '@hh.ru/magritte-internal-custom-scroll';
27
- import '../internal/useSnapScroll.js';
28
20
 
29
21
  const renderPaneChilds = (children, foldable) => {
30
22
  const items = Children.toArray(children);
@@ -73,6 +65,7 @@ const Pane = ({ children, nextPane, foldable, animationProgress }) => {
73
65
  style: { y: nextPaneY, zIndex: nextPane.props.foldable ? 0 : 3 }, children: nextPane }))] }));
74
66
  };
75
67
  const ExternalPane = Pane;
68
+ const isPaneElement = (node) => isValidElement(node) && node.type === ExternalPane;
76
69
 
77
- export { ExternalPane, Pane };
70
+ export { ExternalPane, Pane, isPaneElement };
78
71
  //# sourceMappingURL=Pane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pane.js","sources":["src/public/Pane.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n type FC,\n type ReactNode,\n type JSXElementConstructor,\n type PropsWithChildren,\n type ReactElement,\n} from 'react';\nimport classNames from 'classnames';\nimport { useMotionValue, motion, type MotionValue } from 'motion/react';\n\nimport { MorphStoreProvider } from '@hh.ru/magritte-ui-nav-bar/internal/MorphStore';\nimport { PaneContext, usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useSyncMotionValue } from '@hh.ru/magritte-ui-nav-bar/internal/useSyncMotionValue';\nimport { lerp, useInitOnce, useStoreSyncedTransform } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { EnvironmentFingerprintProvider } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\nimport { LayoutStage } from '@hh.ru/magritte-ui-nav-bar/public/LayoutStage';\nimport { Stage, type StageProps } from '@hh.ru/magritte-ui-nav-bar/public/Stage';\n\nimport styles from './nav-bar.less';\n\nexport type InternalPaneProps = PropsWithChildren<{\n foldable?: boolean;\n nextPane?: ReactElement<InternalPaneProps, JSXElementConstructor<InternalPaneProps>> | null;\n animationProgress?: MotionValue<number>;\n}>;\nexport type ExternalPaneProps = PropsWithChildren<{\n /**\n * Включает режим когда панель \"схлопывается\" под стоящую над ней панель.\n */\n foldable?: boolean;\n /**\n * Принимает MotionValue значение которого будет обновляться синхронно с анимацией панели.\n * Прогресс анимации представляется в виде числа 0..1\n * Предназначен для синхронизации внешних анимаций с анимацией панели.\n */\n animationProgress?: MotionValue<number>;\n}>;\n\nexport type PaneElement = ReactElement<ExternalPaneProps, JSXElementConstructor<ExternalPaneProps>>;\n\nconst renderPaneChilds = (children: ReactNode, foldable: boolean) => {\n const items = Children.toArray(children);\n const stageContainers = items.filter((child) => isValidElement(child) && child.type === Stage) as ReactElement<\n StageProps,\n JSXElementConstructor<StageProps>\n >[];\n const layoutStageContainers = items.filter(\n (child) => isValidElement(child) && child.type === LayoutStage\n ) as ReactElement<PropsWithChildren, JSXElementConstructor<PropsWithChildren>>[];\n\n if ((stageContainers.length === 0 && layoutStageContainers.length === 0) || foldable) {\n return <Stage animationStage=\"only\">{children}</Stage>;\n }\n\n if (layoutStageContainers.length > 0) {\n return cloneElement(layoutStageContainers[0]);\n }\n\n stageContainers.length = Math.min(stageContainers.length, 2);\n\n return stageContainers.map((child, index) => {\n return cloneElement(child, {\n ...child.props,\n animationStage: stageContainers.length === 1 ? 'only' : (['start', 'end'] as const)[index],\n });\n });\n};\n\nexport const Pane: FC<InternalPaneProps> = ({ children, nextPane, foldable, animationProgress }) => {\n const paneStore = usePaneStore();\n\n const y = useMotionValue(0);\n const nextPaneY = useMotionValue(0);\n const backgroundScale = useMotionValue(1);\n const backgroundY = useMotionValue(0);\n useSyncMotionValue(paneStore.get('motionValue'), animationProgress);\n\n const contentHeight = useMotionValue<number | 'auto'>('auto');\n useInitOnce(() =>\n paneStore.onChange('startHeight', () => contentHeight.set(paneStore.get('startHeight') ?? 'auto'))\n );\n\n paneStore.set({ foldable });\n\n useStoreSyncedTransform(\n paneStore.get('motionValue'),\n paneStore,\n ['startHeight', 'endHeight'],\n () => ({\n start: paneStore.get('startHeight') ?? 0,\n end: paneStore.get('endHeight') ?? paneStore.get('startHeight') ?? 0,\n }),\n (height, progress) => {\n const heightDiff = height.end - height.start;\n const shift = foldable ? progress * -height.start : 0;\n y.set(shift);\n nextPaneY.set(progress * heightDiff);\n backgroundY.set(-shift);\n backgroundScale.set(\n height.start === 0 ? 1 : lerp(height.start, foldable ? 0 : height.end, progress) / height.start\n );\n }\n );\n\n return (\n <motion.div\n className={classNames(styles.pane, { [styles.lastPane]: !nextPane })}\n style={{ y: foldable ? y : 0 }}\n >\n <EnvironmentFingerprintProvider>\n <motion.div className={styles.paneContent} style={{ height: contentHeight }}>\n <PaneContext.Provider value={paneStore}>\n <MorphStoreProvider>{renderPaneChilds(children, !!foldable)}</MorphStoreProvider>\n </PaneContext.Provider>\n <motion.div\n className={styles.paneBackground}\n data-foldable={foldable}\n style={{ scaleY: backgroundScale, y: backgroundY }}\n />\n </motion.div>\n </EnvironmentFingerprintProvider>\n\n {!!nextPane && (\n <motion.div\n className={styles.nextPane}\n // если foldable уезжаем под контент, если нет то надо быть над контентом панели идущей перед\n // т.к. если контент сверху становится меньше, то во время фейда следующая панель\n // должна быть над ним, иначе исчезающий контент будет накладываться поверх панели пока\n // не дойдем до конечной точки анимации, выглядит некрасиво\n style={{ y: nextPaneY, zIndex: nextPane.props.foldable ? 0 : 3 }}\n >\n {nextPane}\n </motion.div>\n )}\n </motion.div>\n );\n};\n\nexport const ExternalPane = Pane as FC<PropsWithChildren<ExternalPaneProps>>;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Pane.js","sources":["src/public/Pane.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n type FC,\n type ReactNode,\n type JSXElementConstructor,\n type PropsWithChildren,\n type ReactElement,\n} from 'react';\nimport classNames from 'classnames';\nimport { useMotionValue, motion, type MotionValue } from 'motion/react';\n\nimport { MorphStoreProvider } from '@hh.ru/magritte-ui-nav-bar/internal/MorphStore';\nimport { PaneContext, usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useSyncMotionValue } from '@hh.ru/magritte-ui-nav-bar/internal/useSyncMotionValue';\nimport { lerp, useInitOnce, useStoreSyncedTransform } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { EnvironmentFingerprintProvider } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\nimport { LayoutStage } from '@hh.ru/magritte-ui-nav-bar/public/LayoutStage';\nimport { Stage, type StageProps } from '@hh.ru/magritte-ui-nav-bar/public/Stage';\n\nimport styles from './nav-bar.less';\n\nexport type InternalPaneProps = PropsWithChildren<{\n foldable?: boolean;\n nextPane?: ReactElement<InternalPaneProps, JSXElementConstructor<InternalPaneProps>> | null;\n animationProgress?: MotionValue<number>;\n}>;\nexport type ExternalPaneProps = PropsWithChildren<{\n /**\n * Включает режим когда панель \"схлопывается\" под стоящую над ней панель.\n */\n foldable?: boolean;\n /**\n * Принимает MotionValue значение которого будет обновляться синхронно с анимацией панели.\n * Прогресс анимации представляется в виде числа 0..1\n * Предназначен для синхронизации внешних анимаций с анимацией панели.\n */\n animationProgress?: MotionValue<number>;\n}>;\n\nexport type PaneElement = ReactElement<ExternalPaneProps, JSXElementConstructor<ExternalPaneProps>>;\n\nconst renderPaneChilds = (children: ReactNode, foldable: boolean) => {\n const items = Children.toArray(children);\n const stageContainers = items.filter((child) => isValidElement(child) && child.type === Stage) as ReactElement<\n StageProps,\n JSXElementConstructor<StageProps>\n >[];\n const layoutStageContainers = items.filter(\n (child) => isValidElement(child) && child.type === LayoutStage\n ) as ReactElement<PropsWithChildren, JSXElementConstructor<PropsWithChildren>>[];\n\n if ((stageContainers.length === 0 && layoutStageContainers.length === 0) || foldable) {\n return <Stage animationStage=\"only\">{children}</Stage>;\n }\n\n if (layoutStageContainers.length > 0) {\n return cloneElement(layoutStageContainers[0]);\n }\n\n stageContainers.length = Math.min(stageContainers.length, 2);\n\n return stageContainers.map((child, index) => {\n return cloneElement(child, {\n ...child.props,\n animationStage: stageContainers.length === 1 ? 'only' : (['start', 'end'] as const)[index],\n });\n });\n};\n\nexport const Pane: FC<InternalPaneProps> = ({ children, nextPane, foldable, animationProgress }) => {\n const paneStore = usePaneStore();\n\n const y = useMotionValue(0);\n const nextPaneY = useMotionValue(0);\n const backgroundScale = useMotionValue(1);\n const backgroundY = useMotionValue(0);\n useSyncMotionValue(paneStore.get('motionValue'), animationProgress);\n\n const contentHeight = useMotionValue<number | 'auto'>('auto');\n useInitOnce(() =>\n paneStore.onChange('startHeight', () => contentHeight.set(paneStore.get('startHeight') ?? 'auto'))\n );\n\n paneStore.set({ foldable });\n\n useStoreSyncedTransform(\n paneStore.get('motionValue'),\n paneStore,\n ['startHeight', 'endHeight'],\n () => ({\n start: paneStore.get('startHeight') ?? 0,\n end: paneStore.get('endHeight') ?? paneStore.get('startHeight') ?? 0,\n }),\n (height, progress) => {\n const heightDiff = height.end - height.start;\n const shift = foldable ? progress * -height.start : 0;\n y.set(shift);\n nextPaneY.set(progress * heightDiff);\n backgroundY.set(-shift);\n backgroundScale.set(\n height.start === 0 ? 1 : lerp(height.start, foldable ? 0 : height.end, progress) / height.start\n );\n }\n );\n\n return (\n <motion.div\n className={classNames(styles.pane, { [styles.lastPane]: !nextPane })}\n style={{ y: foldable ? y : 0 }}\n >\n <EnvironmentFingerprintProvider>\n <motion.div className={styles.paneContent} style={{ height: contentHeight }}>\n <PaneContext.Provider value={paneStore}>\n <MorphStoreProvider>{renderPaneChilds(children, !!foldable)}</MorphStoreProvider>\n </PaneContext.Provider>\n <motion.div\n className={styles.paneBackground}\n data-foldable={foldable}\n style={{ scaleY: backgroundScale, y: backgroundY }}\n />\n </motion.div>\n </EnvironmentFingerprintProvider>\n\n {!!nextPane && (\n <motion.div\n className={styles.nextPane}\n // если foldable уезжаем под контент, если нет то надо быть над контентом панели идущей перед\n // т.к. если контент сверху становится меньше, то во время фейда следующая панель\n // должна быть над ним, иначе исчезающий контент будет накладываться поверх панели пока\n // не дойдем до конечной точки анимации, выглядит некрасиво\n style={{ y: nextPaneY, zIndex: nextPane.props.foldable ? 0 : 3 }}\n >\n {nextPane}\n </motion.div>\n )}\n </motion.div>\n );\n};\n\nexport const ExternalPane = Pane as FC<PropsWithChildren<ExternalPaneProps>>;\n\nexport const isPaneElement = (node: ReactNode): node is PaneElement =>\n isValidElement(node) && node.type === ExternalPane;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
package/public/Stage.js CHANGED
@@ -7,20 +7,11 @@ import { useMeasureAuto } from '../internal/MetricsProvider.js';
7
7
  import { usePaneStore } from '../internal/PaneStore.js';
8
8
  import { useInert } from '../internal/useInert.js';
9
9
  import { EnvironmentFingerprintNode } from './EnvironmentFingerprintNode.js';
10
- import { s as styles } from '../NavBar-Cp0mcX9W.js';
10
+ import { s as styles } from '../nav-bar-CmjjkPy6.js';
11
11
  import '../internal/utils.js';
12
12
  import 'motion';
13
13
  import '../internal/KeyedSubscriptions.js';
14
- import '@hh.ru/magritte-ui-divider';
15
- import '@hh.ru/magritte-ui-layer';
16
- import '../internal/useAnimationRanges.js';
17
- import '../internal/useBindScrollToAnimationProgress.js';
18
- import '../internal/useNavBarMetrics.js';
19
- import '../internal/useResetFocus.js';
20
- import '../internal/useScrollAdapter.js';
21
- import '@hh.ru/magritte-internal-custom-scroll';
22
- import '../internal/useSnapScroll.js';
23
- import '../internal/useSyncMotionValue.js';
14
+ import '../internal/NavBarContext.js';
24
15
 
25
16
  const AnimationStageContext = createContext('only');
26
17
  const useAnimationStage = () => useContext(AnimationStageContext);
@@ -1 +1 @@
1
- {"version":3,"file":"Stage.js","sources":["src/public/Stage.tsx"],"sourcesContent":["import { createContext, useContext, useLayoutEffect, useRef, type FC, type PropsWithChildren } from 'react';\nimport classNames from 'classnames';\nimport { useTransform, motion, HTMLMotionProps } from 'motion/react';\n\nimport { useMeasureAuto } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useInert } from '@hh.ru/magritte-ui-nav-bar/internal/useInert';\nimport { EnvironmentFingerprintNode } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\n\nimport styles from './nav-bar.less';\n\ntype AnimationStage = 'start' | 'end' | 'only';\n\nconst AnimationStageContext = createContext<AnimationStage>('only');\n\nexport const useAnimationStage = (): AnimationStage => useContext(AnimationStageContext);\n\nexport type StageProps = PropsWithChildren<{ animationStage?: AnimationStage } & HTMLMotionProps<'div'>>;\n\nexport const Stage: FC<StageProps> = ({ children, animationStage = 'only', ...rest }) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const paneStore = usePaneStore();\n const isStartStage = animationStage === 'start' || animationStage === 'only';\n const isEndStage = animationStage === 'end' || animationStage === 'only';\n const isOnlyStage = animationStage === 'only';\n const motionValue = paneStore.get('motionValue');\n const opacity = useTransform(motionValue, [0, 1], isStartStage ? [1, 0] : [0, 1]);\n const [refCb, setInert] = useInert();\n const pointerEvents = useTransform(motionValue, (value) => {\n const pointerEvents =\n isOnlyStage || (isStartStage && value < 0.5) || (isEndStage && value > 0.5) ? 'auto' : 'none';\n setInert(pointerEvents === 'none');\n return pointerEvents;\n });\n\n useLayoutEffect(() => {\n if (animationStage !== 'end') {\n return void 0;\n }\n paneStore.set({ animated: true });\n return () => paneStore.set({ animated: false });\n }, [paneStore, animationStage]);\n\n useMeasureAuto(\n rootRef,\n (rect) => paneStore.set({ top: rect.top, [isStartStage ? 'startHeight' : 'endHeight']: rect.height }),\n [animationStage, paneStore]\n );\n\n return (\n <motion.div\n {...rest}\n ref={refCb}\n className={isStartStage ? styles.startStateContainer : styles.endStateContainer}\n style={isOnlyStage && !paneStore.get('foldable') ? {} : { opacity, pointerEvents }}\n >\n <EnvironmentFingerprintNode\n ref={rootRef}\n className={classNames(styles.contentContainer, styles.navBarStage)}\n >\n <AnimationStageContext.Provider value={animationStage ?? 'only'}>\n {children}\n </AnimationStageContext.Provider>\n </EnvironmentFingerprintNode>\n </motion.div>\n );\n};\n\nexport const ExternalStage = Stage as FC<PropsWithChildren>;\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Stage.js","sources":["src/public/Stage.tsx"],"sourcesContent":["import { createContext, useContext, useLayoutEffect, useRef, type FC, type PropsWithChildren } from 'react';\nimport classNames from 'classnames';\nimport { useTransform, motion, HTMLMotionProps } from 'motion/react';\n\nimport { useMeasureAuto } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useInert } from '@hh.ru/magritte-ui-nav-bar/internal/useInert';\nimport { EnvironmentFingerprintNode } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\n\nimport styles from './nav-bar.less';\n\ntype AnimationStage = 'start' | 'end' | 'only';\n\nconst AnimationStageContext = createContext<AnimationStage>('only');\n\nexport const useAnimationStage = (): AnimationStage => useContext(AnimationStageContext);\n\nexport type StageProps = PropsWithChildren<{ animationStage?: AnimationStage } & HTMLMotionProps<'div'>>;\n\nexport const Stage: FC<StageProps> = ({ children, animationStage = 'only', ...rest }) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const paneStore = usePaneStore();\n const isStartStage = animationStage === 'start' || animationStage === 'only';\n const isEndStage = animationStage === 'end' || animationStage === 'only';\n const isOnlyStage = animationStage === 'only';\n const motionValue = paneStore.get('motionValue');\n const opacity = useTransform(motionValue, [0, 1], isStartStage ? [1, 0] : [0, 1]);\n const [refCb, setInert] = useInert();\n const pointerEvents = useTransform(motionValue, (value) => {\n const pointerEvents =\n isOnlyStage || (isStartStage && value < 0.5) || (isEndStage && value > 0.5) ? 'auto' : 'none';\n setInert(pointerEvents === 'none');\n return pointerEvents;\n });\n\n useLayoutEffect(() => {\n if (animationStage !== 'end') {\n return void 0;\n }\n paneStore.set({ animated: true });\n return () => paneStore.set({ animated: false });\n }, [paneStore, animationStage]);\n\n useMeasureAuto(\n rootRef,\n (rect) => paneStore.set({ top: rect.top, [isStartStage ? 'startHeight' : 'endHeight']: rect.height }),\n [animationStage, paneStore]\n );\n\n return (\n <motion.div\n {...rest}\n ref={refCb}\n className={isStartStage ? styles.startStateContainer : styles.endStateContainer}\n style={isOnlyStage && !paneStore.get('foldable') ? {} : { opacity, pointerEvents }}\n >\n <EnvironmentFingerprintNode\n ref={rootRef}\n className={classNames(styles.contentContainer, styles.navBarStage)}\n >\n <AnimationStageContext.Provider value={animationStage ?? 'only'}>\n {children}\n </AnimationStageContext.Provider>\n </EnvironmentFingerprintNode>\n </motion.div>\n );\n};\n\nexport const ExternalStage = Stage as FC<PropsWithChildren>;\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;AAaA,MAAM,qBAAqB,GAAG,aAAa,CAAiB,MAAM,CAAC,CAAC;AAEvD,MAAA,iBAAiB,GAAG,MAAsB,UAAU,CAAC,qBAAqB,EAAE;AAI5E,MAAA,KAAK,GAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,KAAI;AACpF,IAAA,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AAC7C,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,YAAY,GAAG,cAAc,KAAK,OAAO,IAAI,cAAc,KAAK,MAAM,CAAC;IAC7E,MAAM,UAAU,GAAG,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,MAAM,CAAC;AACzE,IAAA,MAAM,WAAW,GAAG,cAAc,KAAK,MAAM,CAAC;IAC9C,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACjD,IAAA,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,KAAK,KAAI;QACtD,MAAM,aAAa,GACf,WAAW,KAAK,YAAY,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;AAClG,QAAA,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC;AACnC,QAAA,OAAO,aAAa,CAAC;AACzB,KAAC,CAAC,CAAC;IAEH,eAAe,CAAC,MAAK;AACjB,QAAA,IAAI,cAAc,KAAK,KAAK,EAAE;YAC1B,OAAO,KAAK,CAAC,CAAC;SACjB;QACD,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAClC,QAAA,OAAO,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,KAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;AAEhC,IAAA,cAAc,CACV,OAAO,EACP,CAAC,IAAI,KAAK,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EACrG,CAAC,cAAc,EAAE,SAAS,CAAC,CAC9B,CAAC;AAEF,IAAA,QACIA,GAAC,CAAA,MAAM,CAAC,GAAG,EAAA,EAAA,GACH,IAAI,EACR,GAAG,EAAE,KAAK,EACV,SAAS,EAAE,YAAY,GAAG,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,EAC/E,KAAK,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,EAAA,QAAA,EAElFA,IAAC,0BAA0B,EAAA,EACvB,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,EAAA,QAAA,EAElEA,IAAC,qBAAqB,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,cAAc,IAAI,MAAM,EAC1D,QAAA,EAAA,QAAQ,GACoB,EACR,CAAA,EAAA,CACpB,EACf;AACN,EAAE;AAEK,MAAM,aAAa,GAAG;;;;"}
@@ -20,5 +20,6 @@ export interface TitleContainerProps {
20
20
  * Позволяет выровнять по горизонтали контент слотов для заголовка и подзаголовка
21
21
  */
22
22
  centered?: boolean;
23
+ size?: 'large' | 'small';
23
24
  }
24
25
  export declare const TitleContainer: FC<TitleContainerProps>;
@@ -2,7 +2,8 @@ import './../index.css';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import classNames from 'classnames';
4
4
  import { Morph } from './Morph.js';
5
- import { s as styles } from '../NavBar-Cp0mcX9W.js';
5
+ import { TextDefaultPropsContext } from '@hh.ru/magritte-ui-typography';
6
+ import { s as styles } from '../nav-bar-CmjjkPy6.js';
6
7
  import 'react';
7
8
  import 'motion/react';
8
9
  import '../internal/MetricsProvider.js';
@@ -11,22 +12,35 @@ import 'motion';
11
12
  import '../internal/MorphStore.js';
12
13
  import '../internal/KeyedSubscriptions.js';
13
14
  import '../internal/PaneStore.js';
15
+ import '../internal/NavBarContext.js';
14
16
  import './EnvironmentFingerprintNode.js';
15
17
  import './Stage.js';
16
18
  import '../internal/useInert.js';
17
- import '@hh.ru/magritte-ui-divider';
18
- import '@hh.ru/magritte-ui-layer';
19
- import '../internal/useAnimationRanges.js';
20
- import '../internal/useBindScrollToAnimationProgress.js';
21
- import '../internal/useNavBarMetrics.js';
22
- import '../internal/useResetFocus.js';
23
- import '../internal/useScrollAdapter.js';
24
- import '@hh.ru/magritte-internal-custom-scroll';
25
- import '../internal/useSnapScroll.js';
26
- import '../internal/useSyncMotionValue.js';
27
19
 
28
- const TitleContainer = ({ left, title, icon, subtitle, centered = false }) => {
29
- return (jsxs("div", { className: styles.titleContainerWrapper, children: [!!left && (jsx("div", { className: styles.titleLeftSlot, children: jsx(Morph, { id: "title-component-left-slot", className: styles.titleMorphItem, children: left }) })), jsxs("div", { className: classNames(styles.titleMainPart, { [styles.centered]: centered }), children: [jsxs("div", { className: styles.titleContainer, children: [jsx("div", { className: styles.title, children: !!title && (jsx(Morph, { id: "title-component-title", className: styles.titleMorphItem, horizontalPositionAlign: "left", children: title })) }), jsx("div", { className: styles.titleInlineContainer, children: !!icon && (jsx(Morph, { id: "title-component-inline-slot", className: styles.titleMorphItem, children: icon })) })] }), jsx("div", { className: styles.subtitleContainer, children: !!subtitle && (jsx(Morph, { id: "title-component-subtitle", className: styles.titleMorphItem, horizontalPositionAlign: "left", children: subtitle })) })] })] }));
20
+ const TEXT_DEFAULT_PROPS_TITLE = {
21
+ small: {
22
+ typography: 'subtitle-1-semibold',
23
+ style: 'primary',
24
+ },
25
+ large: {
26
+ typography: 'title-4-semibold',
27
+ style: 'primary',
28
+ },
29
+ };
30
+ const TEXT_DEFAULT_PROPS_SUBTITLE = {
31
+ small: {
32
+ typography: 'label-4-regular',
33
+ style: 'secondary',
34
+ },
35
+ large: {
36
+ typography: 'label-2-regular',
37
+ style: 'secondary',
38
+ },
39
+ };
40
+ const TitleContainer = ({ left, title, icon, subtitle, size = 'small', centered = false, }) => {
41
+ return (jsxs("div", { className: classNames(styles.titleContainerWrapper, {
42
+ [styles.sizeLarge]: size === 'large',
43
+ }), children: [!!left && (jsx("div", { className: styles.titleLeftSlot, children: jsx(Morph, { id: "title-component-left-slot", className: styles.titleMorphItem, children: left }) })), jsxs("div", { className: classNames(styles.titleMainPart, { [styles.centered]: centered }), children: [jsxs("div", { className: styles.titleContainer, children: [jsx("div", { className: styles.title, children: !!title && (jsx(TextDefaultPropsContext, { props: TEXT_DEFAULT_PROPS_TITLE[size], children: jsx(Morph, { id: "title-component-title", className: classNames(styles.titleMorphItem, styles.textMorphItem), horizontalPositionAlign: "left", children: title }) })) }), jsx("div", { className: styles.titleInlineContainer, children: !!icon && (jsx(Morph, { id: "title-component-inline-slot", className: styles.titleMorphItem, children: icon })) })] }), jsx("div", { className: styles.subtitleContainer, children: !!subtitle && (jsx(TextDefaultPropsContext, { props: TEXT_DEFAULT_PROPS_SUBTITLE[size], children: jsx(Morph, { id: "title-component-subtitle", className: classNames(styles.titleMorphItem, styles.textMorphItem), horizontalPositionAlign: "left", children: subtitle }) })) })] })] }));
30
44
  };
31
45
 
32
46
  export { TitleContainer };
@@ -1 +1 @@
1
- {"version":3,"file":"TitleContainer.js","sources":["src/public/TitleContainer.tsx"],"sourcesContent":["import { type FC, type ReactNode } from 'react';\nimport classNames from 'classnames';\n\nimport { Morph } from '@hh.ru/magritte-ui-nav-bar/public/Morph';\n\nimport styles from './nav-bar.less';\n\nexport interface TitleContainerProps {\n /**\n * Контент левого слота\n */\n left?: ReactNode;\n /**\n * Контент слота для заголовка\n */\n title?: ReactNode;\n /**\n * Контент слота для подзаголовка\n */\n subtitle?: ReactNode;\n /**\n * Контент слота справа от заголовка\n */\n icon?: ReactNode;\n /**\n * Позволяет выровнять по горизонтали контент слотов для заголовка и подзаголовка\n */\n centered?: boolean;\n}\n\nexport const TitleContainer: FC<TitleContainerProps> = ({ left, title, icon, subtitle, centered = false }) => {\n return (\n <div className={styles.titleContainerWrapper}>\n {!!left && (\n <div className={styles.titleLeftSlot}>\n <Morph id=\"title-component-left-slot\" className={styles.titleMorphItem}>\n {left}\n </Morph>\n </div>\n )}\n <div className={classNames(styles.titleMainPart, { [styles.centered]: centered })}>\n <div className={styles.titleContainer}>\n <div className={styles.title}>\n {!!title && (\n <Morph\n id=\"title-component-title\"\n className={styles.titleMorphItem}\n horizontalPositionAlign=\"left\"\n >\n {title}\n </Morph>\n )}\n </div>\n <div className={styles.titleInlineContainer}>\n {!!icon && (\n <Morph id=\"title-component-inline-slot\" className={styles.titleMorphItem}>\n {icon}\n </Morph>\n )}\n </div>\n </div>\n <div className={styles.subtitleContainer}>\n {!!subtitle && (\n <Morph\n id=\"title-component-subtitle\"\n className={styles.titleMorphItem}\n horizontalPositionAlign=\"left\"\n >\n {subtitle}\n </Morph>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8Ba,MAAA,cAAc,GAA4B,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,KAAI;AACzG,IAAA,QACIA,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,qBAAqB,EAAA,QAAA,EAAA,CACvC,CAAC,CAAC,IAAI,KACHC,aAAK,SAAS,EAAE,MAAM,CAAC,aAAa,EAChC,QAAA,EAAAA,GAAA,CAAC,KAAK,EAAC,EAAA,EAAE,EAAC,2BAA2B,EAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EACjE,QAAA,EAAA,IAAI,GACD,EACN,CAAA,CACT,EACDD,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,CAC7EA,cAAK,SAAS,EAAE,MAAM,CAAC,cAAc,EACjC,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EACvB,CAAC,CAAC,KAAK,KACJA,IAAC,KAAK,EAAA,EACF,EAAE,EAAC,uBAAuB,EAC1B,SAAS,EAAE,MAAM,CAAC,cAAc,EAChC,uBAAuB,EAAC,MAAM,EAE7B,QAAA,EAAA,KAAK,GACF,CACX,EAAA,CACC,EACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,oBAAoB,EAAA,QAAA,EACtC,CAAC,CAAC,IAAI,KACHA,IAAC,KAAK,EAAA,EAAC,EAAE,EAAC,6BAA6B,EAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EACnE,QAAA,EAAA,IAAI,EACD,CAAA,CACX,GACC,CACJ,EAAA,CAAA,EACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,iBAAiB,EAAA,QAAA,EACnC,CAAC,CAAC,QAAQ,KACPA,GAAA,CAAC,KAAK,EACF,EAAA,EAAE,EAAC,0BAA0B,EAC7B,SAAS,EAAE,MAAM,CAAC,cAAc,EAChC,uBAAuB,EAAC,MAAM,EAAA,QAAA,EAE7B,QAAQ,EACL,CAAA,CACX,GACC,CACJ,EAAA,CAAA,CAAA,EAAA,CACJ,EACR;AACN;;;;"}
1
+ {"version":3,"file":"TitleContainer.js","sources":["src/public/TitleContainer.tsx"],"sourcesContent":["import { type FC, type ReactNode } from 'react';\nimport classNames from 'classnames';\n\nimport { Morph } from '@hh.ru/magritte-ui-nav-bar/public/Morph';\nimport { TextDefaultPropsContext } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './nav-bar.less';\n\nconst TEXT_DEFAULT_PROPS_TITLE = {\n small: {\n typography: 'subtitle-1-semibold',\n style: 'primary',\n },\n large: {\n typography: 'title-4-semibold',\n style: 'primary',\n },\n} as const;\n\nconst TEXT_DEFAULT_PROPS_SUBTITLE = {\n small: {\n typography: 'label-4-regular',\n style: 'secondary',\n },\n large: {\n typography: 'label-2-regular',\n style: 'secondary',\n },\n} as const;\n\nexport interface TitleContainerProps {\n /**\n * Контент левого слота\n */\n left?: ReactNode;\n /**\n * Контент слота для заголовка\n */\n title?: ReactNode;\n /**\n * Контент слота для подзаголовка\n */\n subtitle?: ReactNode;\n /**\n * Контент слота справа от заголовка\n */\n icon?: ReactNode;\n /**\n * Позволяет выровнять по горизонтали контент слотов для заголовка и подзаголовка\n */\n centered?: boolean;\n size?: 'large' | 'small';\n}\n\nexport const TitleContainer: FC<TitleContainerProps> = ({\n left,\n title,\n icon,\n subtitle,\n size = 'small',\n centered = false,\n}) => {\n return (\n <div\n className={classNames(styles.titleContainerWrapper, {\n [styles.sizeLarge]: size === 'large',\n })}\n >\n {!!left && (\n <div className={styles.titleLeftSlot}>\n <Morph id=\"title-component-left-slot\" className={styles.titleMorphItem}>\n {left}\n </Morph>\n </div>\n )}\n <div className={classNames(styles.titleMainPart, { [styles.centered]: centered })}>\n <div className={styles.titleContainer}>\n <div className={styles.title}>\n {!!title && (\n <TextDefaultPropsContext props={TEXT_DEFAULT_PROPS_TITLE[size]}>\n <Morph\n id=\"title-component-title\"\n className={classNames(styles.titleMorphItem, styles.textMorphItem)}\n horizontalPositionAlign=\"left\"\n >\n {title}\n </Morph>\n </TextDefaultPropsContext>\n )}\n </div>\n <div className={styles.titleInlineContainer}>\n {!!icon && (\n <Morph id=\"title-component-inline-slot\" className={styles.titleMorphItem}>\n {icon}\n </Morph>\n )}\n </div>\n </div>\n <div className={styles.subtitleContainer}>\n {!!subtitle && (\n <TextDefaultPropsContext props={TEXT_DEFAULT_PROPS_SUBTITLE[size]}>\n <Morph\n id=\"title-component-subtitle\"\n className={classNames(styles.titleMorphItem, styles.textMorphItem)}\n horizontalPositionAlign=\"left\"\n >\n {subtitle}\n </Morph>\n </TextDefaultPropsContext>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;AAQA,MAAM,wBAAwB,GAAG;AAC7B,IAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,qBAAqB;AACjC,QAAA,KAAK,EAAE,SAAS;AACnB,KAAA;AACD,IAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,kBAAkB;AAC9B,QAAA,KAAK,EAAE,SAAS;AACnB,KAAA;CACK,CAAC;AAEX,MAAM,2BAA2B,GAAG;AAChC,IAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,iBAAiB;AAC7B,QAAA,KAAK,EAAE,WAAW;AACrB,KAAA;AACD,IAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,iBAAiB;AAC7B,QAAA,KAAK,EAAE,WAAW;AACrB,KAAA;CACK,CAAC;MA0BE,cAAc,GAA4B,CAAC,EACpD,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,GAAG,OAAO,EACd,QAAQ,GAAG,KAAK,GACnB,KAAI;IACD,QACIA,cACI,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,qBAAqB,EAAE;AAChD,YAAA,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,KAAK,OAAO;SACvC,CAAC,EAAA,QAAA,EAAA,CAED,CAAC,CAAC,IAAI,KACHC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAChCA,IAAC,KAAK,EAAA,EAAC,EAAE,EAAC,2BAA2B,EAAC,SAAS,EAAE,MAAM,CAAC,cAAc,YACjE,IAAI,EAAA,CACD,GACN,CACT,EACDD,cAAK,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,aAC7EA,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,cAAc,EACjC,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EACvB,CAAC,CAAC,KAAK,KACJA,GAAC,CAAA,uBAAuB,IAAC,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,EAC1D,QAAA,EAAAA,GAAA,CAAC,KAAK,EACF,EAAA,EAAE,EAAC,uBAAuB,EAC1B,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,EAClE,uBAAuB,EAAC,MAAM,YAE7B,KAAK,EAAA,CACF,GACc,CAC7B,EAAA,CACC,EACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,oBAAoB,EACtC,QAAA,EAAA,CAAC,CAAC,IAAI,KACHA,IAAC,KAAK,EAAA,EAAC,EAAE,EAAC,6BAA6B,EAAC,SAAS,EAAE,MAAM,CAAC,cAAc,YACnE,IAAI,EAAA,CACD,CACX,EACC,CAAA,CAAA,EAAA,CACJ,EACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,iBAAiB,YACnC,CAAC,CAAC,QAAQ,KACPA,IAAC,uBAAuB,EAAA,EAAC,KAAK,EAAE,2BAA2B,CAAC,IAAI,CAAC,YAC7DA,GAAC,CAAA,KAAK,IACF,EAAE,EAAC,0BAA0B,EAC7B,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,EAClE,uBAAuB,EAAC,MAAM,EAAA,QAAA,EAE7B,QAAQ,EACL,CAAA,EAAA,CACc,CAC7B,EACC,CAAA,CAAA,EAAA,CACJ,CACJ,EAAA,CAAA,EACR;AACN;;;;"}
@@ -0,0 +1,40 @@
1
+ import { type FC, type ReactNode } from 'react';
2
+ import type { IconProps } from '@hh.ru/magritte-ui-icon/types';
3
+ import type { ActionsProps } from '@hh.ru/magritte-ui-nav-bar/public/Actions';
4
+ import type { NavBarProps } from '@hh.ru/magritte-ui-nav-bar/public/NavBar';
5
+ /** Внутренний хук чтения дефолтов корневых пропсов `NavBar` из ближайшего `NavBarDefaultPropsContext`. */
6
+ export declare const useNavBarRootDefaultProps: () => Partial<NavBarProps>;
7
+ /** Внутренний хук чтения дефолтов `Actions` из ближайшего `NavBarDefaultPropsContext`. */
8
+ export declare const useActionsDefaultProps: () => Partial<ActionsProps>;
9
+ /** Внутренний хук чтения переопределений дефолтов иконок боковых слотов `Actions`. */
10
+ export declare const useActionsIconsDefaultProps: () => Partial<IconProps>;
11
+ export interface NavBarDefaultPropsContextProps {
12
+ /**
13
+ * Дефолтные пропсы для самого `NavBar` в поддереве (например `startTriggerPosition` /
14
+ * `endTriggerPosition`) — явные пропсы на самом `NavBar` побеждают.
15
+ */
16
+ rootProps?: Partial<NavBarProps>;
17
+ /** Дефолтные пропсы для всех `Actions` в поддереве — явные пропсы на самом `Actions` побеждают. */
18
+ actionsProps?: Partial<ActionsProps>;
19
+ /**
20
+ * Переопределение дефолтных пропсов иконок в боковых слотах `Actions` (`left` / `right`).
21
+ * Мёржится поверх базовых дефолтов боковых иконок; на иконки центрального слота не влияет.
22
+ */
23
+ actionsIconsProps?: Partial<IconProps>;
24
+ /**
25
+ * Если `true`, заданные здесь дефолты форсируются: по пересекающимся ключам они побеждают
26
+ * любой вложенный (внутренний) провайдер, а не наоборот. Явные пропсы на самом компоненте
27
+ * по-прежнему перекрывают любой дефолт. Применяется ко всем слотам.
28
+ * @default false
29
+ */
30
+ important?: boolean;
31
+ children?: ReactNode;
32
+ }
33
+ /**
34
+ * Провайдер дефолтных пропсов для подкомпонентов NavBar в поддереве.
35
+ *
36
+ * Под капотом раскладывает пропсы по изолированным, типизированным контекстам каждого подкомпонента
37
+ * (`actions` → контекст `Actions` и т.д.), а подкомпоненты читают свои дефолты через собственные хуки.
38
+ * Добавление поддержки нового подкомпонента = новое поле-слот здесь + чтение в этом подкомпоненте.
39
+ */
40
+ export declare const NavBarDefaultPropsContext: FC<NavBarDefaultPropsContextProps>;
@@ -0,0 +1,36 @@
1
+ import './../index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { createDefaultPropsContext } from '@hh.ru/magritte-internal-default-props-context';
4
+
5
+ /**
6
+ * Стабильные ссылки на пустые дефолты для незаданных слотов. Объявлены на уровне модуля,
7
+ * чтобы не создавать новый объект на каждый рендер composite-провайдера — иначе внутренний
8
+ * провайдер слота пересчитывал бы свёртку дефолтов вхолостую на каждый рендер.
9
+ */
10
+ const EMPTY_ACTIONS_PROPS = {};
11
+ const EMPTY_ICON_PROPS = {};
12
+ const EMPTY_ROOT_PROPS = {};
13
+ const rootContext = createDefaultPropsContext('NavBarRoot');
14
+ const actionsContext = createDefaultPropsContext('NavBarActions');
15
+ const actionsIconsContext = createDefaultPropsContext('NavBarActionsIcons');
16
+ const RootDefaultPropsContext = rootContext.DefaultPropsContext;
17
+ const ActionsDefaultPropsContext = actionsContext.DefaultPropsContext;
18
+ const ActionsIconsDefaultPropsContext = actionsIconsContext.DefaultPropsContext;
19
+ /** Внутренний хук чтения дефолтов корневых пропсов `NavBar` из ближайшего `NavBarDefaultPropsContext`. */
20
+ const useNavBarRootDefaultProps = rootContext.useDefaultProps;
21
+ /** Внутренний хук чтения дефолтов `Actions` из ближайшего `NavBarDefaultPropsContext`. */
22
+ const useActionsDefaultProps = actionsContext.useDefaultProps;
23
+ /** Внутренний хук чтения переопределений дефолтов иконок боковых слотов `Actions`. */
24
+ const useActionsIconsDefaultProps = actionsIconsContext.useDefaultProps;
25
+ /**
26
+ * Провайдер дефолтных пропсов для подкомпонентов NavBar в поддереве.
27
+ *
28
+ * Под капотом раскладывает пропсы по изолированным, типизированным контекстам каждого подкомпонента
29
+ * (`actions` → контекст `Actions` и т.д.), а подкомпоненты читают свои дефолты через собственные хуки.
30
+ * Добавление поддержки нового подкомпонента = новое поле-слот здесь + чтение в этом подкомпоненте.
31
+ */
32
+ const NavBarDefaultPropsContext = ({ rootProps: root = EMPTY_ROOT_PROPS, actionsProps: actions = EMPTY_ACTIONS_PROPS, actionsIconsProps: actionsIcons = EMPTY_ICON_PROPS, important = false, children, }) => (jsx(RootDefaultPropsContext, { props: root, important: important, children: jsx(ActionsDefaultPropsContext, { props: actions, important: important, children: jsx(ActionsIconsDefaultPropsContext, { props: actionsIcons, important: important, children: children }) }) }));
33
+ NavBarDefaultPropsContext.displayName = 'NavBarDefaultPropsContext';
34
+
35
+ export { NavBarDefaultPropsContext, useActionsDefaultProps, useActionsIconsDefaultProps, useNavBarRootDefaultProps };
36
+ //# sourceMappingURL=defaultProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultProps.js","sources":["src/public/defaultProps.tsx"],"sourcesContent":["import { type FC, type ReactNode } from 'react';\n\nimport { createDefaultPropsContext } from '@hh.ru/magritte-internal-default-props-context';\nimport type { IconProps } from '@hh.ru/magritte-ui-icon/types';\nimport type { ActionsProps } from '@hh.ru/magritte-ui-nav-bar/public/Actions';\nimport type { NavBarProps } from '@hh.ru/magritte-ui-nav-bar/public/NavBar';\n\n/**\n * Стабильные ссылки на пустые дефолты для незаданных слотов. Объявлены на уровне модуля,\n * чтобы не создавать новый объект на каждый рендер composite-провайдера — иначе внутренний\n * провайдер слота пересчитывал бы свёртку дефолтов вхолостую на каждый рендер.\n */\nconst EMPTY_ACTIONS_PROPS: Partial<ActionsProps> = {};\nconst EMPTY_ICON_PROPS: Partial<IconProps> = {};\nconst EMPTY_ROOT_PROPS: Partial<NavBarProps> = {};\n\nconst rootContext = createDefaultPropsContext<NavBarProps>('NavBarRoot');\nconst actionsContext = createDefaultPropsContext<ActionsProps>('NavBarActions');\nconst actionsIconsContext = createDefaultPropsContext<IconProps>('NavBarActionsIcons');\n\nconst RootDefaultPropsContext = rootContext.DefaultPropsContext;\nconst ActionsDefaultPropsContext = actionsContext.DefaultPropsContext;\nconst ActionsIconsDefaultPropsContext = actionsIconsContext.DefaultPropsContext;\n\n/** Внутренний хук чтения дефолтов корневых пропсов `NavBar` из ближайшего `NavBarDefaultPropsContext`. */\nexport const useNavBarRootDefaultProps = rootContext.useDefaultProps;\n\n/** Внутренний хук чтения дефолтов `Actions` из ближайшего `NavBarDefaultPropsContext`. */\nexport const useActionsDefaultProps = actionsContext.useDefaultProps;\n\n/** Внутренний хук чтения переопределений дефолтов иконок боковых слотов `Actions`. */\nexport const useActionsIconsDefaultProps = actionsIconsContext.useDefaultProps;\n\nexport interface NavBarDefaultPropsContextProps {\n /**\n * Дефолтные пропсы для самого `NavBar` в поддереве (например `startTriggerPosition` /\n * `endTriggerPosition`) — явные пропсы на самом `NavBar` побеждают.\n */\n rootProps?: Partial<NavBarProps>;\n /** Дефолтные пропсы для всех `Actions` в поддереве — явные пропсы на самом `Actions` побеждают. */\n actionsProps?: Partial<ActionsProps>;\n /**\n * Переопределение дефолтных пропсов иконок в боковых слотах `Actions` (`left` / `right`).\n * Мёржится поверх базовых дефолтов боковых иконок; на иконки центрального слота не влияет.\n */\n actionsIconsProps?: Partial<IconProps>;\n /**\n * Если `true`, заданные здесь дефолты форсируются: по пересекающимся ключам они побеждают\n * любой вложенный (внутренний) провайдер, а не наоборот. Явные пропсы на самом компоненте\n * по-прежнему перекрывают любой дефолт. Применяется ко всем слотам.\n * @default false\n */\n important?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Провайдер дефолтных пропсов для подкомпонентов NavBar в поддереве.\n *\n * Под капотом раскладывает пропсы по изолированным, типизированным контекстам каждого подкомпонента\n * (`actions` → контекст `Actions` и т.д.), а подкомпоненты читают свои дефолты через собственные хуки.\n * Добавление поддержки нового подкомпонента = новое поле-слот здесь + чтение в этом подкомпоненте.\n */\nexport const NavBarDefaultPropsContext: FC<NavBarDefaultPropsContextProps> = ({\n rootProps: root = EMPTY_ROOT_PROPS,\n actionsProps: actions = EMPTY_ACTIONS_PROPS,\n actionsIconsProps: actionsIcons = EMPTY_ICON_PROPS,\n important = false,\n children,\n}) => (\n <RootDefaultPropsContext props={root} important={important}>\n <ActionsDefaultPropsContext props={actions} important={important}>\n <ActionsIconsDefaultPropsContext props={actionsIcons} important={important}>\n {children}\n </ActionsIconsDefaultPropsContext>\n </ActionsDefaultPropsContext>\n </RootDefaultPropsContext>\n);\n\nNavBarDefaultPropsContext.displayName = 'NavBarDefaultPropsContext';\n"],"names":["_jsx"],"mappings":";;;AAOA;;;;AAIG;AACH,MAAM,mBAAmB,GAA0B,EAAE,CAAC;AACtD,MAAM,gBAAgB,GAAuB,EAAE,CAAC;AAChD,MAAM,gBAAgB,GAAyB,EAAE,CAAC;AAElD,MAAM,WAAW,GAAG,yBAAyB,CAAc,YAAY,CAAC,CAAC;AACzE,MAAM,cAAc,GAAG,yBAAyB,CAAe,eAAe,CAAC,CAAC;AAChF,MAAM,mBAAmB,GAAG,yBAAyB,CAAY,oBAAoB,CAAC,CAAC;AAEvF,MAAM,uBAAuB,GAAG,WAAW,CAAC,mBAAmB,CAAC;AAChE,MAAM,0BAA0B,GAAG,cAAc,CAAC,mBAAmB,CAAC;AACtE,MAAM,+BAA+B,GAAG,mBAAmB,CAAC,mBAAmB,CAAC;AAEhF;AACa,MAAA,yBAAyB,GAAG,WAAW,CAAC,gBAAgB;AAErE;AACa,MAAA,sBAAsB,GAAG,cAAc,CAAC,gBAAgB;AAErE;AACa,MAAA,2BAA2B,GAAG,mBAAmB,CAAC,gBAAgB;AAyB/E;;;;;;AAMG;AACI,MAAM,yBAAyB,GAAuC,CAAC,EAC1E,SAAS,EAAE,IAAI,GAAG,gBAAgB,EAClC,YAAY,EAAE,OAAO,GAAG,mBAAmB,EAC3C,iBAAiB,EAAE,YAAY,GAAG,gBAAgB,EAClD,SAAS,GAAG,KAAK,EACjB,QAAQ,GACX,MACGA,GAAC,CAAA,uBAAuB,EAAC,EAAA,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAA,QAAA,EACtDA,GAAC,CAAA,0BAA0B,IAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC5D,QAAA,EAAAA,GAAA,CAAC,+BAA+B,EAAA,EAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,YACrE,QAAQ,EAAA,CACqB,EACT,CAAA,EAAA,CACP,EAC5B;AAEF,yBAAyB,CAAC,WAAW,GAAG,2BAA2B;;;;"}