@hh.ru/magritte-ui-nav-bar 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mock.js","sources":["../../mock-component/lib/setupMockComponent.js","../src/index.mock.ts"],"sourcesContent":["import { jsxs, jsx } from 'react/jsx-runtime';\nimport { forwardRef } from 'react';\n\nfunction enhance(mockComponent, staticProps) {\n // удаляем внутренний свойства реакта, чтобы не перезаписать ими mockComponent\n delete staticProps.type;\n delete staticProps.$$typeof;\n delete staticProps.render;\n for (const prop in staticProps) {\n mockComponent[prop] = staticProps[prop];\n }\n}\nconst MockComponent = ({ style, ...props }) => (\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\n// eslint-disable-next-line react/jsx-no-undef\njsx(\"magritte-component-mock\", { \"style-data\": style, ...props }));\nconst MockComponentRenderProp = ({ style, ...props }) => (\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\n// eslint-disable-next-line react/jsx-no-undef\njsx(\"magritte-component-mock-render-prop\", { \"style-data\": style, ...props }));\n/**\n * Возвращает mock React компонента\n */\nconst mockComponent = (componentName, staticProps = {}, { withChildren, innerDependence, WrapperComponent } = {}) => {\n const mockWrapper = forwardRef(({ children, ...props }, ref) => {\n const mock = (\n // eslint-disable-next-line react/jsx-no-undef\n jsxs(MockComponent, { ...props, _component: componentName, children: [innerDependence ? innerDependence(props, ref) : null, withChildren ? children : null] }));\n return WrapperComponent ? jsx(WrapperComponent, { ...props, children: mock }) : mock;\n });\n staticProps && enhance(mockWrapper, staticProps);\n mockWrapper.displayName = 'magritte-ref';\n return mockWrapper;\n};\n/**\n * Возвращает mock React компонента, который рендерит переданный в него пропс render\n *\n * @param {String} componentName наименование компонента\n * @param {Object} [staticProps] объект со свойствами, которыми необходимо усилить mock\n * @param {Object} [options] параметры мока\n * @param {boolean} [options.withChildren] флаг отвечает за рендеринг children компонента\n * @param {React.Component} [options.innerDependence] Реакт компонент, который рендерится внутри мока.\n * Необходим, когда mock компоненту требуется иметь\n * дополнительные элементы\n */\nconst mockComponentRenderProp = (componentName, staticProps, { withChildren, innerDependence, renderArguments } = { renderArguments: [] }) => {\n const mockWrapper = ({ render, children, ...props }) => (jsxs(MockComponentRenderProp, { ...props, _component: componentName, children: [innerDependence ? innerDependence(props) : null, withChildren ? children : null, render?.(...(renderArguments || []))] }));\n staticProps && enhance(mockWrapper, staticProps);\n mockWrapper.displayName = 'magritte-component-mock-render-prop';\n return mockWrapper;\n};\n\nexport { mockComponent, mockComponentRenderProp };\n//# sourceMappingURL=setupMockComponent.js.map\n","import { ForwardRefExoticComponent } from 'react';\n\nimport { mockComponent } from '@hh.ru/magritte-ui-mock-component';\n\nexport { type ActionsProps } from '@hh.ru/magritte-ui-nav-bar/public/Actions';\nexport { type NavBarProps } from '@hh.ru/magritte-ui-nav-bar/public/NavBar';\nexport { type ExternalPaneProps as PaneProps } from '@hh.ru/magritte-ui-nav-bar/public/Pane';\nexport { type MorphProps } from '@hh.ru/magritte-ui-nav-bar/public/Morph';\nexport { type TitleContainerProps } from '@hh.ru/magritte-ui-nav-bar/public/TitleContainer';\nexport { type LayoutMorphProps } from '@hh.ru/magritte-ui-nav-bar/public/LayoutMorph';\nexport { type EnvironmentFingerprintNodeProps } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\n\nexport const NavBar: ForwardRefExoticComponent<Record<string, unknown>> = mockComponent('NavBar', undefined, {\n withChildren: true,\n});\n\nexport const Actions = mockComponent('Action', undefined, { withChildren: true });\nexport const TitleContainer = mockComponent('TitleContainer', undefined, { withChildren: true });\nexport const Pane = mockComponent('Pane', undefined, { withChildren: true });\nexport const Morph = mockComponent('Morph', undefined, { withChildren: true });\nexport const Stage = mockComponent('Stage', undefined, { withChildren: true });\nexport const LayoutMorph = mockComponent('LayoutMorph', undefined, { withChildren: true });\nexport const LayoutStage = mockComponent('LayoutStage', undefined, { withChildren: true });\nexport const EnvironmentFingerprintNode: ForwardRefExoticComponent<Record<string, unknown>> = mockComponent(\n 'EnvironmentFingerprintNode',\n undefined,\n { withChildren: true }\n);\n"],"names":[],"mappings":";;;AAGA,SAAS,OAAO,CAAC,aAAa,EAAE,WAAW,EAAE;AAC7C;AACA,IAAI,OAAO,WAAW,CAAC,IAAI,CAAC;AAC5B,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC;AAChC,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC;AAC9B,IAAI,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AACpC,QAAQ,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAChD,KAAK;AACL,CAAC;AACD,MAAM,aAAa,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;AAC1C;AACA;AACA;AACA,GAAG,CAAC,yBAAyB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AAMnE;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,WAAW,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK;AACrH,IAAI,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK;AACpE,QAAQ,MAAM,IAAI;AAClB;AACA,QAAQ,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,eAAe,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACxK,QAAQ,OAAO,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;AAC7F,KAAK,CAAC,CAAC;AACP,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACrD,IAAI,WAAW,CAAC,WAAW,GAAG,cAAc,CAAC;AAC7C,IAAI,OAAO,WAAW,CAAC;AACvB,CAAC;;MCvBY,MAAM,GAAuD,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE;AACzG,IAAA,YAAY,EAAE,IAAI;AACrB,CAAA,EAAE;AAEU,MAAA,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AACrE,MAAA,cAAc,GAAG,aAAa,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AACpF,MAAA,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAChE,MAAA,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAClE,MAAA,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAClE,MAAA,WAAW,GAAG,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAC9E,MAAA,WAAW,GAAG,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAC9E,MAAA,0BAA0B,GAAuD,aAAa,CACvG,4BAA4B,EAC5B,SAAS,EACT,EAAE,YAAY,EAAE,IAAI,EAAE;;;;"}
1
+ {"version":3,"file":"index.mock.js","sources":["../src/index.mock.ts"],"sourcesContent":["import { ForwardRefExoticComponent } from 'react';\n\nimport { mockComponent } from '@hh.ru/magritte-ui-mock-component';\n\nexport { type ActionsProps } from '@hh.ru/magritte-ui-nav-bar/public/Actions';\nexport { type NavBarProps } from '@hh.ru/magritte-ui-nav-bar/public/NavBar';\nexport { type ExternalPaneProps as PaneProps } from '@hh.ru/magritte-ui-nav-bar/public/Pane';\nexport { type MorphProps } from '@hh.ru/magritte-ui-nav-bar/public/Morph';\nexport { type TitleContainerProps } from '@hh.ru/magritte-ui-nav-bar/public/TitleContainer';\nexport { type LayoutMorphProps } from '@hh.ru/magritte-ui-nav-bar/public/LayoutMorph';\nexport { type EnvironmentFingerprintNodeProps } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\n\nexport const NavBar: ForwardRefExoticComponent<Record<string, unknown>> = mockComponent('NavBar', undefined, {\n withChildren: true,\n});\n\nexport const Actions = mockComponent('Action', undefined, { withChildren: true });\nexport const TitleContainer = mockComponent('TitleContainer', undefined, { withChildren: true });\nexport const Pane = mockComponent('Pane', undefined, { withChildren: true });\nexport const Morph = mockComponent('Morph', undefined, { withChildren: true });\nexport const Stage = mockComponent('Stage', undefined, { withChildren: true });\nexport const LayoutMorph = mockComponent('LayoutMorph', undefined, { withChildren: true });\nexport const LayoutStage = mockComponent('LayoutStage', undefined, { withChildren: true });\nexport const EnvironmentFingerprintNode: ForwardRefExoticComponent<Record<string, unknown>> = mockComponent(\n 'EnvironmentFingerprintNode',\n undefined,\n { withChildren: true }\n);\n"],"names":[],"mappings":";;MAYa,MAAM,GAAuD,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE;AACzG,IAAA,YAAY,EAAE,IAAI;AACrB,CAAA,EAAE;AAEU,MAAA,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AACrE,MAAA,cAAc,GAAG,aAAa,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AACpF,MAAA,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAChE,MAAA,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAClE,MAAA,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAClE,MAAA,WAAW,GAAG,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAC9E,MAAA,WAAW,GAAG,aAAa,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;AAC9E,MAAA,0BAA0B,GAAuD,aAAa,CACvG,4BAA4B,EAC5B,SAAS,EACT,EAAE,YAAY,EAAE,IAAI,EAAE;;;;"}
@@ -3,14 +3,13 @@ import { createContext, useContext, useId, useLayoutEffect } from 'react';
3
3
  import { motionValue } from 'motion';
4
4
  import { KeyedSubscriptions } from './KeyedSubscriptions.js';
5
5
  import { useInitOnce } from './utils.js';
6
- import { u as useNavBarContext } from '../NavBar-BM6rmKUJ.js';
6
+ import { u as useNavBarContext } from '../NavBar-C_bLkCSc.js';
7
7
  import 'react/jsx-runtime';
8
8
  import 'classnames';
9
9
  import 'motion/react';
10
10
  import '@hh.ru/magritte-ui-divider';
11
11
  import '@hh.ru/magritte-ui-layer';
12
12
  import './MetricsProvider.js';
13
- import './ProgressiveBlur.js';
14
13
  import './useAnimationRanges.js';
15
14
  import './useBindScrollToAnimationProgress.js';
16
15
  import './useNavBarMetrics.js';
@@ -1 +1 @@
1
- {"version":3,"file":"PaneStore.js","sources":["../../src/internal/PaneStore.ts"],"sourcesContent":["import { createContext, useContext, useId, useLayoutEffect } from 'react';\nimport { motionValue, type MotionValue } from 'motion';\n\nimport { KeyedSubscriptions } from '@hh.ru/magritte-ui-nav-bar/internal/KeyedSubscriptions';\nimport { useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { useNavBarContext } from '@hh.ru/magritte-ui-nav-bar/public/NavBar';\n\nexport interface PaneData {\n id: string;\n foldable?: boolean;\n motionValue: MotionValue<number>;\n startHeight?: number;\n endHeight?: number;\n top?: number;\n}\n\n/**\n * Хранилище состояния панели с поддержкой подписок на изменения.\n *\n * Наследует всю подписочную логику от {@link KeyedSubscriptions}, а именно:\n * - `onChange(key, cb)` — подписка на изменения конкретного ключа состояния;\n * - `onDestroy(cb)` — подписка на уничтожение;\n * - батчинг уведомлений (несколько изменений за один цикл объединяются);\n * - дедупликация коллбеков (один коллбек, подписанный на разные ключи, вызовется один раз).\n *\n * Собственная ответственность класса:\n * - Хранение состояния панели в `PaneData`.\n * - Применение частичных обновлений через метод `set(...)`:\n * - сравнивает новые значения с текущими;\n * - обновляет только изменившиеся поля;\n * - помечает изменённые ключи (`markChanged`) и инициирует рассылку (`notify`).\n * - Получение текущего значения по ключу через `get(...)`.\n *\n * Таким образом, `PaneStore` объединяет модель данных панели\n * с реактивными подписками на её изменения.\n */\nexport class PaneStore extends KeyedSubscriptions<keyof PaneData> {\n data: PaneData;\n\n /**\n * @param data Начальное состояние панели.\n */\n constructor(data: PaneData) {\n super();\n this.data = data;\n }\n\n /**\n * Частичное обновление состояния панели.\n * Для каждого ключа из `patch` выполняется сравнение и,\n * если значение изменилось, оно записывается в `data`,\n * а ключ помечается как изменённый.\n * После всех обновлений вызывается `notify()` для рассылки подписчикам.\n *\n * @example\n * controller.set({ foldable: true, startHeight: 200 });\n */\n set<K extends keyof PaneData>(patch: Partial<Pick<PaneData, K>>): void {\n (Object.keys(patch) as K[]).forEach((key) => {\n const next = patch[key];\n if (next !== this.data[key]) {\n this.data[key] = next as PaneData[K];\n this.markChanged(key);\n }\n });\n this.notify();\n }\n\n /**\n * Получить текущее значение поля состояния.\n *\n * @param key Ключ из {@link PaneData}.\n * @returns Текущее значение по указанному ключу.\n *\n * @example\n * const height = controller.get(\"startHeight\");\n */\n get<K extends keyof PaneData>(key: K): PaneData[K] {\n return this.data[key];\n }\n}\n\nexport const PaneContext = createContext<PaneStore | null>(null);\nexport const usePaneStore = (): PaneStore => {\n const contextStore = useContext(PaneContext);\n const id = useId();\n const registerPaneStore = useNavBarContext();\n const paneStore = useInitOnce(() => contextStore ?? new PaneStore({ motionValue: motionValue(0), id }));\n useLayoutEffect(() => {\n if (!registerPaneStore || contextStore !== null) {\n return void 0;\n }\n\n return registerPaneStore(contextStore ?? paneStore);\n }, [contextStore, paneStore, registerPaneStore]);\n return contextStore ?? paneStore;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;AAmBG;AACG,MAAO,SAAU,SAAQ,kBAAkC,CAAA;AAC7D,IAAA,IAAI,CAAW;AAEf;;AAEG;AACH,IAAA,WAAA,CAAY,IAAc,EAAA;AACtB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;KACpB;AAED;;;;;;;;;AASG;AACH,IAAA,GAAG,CAA2B,KAAiC,EAAA;QAC1D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAS,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACxC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAmB,CAAC;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aACzB;AACL,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;KACjB;AAED;;;;;;;;AAQG;AACH,IAAA,GAAG,CAA2B,GAAM,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACzB;AACJ,CAAA;MAEY,WAAW,GAAG,aAAa,CAAmB,IAAI,EAAE;AAC1D,MAAM,YAAY,GAAG,MAAgB;AACxC,IAAA,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAC7C,IAAA,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;AACnB,IAAA,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,YAAY,IAAI,IAAI,SAAS,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACxG,eAAe,CAAC,MAAK;AACjB,QAAA,IAAI,CAAC,iBAAiB,IAAI,YAAY,KAAK,IAAI,EAAE;YAC7C,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,OAAO,iBAAiB,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC;KACvD,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACjD,OAAO,YAAY,IAAI,SAAS,CAAC;AACrC;;;;"}
1
+ {"version":3,"file":"PaneStore.js","sources":["../../src/internal/PaneStore.ts"],"sourcesContent":["import { createContext, useContext, useId, useLayoutEffect } from 'react';\nimport { motionValue, type MotionValue } from 'motion';\n\nimport { KeyedSubscriptions } from '@hh.ru/magritte-ui-nav-bar/internal/KeyedSubscriptions';\nimport { useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { useNavBarContext } from '@hh.ru/magritte-ui-nav-bar/public/NavBar';\n\nexport interface PaneData {\n id: string;\n foldable?: boolean;\n motionValue: MotionValue<number>;\n startHeight?: number;\n endHeight?: number;\n top?: number;\n}\n\n/**\n * Хранилище состояния панели с поддержкой подписок на изменения.\n *\n * Наследует всю подписочную логику от {@link KeyedSubscriptions}, а именно:\n * - `onChange(key, cb)` — подписка на изменения конкретного ключа состояния;\n * - `onDestroy(cb)` — подписка на уничтожение;\n * - батчинг уведомлений (несколько изменений за один цикл объединяются);\n * - дедупликация коллбеков (один коллбек, подписанный на разные ключи, вызовется один раз).\n *\n * Собственная ответственность класса:\n * - Хранение состояния панели в `PaneData`.\n * - Применение частичных обновлений через метод `set(...)`:\n * - сравнивает новые значения с текущими;\n * - обновляет только изменившиеся поля;\n * - помечает изменённые ключи (`markChanged`) и инициирует рассылку (`notify`).\n * - Получение текущего значения по ключу через `get(...)`.\n *\n * Таким образом, `PaneStore` объединяет модель данных панели\n * с реактивными подписками на её изменения.\n */\nexport class PaneStore extends KeyedSubscriptions<keyof PaneData> {\n data: PaneData;\n\n /**\n * @param data Начальное состояние панели.\n */\n constructor(data: PaneData) {\n super();\n this.data = data;\n }\n\n /**\n * Частичное обновление состояния панели.\n * Для каждого ключа из `patch` выполняется сравнение и,\n * если значение изменилось, оно записывается в `data`,\n * а ключ помечается как изменённый.\n * После всех обновлений вызывается `notify()` для рассылки подписчикам.\n *\n * @example\n * controller.set({ foldable: true, startHeight: 200 });\n */\n set<K extends keyof PaneData>(patch: Partial<Pick<PaneData, K>>): void {\n (Object.keys(patch) as K[]).forEach((key) => {\n const next = patch[key];\n if (next !== this.data[key]) {\n this.data[key] = next as PaneData[K];\n this.markChanged(key);\n }\n });\n this.notify();\n }\n\n /**\n * Получить текущее значение поля состояния.\n *\n * @param key Ключ из {@link PaneData}.\n * @returns Текущее значение по указанному ключу.\n *\n * @example\n * const height = controller.get(\"startHeight\");\n */\n get<K extends keyof PaneData>(key: K): PaneData[K] {\n return this.data[key];\n }\n}\n\nexport const PaneContext = createContext<PaneStore | null>(null);\nexport const usePaneStore = (): PaneStore => {\n const contextStore = useContext(PaneContext);\n const id = useId();\n const registerPaneStore = useNavBarContext();\n const paneStore = useInitOnce(() => contextStore ?? new PaneStore({ motionValue: motionValue(0), id }));\n useLayoutEffect(() => {\n if (!registerPaneStore || contextStore !== null) {\n return void 0;\n }\n\n return registerPaneStore(contextStore ?? paneStore);\n }, [contextStore, paneStore, registerPaneStore]);\n return contextStore ?? paneStore;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;AAmBG;AACG,MAAO,SAAU,SAAQ,kBAAkC,CAAA;AAC7D,IAAA,IAAI,CAAW;AAEf;;AAEG;AACH,IAAA,WAAA,CAAY,IAAc,EAAA;AACtB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;KACpB;AAED;;;;;;;;;AASG;AACH,IAAA,GAAG,CAA2B,KAAiC,EAAA;QAC1D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAS,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACxC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAmB,CAAC;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aACzB;AACL,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;KACjB;AAED;;;;;;;;AAQG;AACH,IAAA,GAAG,CAA2B,GAAM,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACzB;AACJ,CAAA;MAEY,WAAW,GAAG,aAAa,CAAmB,IAAI,EAAE;AAC1D,MAAM,YAAY,GAAG,MAAgB;AACxC,IAAA,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAC7C,IAAA,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;AACnB,IAAA,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,YAAY,IAAI,IAAI,SAAS,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACxG,eAAe,CAAC,MAAK;AACjB,QAAA,IAAI,CAAC,iBAAiB,IAAI,YAAY,KAAK,IAAI,EAAE;YAC7C,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,OAAO,iBAAiB,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC;KACvD,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACjD,OAAO,YAAY,IAAI,SAAS,CAAC;AACrC;;;;"}
@@ -0,0 +1,2 @@
1
+ import { RefCallback } from 'react';
2
+ export declare const useInert: () => [RefCallback<HTMLElement | null>, (isInert: boolean) => void];
@@ -0,0 +1,26 @@
1
+ import './../index.css';
2
+ import { useRef } from 'react';
3
+ import { useInitOnce } from './utils.js';
4
+
5
+ const useInert = () => {
6
+ const currentInertRef = useRef(false);
7
+ const elementRef = useRef(null);
8
+ const refCallback = useInitOnce(() => (element) => {
9
+ elementRef.current = element;
10
+ if (element) {
11
+ element.toggleAttribute('inert', currentInertRef.current);
12
+ }
13
+ });
14
+ const setInert = useInitOnce(() => (isInert) => {
15
+ if (isInert !== currentInertRef.current) {
16
+ currentInertRef.current = isInert;
17
+ if (elementRef.current) {
18
+ elementRef.current.toggleAttribute('inert', currentInertRef.current);
19
+ }
20
+ }
21
+ });
22
+ return [refCallback, setInert];
23
+ };
24
+
25
+ export { useInert };
26
+ //# sourceMappingURL=useInert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInert.js","sources":["../../src/internal/useInert.ts"],"sourcesContent":["import { RefCallback, useRef } from 'react';\n\nimport { useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\n\nexport const useInert = (): [RefCallback<HTMLElement | null>, (isInert: boolean) => void] => {\n const currentInertRef = useRef(false);\n const elementRef = useRef<HTMLElement | null>(null);\n const refCallback: RefCallback<HTMLElement | null> = useInitOnce(() => (element) => {\n elementRef.current = element;\n if (element) {\n element.toggleAttribute('inert', currentInertRef.current);\n }\n });\n const setInert = useInitOnce(() => (isInert: boolean) => {\n if (isInert !== currentInertRef.current) {\n currentInertRef.current = isInert;\n if (elementRef.current) {\n elementRef.current.toggleAttribute('inert', currentInertRef.current);\n }\n }\n });\n\n return [refCallback, setInert];\n};\n"],"names":[],"mappings":";;;AAIO,MAAM,QAAQ,GAAG,MAAoE;AACxF,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACtC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACpD,MAAM,WAAW,GAAoC,WAAW,CAAC,MAAM,CAAC,OAAO,KAAI;AAC/E,QAAA,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,IAAI,OAAO,EAAE;YACT,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;SAC7D;AACL,KAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,OAAgB,KAAI;AACpD,QAAA,IAAI,OAAO,KAAK,eAAe,CAAC,OAAO,EAAE;AACrC,YAAA,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC;AAClC,YAAA,IAAI,UAAU,CAAC,OAAO,EAAE;gBACpB,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;aACxE;SACJ;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnC;;;;"}
@@ -1,3 +1,3 @@
1
1
  import { type RefObject } from 'react';
2
2
  import { type MotionValue } from 'motion/react';
3
- export declare const useResetFocus: (rootRef: RefObject<HTMLElement>, scrollPosition: MotionValue<number>) => void;
3
+ export declare const useResetFocus: (rootRef: RefObject<HTMLElement>, animationProgress: MotionValue<number>) => void;
@@ -1,7 +1,7 @@
1
1
  import './../index.css';
2
2
  import { useRef, useEffect } from 'react';
3
3
 
4
- const useResetFocus = (rootRef, scrollPosition) => {
4
+ const useResetFocus = (rootRef, animationProgress) => {
5
5
  const hasFocus = useRef(false);
6
6
  useEffect(() => {
7
7
  if (!rootRef.current) {
@@ -10,7 +10,7 @@ const useResetFocus = (rootRef, scrollPosition) => {
10
10
  const focusHandler = () => (hasFocus.current = true);
11
11
  const element = rootRef.current;
12
12
  element.addEventListener('focusin', focusHandler);
13
- const unsubscribe = scrollPosition.on('change', () => {
13
+ const unsubscribe = animationProgress.on('change', () => {
14
14
  if (!hasFocus.current || !rootRef.current) {
15
15
  return;
16
16
  }
@@ -24,7 +24,7 @@ const useResetFocus = (rootRef, scrollPosition) => {
24
24
  unsubscribe();
25
25
  element.removeEventListener('focusin', focusHandler);
26
26
  };
27
- }, [scrollPosition, rootRef]);
27
+ }, [animationProgress, rootRef]);
28
28
  };
29
29
 
30
30
  export { useResetFocus };
@@ -1 +1 @@
1
- {"version":3,"file":"useResetFocus.js","sources":["../../src/internal/useResetFocus.ts"],"sourcesContent":["import { type MutableRefObject, useRef, type RefObject, useEffect } from 'react';\nimport { type MotionValue } from 'motion/react';\n\nexport const useResetFocus = (rootRef: RefObject<HTMLElement>, scrollPosition: MotionValue<number>): void => {\n const hasFocus: MutableRefObject<boolean> = useRef(false);\n\n useEffect(() => {\n if (!rootRef.current) {\n return void 0;\n }\n\n const focusHandler = () => (hasFocus.current = true);\n const element = rootRef.current;\n element.addEventListener('focusin', focusHandler);\n const unsubscribe = scrollPosition.on('change', () => {\n if (!hasFocus.current || !rootRef.current) {\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n hasFocus.current = false;\n if (activeElement && rootRef.current.contains(activeElement) && typeof activeElement.blur === 'function') {\n activeElement.blur();\n }\n });\n\n return () => {\n unsubscribe();\n element.removeEventListener('focusin', focusHandler);\n };\n }, [scrollPosition, rootRef]);\n};\n"],"names":[],"mappings":";;MAGa,aAAa,GAAG,CAAC,OAA+B,EAAE,cAAmC,KAAU;AACxG,IAAA,MAAM,QAAQ,GAA8B,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1D,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClB,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,MAAM,YAAY,GAAG,OAAO,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACrD,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AAChC,QAAA,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAK;YACjD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;gBACvC,OAAO;aACV;AAED,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAA4B,CAAC;AAC5D,YAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AACzB,YAAA,IAAI,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,UAAU,EAAE;gBACtG,aAAa,CAAC,IAAI,EAAE,CAAC;aACxB;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,MAAK;AACR,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACzD,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;AAClC;;;;"}
1
+ {"version":3,"file":"useResetFocus.js","sources":["../../src/internal/useResetFocus.ts"],"sourcesContent":["import { type MutableRefObject, useRef, type RefObject, useEffect } from 'react';\nimport { type MotionValue } from 'motion/react';\n\nexport const useResetFocus = (rootRef: RefObject<HTMLElement>, animationProgress: MotionValue<number>): void => {\n const hasFocus: MutableRefObject<boolean> = useRef(false);\n\n useEffect(() => {\n if (!rootRef.current) {\n return void 0;\n }\n\n const focusHandler = () => (hasFocus.current = true);\n const element = rootRef.current;\n element.addEventListener('focusin', focusHandler);\n const unsubscribe = animationProgress.on('change', () => {\n if (!hasFocus.current || !rootRef.current) {\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n hasFocus.current = false;\n if (activeElement && rootRef.current.contains(activeElement) && typeof activeElement.blur === 'function') {\n activeElement.blur();\n }\n });\n\n return () => {\n unsubscribe();\n element.removeEventListener('focusin', focusHandler);\n };\n }, [animationProgress, rootRef]);\n};\n"],"names":[],"mappings":";;MAGa,aAAa,GAAG,CAAC,OAA+B,EAAE,iBAAsC,KAAU;AAC3G,IAAA,MAAM,QAAQ,GAA8B,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1D,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClB,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,MAAM,YAAY,GAAG,OAAO,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACrD,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AAChC,QAAA,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAK;YACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;gBACvC,OAAO;aACV;AAED,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAA4B,CAAC;AAC5D,YAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AACzB,YAAA,IAAI,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,UAAU,EAAE;gBACtG,aAAa,CAAC,IAAI,EAAE,CAAC;aACxB;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,MAAK;AACR,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACzD,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;AACrC;;;;"}
package/internal/utils.js CHANGED
@@ -22,7 +22,14 @@ const remap = (domain, image) => {
22
22
  }
23
23
  const a = imageRange / domainRange;
24
24
  const b = image[0] - a * domain[0];
25
- return (value) => clamp(a * value + b, min, max);
25
+ return (value) => {
26
+ // из-за ошибок в числах с плавающей запятой можем не достигать пределов, поэтому дополнительно
27
+ // проверяем вручную
28
+ if (value === domain[0] || value === domain[1]) {
29
+ return value === domain[0] ? image[0] : image[1];
30
+ }
31
+ return clamp(a * value + b, min, max);
32
+ };
26
33
  };
27
34
  const useInitOnce = (fn) => {
28
35
  const ref = useRef(null);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/internal/utils.ts"],"sourcesContent":["import { type MutableRefObject, useLayoutEffect, useRef } from 'react';\nimport type { MotionValue } from 'motion';\n\nimport { KeyedSubscriptions } from '@hh.ru/magritte-ui-nav-bar/internal/KeyedSubscriptions';\nimport { ScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\n\nexport const lerp = (from: number, to: number, progress: number): number => from + (to - from) * progress;\nexport const clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\n/**\n * Создаёт функцию преобразования значений из одного числового интервала (домен) в другой (образ).\n *\n * @param domain Интервал входных значений [min, max].\n * @param image Интервал выходных значений [min, max].\n *\n * @returns Функция, принимающая число из диапазона `domain`, преобразующая его в диапазон `image`\n * с линейной интерполяцией.\n */\nexport const remap = (domain: [number, number], image: [number, number]) => {\n const domainRange = domain[1] - domain[0];\n const imageRange = image[1] - image[0];\n const min = Math.min(...image);\n const max = Math.max(...image);\n\n if (domainRange === 0) {\n return () => image[0];\n }\n\n const a = imageRange / domainRange;\n const b = image[0] - a * domain[0];\n\n return (value: number): number => clamp(a * value + b, min, max);\n};\n\nexport const useInitOnce = <T>(fn: () => T): T => {\n const ref = useRef<T | null>(null);\n if (ref.current === null) {\n ref.current = fn();\n }\n return ref.current;\n};\n\n/**\n * Возвращает «одноразовый» планировщик, который выполнит `fn` в следующем\n * тике **микрозадач** (через `Promise.resolve().then(...)`). Повторные вызовы\n * до момента выполнения схлопываются в один запуск.\n *\n * Семантика:\n * - Первый вызов ставит `fn` в очередь микрозадач; последующие вызовы до\n * выполнения игнорируются.\n * - После выполнения `fn` «засов» снимается — можно планировать снова.\n * - Ошибки из `fn` перебрасываются в следующий макротик (через `setTimeout`),\n * чтобы они были видны в DevTools и не превращались в «unhandled rejection».\n *\n * Когда использовать:\n * - Нужно объединить множество синхронных триггеров в одно действие,\n * выполнив его **раньше таймеров/`requestAnimationFrame`**.\n * - Не требуется ожидать стабилизации DOM/лейаута (микрозадачи идут до кадра).\n *\n * @param fn — колбэк, который будет выполнен в следующем тике микрозадач.\n * @returns Функция-триггер: вызов ставит `fn` в очередь 1 раз на тик микрозадач.\n *\n * @example\n * const trigger = scheduleMicro(recompute);\n * trigger(); // запланирован один запуск\n * trigger(); // проигнорирован (уже запланировано)\n * // `recompute` выполнится один раз на следующем тике микрозадач\n */\nexport const scheduleMicro = (fn: VoidFunction) => {\n let scheduled = false;\n return (): void => {\n if (scheduled) {\n return;\n }\n scheduled = true;\n Promise.resolve()\n .then(() => {\n scheduled = false;\n fn();\n })\n .catch((err) =>\n setTimeout(() => {\n throw err;\n }, 0)\n );\n };\n};\n\n/**\n * Возвращает «одноразовый» планировщик, который выполнит `fn` в следующем\n * тике **макрозадач** (через `setTimeout(0)`). Повторные вызовы до момента\n * выполнения схлопываются в один запуск.\n *\n * Семантика:\n * - Первый вызов ставит `fn` в `setTimeout`; последующие вызовы до выполнения\n * игнорируются.\n * - После выполнения `fn` «засов» снимается — можно планировать снова.\n * - Ошибки из `fn` всплывут как непойманные ошибки из обработчика таймера.\n *\n * Когда использовать:\n * - Нужно отложить выполнение **после** опустошения очереди микрозадач\n * (т.е. позже, чем `scheduleMicro`), часто позволяя браузеру между делом\n * подготовить кадр/перерисовку.\n *\n * @param fn — колбэк, который будет выполнен в следующем тике макрозадач.\n * @returns Функция-триггер: вызов ставит `fn` в очередь 1 раз на тик таймера.\n *\n * @example\n * const trigger = scheduleMacro(flushQueue);\n * trigger(); // запланирован один таймер\n * trigger(); // проигнорирован до выполнения `flushQueue`\n */\nexport const scheduleMacro = (fn: VoidFunction): VoidFunction => {\n let scheduled = false;\n const scheduledFn = () => {\n if (scheduled) {\n return;\n }\n scheduled = true;\n setTimeout(() => {\n scheduled = false;\n fn();\n });\n };\n return scheduledFn;\n};\n\n/**\n * Планировщик для «сбора метрик» на основе микрозадач: откладывает выполнение `fn`\n * до момента, когда серия частых вызовов завершится, и запускает `fn` ровно один раз.\n *\n * Идея:\n * - Первый вызов добавляет «запас» из двух тиков микрозадач; каждый следующий\n * в ту же серию добавляет ещё +1.\n * - Единый «дренирующий» цикл (один на серию) уменьшает счётчик на каждом тике\n * микрозадач; когда счётчик достигает нуля — выполняется `fn`.\n * - Повторные вызовы не создают параллельных циклов; `fn` не вызывается несколько раз.\n * - Ошибки из `fn` перебрасываются в макрозадачу (`setTimeout`), чтобы их было видно\n * в DevTools и они не становились unhandled rejection.\n *\n * Когда использовать:\n * - Нужна коалесценция множественных триггеров (Promises, ResizeObserver и т.п.)\n * с запуском «после того, как всё успокоилось», чтобы измерить DOM/пересчитать\n * лейаут/агрегировать состояние один раз.\n *\n * Гарантии и нюансы:\n * - Гарантируется минимум два тика микрозадач после первого вызова (даёт времени\n * промисам/микроочереди завершиться).\n * - Работает как эвристика «дождаться затишья» на уровне микрозадач, без перехода\n * в макрозадачи/таймеры (сам `fn` всё равно выполняется в микрозадаче).\n *\n * @param fn — колбэк, который будет выполнен один раз после завершения серии вызовов.\n * @returns Триггер; его можно вызывать многократно — `fn` запустится один раз,\n * когда внутренний счётчик дойдёт до нуля.\n */\nexport const scheduleGatherMetrics = (fn: VoidFunction): VoidFunction => {\n let callsCount = 0;\n let draining = false;\n\n const step = () =>\n Promise.resolve()\n .then(() => {\n if (callsCount > 0) {\n callsCount -= 1;\n if (callsCount > 0) {\n void step();\n return;\n }\n draining = false;\n fn();\n return;\n }\n draining = false;\n })\n .catch((err) =>\n setTimeout(() => {\n throw err;\n }, 0)\n );\n\n return () => {\n callsCount += callsCount === 0 ? 2 : 1;\n if (!draining) {\n draining = true;\n void step();\n }\n };\n};\n\n/**\n * Хук для получения \"живой\" ссылки (`ref`) на актуальное значение.\n *\n * В отличие от обычного `useRef(initialValue)`, где `.current` инициализируется\n * только один раз и далее меняется вручную, `useActualRef` автоматически\n * обновляет `.current` при каждом рендере на основе переданного `value`.\n *\n * Зачем это нужно:\n * - Когда в коллбэках или подписках нужно иметь доступ к самому свежему значению\n * пропса или состояния, но при этом не хочется пересоздавать замыкания.\n * - Позволяет избежать проблем со \"старыми\" значениями внутри `useCallback`,\n * `useEffect` и обработчиков событий.\n *\n * @param value Актуальное значение, которое должно быть доступно через `.current`.\n *\n * @returns `ref`-объект (`MutableRefObject<T>`), чьё свойство `.current` всегда\n * указывает на последнее переданное `value`.\n */\nexport const useActualRef = <T>(value: T): MutableRefObject<T> => {\n const valueRef = useRef(value);\n valueRef.current = value;\n return valueRef;\n};\n\n/**\n * Подписывает трансформацию на изменения исходного `MotionValue` **и** внешнего хранилища ключевых подписок.\n *\n * В отличие от `useTransform` из motion, этот хук не создает новый `MotionValue`.\n * Вместо этого он вызывает пользовательскую `transformFn(arg, value)` при любом изменении:\n * - исходного `originalValue`, и/или\n * - значений во внешнем хранилище `store` по указанным `keys`.\n *\n * `transformFn` обычно внутри делает `.set(...)` у одного или нескольких целевых `MotionValue`.\n *\n * @template T Тип значения исходного `MotionValue`.\n * @template K Тип ключей внешнего хранилища (строка | число | символ).\n * @template V Тип агрегированного значения, извлекаемого из хранилища и передаваемого в `transformFn`.\n *\n * @param {MotionValue<T>} originalValue\n * Исходный `MotionValue`, изменения которого инициируют трансформацию.\n *\n * @param {KeyedSubscriptions<K> | (() => KeyedSubscriptions<K>)} store\n * Внешнее хранилище с подписками. Может быть самим объектом или фабрикой.\n * Если передана функция, хук пересоздает подписки при событии `onDestroy`.\n *\n * @param {K[]} keys\n * Набор ключей хранилища, на изменения которых нужно реагировать.\n * Равенство `keys` проверяется по количеству и составу; изменение порядка не важно.\n * Изменение этого набора вызывает пересоздание подписок подписок.\n *\n * @param {() => V} valueExtractor\n * Функция, синхронно извлекающая/агрегирующая данные из хранилища\n * для передачи первым аргументом в `transformFn`.\n *\n * @param {(arg: V, value: T) => void} transformFn\n * Функция-трансформация. Вызывается при каждом триггере с\n * `arg = valueExtractor()` и `value = originalValue.get()`. Обычно внутри вызывает `someMotionValue.set(...)`.\n *\n * @example\n * ```tsx\n * import { motion, useMotionValue } from \"motion/react\";\n *\n * const store: KeyedSubscriptions<\"width\" | \"height\"> = createKeyedStore();\n *\n * export function Example() {\n * const x = useMotionValue(0); // исходный драйвер\n * const y = useMotionValue(0); // целевой MotionValue\n *\n * useStoreSyncedTransform(\n * x,\n * store,\n * [\"width\", \"height\"],\n * () => ({\n * w: store.get(\"width\"),\n * h: store.get(\"height\"),\n * }),\n * ({ w, h }, xVal) => {\n * // пример простой зависимости\n * const mapped = (xVal / Math.max(w, 1)) * h;\n * y.set(mapped);\n * }\n * );\n *\n * return <motion.div style={{ x, y }} />;\n * }\n * ```\n */\nexport const useStoreSyncedTransform = <T, K extends PropertyKey, V>(\n originalValue: MotionValue<T>,\n store: KeyedSubscriptions<K>,\n keys: K[],\n valueExtractor: () => V,\n transformFn: (arg: V, value: T) => void\n): void => {\n const valueExtractorRef = useActualRef(valueExtractor);\n const extractedValueRef = useActualRef(valueExtractor());\n const transformFnRef = useActualRef(transformFn);\n const originalValueRef = useActualRef(originalValue);\n const transform = useInitOnce(\n () => () => transformFnRef.current(extractedValueRef.current, originalValueRef.current.get())\n );\n\n const observedKeysRef = useRef<Set<K> | null>(null);\n let observedKeys = observedKeysRef.current;\n const isKeysChanged =\n observedKeys === null || keys.length !== observedKeys.size || keys.some((k) => !observedKeys?.has(k));\n\n if (isKeysChanged) {\n observedKeys = new Set(keys);\n observedKeysRef.current = observedKeys;\n }\n\n useLayoutEffect(() => {\n const unsubscribeStore = store.onChange(observedKeys ? [...observedKeys] : [], () => {\n extractedValueRef.current = valueExtractorRef.current();\n transform();\n });\n const unsubscribeValue = originalValue.on('change', transform);\n\n return () => {\n unsubscribeStore();\n unsubscribeValue();\n };\n }, [store, observedKeys, originalValue, extractedValueRef, valueExtractorRef, transform]);\n\n useLayoutEffect(() => {\n transform();\n }, [valueExtractor, extractedValueRef, transformFn, transform]);\n};\n\nconst SCROLLABLE = ['auto', 'scroll'];\nexport const findScrollContainer = (\n element: HTMLElement\n):\n | { eventsProvider: HTMLElement; infoProvider: HTMLElement; mode: 'element' }\n | { eventsProvider: Window; infoProvider: Element; mode: 'window' } => {\n let parentElement = element.parentElement;\n while (parentElement !== null) {\n const { overflowY } = window.getComputedStyle(parentElement);\n if (SCROLLABLE.includes(overflowY)) {\n return { eventsProvider: parentElement, infoProvider: parentElement, mode: 'element' };\n }\n parentElement = parentElement.parentElement;\n }\n\n return {\n eventsProvider: window,\n infoProvider: document.scrollingElement || document.documentElement,\n mode: 'window',\n };\n};\n\nexport const isDOMRectsEqual = (a: DOMRectReadOnly | null, b: DOMRectReadOnly | null): boolean =>\n a === b || (a !== null && b !== null && a.x === b.x && a.y === b.y && a.height === b.height && a.width === b.width);\n\nexport interface MorphSetup {\n start: DOMRectReadOnly;\n end: DOMRectReadOnly;\n containerStart: DOMRectReadOnly;\n containerEnd: DOMRectReadOnly;\n}\n\nexport type SizeAxis = 'vertical' | 'horizontal' | 'both' | 'auto';\nexport type HorizontalAlign = 'left' | 'right' | 'center';\nexport type VerticalAlign = 'top' | 'bottom' | 'center';\n\nconst MAX_SCALE_RATIO = 2;\nconst AXIS_SIZE_MULTIPLIER = {\n left: 0,\n center: 0.5,\n right: 1,\n top: 0,\n bottom: 1,\n} as const;\n\nexport const calcMorphParams = (\n start: DOMRectReadOnly | null,\n end: DOMRectReadOnly | null,\n sizeAxis: SizeAxis,\n horizontalPositionAlign: HorizontalAlign,\n verticalPositionAlign: VerticalAlign\n): { deltaX: number; deltaY: number; scaleX: number; scaleY: number } => {\n if (start === null || end === null) {\n return {\n deltaX: 0,\n deltaY: 0,\n scaleX: 1,\n scaleY: 1,\n };\n }\n\n let axis = sizeAxis;\n let scaleX = end.width / start.width;\n let scaleY = end.height / start.height;\n\n if (sizeAxis === 'auto') {\n const ratio = Math.max(scaleX, scaleY) / Math.min(scaleX, scaleY);\n if (ratio > MAX_SCALE_RATIO) {\n const absScaleX = scaleX < 1 ? 1 / scaleX : scaleX;\n const absScaleY = scaleY < 1 ? 1 / scaleY : scaleY;\n axis = absScaleX < absScaleY ? 'horizontal' : 'vertical';\n }\n }\n\n scaleX = axis === 'vertical' ? scaleY : scaleX;\n scaleY = axis === 'horizontal' ? scaleX : scaleY;\n\n const startX = start.x + start.width * AXIS_SIZE_MULTIPLIER[horizontalPositionAlign];\n const endX = end.x + end.width * AXIS_SIZE_MULTIPLIER[horizontalPositionAlign];\n const startY = start.y + start.height * AXIS_SIZE_MULTIPLIER[verticalPositionAlign];\n const endY = end.y + end.height * AXIS_SIZE_MULTIPLIER[verticalPositionAlign];\n\n const deltaX = endX - startX;\n const deltaY = endY - startY;\n\n return {\n deltaX,\n deltaY,\n scaleX,\n scaleY,\n };\n};\n\nexport const getRelativeOffset = (scrollAdapter: ScrollAdapter, element: HTMLElement | null): number => {\n if (!scrollAdapter.scrollContainer.current || !element) {\n return 0;\n }\n\n const container = scrollAdapter.scrollContainer.current;\n const containerTop = container === document.documentElement ? 0 : container.getBoundingClientRect().top;\n const scroll = scrollAdapter.getScrollTop();\n scrollAdapter.setScrollTop(0);\n const elementTop = element.getBoundingClientRect().top;\n scrollAdapter.setScrollTop(scroll);\n\n return elementTop - containerTop;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/internal/utils.ts"],"sourcesContent":["import { type MutableRefObject, useLayoutEffect, useRef } from 'react';\nimport type { MotionValue } from 'motion';\n\nimport { KeyedSubscriptions } from '@hh.ru/magritte-ui-nav-bar/internal/KeyedSubscriptions';\nimport { ScrollAdapter } from '@hh.ru/magritte-ui-nav-bar/internal/useScrollAdapter';\n\nexport const lerp = (from: number, to: number, progress: number): number => from + (to - from) * progress;\nexport const clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\n/**\n * Создаёт функцию преобразования значений из одного числового интервала (домен) в другой (образ).\n *\n * @param domain Интервал входных значений [min, max].\n * @param image Интервал выходных значений [min, max].\n *\n * @returns Функция, принимающая число из диапазона `domain`, преобразующая его в диапазон `image`\n * с линейной интерполяцией.\n */\nexport const remap = (domain: [number, number], image: [number, number]) => {\n const domainRange = domain[1] - domain[0];\n const imageRange = image[1] - image[0];\n const min = Math.min(...image);\n const max = Math.max(...image);\n\n if (domainRange === 0) {\n return () => image[0];\n }\n\n const a = imageRange / domainRange;\n const b = image[0] - a * domain[0];\n\n return (value: number): number => {\n // из-за ошибок в числах с плавающей запятой можем не достигать пределов, поэтому дополнительно\n // проверяем вручную\n if (value === domain[0] || value === domain[1]) {\n return value === domain[0] ? image[0] : image[1];\n }\n return clamp(a * value + b, min, max);\n };\n};\n\nexport const useInitOnce = <T>(fn: () => T): T => {\n const ref = useRef<T | null>(null);\n if (ref.current === null) {\n ref.current = fn();\n }\n return ref.current;\n};\n\n/**\n * Возвращает «одноразовый» планировщик, который выполнит `fn` в следующем\n * тике **микрозадач** (через `Promise.resolve().then(...)`). Повторные вызовы\n * до момента выполнения схлопываются в один запуск.\n *\n * Семантика:\n * - Первый вызов ставит `fn` в очередь микрозадач; последующие вызовы до\n * выполнения игнорируются.\n * - После выполнения `fn` «засов» снимается — можно планировать снова.\n * - Ошибки из `fn` перебрасываются в следующий макротик (через `setTimeout`),\n * чтобы они были видны в DevTools и не превращались в «unhandled rejection».\n *\n * Когда использовать:\n * - Нужно объединить множество синхронных триггеров в одно действие,\n * выполнив его **раньше таймеров/`requestAnimationFrame`**.\n * - Не требуется ожидать стабилизации DOM/лейаута (микрозадачи идут до кадра).\n *\n * @param fn — колбэк, который будет выполнен в следующем тике микрозадач.\n * @returns Функция-триггер: вызов ставит `fn` в очередь 1 раз на тик микрозадач.\n *\n * @example\n * const trigger = scheduleMicro(recompute);\n * trigger(); // запланирован один запуск\n * trigger(); // проигнорирован (уже запланировано)\n * // `recompute` выполнится один раз на следующем тике микрозадач\n */\nexport const scheduleMicro = (fn: VoidFunction) => {\n let scheduled = false;\n return (): void => {\n if (scheduled) {\n return;\n }\n scheduled = true;\n Promise.resolve()\n .then(() => {\n scheduled = false;\n fn();\n })\n .catch((err) =>\n setTimeout(() => {\n throw err;\n }, 0)\n );\n };\n};\n\n/**\n * Возвращает «одноразовый» планировщик, который выполнит `fn` в следующем\n * тике **макрозадач** (через `setTimeout(0)`). Повторные вызовы до момента\n * выполнения схлопываются в один запуск.\n *\n * Семантика:\n * - Первый вызов ставит `fn` в `setTimeout`; последующие вызовы до выполнения\n * игнорируются.\n * - После выполнения `fn` «засов» снимается — можно планировать снова.\n * - Ошибки из `fn` всплывут как непойманные ошибки из обработчика таймера.\n *\n * Когда использовать:\n * - Нужно отложить выполнение **после** опустошения очереди микрозадач\n * (т.е. позже, чем `scheduleMicro`), часто позволяя браузеру между делом\n * подготовить кадр/перерисовку.\n *\n * @param fn — колбэк, который будет выполнен в следующем тике макрозадач.\n * @returns Функция-триггер: вызов ставит `fn` в очередь 1 раз на тик таймера.\n *\n * @example\n * const trigger = scheduleMacro(flushQueue);\n * trigger(); // запланирован один таймер\n * trigger(); // проигнорирован до выполнения `flushQueue`\n */\nexport const scheduleMacro = (fn: VoidFunction): VoidFunction => {\n let scheduled = false;\n const scheduledFn = () => {\n if (scheduled) {\n return;\n }\n scheduled = true;\n setTimeout(() => {\n scheduled = false;\n fn();\n });\n };\n return scheduledFn;\n};\n\n/**\n * Планировщик для «сбора метрик» на основе микрозадач: откладывает выполнение `fn`\n * до момента, когда серия частых вызовов завершится, и запускает `fn` ровно один раз.\n *\n * Идея:\n * - Первый вызов добавляет «запас» из двух тиков микрозадач; каждый следующий\n * в ту же серию добавляет ещё +1.\n * - Единый «дренирующий» цикл (один на серию) уменьшает счётчик на каждом тике\n * микрозадач; когда счётчик достигает нуля — выполняется `fn`.\n * - Повторные вызовы не создают параллельных циклов; `fn` не вызывается несколько раз.\n * - Ошибки из `fn` перебрасываются в макрозадачу (`setTimeout`), чтобы их было видно\n * в DevTools и они не становились unhandled rejection.\n *\n * Когда использовать:\n * - Нужна коалесценция множественных триггеров (Promises, ResizeObserver и т.п.)\n * с запуском «после того, как всё успокоилось», чтобы измерить DOM/пересчитать\n * лейаут/агрегировать состояние один раз.\n *\n * Гарантии и нюансы:\n * - Гарантируется минимум два тика микрозадач после первого вызова (даёт времени\n * промисам/микроочереди завершиться).\n * - Работает как эвристика «дождаться затишья» на уровне микрозадач, без перехода\n * в макрозадачи/таймеры (сам `fn` всё равно выполняется в микрозадаче).\n *\n * @param fn — колбэк, который будет выполнен один раз после завершения серии вызовов.\n * @returns Триггер; его можно вызывать многократно — `fn` запустится один раз,\n * когда внутренний счётчик дойдёт до нуля.\n */\nexport const scheduleGatherMetrics = (fn: VoidFunction): VoidFunction => {\n let callsCount = 0;\n let draining = false;\n\n const step = () =>\n Promise.resolve()\n .then(() => {\n if (callsCount > 0) {\n callsCount -= 1;\n if (callsCount > 0) {\n void step();\n return;\n }\n draining = false;\n fn();\n return;\n }\n draining = false;\n })\n .catch((err) =>\n setTimeout(() => {\n throw err;\n }, 0)\n );\n\n return () => {\n callsCount += callsCount === 0 ? 2 : 1;\n if (!draining) {\n draining = true;\n void step();\n }\n };\n};\n\n/**\n * Хук для получения \"живой\" ссылки (`ref`) на актуальное значение.\n *\n * В отличие от обычного `useRef(initialValue)`, где `.current` инициализируется\n * только один раз и далее меняется вручную, `useActualRef` автоматически\n * обновляет `.current` при каждом рендере на основе переданного `value`.\n *\n * Зачем это нужно:\n * - Когда в коллбэках или подписках нужно иметь доступ к самому свежему значению\n * пропса или состояния, но при этом не хочется пересоздавать замыкания.\n * - Позволяет избежать проблем со \"старыми\" значениями внутри `useCallback`,\n * `useEffect` и обработчиков событий.\n *\n * @param value Актуальное значение, которое должно быть доступно через `.current`.\n *\n * @returns `ref`-объект (`MutableRefObject<T>`), чьё свойство `.current` всегда\n * указывает на последнее переданное `value`.\n */\nexport const useActualRef = <T>(value: T): MutableRefObject<T> => {\n const valueRef = useRef(value);\n valueRef.current = value;\n return valueRef;\n};\n\n/**\n * Подписывает трансформацию на изменения исходного `MotionValue` **и** внешнего хранилища ключевых подписок.\n *\n * В отличие от `useTransform` из motion, этот хук не создает новый `MotionValue`.\n * Вместо этого он вызывает пользовательскую `transformFn(arg, value)` при любом изменении:\n * - исходного `originalValue`, и/или\n * - значений во внешнем хранилище `store` по указанным `keys`.\n *\n * `transformFn` обычно внутри делает `.set(...)` у одного или нескольких целевых `MotionValue`.\n *\n * @template T Тип значения исходного `MotionValue`.\n * @template K Тип ключей внешнего хранилища (строка | число | символ).\n * @template V Тип агрегированного значения, извлекаемого из хранилища и передаваемого в `transformFn`.\n *\n * @param {MotionValue<T>} originalValue\n * Исходный `MotionValue`, изменения которого инициируют трансформацию.\n *\n * @param {KeyedSubscriptions<K> | (() => KeyedSubscriptions<K>)} store\n * Внешнее хранилище с подписками. Может быть самим объектом или фабрикой.\n * Если передана функция, хук пересоздает подписки при событии `onDestroy`.\n *\n * @param {K[]} keys\n * Набор ключей хранилища, на изменения которых нужно реагировать.\n * Равенство `keys` проверяется по количеству и составу; изменение порядка не важно.\n * Изменение этого набора вызывает пересоздание подписок подписок.\n *\n * @param {() => V} valueExtractor\n * Функция, синхронно извлекающая/агрегирующая данные из хранилища\n * для передачи первым аргументом в `transformFn`.\n *\n * @param {(arg: V, value: T) => void} transformFn\n * Функция-трансформация. Вызывается при каждом триггере с\n * `arg = valueExtractor()` и `value = originalValue.get()`. Обычно внутри вызывает `someMotionValue.set(...)`.\n *\n * @example\n * ```tsx\n * import { motion, useMotionValue } from \"motion/react\";\n *\n * const store: KeyedSubscriptions<\"width\" | \"height\"> = createKeyedStore();\n *\n * export function Example() {\n * const x = useMotionValue(0); // исходный драйвер\n * const y = useMotionValue(0); // целевой MotionValue\n *\n * useStoreSyncedTransform(\n * x,\n * store,\n * [\"width\", \"height\"],\n * () => ({\n * w: store.get(\"width\"),\n * h: store.get(\"height\"),\n * }),\n * ({ w, h }, xVal) => {\n * // пример простой зависимости\n * const mapped = (xVal / Math.max(w, 1)) * h;\n * y.set(mapped);\n * }\n * );\n *\n * return <motion.div style={{ x, y }} />;\n * }\n * ```\n */\nexport const useStoreSyncedTransform = <T, K extends PropertyKey, V>(\n originalValue: MotionValue<T>,\n store: KeyedSubscriptions<K>,\n keys: K[],\n valueExtractor: () => V,\n transformFn: (arg: V, value: T) => void\n): void => {\n const valueExtractorRef = useActualRef(valueExtractor);\n const extractedValueRef = useActualRef(valueExtractor());\n const transformFnRef = useActualRef(transformFn);\n const originalValueRef = useActualRef(originalValue);\n const transform = useInitOnce(\n () => () => transformFnRef.current(extractedValueRef.current, originalValueRef.current.get())\n );\n\n const observedKeysRef = useRef<Set<K> | null>(null);\n let observedKeys = observedKeysRef.current;\n const isKeysChanged =\n observedKeys === null || keys.length !== observedKeys.size || keys.some((k) => !observedKeys?.has(k));\n\n if (isKeysChanged) {\n observedKeys = new Set(keys);\n observedKeysRef.current = observedKeys;\n }\n\n useLayoutEffect(() => {\n const unsubscribeStore = store.onChange(observedKeys ? [...observedKeys] : [], () => {\n extractedValueRef.current = valueExtractorRef.current();\n transform();\n });\n const unsubscribeValue = originalValue.on('change', transform);\n\n return () => {\n unsubscribeStore();\n unsubscribeValue();\n };\n }, [store, observedKeys, originalValue, extractedValueRef, valueExtractorRef, transform]);\n\n useLayoutEffect(() => {\n transform();\n }, [valueExtractor, extractedValueRef, transformFn, transform]);\n};\n\nconst SCROLLABLE = ['auto', 'scroll'];\nexport const findScrollContainer = (\n element: HTMLElement\n):\n | { eventsProvider: HTMLElement; infoProvider: HTMLElement; mode: 'element' }\n | { eventsProvider: Window; infoProvider: Element; mode: 'window' } => {\n let parentElement = element.parentElement;\n while (parentElement !== null) {\n const { overflowY } = window.getComputedStyle(parentElement);\n if (SCROLLABLE.includes(overflowY)) {\n return { eventsProvider: parentElement, infoProvider: parentElement, mode: 'element' };\n }\n parentElement = parentElement.parentElement;\n }\n\n return {\n eventsProvider: window,\n infoProvider: document.scrollingElement || document.documentElement,\n mode: 'window',\n };\n};\n\nexport const isDOMRectsEqual = (a: DOMRectReadOnly | null, b: DOMRectReadOnly | null): boolean =>\n a === b || (a !== null && b !== null && a.x === b.x && a.y === b.y && a.height === b.height && a.width === b.width);\n\nexport interface MorphSetup {\n start: DOMRectReadOnly;\n end: DOMRectReadOnly;\n containerStart: DOMRectReadOnly;\n containerEnd: DOMRectReadOnly;\n}\n\nexport type SizeAxis = 'vertical' | 'horizontal' | 'both' | 'auto';\nexport type HorizontalAlign = 'left' | 'right' | 'center';\nexport type VerticalAlign = 'top' | 'bottom' | 'center';\n\nconst MAX_SCALE_RATIO = 2;\nconst AXIS_SIZE_MULTIPLIER = {\n left: 0,\n center: 0.5,\n right: 1,\n top: 0,\n bottom: 1,\n} as const;\n\nexport const calcMorphParams = (\n start: DOMRectReadOnly | null,\n end: DOMRectReadOnly | null,\n sizeAxis: SizeAxis,\n horizontalPositionAlign: HorizontalAlign,\n verticalPositionAlign: VerticalAlign\n): { deltaX: number; deltaY: number; scaleX: number; scaleY: number } => {\n if (start === null || end === null) {\n return {\n deltaX: 0,\n deltaY: 0,\n scaleX: 1,\n scaleY: 1,\n };\n }\n\n let axis = sizeAxis;\n let scaleX = end.width / start.width;\n let scaleY = end.height / start.height;\n\n if (sizeAxis === 'auto') {\n const ratio = Math.max(scaleX, scaleY) / Math.min(scaleX, scaleY);\n if (ratio > MAX_SCALE_RATIO) {\n const absScaleX = scaleX < 1 ? 1 / scaleX : scaleX;\n const absScaleY = scaleY < 1 ? 1 / scaleY : scaleY;\n axis = absScaleX < absScaleY ? 'horizontal' : 'vertical';\n }\n }\n\n scaleX = axis === 'vertical' ? scaleY : scaleX;\n scaleY = axis === 'horizontal' ? scaleX : scaleY;\n\n const startX = start.x + start.width * AXIS_SIZE_MULTIPLIER[horizontalPositionAlign];\n const endX = end.x + end.width * AXIS_SIZE_MULTIPLIER[horizontalPositionAlign];\n const startY = start.y + start.height * AXIS_SIZE_MULTIPLIER[verticalPositionAlign];\n const endY = end.y + end.height * AXIS_SIZE_MULTIPLIER[verticalPositionAlign];\n\n const deltaX = endX - startX;\n const deltaY = endY - startY;\n\n return {\n deltaX,\n deltaY,\n scaleX,\n scaleY,\n };\n};\n\nexport const getRelativeOffset = (scrollAdapter: ScrollAdapter, element: HTMLElement | null): number => {\n if (!scrollAdapter.scrollContainer.current || !element) {\n return 0;\n }\n\n const container = scrollAdapter.scrollContainer.current;\n const containerTop = container === document.documentElement ? 0 : container.getBoundingClientRect().top;\n const scroll = scrollAdapter.getScrollTop();\n scrollAdapter.setScrollTop(0);\n const elementTop = element.getBoundingClientRect().top;\n scrollAdapter.setScrollTop(scroll);\n\n return elementTop - containerTop;\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-nav-bar",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -27,12 +27,14 @@
27
27
  "access": "public"
28
28
  },
29
29
  "dependencies": {
30
+ "@hh.ru/magritte-common-use-multiple-refs": "1.1.9",
30
31
  "@hh.ru/magritte-common-use-when-font-loaded": "1.0.12",
31
32
  "@hh.ru/magritte-design-tokens": "23.2.3",
32
33
  "@hh.ru/magritte-internal-custom-scroll": "2.0.0",
33
34
  "@hh.ru/magritte-ui-divider": "3.0.7",
34
35
  "@hh.ru/magritte-ui-icon": "13.1.1",
35
- "@hh.ru/magritte-ui-layer": "3.0.5"
36
+ "@hh.ru/magritte-ui-layer": "3.0.5",
37
+ "@hh.ru/magritte-ui-mock-component": "1.1.5"
36
38
  },
37
- "gitHead": "90a91eaf0ef55ef0ae534be060b7bf4c27736f36"
39
+ "gitHead": "b20ca79252fa840d3d5fafb398e47efdfe3a00a9"
38
40
  }
package/public/Actions.js CHANGED
@@ -6,7 +6,7 @@ import { isIconElement } from '@hh.ru/magritte-ui-icon';
6
6
  import { EnvironmentFingerprintNode } from './EnvironmentFingerprintNode.js';
7
7
  import { Morph } from './Morph.js';
8
8
  import { useAnimationStage } from './Stage.js';
9
- import { s as styles } from '../NavBar-BM6rmKUJ.js';
9
+ import { s as styles } from '../NavBar-C_bLkCSc.js';
10
10
  import '../internal/MetricsProvider.js';
11
11
  import '../internal/utils.js';
12
12
  import 'motion/react';
@@ -14,9 +14,9 @@ import '../internal/MorphStore.js';
14
14
  import '../internal/KeyedSubscriptions.js';
15
15
  import '../internal/PaneStore.js';
16
16
  import 'motion';
17
+ import '../internal/useInert.js';
17
18
  import '@hh.ru/magritte-ui-divider';
18
19
  import '@hh.ru/magritte-ui-layer';
19
- import '../internal/ProgressiveBlur.js';
20
20
  import '../internal/useAnimationRanges.js';
21
21
  import '../internal/useBindScrollToAnimationProgress.js';
22
22
  import '../internal/useNavBarMetrics.js';
@@ -39,7 +39,7 @@ const Actions = ({ children, left, right, centered = false, autoMorph = true, })
39
39
  [styles.actionsEndStage]: stage === 'end',
40
40
  [styles.actionsOnlyStage]: stage === 'only',
41
41
  [styles.actionsNoChildren]: !children,
42
- }), children: [!!left && (jsxs("div", { className: styles.actionsLeftSlot, children: [jsx(EnvironmentFingerprintNode, { className: styles.actionsSideSlotContent, children: autoMorph && stage !== 'only' ? wrapToMorph(left, false) : left }), centered && (jsx("div", { className: styles.actionsSideSlotContentClone, "aria-hidden": "true", children: right }))] })), (!!children || !left || !right) && (jsx("div", { className: classNames(styles.actionsCenterSlot, { [styles.actionsCenterSlotCentered]: centered }), children: children })), !!right && (jsxs("div", { className: styles.actionsRightSlot, children: [jsx(EnvironmentFingerprintNode, { className: styles.actionsSideSlotContent, children: autoMorph && stage !== 'only' ? wrapToMorph(right, true) : right }), centered && (jsx("div", { className: styles.actionsSideSlotContentClone, "aria-hidden": "true", children: left }))] }))] }));
42
+ }), children: [!!left && (jsxs("div", { className: styles.actionsLeftSlot, children: [jsx(EnvironmentFingerprintNode, { className: styles.actionsSideSlotContent, children: autoMorph && stage !== 'only' ? wrapToMorph(left, false) : left }), centered && (jsx("div", { className: styles.actionsSideSlotContentClone, "aria-hidden": "true", "data-qa": "actions-duplicate-container", inert: 'true', children: right }))] })), (!!children || !left || !right) && (jsx("div", { className: classNames(styles.actionsCenterSlot, { [styles.actionsCenterSlotCentered]: centered }), children: children })), !!right && (jsxs("div", { className: styles.actionsRightSlot, children: [jsx(EnvironmentFingerprintNode, { className: styles.actionsSideSlotContent, children: autoMorph && stage !== 'only' ? wrapToMorph(right, true) : right }), centered && (jsx("div", { className: styles.actionsSideSlotContentClone, "aria-hidden": "true", "data-qa": "actions-duplicate-container", inert: 'true', children: left }))] }))] }));
43
43
  };
44
44
 
45
45
  export { Actions };
@@ -1 +1 @@
1
- {"version":3,"file":"Actions.js","sources":["../../src/public/Actions.tsx"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type JSXElementConstructor,\n type PropsWithChildren,\n type ReactElement,\n type FC,\n type ReactNode,\n} from 'react';\nimport classNames from 'classnames';\n\nimport { isIconElement } from '@hh.ru/magritte-ui-icon';\nimport { EnvironmentFingerprintNode } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\nimport { Morph } from '@hh.ru/magritte-ui-nav-bar/public/Morph';\nimport { useAnimationStage } from '@hh.ru/magritte-ui-nav-bar/public/Stage';\n\nimport styles from './nav-bar.less';\n\nexport interface ActionsProps {\n /**\n * Контент левого слота\n */\n left?: ReactNode | ReactNode[];\n /**\n * Контент правого слота\n */\n right?: ReactNode | ReactNode[];\n /**\n * Контент центрального слота\n */\n children?: ReactNode;\n /**\n * Включает центрирование контента центрального слота относительно всего компонента.\n */\n centered?: boolean;\n /**\n * Управляет автоматическим оборачиванием всего контента в компоненты <Morph />.\n * По умолчанию включен, но может быть отключен если требуется более сложное описание анимации\n * чем используется по умолчанию.\n */\n autoMorph?: boolean;\n}\n\nconst wrapToMorph = (node: ReactNode | ReactNode[], isRight: boolean) => {\n const arr =\n isValidElement(node) && node.type === Fragment\n ? Children.toArray(\n (node as ReactElement<PropsWithChildren, JSXElementConstructor<PropsWithChildren>>).props.children\n )\n : Children.toArray(node);\n\n return arr.map((node, index) => (\n <Morph\n className={isIconElement(node) ? styles.actionsIconMorph : ''}\n id={`actions-component-${isRight ? 'right' : 'left'}-slot-item-${isRight ? arr.length - index : index}`}\n key={index}\n >\n {node}\n </Morph>\n ));\n};\n\nexport const Actions: FC<PropsWithChildren<ActionsProps>> = ({\n children,\n left,\n right,\n centered = false,\n autoMorph = true,\n}) => {\n const stage = useAnimationStage();\n return (\n <div\n className={classNames(styles.actionsContainer, {\n [styles.actionsStartStage]: stage === 'start',\n [styles.actionsEndStage]: stage === 'end',\n [styles.actionsOnlyStage]: stage === 'only',\n [styles.actionsNoChildren]: !children,\n })}\n >\n {!!left && (\n <div className={styles.actionsLeftSlot}>\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(left, false) : left}\n </EnvironmentFingerprintNode>\n {centered && (\n <div className={styles.actionsSideSlotContentClone} aria-hidden=\"true\">\n {right}\n </div>\n )}\n </div>\n )}\n\n {(!!children || !left || !right) && (\n <div className={classNames(styles.actionsCenterSlot, { [styles.actionsCenterSlotCentered]: centered })}>\n {children}\n </div>\n )}\n\n {!!right && (\n <div className={styles.actionsRightSlot}>\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(right, true) : right}\n </EnvironmentFingerprintNode>\n {centered && (\n <div className={styles.actionsSideSlotContentClone} aria-hidden=\"true\">\n {left}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Actions.js","sources":["../../src/public/Actions.tsx"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type JSXElementConstructor,\n type PropsWithChildren,\n type ReactElement,\n type FC,\n type ReactNode,\n} from 'react';\nimport classNames from 'classnames';\n\nimport { isIconElement } from '@hh.ru/magritte-ui-icon';\nimport { EnvironmentFingerprintNode } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\nimport { Morph } from '@hh.ru/magritte-ui-nav-bar/public/Morph';\nimport { useAnimationStage } from '@hh.ru/magritte-ui-nav-bar/public/Stage';\n\nimport styles from './nav-bar.less';\n\nexport interface ActionsProps {\n /**\n * Контент левого слота\n */\n left?: ReactNode | ReactNode[];\n /**\n * Контент правого слота\n */\n right?: ReactNode | ReactNode[];\n /**\n * Контент центрального слота\n */\n children?: ReactNode;\n /**\n * Включает центрирование контента центрального слота относительно всего компонента.\n */\n centered?: boolean;\n /**\n * Управляет автоматическим оборачиванием всего контента в компоненты <Morph />.\n * По умолчанию включен, но может быть отключен если требуется более сложное описание анимации\n * чем используется по умолчанию.\n */\n autoMorph?: boolean;\n}\n\nconst wrapToMorph = (node: ReactNode | ReactNode[], isRight: boolean) => {\n const arr =\n isValidElement(node) && node.type === Fragment\n ? Children.toArray(\n (node as ReactElement<PropsWithChildren, JSXElementConstructor<PropsWithChildren>>).props.children\n )\n : Children.toArray(node);\n\n return arr.map((node, index) => (\n <Morph\n className={isIconElement(node) ? styles.actionsIconMorph : ''}\n id={`actions-component-${isRight ? 'right' : 'left'}-slot-item-${isRight ? arr.length - index : index}`}\n key={index}\n >\n {node}\n </Morph>\n ));\n};\n\nexport const Actions: FC<PropsWithChildren<ActionsProps>> = ({\n children,\n left,\n right,\n centered = false,\n autoMorph = true,\n}) => {\n const stage = useAnimationStage();\n return (\n <div\n className={classNames(styles.actionsContainer, {\n [styles.actionsStartStage]: stage === 'start',\n [styles.actionsEndStage]: stage === 'end',\n [styles.actionsOnlyStage]: stage === 'only',\n [styles.actionsNoChildren]: !children,\n })}\n >\n {!!left && (\n <div className={styles.actionsLeftSlot}>\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(left, false) : left}\n </EnvironmentFingerprintNode>\n {centered && (\n <div\n className={styles.actionsSideSlotContentClone}\n aria-hidden=\"true\"\n data-qa=\"actions-duplicate-container\"\n // атрибут не завезли в типы react 18, только с 19го\n {...{ inert: 'true' }}\n >\n {right}\n </div>\n )}\n </div>\n )}\n\n {(!!children || !left || !right) && (\n <div className={classNames(styles.actionsCenterSlot, { [styles.actionsCenterSlotCentered]: centered })}>\n {children}\n </div>\n )}\n\n {!!right && (\n <div className={styles.actionsRightSlot}>\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(right, true) : right}\n </EnvironmentFingerprintNode>\n {centered && (\n <div\n className={styles.actionsSideSlotContentClone}\n aria-hidden=\"true\"\n data-qa=\"actions-duplicate-container\"\n {...{ inert: 'true' }}\n >\n {left}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -3,19 +3,20 @@ import { jsx } from 'react/jsx-runtime';
3
3
  import { createContext, useId, useRef, useContext, useLayoutEffect } from 'react';
4
4
  import classNames from 'classnames';
5
5
  import { useMotionValue, motion } from 'motion/react';
6
+ import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
6
7
  import { useMeasureManual } from '../internal/MetricsProvider.js';
7
8
  import { useMorphStore } from '../internal/MorphStore.js';
8
9
  import { usePaneStore } from '../internal/PaneStore.js';
10
+ import { useInert } from '../internal/useInert.js';
9
11
  import { useActualRef, useStoreSyncedTransform, lerp, calcMorphParams } from '../internal/utils.js';
10
12
  import { AnimationStageContext } from './LayoutStage.js';
11
- import { s as styles } from '../NavBar-BM6rmKUJ.js';
13
+ import { s as styles } from '../NavBar-C_bLkCSc.js';
12
14
  import '../internal/KeyedSubscriptions.js';
13
15
  import 'motion';
14
16
  import '@hh.ru/magritte-common-use-when-font-loaded';
15
17
  import './EnvironmentFingerprintNode.js';
16
18
  import '@hh.ru/magritte-ui-divider';
17
19
  import '@hh.ru/magritte-ui-layer';
18
- import '../internal/ProgressiveBlur.js';
19
20
  import '../internal/useAnimationRanges.js';
20
21
  import '../internal/useBindScrollToAnimationProgress.js';
21
22
  import '../internal/useNavBarMetrics.js';
@@ -52,6 +53,8 @@ const LayoutMorph = ({ children, stage, id: manualId, sizeAxis = 'auto', vertica
52
53
  const scaleY = useMotionValue(1);
53
54
  const opacity = useMotionValue(stage !== 'end' ? 1 : 0);
54
55
  const pointerEvents = useMotionValue('auto');
56
+ const [refCb, setInert] = useInert();
57
+ const rootRefCallback = useMultipleRefs(rootRef, refCb);
55
58
  const childRef = useRef(null);
56
59
  const containerId = useLayoutMorphContext();
57
60
  useLayoutEffect(() => {
@@ -88,6 +91,7 @@ const LayoutMorph = ({ children, stage, id: manualId, sizeAxis = 'auto', vertica
88
91
  scaleX.set(lerp(1, params.scaleX, p));
89
92
  scaleY.set(lerp(1, params.scaleY, p));
90
93
  pointerEvents.set(p === 0 || (p === 1 && !stage) ? 'auto' : 'none');
94
+ setInert(pointerEvents.get() === 'none');
91
95
  stage && opacity.set(1 - p);
92
96
  };
93
97
  }
@@ -99,7 +103,8 @@ const LayoutMorph = ({ children, stage, id: manualId, sizeAxis = 'auto', vertica
99
103
  y.set(lerp(startY, startY + params.deltaY, p));
100
104
  width.set(lerp(setup.start.width, setup.start.width * params.scaleX, p));
101
105
  height.set(lerp(setup.start.height, setup.start.height * params.scaleY, p));
102
- pointerEvents.set(p === 0 || (p === 1 && !stage) ? 'auto' : 'none');
106
+ pointerEvents.set(p === 0 || !stage ? 'auto' : 'none');
107
+ setInert(pointerEvents.get() === 'none');
103
108
  stage && opacity.set(1 - p);
104
109
  };
105
110
  }, (interpolator, progress) => interpolator(progress));
@@ -117,7 +122,7 @@ const LayoutMorph = ({ children, stage, id: manualId, sizeAxis = 'auto', vertica
117
122
  }
118
123
  }
119
124
  });
120
- return (jsx(motion.div, { ...rest, ref: rootRef, className: classNames(styles.layoutMorph, {
125
+ return (jsx(motion.div, { ...rest, ref: rootRefCallback, className: classNames(styles.layoutMorph, {
121
126
  [styles.layoutMorphStart]: stage === 'start',
122
127
  [styles.layoutMorphEnd]: stage === 'end',
123
128
  [styles.morphItemTop]: verticalPositionAlign === 'top' && isManual,
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutMorph.js","sources":["../../src/public/LayoutMorph.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useRef,\n type FC,\n type MutableRefObject,\n type PropsWithChildren,\n} from 'react';\nimport classNames from 'classnames';\nimport { type HTMLMotionProps, motion, useMotionValue } from 'motion/react';\n\nimport { useMeasureManual } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { useMorphStore } from '@hh.ru/magritte-ui-nav-bar/internal/MorphStore';\nimport { usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport {\n lerp,\n useActualRef,\n useStoreSyncedTransform,\n calcMorphParams,\n type MorphSetup,\n type HorizontalAlign,\n type SizeAxis,\n type VerticalAlign,\n} from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { AnimationStageContext } from '@hh.ru/magritte-ui-nav-bar/public/LayoutStage';\n\nimport styles from './nav-bar.less';\n\nconst startKey = (id: string) => `${id}-start`;\nconst endKey = (id: string) => `${id}-end`;\n\nconst LayoutMorphContext = createContext<string>('#container');\nconst useLayoutMorphContext = () => useContext(LayoutMorphContext);\n\nconst calcParams = (\n setup: MorphSetup,\n sizeAxis: SizeAxis,\n horizontalPositionAlign: HorizontalAlign,\n verticalPositionAlign: VerticalAlign\n) => {\n const start = DOMRect.fromRect(setup.start);\n start.x -= setup.containerStart.x;\n start.y -= setup.containerStart.y;\n\n const end = DOMRect.fromRect(setup.end);\n end.x -= setup.containerEnd.x;\n end.y -= setup.containerEnd.y;\n\n return calcMorphParams(start, end, sizeAxis, horizontalPositionAlign, verticalPositionAlign);\n};\n\nexport type LayoutMorphProps = PropsWithChildren<\n {\n /**\n * Задает стадию анимации на которой элемент будет виден.\n * Если не задан, то элемент будет виден на протяжении всей анимации.\n */\n stage?: 'start' | 'end';\n /**\n * Позволяет анимировать элементы через морфинг, задав между ними связь с помощью указания одинакового `id`\n * и разных `stage`\n */\n id?: string;\n /**\n * Задает ось на основе которой будет вычисляться коэффициент масштабирования применяемый в ходе анимации.\n * В режиме `both` для каждой из осей применяется свой коэффициент что может привести к искажению пропорций в ходе\n * анимации.\n * В режиме `auto` применяется эвристика для выбора одного из трех остальных режимов для получения наилучшего\n * результат и минимизации искажения пропорций.\n */\n sizeAxis?: SizeAxis;\n /**\n * Задает горизонтальное выравнивание анимируемых элементов в ходе анимации.\n */\n horizontalPositionAlign?: HorizontalAlign;\n /**\n * Задает вертикальное выравнивание анимируемых элементов в ходе анимации.\n */\n verticalPositionAlign?: VerticalAlign;\n } & HTMLMotionProps<'div'>\n>;\n\nexport const LayoutMorph: FC<LayoutMorphProps> = ({\n children,\n stage,\n id: manualId,\n sizeAxis = 'auto',\n verticalPositionAlign = 'center',\n horizontalPositionAlign = 'center',\n ...rest\n}) => {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const animationStageRef = useContext(AnimationStageContext);\n const morphStore = useMorphStore();\n const paneStore = usePaneStore();\n\n const width = useMotionValue<'auto' | number>('auto');\n const height = useMotionValue<'auto' | number>('auto');\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const scaleX = useMotionValue(1);\n const scaleY = useMotionValue(1);\n const opacity = useMotionValue(stage !== 'end' ? 1 : 0);\n const pointerEvents = useMotionValue<'auto' | 'none'>('auto');\n\n const childRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n const containerId = useLayoutMorphContext();\n\n useLayoutEffect(() => {\n if (!rootRef.current || !rootRef.current.firstChild) {\n return;\n }\n if (rootRef.current.children.length > 1) {\n throw new Error(\n 'LayoutMorph expects exactly one child HTML element. Please wrap multiple children in a container.'\n );\n }\n childRef.current = rootRef.current.firstChild as HTMLElement;\n }, []);\n\n const isManual = !!manualId && !!stage;\n\n const actualIdRef = useActualRef(isManual ? manualId : id);\n\n useStoreSyncedTransform(\n paneStore.get('motionValue'),\n morphStore,\n [startKey(id), endKey(id), startKey(containerId), endKey(containerId)],\n () => {\n const basicRect = new DOMRectReadOnly();\n const sk = stage === 'end' ? endKey : startKey;\n const ek = stage === 'end' ? startKey : endKey;\n const setup = {\n start: morphStore.get(sk(actualIdRef.current)) ?? basicRect,\n end: morphStore.get(ek(actualIdRef.current)) ?? basicRect,\n containerStart: morphStore.get(sk(containerId)) ?? basicRect,\n containerEnd: morphStore.get(ek(containerId)) ?? basicRect,\n };\n\n const params = calcParams(\n setup,\n isManual ? sizeAxis : 'both',\n isManual ? horizontalPositionAlign : 'left',\n isManual ? verticalPositionAlign : 'top'\n );\n const startX = setup.start.x - setup.containerStart.x;\n const startY = setup.start.y - setup.containerStart.y;\n\n if (isManual) {\n width.set(setup.start.width);\n height.set(setup.start.height);\n return (progress: number) => {\n const p = stage === 'end' ? 1 - progress : progress;\n x.set(lerp(startX, startX + params.deltaX, p));\n y.set(lerp(startY, startY + params.deltaY, p));\n scaleX.set(lerp(1, params.scaleX, p));\n scaleY.set(lerp(1, params.scaleY, p));\n pointerEvents.set(p === 0 || (p === 1 && !stage) ? 'auto' : 'none');\n stage && opacity.set(1 - p);\n };\n }\n\n scaleX.set(1);\n scaleY.set(1);\n return (progress: number) => {\n const p = stage === 'end' ? 1 - progress : progress;\n x.set(lerp(startX, startX + params.deltaX, p));\n y.set(lerp(startY, startY + params.deltaY, p));\n width.set(lerp(setup.start.width, setup.start.width * params.scaleX, p));\n height.set(lerp(setup.start.height, setup.start.height * params.scaleY, p));\n pointerEvents.set(p === 0 || (p === 1 && !stage) ? 'auto' : 'none');\n stage && opacity.set(1 - p);\n };\n },\n (interpolator, progress) => interpolator(progress)\n );\n\n useMeasureManual(childRef, (rect) => {\n if (animationStageRef.current === 'start') {\n (stage === 'start' || !stage) && morphStore.set(startKey(actualIdRef.current), rect);\n // если элемент виден только в начальной или конечной точке анимации, то его позиция и размер\n // не меняются в процессе анимации, только прозрачность\n stage === 'start' && morphStore.set(endKey(actualIdRef.current), rect);\n } else if (animationStageRef.current === 'end') {\n (stage === 'end' || !stage) && morphStore.set(endKey(actualIdRef.current), rect);\n if ((!isManual || morphStore.get(startKey(actualIdRef.current)) === null) && stage === 'end') {\n morphStore.set(startKey(actualIdRef.current), rect);\n }\n }\n });\n\n return (\n <motion.div\n {...rest}\n ref={rootRef}\n className={classNames(styles.layoutMorph, {\n [styles.layoutMorphStart]: stage === 'start',\n [styles.layoutMorphEnd]: stage === 'end',\n [styles.morphItemTop]: verticalPositionAlign === 'top' && isManual,\n [styles.morphItemBottom]: verticalPositionAlign === 'bottom' && isManual,\n [styles.morphItemLeft]: horizontalPositionAlign === 'left' && isManual,\n [styles.morphItemRight]: horizontalPositionAlign === 'right' && isManual,\n })}\n style={{ width, height, x, y, scaleX, scaleY, opacity, pointerEvents }}\n >\n <LayoutMorphContext.Provider value={id}>{children}</LayoutMorphContext.Provider>\n </motion.div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"LayoutMorph.js","sources":["../../src/public/LayoutMorph.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useRef,\n type FC,\n type MutableRefObject,\n type PropsWithChildren,\n} from 'react';\nimport classNames from 'classnames';\nimport { type HTMLMotionProps, motion, useMotionValue } from 'motion/react';\n\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useMeasureManual } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { useMorphStore } from '@hh.ru/magritte-ui-nav-bar/internal/MorphStore';\nimport { usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useInert } from '@hh.ru/magritte-ui-nav-bar/internal/useInert';\nimport {\n lerp,\n useActualRef,\n useStoreSyncedTransform,\n calcMorphParams,\n type MorphSetup,\n type HorizontalAlign,\n type SizeAxis,\n type VerticalAlign,\n} from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { AnimationStageContext } from '@hh.ru/magritte-ui-nav-bar/public/LayoutStage';\n\nimport styles from './nav-bar.less';\n\nconst startKey = (id: string) => `${id}-start`;\nconst endKey = (id: string) => `${id}-end`;\n\nconst LayoutMorphContext = createContext<string>('#container');\nconst useLayoutMorphContext = () => useContext(LayoutMorphContext);\n\nconst calcParams = (\n setup: MorphSetup,\n sizeAxis: SizeAxis,\n horizontalPositionAlign: HorizontalAlign,\n verticalPositionAlign: VerticalAlign\n) => {\n const start = DOMRect.fromRect(setup.start);\n start.x -= setup.containerStart.x;\n start.y -= setup.containerStart.y;\n\n const end = DOMRect.fromRect(setup.end);\n end.x -= setup.containerEnd.x;\n end.y -= setup.containerEnd.y;\n\n return calcMorphParams(start, end, sizeAxis, horizontalPositionAlign, verticalPositionAlign);\n};\n\nexport type LayoutMorphProps = PropsWithChildren<\n {\n /**\n * Задает стадию анимации на которой элемент будет виден.\n * Если не задан, то элемент будет виден на протяжении всей анимации.\n */\n stage?: 'start' | 'end';\n /**\n * Позволяет анимировать элементы через морфинг, задав между ними связь с помощью указания одинакового `id`\n * и разных `stage`\n */\n id?: string;\n /**\n * Задает ось на основе которой будет вычисляться коэффициент масштабирования применяемый в ходе анимации.\n * В режиме `both` для каждой из осей применяется свой коэффициент что может привести к искажению пропорций в ходе\n * анимации.\n * В режиме `auto` применяется эвристика для выбора одного из трех остальных режимов для получения наилучшего\n * результат и минимизации искажения пропорций.\n */\n sizeAxis?: SizeAxis;\n /**\n * Задает горизонтальное выравнивание анимируемых элементов в ходе анимации.\n */\n horizontalPositionAlign?: HorizontalAlign;\n /**\n * Задает вертикальное выравнивание анимируемых элементов в ходе анимации.\n */\n verticalPositionAlign?: VerticalAlign;\n } & HTMLMotionProps<'div'>\n>;\n\nexport const LayoutMorph: FC<LayoutMorphProps> = ({\n children,\n stage,\n id: manualId,\n sizeAxis = 'auto',\n verticalPositionAlign = 'center',\n horizontalPositionAlign = 'center',\n ...rest\n}) => {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const animationStageRef = useContext(AnimationStageContext);\n const morphStore = useMorphStore();\n const paneStore = usePaneStore();\n\n const width = useMotionValue<'auto' | number>('auto');\n const height = useMotionValue<'auto' | number>('auto');\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const scaleX = useMotionValue(1);\n const scaleY = useMotionValue(1);\n const opacity = useMotionValue(stage !== 'end' ? 1 : 0);\n const pointerEvents = useMotionValue<'auto' | 'none'>('auto');\n const [refCb, setInert] = useInert();\n const rootRefCallback = useMultipleRefs<HTMLElement>(rootRef, refCb);\n\n const childRef: MutableRefObject<HTMLElement | null> = useRef(null);\n\n const containerId = useLayoutMorphContext();\n\n useLayoutEffect(() => {\n if (!rootRef.current || !rootRef.current.firstChild) {\n return;\n }\n if (rootRef.current.children.length > 1) {\n throw new Error(\n 'LayoutMorph expects exactly one child HTML element. Please wrap multiple children in a container.'\n );\n }\n childRef.current = rootRef.current.firstChild as HTMLElement;\n }, []);\n\n const isManual = !!manualId && !!stage;\n\n const actualIdRef = useActualRef(isManual ? manualId : id);\n\n useStoreSyncedTransform(\n paneStore.get('motionValue'),\n morphStore,\n [startKey(id), endKey(id), startKey(containerId), endKey(containerId)],\n () => {\n const basicRect = new DOMRectReadOnly();\n const sk = stage === 'end' ? endKey : startKey;\n const ek = stage === 'end' ? startKey : endKey;\n const setup = {\n start: morphStore.get(sk(actualIdRef.current)) ?? basicRect,\n end: morphStore.get(ek(actualIdRef.current)) ?? basicRect,\n containerStart: morphStore.get(sk(containerId)) ?? basicRect,\n containerEnd: morphStore.get(ek(containerId)) ?? basicRect,\n };\n\n const params = calcParams(\n setup,\n isManual ? sizeAxis : 'both',\n isManual ? horizontalPositionAlign : 'left',\n isManual ? verticalPositionAlign : 'top'\n );\n const startX = setup.start.x - setup.containerStart.x;\n const startY = setup.start.y - setup.containerStart.y;\n\n if (isManual) {\n width.set(setup.start.width);\n height.set(setup.start.height);\n return (progress: number) => {\n const p = stage === 'end' ? 1 - progress : progress;\n x.set(lerp(startX, startX + params.deltaX, p));\n y.set(lerp(startY, startY + params.deltaY, p));\n scaleX.set(lerp(1, params.scaleX, p));\n scaleY.set(lerp(1, params.scaleY, p));\n pointerEvents.set(p === 0 || (p === 1 && !stage) ? 'auto' : 'none');\n setInert(pointerEvents.get() === 'none');\n stage && opacity.set(1 - p);\n };\n }\n\n scaleX.set(1);\n scaleY.set(1);\n return (progress: number) => {\n const p = stage === 'end' ? 1 - progress : progress;\n x.set(lerp(startX, startX + params.deltaX, p));\n y.set(lerp(startY, startY + params.deltaY, p));\n width.set(lerp(setup.start.width, setup.start.width * params.scaleX, p));\n height.set(lerp(setup.start.height, setup.start.height * params.scaleY, p));\n pointerEvents.set(p === 0 || !stage ? 'auto' : 'none');\n setInert(pointerEvents.get() === 'none');\n stage && opacity.set(1 - p);\n };\n },\n (interpolator, progress) => interpolator(progress)\n );\n\n useMeasureManual(childRef, (rect) => {\n if (animationStageRef.current === 'start') {\n (stage === 'start' || !stage) && morphStore.set(startKey(actualIdRef.current), rect);\n // если элемент виден только в начальной или конечной точке анимации, то его позиция и размер\n // не меняются в процессе анимации, только прозрачность\n stage === 'start' && morphStore.set(endKey(actualIdRef.current), rect);\n } else if (animationStageRef.current === 'end') {\n (stage === 'end' || !stage) && morphStore.set(endKey(actualIdRef.current), rect);\n if ((!isManual || morphStore.get(startKey(actualIdRef.current)) === null) && stage === 'end') {\n morphStore.set(startKey(actualIdRef.current), rect);\n }\n }\n });\n\n return (\n <motion.div\n {...rest}\n ref={rootRefCallback}\n className={classNames(styles.layoutMorph, {\n [styles.layoutMorphStart]: stage === 'start',\n [styles.layoutMorphEnd]: stage === 'end',\n [styles.morphItemTop]: verticalPositionAlign === 'top' && isManual,\n [styles.morphItemBottom]: verticalPositionAlign === 'bottom' && isManual,\n [styles.morphItemLeft]: horizontalPositionAlign === 'left' && isManual,\n [styles.morphItemRight]: horizontalPositionAlign === 'right' && isManual,\n })}\n style={{ width, height, x, y, scaleX, scaleY, opacity, pointerEvents }}\n >\n <LayoutMorphContext.Provider value={id}>{children}</LayoutMorphContext.Provider>\n </motion.div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
@@ -9,12 +9,11 @@ import { MorphStoreProvider, useMorphStore } from '../internal/MorphStore.js';
9
9
  import { usePaneStore } from '../internal/PaneStore.js';
10
10
  import { useInitOnce } from '../internal/utils.js';
11
11
  import { EnvironmentFingerprintNode, useEnvironmentFingerprint } from './EnvironmentFingerprintNode.js';
12
- import { s as styles } from '../NavBar-BM6rmKUJ.js';
12
+ import { s as styles } from '../NavBar-C_bLkCSc.js';
13
13
  import '../internal/KeyedSubscriptions.js';
14
14
  import 'motion';
15
15
  import '@hh.ru/magritte-ui-divider';
16
16
  import '@hh.ru/magritte-ui-layer';
17
- import '../internal/ProgressiveBlur.js';
18
17
  import '../internal/useAnimationRanges.js';
19
18
  import '../internal/useBindScrollToAnimationProgress.js';
20
19
  import '../internal/useNavBarMetrics.js';
@@ -79,7 +78,7 @@ const CombinedStageAnimationMeasurementManager = ({ children, ...rest }) => {
79
78
  };
80
79
  const LayoutStage = ({ children, ...rest }) => {
81
80
  const stageRef = useRef('start');
82
- return (jsx(EnvironmentFingerprintNode, { style: { pointerEvents: 'auto' }, children: jsx(MorphStoreProvider, { children: jsx(AnimationStageContext.Provider, { value: stageRef, children: jsx(MetricsProvider, { children: jsx(CombinedStageAnimationMeasurementManager, { ...rest, children: children }) }) }) }) }));
81
+ return (jsx(EnvironmentFingerprintNode, { style: { pointerEvents: 'none' }, children: jsx(MorphStoreProvider, { children: jsx(AnimationStageContext.Provider, { value: stageRef, children: jsx(MetricsProvider, { children: jsx(CombinedStageAnimationMeasurementManager, { ...rest, children: children }) }) }) }) }));
83
82
  };
84
83
 
85
84
  export { AnimationStageContext, CONTAINER_END_KEY, CONTAINER_START_KEY, LayoutStage };