@hh.ru/magritte-ui-nav-bar 1.3.4 → 1.3.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/internal/utils.ts"],"sourcesContent":["import { type MutableRefObject, useLayoutEffect, useRef } from 'react';\nimport { frame, 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 scheduled = useRef(false);\n const scheduleTransform = useInitOnce(() => () => {\n if (scheduled.current) {\n return;\n }\n\n scheduled.current = true;\n frame.preRender(() => {\n transformFnRef.current(extractedValueRef.current, originalValueRef.current.get());\n scheduled.current = false;\n });\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 scheduleTransform();\n });\n const unsubscribeValue = originalValue.on('change', scheduleTransform);\n\n return () => {\n unsubscribeStore();\n unsubscribeValue();\n };\n }, [store, observedKeys, originalValue, extractedValueRef, valueExtractorRef, scheduleTransform]);\n\n useLayoutEffect(() => {\n scheduleTransform();\n }, [valueExtractor, extractedValueRef, transformFn, scheduleTransform]);\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 { frame, 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 scheduled = useRef(false);\n const scheduleTransform = useInitOnce(() => () => {\n if (scheduled.current) {\n return;\n }\n\n scheduled.current = true;\n frame.preRender(() => {\n transformFnRef.current(extractedValueRef.current, originalValueRef.current.get());\n scheduled.current = false;\n });\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 scheduleTransform();\n });\n const unsubscribeValue = originalValue.on('change', scheduleTransform);\n\n return () => {\n unsubscribeStore();\n unsubscribeValue();\n };\n }, [store, observedKeys, originalValue, extractedValueRef, valueExtractorRef, scheduleTransform]);\n\n useLayoutEffect(() => {\n scheduleTransform();\n }, [valueExtractor, extractedValueRef, transformFn, scheduleTransform]);\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.3.4",
3
+ "version": "1.3.6",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -27,14 +27,14 @@
27
27
  "access": "public"
28
28
  },
29
29
  "dependencies": {
30
- "@hh.ru/magritte-common-use-multiple-refs": "1.1.10",
31
- "@hh.ru/magritte-common-use-when-font-loaded": "1.0.13",
32
- "@hh.ru/magritte-design-tokens": "24.4.0",
33
- "@hh.ru/magritte-internal-custom-scroll": "2.1.0",
34
- "@hh.ru/magritte-ui-divider": "3.0.16",
35
- "@hh.ru/magritte-ui-icon": "13.10.1",
36
- "@hh.ru/magritte-ui-layer": "3.2.1",
37
- "@hh.ru/magritte-ui-mock-component": "1.1.6"
30
+ "@hh.ru/magritte-common-use-multiple-refs": "1.1.11",
31
+ "@hh.ru/magritte-common-use-when-font-loaded": "1.0.14",
32
+ "@hh.ru/magritte-design-tokens": "24.4.1",
33
+ "@hh.ru/magritte-internal-custom-scroll": "2.1.1",
34
+ "@hh.ru/magritte-ui-divider": "3.0.17",
35
+ "@hh.ru/magritte-ui-icon": "13.11.1",
36
+ "@hh.ru/magritte-ui-layer": "3.2.2",
37
+ "@hh.ru/magritte-ui-mock-component": "1.1.7"
38
38
  },
39
- "gitHead": "83d85ed3ddca2987dfacd2e84d6bf207d6b1bb97"
39
+ "gitHead": "ec7d56f576ca5581c2acb5010b53bbfb8da52962"
40
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-CsMoS3xA.js';
9
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
10
10
  import '../internal/MetricsProvider.js';
11
11
  import '../internal/utils.js';
12
12
  import 'motion';
@@ -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 || (!!right && centered)) && (\n <div className={styles.actionsLeftSlot}>\n {!!left && (\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(left, false) : left}\n </EnvironmentFingerprintNode>\n )}\n {centered && !!right && (\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 || (!!left && centered)) && (\n <div className={styles.actionsRightSlot}>\n {!!right && (\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(right, true) : right}\n </EnvironmentFingerprintNode>\n )}\n {centered && !!left && (\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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"}
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 || (!!right && centered)) && (\n <div className={styles.actionsLeftSlot}>\n {!!left && (\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(left, false) : left}\n </EnvironmentFingerprintNode>\n )}\n {centered && !!right && (\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 || (!!left && centered)) && (\n <div className={styles.actionsRightSlot}>\n {!!right && (\n <EnvironmentFingerprintNode className={styles.actionsSideSlotContent}>\n {autoMorph && stage !== 'only' ? wrapToMorph(right, true) : right}\n </EnvironmentFingerprintNode>\n )}\n {centered && !!left && (\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAM,WAAW,GAAG,CAAC,IAA6B,EAAE,OAAgB,KAAI;IACpE,MAAM,GAAG,GACL,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;UACxC,QAAQ,CAAC,OAAO,CACX,IAAkF,CAAC,KAAK,CAAC,QAAQ,CACrG;AACH,UAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjC,IAAA,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MACvBA,IAAC,KAAK,EAAA,EACF,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,gBAAgB,GAAG,EAAE,EAC7D,EAAE,EAAE,CAAA,kBAAA,EAAqB,OAAO,GAAG,OAAO,GAAG,MAAM,CAAA,WAAA,EAAc,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA,CAAE,EAGtG,QAAA,EAAA,IAAI,EAFA,EAAA,KAAK,CAGN,CACX,CAAC,CAAC;AACP,CAAC,CAAC;MAEW,OAAO,GAAwC,CAAC,EACzD,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,IAAI,GACnB,KAAI;AACD,IAAA,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,QACIC,cACI,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE;AAC3C,YAAA,CAAC,MAAM,CAAC,iBAAiB,GAAG,KAAK,KAAK,OAAO;AAC7C,YAAA,CAAC,MAAM,CAAC,eAAe,GAAG,KAAK,KAAK,KAAK;AACzC,YAAA,CAAC,MAAM,CAAC,gBAAgB,GAAG,KAAK,KAAK,MAAM;AAC3C,YAAA,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,QAAQ;SACxC,CAAC,EAAA,QAAA,EAAA,CAED,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,MAC7BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,QAAA,EAAA,CAAA,CAAC,CAAC,IAAI,KACHD,GAAC,CAAA,0BAA0B,IAAC,SAAS,EAAE,MAAM,CAAC,sBAAsB,EAAA,QAAA,EAC/D,SAAS,IAAI,KAAK,KAAK,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,EACvC,CAAA,CAChC,EACA,QAAQ,IAAI,CAAC,CAAC,KAAK,KAChBA,GACI,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,2BAA2B,EACjC,aAAA,EAAA,MAAM,EACV,SAAA,EAAA,6BAA6B,EAE/B,KAAK,EAAE,MAAM,EAAA,QAAA,EAElB,KAAK,EACJ,CAAA,CACT,IACC,CACT,EAEA,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,MAC3BA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,yBAAyB,GAAG,QAAQ,EAAE,CAAC,EACjG,QAAA,EAAA,QAAQ,GACP,CACT,EAEA,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,MAC7BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAClC,QAAA,EAAA,CAAA,CAAC,CAAC,KAAK,KACJD,IAAC,0BAA0B,EAAA,EAAC,SAAS,EAAE,MAAM,CAAC,sBAAsB,EAC/D,QAAA,EAAA,SAAS,IAAI,KAAK,KAAK,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,GACxC,CAChC,EACA,QAAQ,IAAI,CAAC,CAAC,IAAI,KACfA,aACI,SAAS,EAAE,MAAM,CAAC,2BAA2B,EACjC,aAAA,EAAA,MAAM,EACV,SAAA,EAAA,6BAA6B,EAC/B,KAAK,EAAE,MAAM,EAAA,QAAA,EAElB,IAAI,EAAA,CACH,CACT,CACC,EAAA,CAAA,CACT,CACC,EAAA,CAAA,EACR;AACN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentFingerprintNode.js","sources":["../../src/public/EnvironmentFingerprintNode.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useLayoutEffect,\n useRef,\n type RefCallback,\n type HTMLAttributes,\n type PropsWithChildren,\n type FC,\n type MutableRefObject,\n} from 'react';\n\nimport { useMeasureFingerprint } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { isDOMRectsEqual, scheduleMicro, useActualRef, useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\n\ntype FingerprintContextValue = { registerCallback: (cb: VoidFunction) => VoidFunction; notify: VoidFunction };\nconst FingerprintContext = createContext<FingerprintContextValue | null>(null);\n\nexport type EnvironmentFingerprintNodeProps = PropsWithChildren<HTMLAttributes<HTMLDivElement>>;\nexport const EnvironmentFingerprintNode = forwardRef<HTMLDivElement, EnvironmentFingerprintNodeProps>(\n ({ children, ...rest }, ref) => {\n const ctx = useContext(FingerprintContext);\n if (!ctx) {\n throw new Error('EnvironmentFingerprintNode must be used inside EnvironmentFingerprintProvider');\n }\n const rootRef = useRef<HTMLDivElement | null>();\n const rootRefCallback = useCallback<RefCallback<HTMLDivElement>>(\n (element) => {\n rootRef.current = element;\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n !!ref && (typeof ref === 'function' ? ref(element) : (ref.current = element));\n },\n [ref]\n );\n const rectRef: MutableRefObject<DOMRectReadOnly | null> = useRef(null);\n\n useMeasureFingerprint(rootRef, (rect) => {\n if (!isDOMRectsEqual(rect, rectRef.current)) {\n rectRef.current = rect;\n ctx.notify();\n }\n });\n\n return (\n <div ref={rootRefCallback} {...rest}>\n {children}\n </div>\n );\n }\n);\n\nEnvironmentFingerprintNode.displayName = 'EnvironmentFingerprintNode';\n\nexport const EnvironmentFingerprintProvider: FC<PropsWithChildren> = ({ children }) => {\n const contextValue = useInitOnce(() => {\n const callbacks = new Set<VoidFunction>();\n // Ожидаем что изменения по фингерпринтам могут прилетать не чаще одного раза за тик\n // (потому что они генерятся только ResizeObserver). При этом элементов может измениться сразу несколько,\n // каждый коллбек нам нужно вызвать только один раз. Есть два варианта этого добиться:\n // - обернуть вызов коллбеков в schedule, но тогда они вызовутся не синхронно, а в следующей микротаске\n // - добавить флаг который предотвращает повторную нотификацию в тике и вызвать коллбеки синхронно\n // Синхронный вызов коллбеков позволяет эффективнее снимать метрики в одном цикле измерений,\n // поэтому выбран этот вариант - синхронизация через флаг.\n let notified = false;\n const resetNotified = scheduleMicro(() => (notified = false));\n return {\n registerCallback: (cb: VoidFunction) => {\n callbacks.add(cb);\n return () => callbacks.delete(cb);\n },\n notify: () => {\n if (notified) {\n return;\n }\n notified = true;\n resetNotified();\n callbacks.forEach((cb) => cb());\n },\n };\n });\n\n return <FingerprintContext.Provider value={contextValue}>{children}</FingerprintContext.Provider>;\n};\n\nEnvironmentFingerprintProvider.displayName = 'EnvironmentFingerprintProvider';\n\nexport const useEnvironmentFingerprint = (onChange: VoidFunction): void => {\n const ctx = useContext(FingerprintContext);\n const onChangeRef = useActualRef(onChange);\n const callback = useInitOnce(() => () => onChangeRef.current());\n\n if (!ctx) {\n throw new Error('useEnvironmentFingerprint must be used inside EnvironmentFingerprintProvider');\n }\n\n useLayoutEffect(() => ctx.registerCallback(callback), [ctx, callback]);\n};\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"EnvironmentFingerprintNode.js","sources":["src/public/EnvironmentFingerprintNode.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useLayoutEffect,\n useRef,\n type RefCallback,\n type HTMLAttributes,\n type PropsWithChildren,\n type FC,\n type MutableRefObject,\n} from 'react';\n\nimport { useMeasureFingerprint } from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { isDOMRectsEqual, scheduleMicro, useActualRef, useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\n\ntype FingerprintContextValue = { registerCallback: (cb: VoidFunction) => VoidFunction; notify: VoidFunction };\nconst FingerprintContext = createContext<FingerprintContextValue | null>(null);\n\nexport type EnvironmentFingerprintNodeProps = PropsWithChildren<HTMLAttributes<HTMLDivElement>>;\nexport const EnvironmentFingerprintNode = forwardRef<HTMLDivElement, EnvironmentFingerprintNodeProps>(\n ({ children, ...rest }, ref) => {\n const ctx = useContext(FingerprintContext);\n if (!ctx) {\n throw new Error('EnvironmentFingerprintNode must be used inside EnvironmentFingerprintProvider');\n }\n const rootRef = useRef<HTMLDivElement | null>();\n const rootRefCallback = useCallback<RefCallback<HTMLDivElement>>(\n (element) => {\n rootRef.current = element;\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n !!ref && (typeof ref === 'function' ? ref(element) : (ref.current = element));\n },\n [ref]\n );\n const rectRef: MutableRefObject<DOMRectReadOnly | null> = useRef(null);\n\n useMeasureFingerprint(rootRef, (rect) => {\n if (!isDOMRectsEqual(rect, rectRef.current)) {\n rectRef.current = rect;\n ctx.notify();\n }\n });\n\n return (\n <div ref={rootRefCallback} {...rest}>\n {children}\n </div>\n );\n }\n);\n\nEnvironmentFingerprintNode.displayName = 'EnvironmentFingerprintNode';\n\nexport const EnvironmentFingerprintProvider: FC<PropsWithChildren> = ({ children }) => {\n const contextValue = useInitOnce(() => {\n const callbacks = new Set<VoidFunction>();\n // Ожидаем что изменения по фингерпринтам могут прилетать не чаще одного раза за тик\n // (потому что они генерятся только ResizeObserver). При этом элементов может измениться сразу несколько,\n // каждый коллбек нам нужно вызвать только один раз. Есть два варианта этого добиться:\n // - обернуть вызов коллбеков в schedule, но тогда они вызовутся не синхронно, а в следующей микротаске\n // - добавить флаг который предотвращает повторную нотификацию в тике и вызвать коллбеки синхронно\n // Синхронный вызов коллбеков позволяет эффективнее снимать метрики в одном цикле измерений,\n // поэтому выбран этот вариант - синхронизация через флаг.\n let notified = false;\n const resetNotified = scheduleMicro(() => (notified = false));\n return {\n registerCallback: (cb: VoidFunction) => {\n callbacks.add(cb);\n return () => callbacks.delete(cb);\n },\n notify: () => {\n if (notified) {\n return;\n }\n notified = true;\n resetNotified();\n callbacks.forEach((cb) => cb());\n },\n };\n });\n\n return <FingerprintContext.Provider value={contextValue}>{children}</FingerprintContext.Provider>;\n};\n\nEnvironmentFingerprintProvider.displayName = 'EnvironmentFingerprintProvider';\n\nexport const useEnvironmentFingerprint = (onChange: VoidFunction): void => {\n const ctx = useContext(FingerprintContext);\n const onChangeRef = useActualRef(onChange);\n const callback = useInitOnce(() => () => onChangeRef.current());\n\n if (!ctx) {\n throw new Error('useEnvironmentFingerprint must be used inside EnvironmentFingerprintProvider');\n }\n\n useLayoutEffect(() => ctx.registerCallback(callback), [ctx, callback]);\n};\n"],"names":["_jsx"],"mappings":"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"}
@@ -10,7 +10,7 @@ import { usePaneStore } from '../internal/PaneStore.js';
10
10
  import { useInert } from '../internal/useInert.js';
11
11
  import { useActualRef, useStoreSyncedTransform, lerp, calcMorphParams } from '../internal/utils.js';
12
12
  import { AnimationStageContext } from './LayoutStage.js';
13
- import { s as styles } from '../NavBar-CsMoS3xA.js';
13
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
14
14
  import '../internal/KeyedSubscriptions.js';
15
15
  import 'motion';
16
16
  import '@hh.ru/magritte-common-use-when-font-loaded';
@@ -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 { 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(!stage || p < 0.5 ? '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(!stage || p < 0.5 ? '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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"}
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(!stage || p < 0.5 ? '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(!stage || p < 0.5 ? '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,7 +9,7 @@ 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-CsMoS3xA.js';
12
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
13
13
  import '../internal/KeyedSubscriptions.js';
14
14
  import 'motion';
15
15
  import '@hh.ru/magritte-ui-divider';
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutStage.js","sources":["../../src/public/LayoutStage.tsx"],"sourcesContent":["import {\n createContext,\n createRef,\n useContext,\n useLayoutEffect,\n useRef,\n type FC,\n type MutableRefObject,\n type PropsWithChildren,\n} from 'react';\nimport classNames from 'classnames';\nimport { HTMLMotionProps, motion, useMotionValue, frame } from 'motion/react';\n\nimport { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';\nimport {\n MetricsProvider,\n useMeasureManual,\n useRemeasureAllManual,\n} from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { MorphStoreProvider, useMorphStore } from '@hh.ru/magritte-ui-nav-bar/internal/MorphStore';\nimport { usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport {\n EnvironmentFingerprintNode,\n useEnvironmentFingerprint,\n} from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\n\nimport styles from './nav-bar.less';\n\nexport const CONTAINER_START_KEY = '#container-start';\nexport const CONTAINER_END_KEY = '#container-end';\n\nexport type AnimationStage = 'start' | 'end' | 'progress';\n\nexport const AnimationStageContext = createContext<MutableRefObject<AnimationStage | null>>(createRef());\n\nconst stageClasses = {\n start: 'nav-bar-layout-animation-stage-start',\n end: 'nav-bar-layout-animation-stage-end',\n progress: styles.animationStageProgress,\n} as const;\n\nconst CombinedStageAnimationMeasurementManager: FC<PropsWithChildren<HTMLMotionProps<'div'>>> = ({\n children,\n ...rest\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const animationStageRef = useContext(AnimationStageContext);\n const morphStore = useMorphStore();\n const currentClassRef = useRef<string>(stageClasses.start);\n const paneStore = usePaneStore();\n const forceMeasure = useRemeasureAllManual();\n const progressPainted = useRef(false);\n\n const setStage = useInitOnce(() => (stage: AnimationStage) => {\n const setClasses = (stage: AnimationStage) => {\n if (!wrapperRef.current) {\n return;\n }\n for (const animClasses of Object.entries(stageClasses)) {\n wrapperRef.current.classList.toggle(animClasses[1], stage === animClasses[0]);\n }\n currentClassRef.current = stageClasses[stage];\n animationStageRef.current = stage;\n };\n\n if (stage === 'progress' && !progressPainted.current) {\n setClasses('start');\n frame.render(() => {\n progressPainted.current = true;\n setClasses('progress');\n });\n return;\n }\n\n setClasses(stage);\n });\n const measureSubtree = useInitOnce(() => () => {\n setStage('start');\n forceMeasure();\n setStage('end');\n forceMeasure();\n setStage('progress');\n });\n\n const height = useMotionValue<number | 'auto'>('auto');\n useLayoutEffect(() => {\n paneStore.set({ animated: true });\n return () => paneStore.set({ animated: false });\n }, [paneStore]);\n\n useMeasureManual(wrapperRef, (rect) => {\n if (animationStageRef.current === 'start') {\n height.set(rect.height);\n // height из MotionValue применится к DOM асинхронно, поэтому применяем высоту синхронно\n // чтобы не триггерить ResizeObserver когда сбросим у элементов position в absolute\n if (wrapperRef.current) {\n wrapperRef.current.style.height = `${rect.height}px`;\n }\n paneStore.set({ top: rect.top, startHeight: rect.height });\n morphStore.set(CONTAINER_START_KEY, rect);\n } else {\n paneStore.set({ endHeight: rect.height });\n morphStore.set(CONTAINER_END_KEY, rect);\n }\n });\n\n useEnvironmentFingerprint(measureSubtree);\n useWhenFontLoaded(() => height.get() !== 'auto' && measureSubtree());\n\n return (\n <motion.div\n ref={wrapperRef}\n {...rest}\n className={classNames(styles.layoutAnimationContainer, currentClassRef.current)}\n style={{ height }}\n >\n {children}\n </motion.div>\n );\n};\n\nexport const LayoutStage: FC<PropsWithChildren<HTMLMotionProps<'div'>>> = ({ children, ...rest }) => {\n const stageRef = useRef<AnimationStage | null>('start');\n\n return (\n <EnvironmentFingerprintNode style={{ pointerEvents: 'none' }}>\n <MorphStoreProvider>\n <AnimationStageContext.Provider value={stageRef}>\n <MetricsProvider>\n <CombinedStageAnimationMeasurementManager {...rest}>\n {children}\n </CombinedStageAnimationMeasurementManager>\n </MetricsProvider>\n </AnimationStageContext.Provider>\n </MorphStoreProvider>\n </EnvironmentFingerprintNode>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"LayoutStage.js","sources":["src/public/LayoutStage.tsx"],"sourcesContent":["import {\n createContext,\n createRef,\n useContext,\n useLayoutEffect,\n useRef,\n type FC,\n type MutableRefObject,\n type PropsWithChildren,\n} from 'react';\nimport classNames from 'classnames';\nimport { HTMLMotionProps, motion, useMotionValue, frame } from 'motion/react';\n\nimport { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';\nimport {\n MetricsProvider,\n useMeasureManual,\n useRemeasureAllManual,\n} from '@hh.ru/magritte-ui-nav-bar/internal/MetricsProvider';\nimport { MorphStoreProvider, useMorphStore } from '@hh.ru/magritte-ui-nav-bar/internal/MorphStore';\nimport { usePaneStore } from '@hh.ru/magritte-ui-nav-bar/internal/PaneStore';\nimport { useInitOnce } from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport {\n EnvironmentFingerprintNode,\n useEnvironmentFingerprint,\n} from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\n\nimport styles from './nav-bar.less';\n\nexport const CONTAINER_START_KEY = '#container-start';\nexport const CONTAINER_END_KEY = '#container-end';\n\nexport type AnimationStage = 'start' | 'end' | 'progress';\n\nexport const AnimationStageContext = createContext<MutableRefObject<AnimationStage | null>>(createRef());\n\nconst stageClasses = {\n start: 'nav-bar-layout-animation-stage-start',\n end: 'nav-bar-layout-animation-stage-end',\n progress: styles.animationStageProgress,\n} as const;\n\nconst CombinedStageAnimationMeasurementManager: FC<PropsWithChildren<HTMLMotionProps<'div'>>> = ({\n children,\n ...rest\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const animationStageRef = useContext(AnimationStageContext);\n const morphStore = useMorphStore();\n const currentClassRef = useRef<string>(stageClasses.start);\n const paneStore = usePaneStore();\n const forceMeasure = useRemeasureAllManual();\n const progressPainted = useRef(false);\n\n const setStage = useInitOnce(() => (stage: AnimationStage) => {\n const setClasses = (stage: AnimationStage) => {\n if (!wrapperRef.current) {\n return;\n }\n for (const animClasses of Object.entries(stageClasses)) {\n wrapperRef.current.classList.toggle(animClasses[1], stage === animClasses[0]);\n }\n currentClassRef.current = stageClasses[stage];\n animationStageRef.current = stage;\n };\n\n if (stage === 'progress' && !progressPainted.current) {\n setClasses('start');\n frame.render(() => {\n progressPainted.current = true;\n setClasses('progress');\n });\n return;\n }\n\n setClasses(stage);\n });\n const measureSubtree = useInitOnce(() => () => {\n setStage('start');\n forceMeasure();\n setStage('end');\n forceMeasure();\n setStage('progress');\n });\n\n const height = useMotionValue<number | 'auto'>('auto');\n useLayoutEffect(() => {\n paneStore.set({ animated: true });\n return () => paneStore.set({ animated: false });\n }, [paneStore]);\n\n useMeasureManual(wrapperRef, (rect) => {\n if (animationStageRef.current === 'start') {\n height.set(rect.height);\n // height из MotionValue применится к DOM асинхронно, поэтому применяем высоту синхронно\n // чтобы не триггерить ResizeObserver когда сбросим у элементов position в absolute\n if (wrapperRef.current) {\n wrapperRef.current.style.height = `${rect.height}px`;\n }\n paneStore.set({ top: rect.top, startHeight: rect.height });\n morphStore.set(CONTAINER_START_KEY, rect);\n } else {\n paneStore.set({ endHeight: rect.height });\n morphStore.set(CONTAINER_END_KEY, rect);\n }\n });\n\n useEnvironmentFingerprint(measureSubtree);\n useWhenFontLoaded(() => height.get() !== 'auto' && measureSubtree());\n\n return (\n <motion.div\n ref={wrapperRef}\n {...rest}\n className={classNames(styles.layoutAnimationContainer, currentClassRef.current)}\n style={{ height }}\n >\n {children}\n </motion.div>\n );\n};\n\nexport const LayoutStage: FC<PropsWithChildren<HTMLMotionProps<'div'>>> = ({ children, ...rest }) => {\n const stageRef = useRef<AnimationStage | null>('start');\n\n return (\n <EnvironmentFingerprintNode style={{ pointerEvents: 'none' }}>\n <MorphStoreProvider>\n <AnimationStageContext.Provider value={stageRef}>\n <MetricsProvider>\n <CombinedStageAnimationMeasurementManager {...rest}>\n {children}\n </CombinedStageAnimationMeasurementManager>\n </MetricsProvider>\n </AnimationStageContext.Provider>\n </MorphStoreProvider>\n </EnvironmentFingerprintNode>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
package/public/Morph.js CHANGED
@@ -9,7 +9,7 @@ import { usePaneStore } from '../internal/PaneStore.js';
9
9
  import { useStoreSyncedTransform, calcMorphParams, lerp } from '../internal/utils.js';
10
10
  import { useEnvironmentFingerprint } from './EnvironmentFingerprintNode.js';
11
11
  import { useAnimationStage } from './Stage.js';
12
- import { s as styles } from '../NavBar-CsMoS3xA.js';
12
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
13
13
  import '../internal/KeyedSubscriptions.js';
14
14
  import 'motion';
15
15
  import '../internal/useInert.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Morph.js","sources":["../../src/public/Morph.tsx"],"sourcesContent":["import { type PropsWithChildren, type FC, useLayoutEffect, useRef, type CSSProperties } from 'react';\nimport classNames from 'classnames';\nimport { useMotionValue, motion, HTMLMotionProps } from 'motion/react';\n\nimport { useMeasureAuto } 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 useStoreSyncedTransform,\n calcMorphParams,\n type HorizontalAlign,\n type SizeAxis,\n type VerticalAlign,\n} from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { useEnvironmentFingerprint } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\nimport { useAnimationStage } from '@hh.ru/magritte-ui-nav-bar/public/Stage';\n\nimport styles from './nav-bar.less';\n\nexport interface MorphProps extends HTMLMotionProps<'div'> {\n /**\n * Задает соответствие между элементами для морфинга между начальным и конечным <Stage />\n */\n id: string;\n style?: CSSProperties;\n className?: 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}\n\nexport const Morph: FC<PropsWithChildren<MorphProps>> = ({\n children,\n id,\n className,\n style,\n sizeAxis = 'auto',\n horizontalPositionAlign = 'center',\n verticalPositionAlign = 'center',\n ...rest\n}) => {\n const paneStore = usePaneStore();\n const morphStore = useMorphStore();\n const animationStage = useAnimationStage();\n const rootRef = useRef<HTMLDivElement>(null);\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const scaleX = useMotionValue(1);\n const scaleY = useMotionValue(1);\n\n const startId = `start-${id}`;\n const endId = `end-${id}`;\n\n useStoreSyncedTransform(\n paneStore.get('motionValue'),\n morphStore,\n [startId, endId],\n () => {\n const start = morphStore.get(animationStage === 'end' ? endId : startId);\n const end = morphStore.get(animationStage === 'end' ? startId : endId);\n const {\n deltaX,\n deltaY,\n scaleX: xScale,\n scaleY: yScale,\n } = calcMorphParams(start, end, sizeAxis, horizontalPositionAlign, verticalPositionAlign);\n\n return (progress: number) => {\n const p = animationStage === 'end' ? 1 - progress : progress;\n x.set(lerp(0, deltaX, p));\n y.set(lerp(0, deltaY, p));\n\n scaleX.set(lerp(1, xScale, p));\n scaleY.set(lerp(1, yScale, p));\n };\n },\n (interpolator, progress) => interpolator(progress)\n );\n\n const forceInvalidate = useMeasureAuto(rootRef, (rect) => morphStore.set(`${animationStage}-${id}`, rect), [\n id,\n animationStage,\n ]);\n\n useEnvironmentFingerprint(forceInvalidate);\n\n useLayoutEffect(() => () => morphStore.set(`${animationStage}-${id}`, null), [morphStore, animationStage, id]);\n\n return (\n <motion.div\n ref={rootRef}\n {...rest}\n className={classNames(styles.morphItem, className, {\n [styles.morphItemTop]: verticalPositionAlign === 'top',\n [styles.morphItemBottom]: verticalPositionAlign === 'bottom',\n [styles.morphItemLeft]: horizontalPositionAlign === 'left',\n [styles.morphItemRight]: horizontalPositionAlign === 'right',\n })}\n style={{ ...(style ?? {}), x, y, scaleX, scaleY }}\n >\n {children}\n </motion.div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Morph.js","sources":["src/public/Morph.tsx"],"sourcesContent":["import { type PropsWithChildren, type FC, useLayoutEffect, useRef, type CSSProperties } from 'react';\nimport classNames from 'classnames';\nimport { useMotionValue, motion, HTMLMotionProps } from 'motion/react';\n\nimport { useMeasureAuto } 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 useStoreSyncedTransform,\n calcMorphParams,\n type HorizontalAlign,\n type SizeAxis,\n type VerticalAlign,\n} from '@hh.ru/magritte-ui-nav-bar/internal/utils';\nimport { useEnvironmentFingerprint } from '@hh.ru/magritte-ui-nav-bar/public/EnvironmentFingerprintNode';\nimport { useAnimationStage } from '@hh.ru/magritte-ui-nav-bar/public/Stage';\n\nimport styles from './nav-bar.less';\n\nexport interface MorphProps extends HTMLMotionProps<'div'> {\n /**\n * Задает соответствие между элементами для морфинга между начальным и конечным <Stage />\n */\n id: string;\n style?: CSSProperties;\n className?: 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}\n\nexport const Morph: FC<PropsWithChildren<MorphProps>> = ({\n children,\n id,\n className,\n style,\n sizeAxis = 'auto',\n horizontalPositionAlign = 'center',\n verticalPositionAlign = 'center',\n ...rest\n}) => {\n const paneStore = usePaneStore();\n const morphStore = useMorphStore();\n const animationStage = useAnimationStage();\n const rootRef = useRef<HTMLDivElement>(null);\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const scaleX = useMotionValue(1);\n const scaleY = useMotionValue(1);\n\n const startId = `start-${id}`;\n const endId = `end-${id}`;\n\n useStoreSyncedTransform(\n paneStore.get('motionValue'),\n morphStore,\n [startId, endId],\n () => {\n const start = morphStore.get(animationStage === 'end' ? endId : startId);\n const end = morphStore.get(animationStage === 'end' ? startId : endId);\n const {\n deltaX,\n deltaY,\n scaleX: xScale,\n scaleY: yScale,\n } = calcMorphParams(start, end, sizeAxis, horizontalPositionAlign, verticalPositionAlign);\n\n return (progress: number) => {\n const p = animationStage === 'end' ? 1 - progress : progress;\n x.set(lerp(0, deltaX, p));\n y.set(lerp(0, deltaY, p));\n\n scaleX.set(lerp(1, xScale, p));\n scaleY.set(lerp(1, yScale, p));\n };\n },\n (interpolator, progress) => interpolator(progress)\n );\n\n const forceInvalidate = useMeasureAuto(rootRef, (rect) => morphStore.set(`${animationStage}-${id}`, rect), [\n id,\n animationStage,\n ]);\n\n useEnvironmentFingerprint(forceInvalidate);\n\n useLayoutEffect(() => () => morphStore.set(`${animationStage}-${id}`, null), [morphStore, animationStage, id]);\n\n return (\n <motion.div\n ref={rootRef}\n {...rest}\n className={classNames(styles.morphItem, className, {\n [styles.morphItemTop]: verticalPositionAlign === 'top',\n [styles.morphItemBottom]: verticalPositionAlign === 'bottom',\n [styles.morphItemLeft]: horizontalPositionAlign === 'left',\n [styles.morphItemRight]: horizontalPositionAlign === 'right',\n })}\n style={{ ...(style ?? {}), x, y, scaleX, scaleY }}\n >\n {children}\n </motion.div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
package/public/NavBar.js CHANGED
@@ -14,7 +14,7 @@ import '../internal/useScrollAdapter.js';
14
14
  import '../internal/useSnapScroll.js';
15
15
  import '../internal/useSyncMotionValue.js';
16
16
  import '../internal/utils.js';
17
- export { N as NavBar, u as useNavBarContext } from '../NavBar-CsMoS3xA.js';
17
+ export { N as NavBar, u as useNavBarContext } from '../NavBar-vrOLNlmm.js';
18
18
  import 'motion';
19
19
  import '@hh.ru/magritte-internal-custom-scroll';
20
20
  //# sourceMappingURL=NavBar.js.map
package/public/Pane.js CHANGED
@@ -10,7 +10,7 @@ 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-CsMoS3xA.js';
13
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
14
14
  import '../internal/KeyedSubscriptions.js';
15
15
  import 'motion';
16
16
  import '../internal/MetricsProvider.js';
@@ -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"],"names":["_jsx","_jsxs"],"mappings":"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"}
package/public/Stage.js CHANGED
@@ -7,7 +7,7 @@ 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-CsMoS3xA.js';
10
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
11
11
  import '../internal/utils.js';
12
12
  import 'motion';
13
13
  import '../internal/KeyedSubscriptions.js';
@@ -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":"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"}
@@ -2,7 +2,7 @@ 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-CsMoS3xA.js';
5
+ import { s as styles } from '../NavBar-vrOLNlmm.js';
6
6
  import 'react';
7
7
  import 'motion/react';
8
8
  import '../internal/MetricsProvider.js';