From 80592dc4af32965e3e76ed37deee9d1069cdf150 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 May 2026 20:05:00 +0800 Subject: [PATCH 1/3] feat: add `portalTarget` prop to mount viewer overlay in a custom DOM element * feat: add portalTarget prop for custom portal mount location Agent-Logs-Url: https://github.com/motopods/react-zmage/sessions/d359f9e9-8370-4eff-bb9e-31623ffee11c Co-authored-by: motopods <58200641+motopods@users.noreply.github.com> * refactor: simplify portalTarget null handling per review feedback Agent-Logs-Url: https://github.com/motopods/react-zmage/sessions/d359f9e9-8370-4eff-bb9e-31623ffee11c Co-authored-by: motopods <58200641+motopods@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: motopods <58200641+motopods@users.noreply.github.com> --- packages/core/src/Zmage.callee.tsx | 2 +- packages/core/src/components/Browser/Browser.tsx | 4 ++-- packages/core/src/components/Portal/Portal.tsx | 2 +- packages/core/src/types/default.ts | 4 ++-- packages/core/src/types/global.ts | 2 ++ 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/core/src/Zmage.callee.tsx b/packages/core/src/Zmage.callee.tsx index e8e5dc4..4536d14 100644 --- a/packages/core/src/Zmage.callee.tsx +++ b/packages/core/src/Zmage.callee.tsx @@ -171,7 +171,7 @@ const callee = (({ coverRef, ...props }: InternalCalleeProps) => { // Init env const portalEl = document.createElement('div') portalEl.id = 'zmagePortal' - const containerEl = document.body + const containerEl: HTMLElement = props.portalTarget ?? document.body containerEl.appendChild(portalEl) const ref = React.createRef() let unmount: (() => void) | undefined diff --git a/packages/core/src/components/Browser/Browser.tsx b/packages/core/src/components/Browser/Browser.tsx index 69d4d48..035d79b 100644 --- a/packages/core/src/components/Browser/Browser.tsx +++ b/packages/core/src/components/Browser/Browser.tsx @@ -736,7 +736,7 @@ export default class Browser extends React.Component { // Control controller, hotKey, animate, gesture, // Styles & interactive - hideOnScroll, coverVisible, backdrop, zIndex, radius, edge, loop, hideOnDblClick, loadingDelay, + hideOnScroll, coverVisible, backdrop, zIndex, radius, edge, loop, hideOnDblClick, loadingDelay, portalTarget, // Life cycle onError, } = this.getPropsWithEnv() @@ -776,7 +776,7 @@ export default class Browser extends React.Component { { mounted && - + {/*背景层*/} diff --git a/packages/core/src/components/Portal/Portal.tsx b/packages/core/src/components/Portal/Portal.tsx index 4af0304..c41bbfc 100644 --- a/packages/core/src/components/Portal/Portal.tsx +++ b/packages/core/src/components/Portal/Portal.tsx @@ -9,7 +9,7 @@ import ReactDOM from 'react-dom' type Props = { id?: string - target?: HTMLElement + target?: HTMLElement | null zIndex?: number className?: string style?: CSSProperties diff --git a/packages/core/src/types/default.ts b/packages/core/src/types/default.ts index 5fab931..b69c95b 100644 --- a/packages/core/src/types/default.ts +++ b/packages/core/src/types/default.ts @@ -264,7 +264,7 @@ export const getConfigFromProps = (props: BaseType) => { // Control controller, hotKey, animate, gesture, // Styles & interactive - hideOnScroll, coverVisible, backdrop, zIndex, radius, edge, loop, hideOnDblClick, loadingDelay, + hideOnScroll, coverVisible, backdrop, zIndex, radius, edge, loop, hideOnDblClick, loadingDelay, portalTarget, // Life cycle functions onBrowsing, onZooming, onSwitching, onRotating, onError, // Controlled props @@ -299,7 +299,7 @@ export const getConfigFromProps = (props: BaseType) => { // Control controller, hotKey, animate, gesture, // Styles & interactive - hideOnScroll, coverVisible, backdrop, zIndex, radius, edge, loop, hideOnDblClick, loadingDelay, + hideOnScroll, coverVisible, backdrop, zIndex, radius, edge, loop, hideOnDblClick, loadingDelay, portalTarget, // Life cycle functions onBrowsing, onZooming, onSwitching, onRotating, onError, }, diff --git a/packages/core/src/types/global.ts b/packages/core/src/types/global.ts index 600cd99..58e6d1a 100644 --- a/packages/core/src/types/global.ts +++ b/packages/core/src/types/global.ts @@ -377,6 +377,8 @@ export interface InterfaceAndInteractionParams { // 缓存图时的视觉闪烁. 默认 200 (业界 react-loadable 的经典值; UX 研究"顺滑"上限). // 设为 0 = 立即显示 (旧行为). 内部命中 fast-path (img.complete 已就绪) 时直接绕过此延迟. loadingDelay?: number + // 浏览层 Portal 挂载目标元素 (默认 document.body). 传入自定义容器可将浏览层限制在特定 DOM 子树内. + portalTarget?: HTMLElement | null } /** From 6f24f8225b6bfb02045868c1635721eb3c248633 Mon Sep 17 00:00:00 2001 From: Caldis Date: Tue, 19 May 2026 00:18:58 +0800 Subject: [PATCH 2/3] docs: sync portalTarget public surface --- AGENTS.md | 4 +- README.md | 24 +- README.zh-CN.md | 28 +- docs/404.html | 4 +- docs/AGENTS.md | 4 +- docs/about/index.html | 4 +- docs/ai/index.html | 4 +- docs/assets/index-8Ptyfupf.css | 1 + docs/assets/index-DMpwH-Fy.css | 1 - docs/assets/index-Do1OB0YD.js | 703 ----------------- docs/assets/index-yZwjA0O9.js | 738 ++++++++++++++++++ docs/compare/index.html | 4 +- docs/contact/index.html | 4 +- docs/developers/index.html | 4 +- docs/docs/index.html | 4 +- docs/errors/index.html | 4 +- docs/index.html | 4 +- docs/llms-full.txt | 38 +- docs/llms.txt | 10 +- docs/playground/imperative/index.html | 4 +- docs/playground/index.html | 4 +- docs/playground/wrapper/index.html | 4 +- docs/privacy/index.html | 4 +- docs/rate-limits/index.html | 4 +- docs/status/index.html | 4 +- docs/use-cases/index.html | 4 +- packages/core/src/types/global.ts | 2 +- packages/home/src/aiPrompt/buildPrompt.ts | 2 +- packages/home/src/docs/ParamTable.tsx | 3 +- packages/home/src/docs/sections/Examples.tsx | 42 + packages/home/src/docs/sections/Props.tsx | 34 + packages/home/src/i18n/de.ts | 16 +- packages/home/src/i18n/en.ts | 16 +- packages/home/src/i18n/es.ts | 16 +- packages/home/src/i18n/fr.ts | 16 +- packages/home/src/i18n/ja.ts | 16 +- packages/home/src/i18n/ko.ts | 16 +- packages/home/src/i18n/zh-CN.ts | 16 +- packages/home/src/playground/ParamPanel.tsx | 11 +- .../src/playground/PortalTargetScenario.tsx | 47 ++ packages/home/src/playground/shareState.ts | 3 +- packages/home/src/playground/state.ts | 7 +- packages/home/src/routes/Playground.tsx | 4 +- packages/home/src/schema/param-schema.ts | 5 + .../llms-eval/agent-onboarding/rubric.mjs | 2 +- packages/llms-eval/eval.test.mjs | 27 +- pnpm-lock.yaml | 2 +- 47 files changed, 1137 insertions(+), 781 deletions(-) create mode 100644 docs/assets/index-8Ptyfupf.css delete mode 100644 docs/assets/index-DMpwH-Fy.css delete mode 100644 docs/assets/index-Do1OB0YD.js create mode 100644 docs/assets/index-yZwjA0O9.js create mode 100644 packages/home/src/playground/PortalTargetScenario.tsx diff --git a/AGENTS.md b/AGENTS.md index 95bb56a..17b84d3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,7 +90,7 @@ Single `BaseType` covers all. Grouped here by purpose: | Preset | `preset: 'desktop' \| 'mobile' \| 'auto'` | defaults to `'auto'` when omitted; drives default `controller` / `hotKey` / `animate` / `gesture` plus preset-aware viewer spacing. `'auto'` resolves via `matchMedia('(pointer: coarse) and (hover: none)')` on the client; SSR falls back to desktop | | Controlled | `browsing` | omit for self-managed; pair with `onBrowsing` if set. Does not control `` | | Functional | `controller`, `hotKey`, `animate`, `gesture` | pass `boolean` to disable, or partial object to override. `controller.flip` / `hotKey.flip` and `controller.rotate` / `hotKey.rotate` are umbrellas over their per-side counterparts; enabling the umbrella forces both sides on. `controller.placement` moves only the toolbar capsule (`top-right` default); side flips and pagination keep their existing positions. `controller.layout` adjusts toolbar / flip / pagination / caption overlay safe insets without changing image animation geometry; number = px, string = CSS length, scalar `inset` follows each target's natural edge (toolbar by placement, flip left/right, pagination/caption bottom), and `layout.mobile` overrides base layout for mobile preset. Desktop defaults include `pagination.inset=24` and `caption.inset=60`; mobile leaves `layout` unset unless configured. `controller.render({ state, actions, slots })` replaces the whole controller UI, and `controller=false` disables both built-in slots and render. **`hotKey` entries accept `boolean \| string \| string[]`** — string is an `e.code` descriptor (`'Escape'` / `'BracketLeft'` / `'S'`) with cross-platform `Mod` prefix (= ⌘ on macOS, Ctrl elsewhere; e.g. `'Mod+S'`). New defaults: `[`/`]` rotate, `Mod+S` download (download is opt-in: defaults `false` because it hijacks the browser's "Save Page As"). Per-side string descriptor wins over umbrella. `controller.backdrop` / `controller.color` decouple the toolbar bg/icon-color from the modal `backdrop` (set both when `backdrop` is solid dark). `animate.cover` is preset-driven and defaults to `{ objectFit: true, clip: true, radius: true }`; it reads the cover `` itself and does not infer parent-wrapper clipping. `clip-path` / `border-radius` animation may repaint; use `cover.clip=false` or `cover.radius=false` for performance-sensitive mobile pages. Set `animate={{ cover: false }}` for legacy cover geometry. `animate.slowMotion` defaults `false`; when enabled, holding `Shift` while opening or closing slows the full browsing transition to 10x for inspection and demos. `gesture` is preset-driven: desktop enables `wheelZoom` while already zoomed and disables `swipe` / `dragExit` / `pinchZoom` / `doubleTapZoom`; mobile enables horizontal drag paging, vertical drag-to-exit, pinch zoom, and double-tap zoom, while disabling `wheelZoom`. `gesture.touchAction` defaults to `'managed'`: pinch uses CSS `touch-action: none`, double-tap-only uses `manipulation`, otherwise `auto`; set it explicitly if the host page owns touch behavior. `pinchZoom.resetBelowFit` defaults `true`, so shrinking back to fit exits zoom and recenters. `doubleTapZoom.interval` / `distance` define the second-tap window. `wheelZoom.reverse` flips wheel direction; `wheelZoom.exitGuardDuration` defaults to `1000`, so wheel zooming out to `minScale` exits zoom immediately and blocks residual wheel events for that duration. `gesture=false` disables all gestures, and per-child overrides such as `gesture={{ swipe: false }}` / `gesture={{ wheelZoom: false }}` / `gesture={{ pinchZoom: false }}` keep the other preset defaults intact | -| Interface | `hideOnScroll`, `hideOnDblClick`, `coverVisible`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `loadingDelay` | desktop-only flags noted in README. `radius` defaults to desktop `8` / mobile `0`; `edge` defaults to desktop `16` / mobile `0`. `hideOnScroll` and `hideOnDblClick` are the auto-dismiss trigger family (user action → close viewer); `hideOnDblClick` defaults `false`. `loadingDelay` defaults `200ms` — anti-flicker delay before showing the loading indicator (set 0 for legacy instant-show) | +| Interface | `hideOnScroll`, `hideOnDblClick`, `coverVisible`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `loadingDelay` | desktop-only flags noted in README. `portalTarget` defaults to `document.body` and is for app overlay roots / modal roots / micro-frontend containers; it changes only the Portal mount parent, while the viewer remains fullscreen fixed. `radius` defaults to desktop `8` / mobile `0`; `edge` defaults to desktop `16` / mobile `0`. `hideOnScroll` and `hideOnDblClick` are the auto-dismiss trigger family (user action → close viewer); `hideOnDblClick` defaults `false`. `loadingDelay` defaults `200ms` — anti-flicker delay before showing the loading indicator (set 0 for legacy instant-show) | | Lifecycle | `onBrowsing`, `onZooming`, `onSwitching`, `onRotating`, `onError` | first 4 callback args: `boolean`/`boolean`/`number`/`number`. `onError(e: SyntheticEvent)` fires for cover **or** viewer img-load failure — the only hook for the viewer-side failure (cover also flows via native `` `onError` passthrough) | | Native | All `HTMLAttributes` | className, style, onClick, etc. transparently forwarded to inner `` | @@ -102,7 +102,7 @@ Defaults & sub-shapes: see [`packages/core/src/types/default.ts`](./packages/cor 2. **Hard-coding `preset='desktop'` on a touch-targeted page** — omitted `preset` already defaults to `'auto'`. The desktop bundle ships hotkeys + arrow buttons, enables wheel zoom while zoomed, and disables mobile `gesture.swipe` / `gesture.dragExit` / `gesture.pinchZoom` / `gesture.doubleTapZoom`. Use `'desktop'` only when the page deliberately wants desktop behavior on touch devices. 3. **Treating `Zmage` as a class** — it is a `forwardRef` exotic component. ❌ `new Zmage()`. ✅ JSX or `Zmage.browsing()`. 4. **Mixing controlled and uncontrolled** — if `browsing` is in props, it must be a fully controlled `boolean` (provide `onBrowsing` to receive changes). Mixing both modes silently breaks state sync. -5. **Calling `Zmage.browsing` server-side** — it manipulates `document.body`. Guard with `typeof window !== 'undefined'` or call from event handlers / effects. +5. **Calling `Zmage.browsing` server-side** — it manipulates the DOM (`document.body` by default, or `portalTarget` when provided). Guard with `typeof window !== 'undefined'` or call from event handlers / effects. 6. **Putting `src` / `alt` on `` as if it rendered an image** — Wrapper binds real descendant `` nodes. Put image data in the HTML, and pass only viewer config / optional shared `set` to Wrapper. 7. **Wrapping with `Zmage.Wrapper` without re-rendering** — wrapper attaches click handlers in `componentDidMount` / `componentDidUpdate` by querying `wrapperRef.current.querySelectorAll('img')`. Dynamically-injected `` (after wrapper update) won't get attached unless wrapper re-renders. diff --git a/README.md b/README.md index 24052f8..761b8db 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ The wrapper queries `` descendants in `componentDidMount` / `componentDidUp Wrapper-specific prop scope: - Put `src` / `alt` on the child `` nodes. Top-level `src` / `alt` are overwritten by the clicked DOM node. -- Viewer configuration still belongs on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, and lifecycle callbacks. +- Viewer configuration still belongs on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, and lifecycle callbacks. - Pass `set` when the wrapped subtree should behave as one shared gallery. If the clicked image's `src` appears in `set`, Wrapper opens that matching index; `defaultPage` is only the fallback. - Without `set`, the clicked image opens as a single image. `data-zmage-caption` or the nearest `figcaption` can provide the viewer caption. - The controlled `browsing` prop is for component mode; it does not control ``. @@ -537,11 +537,31 @@ Wheel zoom is active only while the viewer is already in zoom mode; normal brows | `coverVisible` | `boolean` | `false` | Keep the cover `` visible while the modal is open. | | `backdrop` | `string` | `'#FFFFFF'` | Viewer backdrop. Any valid CSS color or gradient. **Default is white** — override (`'#111'`, etc.) for dark UIs. | | `zIndex` | `number` | `1000` | Portal stacking. | +| `portalTarget` | `HTMLElement \| null` | `document.body` | Custom DOM element for mounting the viewer Portal. Use it when an app has a dedicated overlay root, modal root, shadow host, or micro-frontend container. It changes the mount parent only; the viewer still uses fullscreen fixed positioning. | | `radius` | `number` | desktop `8`, mobile `0` | Image corner radius (px). | | `edge` | `number` | desktop `16`, mobile `0` | Minimum margin between image and viewport (px). | | `loop` | `boolean` | `true` | Wrap-around when paging past the ends. | | `loadingDelay` | `number` | `200` | Delay (ms) before showing the loading indicator. If the image loads within this window, the indicator never appears — prevents the flash on cached page changes. Set 0 for legacy instant-show. | +`portalTarget` is for host apps that already centralize overlays outside the normal content tree. It does not make a local, clipped preview; use `zIndex` and your app shell's stacking rules to control how the fullscreen viewer sits above other UI. + +```tsx +import { useState } from 'react' +import Zmage from 'react-zmage' +import 'react-zmage/style.css' + +export function ArticleImage () { + const [viewerRoot, setViewerRoot] = useState(null) + + return ( +
+
+ +
+ ) +} +``` + ### Lifecycle | Prop | Signature | Triggered when | @@ -569,7 +589,7 @@ export type BaseType = & BaseParams // src / alt / caption / set / defaultPage & PresetParams // preset & FunctionalParams // controller / hotKey / animate / gesture - & InterfaceAndInteractionParams // hideOnScroll / hideOnDblClick / coverVisible / backdrop / zIndex / radius / edge / loop / loadingDelay + & InterfaceAndInteractionParams // hideOnScroll / hideOnDblClick / coverVisible / backdrop / zIndex / portalTarget / radius / edge / loop / loadingDelay & LifeCycleParams // onBrowsing / onZooming / onSwitching / onRotating / onError & ControlledParams // browsing & HTMLAttributes diff --git a/README.zh-CN.md b/README.zh-CN.md index 05b179c..a76934b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -113,7 +113,7 @@ function Trigger() { 包裹器模式下的参数范围: - `src` / `alt` 应放在子级 `` 上。顶层 `src` / `alt` 会被点击的 DOM 节点覆盖。 -- 查看器配置仍然写在 `` 上:`preset`、`controller`、`hotKey`、`animate`、`gesture`、`backdrop`、`zIndex`、`radius`、`edge`、`loop`、`coverVisible`、`hideOnScroll`、`hideOnDblClick`、`loadingDelay` 和生命周期回调。 +- 查看器配置仍然写在 `` 上:`preset`、`controller`、`hotKey`、`animate`、`gesture`、`backdrop`、`zIndex`、`portalTarget`、`radius`、`edge`、`loop`、`coverVisible`、`hideOnScroll`、`hideOnDblClick`、`loadingDelay` 和生命周期回调。 - 需要让包裹区内图片作为共享图库时传 `set`。若被点击图片的 `src` 出现在 `set` 中,Wrapper 会打开匹配索引;`defaultPage` 只作为兜底。 - 不传 `set` 时,被点击图片按单图打开。`data-zmage-caption` 或最近的 `figcaption` 可作为查看器 caption。 - 受控态 `browsing` 属于组件模式,不能控制 ``。 @@ -372,7 +372,7 @@ interface ControllerRenderSlots { | `flip` | ✅ | — | | `placement` | `top-right` | `top-right` | | `radius` | `8` | `0` | -| `edge` | `30` | `0` | +| `edge` | `16` | `0` | | `controller.layout.pagination.inset` | `24` | — | | `controller.layout.caption.inset` | `60` | — | | `gesture.swipe` | — | ✅ | @@ -498,11 +498,31 @@ interface GestureDoubleTapZoomOptions { | `coverVisible` | `boolean` | `false` | 放大期间是否保留封面图(默认会隐藏避免动画穿帮)。 | | `backdrop` | `string` | `'#FFFFFF'` | 查看器背景色,接受任何合法 CSS color / gradient。**默认白色** —— 深色站点请显式覆盖(例如 `'#111'`)。 | | `zIndex` | `number` | `1000` | Portal 容器的 `z-index`。 | +| `portalTarget` | `HTMLElement \| null` | `document.body` | 查看器 Portal 的自定义挂载目标。适合已有 overlay root、modal root、shadow host 或微前端容器的宿主应用。它只改变挂载父节点,查看器仍然使用 fixed 全屏布局。 | | `radius` | `number` | desktop `8`,mobile `0` | 查看模式下图片圆角 (px)。 | -| `edge` | `number` | desktop `30`,mobile `0` | 图片距屏幕边缘的留白 (px)。 | +| `edge` | `number` | desktop `16`,mobile `0` | 图片距屏幕边缘的留白 (px)。 | | `loop` | `boolean` | `true` | 多图模式:尾页是否循环回首页。 | | `loadingDelay` | `number` | `200` | Loading 指示器显示前的延迟 (ms)。在此期间内图片加载完成则不显示 loading,避免快速切换缓存图时的视觉闪烁。默认 200ms (业界 react-loadable 经典值);设为 0 = 立即显示 (旧行为)。 | +`portalTarget` 用于宿主应用已经有统一弹层容器的场景。它不会把查看器裁剪成容器内的局部预览;需要调整遮罩层级时继续使用 `zIndex` 和宿主应用自己的层级规则。 + +```tsx +import { useState } from 'react' +import Zmage from 'react-zmage' +import 'react-zmage/style.css' + +export function ArticleImage () { + const [viewerRoot, setViewerRoot] = useState(null) + + return ( +
+
+ +
+ ) +} +``` + ### 生命周期 | 配置项 | 签名 | 触发时机 | @@ -530,7 +550,7 @@ export type BaseType = & BaseParams // src / alt / caption / set / defaultPage & PresetParams // preset & FunctionalParams // controller / hotKey / animate / gesture - & InterfaceAndInteractionParams // hideOnScroll / hideOnDblClick / coverVisible / backdrop / zIndex / radius / edge / loop / loadingDelay + & InterfaceAndInteractionParams // hideOnScroll / hideOnDblClick / coverVisible / backdrop / zIndex / portalTarget / radius / edge / loop / loadingDelay & LifeCycleParams // onBrowsing / onZooming / onSwitching / onRotating / onError & ControlledParams // browsing & HTMLAttributes diff --git a/docs/404.html b/docs/404.html index 44856df..d814884 100644 --- a/docs/404.html +++ b/docs/404.html @@ -184,8 +184,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 9f4b518..844e01c 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -92,7 +92,7 @@ Single `BaseType` covers all. Grouped here by purpose: | Preset | `preset: 'desktop' \| 'mobile' \| 'auto'` | defaults to `'auto'` when omitted; drives default `controller` / `hotKey` / `animate` / `gesture` plus preset-aware viewer spacing. `'auto'` resolves via `matchMedia('(pointer: coarse) and (hover: none)')` on the client; SSR falls back to desktop | | Controlled | `browsing` | omit for self-managed; pair with `onBrowsing` if set. Does not control `` | | Functional | `controller`, `hotKey`, `animate`, `gesture` | pass `boolean` to disable, or partial object to override. `controller.flip` / `hotKey.flip` and `controller.rotate` / `hotKey.rotate` are umbrellas over their per-side counterparts; enabling the umbrella forces both sides on. `controller.placement` moves only the toolbar capsule (`top-right` default); side flips and pagination keep their existing positions. `controller.layout` adjusts toolbar / flip / pagination / caption overlay safe insets without changing image animation geometry; number = px, string = CSS length, scalar `inset` follows each target's natural edge (toolbar by placement, flip left/right, pagination/caption bottom), and `layout.mobile` overrides base layout for mobile preset. Desktop defaults include `pagination.inset=24` and `caption.inset=60`; mobile leaves `layout` unset unless configured. `controller.render({ state, actions, slots })` replaces the whole controller UI, and `controller=false` disables both built-in slots and render. **`hotKey` entries accept `boolean \| string \| string[]`** — string is an `e.code` descriptor (`'Escape'` / `'BracketLeft'` / `'S'`) with cross-platform `Mod` prefix (= ⌘ on macOS, Ctrl elsewhere; e.g. `'Mod+S'`). New defaults: `[`/`]` rotate, `Mod+S` download (download is opt-in: defaults `false` because it hijacks the browser's "Save Page As"). Per-side string descriptor wins over umbrella. `controller.backdrop` / `controller.color` decouple the toolbar bg/icon-color from the modal `backdrop` (set both when `backdrop` is solid dark). `animate.cover` is preset-driven and defaults to `{ objectFit: true, clip: true, radius: true }`; it reads the cover `` itself and does not infer parent-wrapper clipping. `clip-path` / `border-radius` animation may repaint; use `cover.clip=false` or `cover.radius=false` for performance-sensitive mobile pages. Set `animate={{ cover: false }}` for legacy cover geometry. `animate.slowMotion` defaults `false`; when enabled, holding `Shift` while opening or closing slows the full browsing transition to 10x for inspection and demos. `gesture` is preset-driven: desktop enables `wheelZoom` while already zoomed and disables `swipe` / `dragExit` / `pinchZoom` / `doubleTapZoom`; mobile enables horizontal drag paging, vertical drag-to-exit, pinch zoom, and double-tap zoom, while disabling `wheelZoom`. `gesture.touchAction` defaults to `'managed'`: pinch uses CSS `touch-action: none`, double-tap-only uses `manipulation`, otherwise `auto`; set it explicitly if the host page owns touch behavior. `pinchZoom.resetBelowFit` defaults `true`, so shrinking back to fit exits zoom and recenters. `doubleTapZoom.interval` / `distance` define the second-tap window. `wheelZoom.reverse` flips wheel direction; `wheelZoom.exitGuardDuration` defaults to `1000`, so wheel zooming out to `minScale` exits zoom immediately and blocks residual wheel events for that duration. `gesture=false` disables all gestures, and per-child overrides such as `gesture={{ swipe: false }}` / `gesture={{ wheelZoom: false }}` / `gesture={{ pinchZoom: false }}` keep the other preset defaults intact | -| Interface | `hideOnScroll`, `hideOnDblClick`, `coverVisible`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `loadingDelay` | desktop-only flags noted in README. `radius` defaults to desktop `8` / mobile `0`; `edge` defaults to desktop `16` / mobile `0`. `hideOnScroll` and `hideOnDblClick` are the auto-dismiss trigger family (user action → close viewer); `hideOnDblClick` defaults `false`. `loadingDelay` defaults `200ms` — anti-flicker delay before showing the loading indicator (set 0 for legacy instant-show) | +| Interface | `hideOnScroll`, `hideOnDblClick`, `coverVisible`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `loadingDelay` | desktop-only flags noted in README. `portalTarget` defaults to `document.body` and is for app overlay roots / modal roots / micro-frontend containers; it changes only the Portal mount parent, while the viewer remains fullscreen fixed. `radius` defaults to desktop `8` / mobile `0`; `edge` defaults to desktop `16` / mobile `0`. `hideOnScroll` and `hideOnDblClick` are the auto-dismiss trigger family (user action → close viewer); `hideOnDblClick` defaults `false`. `loadingDelay` defaults `200ms` — anti-flicker delay before showing the loading indicator (set 0 for legacy instant-show) | | Lifecycle | `onBrowsing`, `onZooming`, `onSwitching`, `onRotating`, `onError` | first 4 callback args: `boolean`/`boolean`/`number`/`number`. `onError(e: SyntheticEvent)` fires for cover **or** viewer img-load failure — the only hook for the viewer-side failure (cover also flows via native `` `onError` passthrough) | | Native | All `HTMLAttributes` | className, style, onClick, etc. transparently forwarded to inner `` | @@ -104,7 +104,7 @@ Defaults & sub-shapes: see [`packages/core/src/types/default.ts`](./packages/cor 2. **Hard-coding `preset='desktop'` on a touch-targeted page** — omitted `preset` already defaults to `'auto'`. The desktop bundle ships hotkeys + arrow buttons, enables wheel zoom while zoomed, and disables mobile `gesture.swipe` / `gesture.dragExit` / `gesture.pinchZoom` / `gesture.doubleTapZoom`. Use `'desktop'` only when the page deliberately wants desktop behavior on touch devices. 3. **Treating `Zmage` as a class** — it is a `forwardRef` exotic component. ❌ `new Zmage()`. ✅ JSX or `Zmage.browsing()`. 4. **Mixing controlled and uncontrolled** — if `browsing` is in props, it must be a fully controlled `boolean` (provide `onBrowsing` to receive changes). Mixing both modes silently breaks state sync. -5. **Calling `Zmage.browsing` server-side** — it manipulates `document.body`. Guard with `typeof window !== 'undefined'` or call from event handlers / effects. +5. **Calling `Zmage.browsing` server-side** — it manipulates the DOM (`document.body` by default, or `portalTarget` when provided). Guard with `typeof window !== 'undefined'` or call from event handlers / effects. 6. **Putting `src` / `alt` on `` as if it rendered an image** — Wrapper binds real descendant `` nodes. Put image data in the HTML, and pass only viewer config / optional shared `set` to Wrapper. 7. **Wrapping with `Zmage.Wrapper` without re-rendering** — wrapper attaches click handlers in `componentDidMount` / `componentDidUpdate` by querying `wrapperRef.current.querySelectorAll('img')`. Dynamically-injected `` (after wrapper update) won't get attached unless wrapper re-renders. diff --git a/docs/about/index.html b/docs/about/index.html index c9c4a3c..a7c029a 100644 --- a/docs/about/index.html +++ b/docs/about/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/ai/index.html b/docs/ai/index.html index e5da67a..12d1258 100644 --- a/docs/ai/index.html +++ b/docs/ai/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/assets/index-8Ptyfupf.css b/docs/assets/index-8Ptyfupf.css new file mode 100644 index 0000000..dc5e967 --- /dev/null +++ b/docs/assets/index-8Ptyfupf.css @@ -0,0 +1 @@ +/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:0 0% 100%;--foreground:240 10% 3.9%;--card:0 0% 100%;--card-foreground:240 10% 3.9%;--popover:0 0% 100%;--popover-foreground:240 10% 3.9%;--primary:240 5.9% 10%;--primary-foreground:0 0% 98%;--secondary:240 4.8% 95.9%;--secondary-foreground:240 5.9% 10%;--muted:240 4.8% 95.9%;--muted-foreground:240 3.8% 46.1%;--accent:240 4.8% 95.9%;--accent-foreground:240 5.9% 10%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 5.9% 90%;--input:240 5.9% 90%;--ring:240 5.9% 10%;--radius:.5rem}.dark{color-scheme:dark;--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 10% 3.9%;--card-foreground:0 0% 98%;--popover:240 10% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:240 5.9% 10%;--secondary:240 3.7% 15.9%;--secondary-foreground:0 0% 98%;--muted:240 3.7% 15.9%;--muted-foreground:240 5% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 15.9%;--ring:240 4.9% 83.9%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-feature-settings:"rlig" 1,"calt" 1}.code-block-scroll{scrollbar-width:thin;scrollbar-color:hsl(var(--muted-foreground) / .35) transparent}.code-block-scroll::-webkit-scrollbar{width:8px;height:8px}.code-block-scroll::-webkit-scrollbar-track{background:0 0}.code-block-scroll::-webkit-scrollbar-thumb{background-color:hsl(var(--muted-foreground) / .3);border-radius:4px}.code-block-scroll::-webkit-scrollbar-thumb:hover{background-color:hsl(var(--muted-foreground) / .55)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-2{inset:calc(var(--spacing) * 2)}.inset-4{inset:calc(var(--spacing) * 4)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-20{top:calc(var(--spacing) * 20)}.top-\[50\%\]{top:50%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-6{bottom:calc(var(--spacing) * 6)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3{left:calc(var(--spacing) * 3)}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.-z-10{z-index:-10}.-z-20{z-index:-20}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-6{margin-block:calc(var(--spacing) * 6)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mt-32{margin-top:calc(var(--spacing) * 32)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-px{margin-left:-1px}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.aspect-\[3\/4\]{aspect-ratio:3/4}.aspect-\[3\/5\]{aspect-ratio:3/5}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[5\/4\]{aspect-ratio:5/4}.aspect-\[16\/7\]{aspect-ratio:16/7}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[16\/10\]{aspect-ratio:16/10}.aspect-square{aspect-ratio:1}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-28{height:calc(var(--spacing) * 28)}.h-32{height:calc(var(--spacing) * 32)}.h-36{height:calc(var(--spacing) * 36)}.h-64{height:calc(var(--spacing) * 64)}.h-\[1px\]{height:1px}.h-\[62dvh\]{height:62dvh}.h-\[min\(70dvh\,720px\)\]{height:min(70dvh,720px)}.h-\[min\(600px\,150vw\)\]{height:min(600px,150vw)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.max-h-\[88dvh\]{max-height:88dvh}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-64{min-height:calc(var(--spacing) * 64)}.min-h-\[132px\]{min-height:132px}.min-h-\[360px\]{min-height:360px}.min-h-\[420px\]{min-height:420px}.min-h-\[calc\(100dvh-3\.5rem\)\]{min-height:calc(100dvh - 3.5rem)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-\[1px\]{width:1px}.w-\[calc\(var\(--spacing\)\*100\)\]{width:calc(var(--spacing) * 100)}.w-\[min\(900px\,190vw\)\]{width:min(900px,190vw)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[68ch\]{max-width:68ch}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[720px\]{min-width:720px}.min-w-\[var\(--radix-dropdown-menu-trigger-width\)\]{min-width:var(--radix-dropdown-menu-trigger-width)}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:--radix-dropdown-menu-content-transform-origin}.origin-\[--radix-popover-content-transform-origin\]{transform-origin:--radix-popover-content-transform-origin}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:--radix-tooltip-content-transform-origin}.origin-right{transform-origin:100%}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.touch-none{touch-action:none}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-mt-24{scroll-margin-top:calc(var(--spacing) * 24)}.list-disc{list-style-type:disc}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[5\.5rem_7rem_minmax\(0\,1fr\)\]{grid-template-columns:5.5rem 7rem minmax(0,1fr)}.grid-cols-\[6rem_8rem_minmax\(0\,1fr\)\]{grid-template-columns:6rem 8rem minmax(0,1fr)}.grid-cols-\[72px_1fr\]{grid-template-columns:72px 1fr}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:hsl(var(--border))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[1\.5px\]{border-radius:1.5px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-400\/30{border-color:#fcbb004d}@supports (color:color-mix(in lab,red,red)){.border-amber-400\/30{border-color:color-mix(in oklab,var(--color-amber-400) 30%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-background{border-color:hsl(var(--background))}.border-border,.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-foreground{border-color:hsl(var(--foreground))}.border-input{border-color:hsl(var(--input))}.border-primary-foreground\/15{border-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.border-primary-foreground\/15{border-color:color-mix(in oklab,hsl(var(--primary-foreground)) 15%,transparent)}}.border-primary\/35{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/35{border-color:color-mix(in oklab,hsl(var(--primary)) 35%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.border-transparent{border-color:#0000}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/10{background-color:color-mix(in oklab,var(--color-amber-400) 10%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-background,.bg-background\/0{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/0{background-color:color-mix(in oklab,hsl(var(--background)) 0%,transparent)}}.bg-background\/45{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/45{background-color:color-mix(in oklab,hsl(var(--background)) 45%,transparent)}}.bg-background\/60{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.bg-background\/70{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/70{background-color:color-mix(in oklab,hsl(var(--background)) 70%,transparent)}}.bg-background\/80{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-border{background-color:hsl(var(--border))}.bg-card,.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-foreground\/25{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/25{background-color:color-mix(in oklab,hsl(var(--foreground)) 25%,transparent)}}.bg-foreground\/55{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/55{background-color:color-mix(in oklab,hsl(var(--foreground)) 55%,transparent)}}.bg-muted,.bg-muted\/20{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,hsl(var(--muted)) 20%,transparent)}}.bg-muted\/25{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/25{background-color:color-mix(in oklab,hsl(var(--muted)) 25%,transparent)}}.bg-muted\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,hsl(var(--muted)) 30%,transparent)}}.bg-muted\/35{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/35{background-color:color-mix(in oklab,hsl(var(--muted)) 35%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.bg-popover{background-color:hsl(var(--popover))}.bg-primary,.bg-primary\/20{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[radial-gradient\(closest-side\,hsl\(var\(--foreground\)\/0\.08\)\,transparent\)\]{background-image:radial-gradient(closest-side,hsl(var(--foreground)/.08),transparent)}.from-background\/20{--tw-gradient-from:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.from-background\/20{--tw-gradient-from:color-mix(in oklab, hsl(var(--background)) 20%, transparent)}}.from-background\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-black\/70{--tw-gradient-from:#000000b3}@supports (color:color-mix(in lab,red,red)){.from-black\/70{--tw-gradient-from:color-mix(in oklab, var(--color-black) 70%, transparent)}}.from-black\/70{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-background\/45{--tw-gradient-via:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.via-background\/45{--tw-gradient-via:color-mix(in oklab, hsl(var(--background)) 45%, transparent)}}.via-background\/45{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-black\/15{--tw-gradient-via:#00000026}@supports (color:color-mix(in lab,red,red)){.via-black\/15{--tw-gradient-via:color-mix(in oklab, var(--color-black) 15%, transparent)}}.via-black\/15{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-background{--tw-gradient-to:hsl(var(--background));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-foreground\/40{--tw-gradient-to:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.to-foreground\/40{--tw-gradient-to:color-mix(in oklab, hsl(var(--foreground)) 40%, transparent)}}.to-foreground\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-center{object-position:center}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pr-44{padding-right:calc(var(--spacing) * 44)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-28{padding-bottom:calc(var(--spacing) * 28)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[clamp\(2\.5rem\,7vw\,5\.5rem\)\]{font-size:clamp(2.5rem,7vw,5.5rem)}.text-\[clamp\(2rem\,5\.5vw\,4rem\)\]{font-size:clamp(2rem,5.5vw,4rem)}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-950{color:var(--color-amber-950)}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground,.text-foreground\/40{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/40{color:color-mix(in oklab,hsl(var(--foreground)) 40%,transparent)}}.text-foreground\/60{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/60{color:color-mix(in oklab,hsl(var(--foreground)) 60%,transparent)}}.text-foreground\/85{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/85{color:color-mix(in oklab,hsl(var(--foreground)) 85%,transparent)}}.text-muted-foreground,.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/65{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/65{color:color-mix(in oklab,hsl(var(--muted-foreground)) 65%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground,.text-primary-foreground\/70{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/70{color:color-mix(in oklab,hsl(var(--primary-foreground)) 70%,transparent)}}.text-primary-foreground\/80{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/80{color:color-mix(in oklab,hsl(var(--primary-foreground)) 80%,transparent)}}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sky-700{color:var(--color-sky-700)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.decoration-dotted{text-decoration-style:dotted}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-foreground\/15{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/15{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 15%, transparent)}}.ring-foreground\/40{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/40{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 40%, transparent)}}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.brightness-\[1\.02\]{--tw-brightness:brightness(1.02);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_30px_hsl\(var\(--foreground\)\/0\.18\)\]{--tw-drop-shadow-size:drop-shadow(0 0 30px var(--tw-drop-shadow-color,hsl(var(--foreground)/.18)));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.saturate-\[0\.95\]{--tw-saturate:saturate(.95);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\,opacity\,transform\]{transition-property:grid-template-rows,opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,width\,height\,opacity\]{transition-property:transform,width,height,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-\[220ms\]{--tw-duration:.22s;transition-duration:.22s}.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{--tw-ease:cubic-bezier(.16,1,.3,1);transition-timing-function:cubic-bezier(.16,1,.3,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-\[1\.012\]:is(:where(.group):hover *){scale:1.012}.group-hover\:opacity-60:is(:where(.group):hover *){opacity:.6}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}@media(hover:hover){.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:bg-accent:hover,.hover\:bg-accent\/40:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/40:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 40%,transparent)}}.hover\:bg-accent\/60:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/60:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 60%,transparent)}}.hover\:bg-card\/70:hover{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card\/70:hover{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 10%,transparent)}}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 80%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 90%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,hsl(var(--secondary)) 80%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-100:hover{opacity:1}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-foreground\/15:hover{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:ring-foreground\/15:hover{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 15%, transparent)}}}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}@media(hover:hover){.hover\:data-\[state\=checked\]\:bg-primary\/85:hover[data-state=checked]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:data-\[state\=checked\]\:bg-primary\/85:hover[data-state=checked]{background-color:color-mix(in oklab,hsl(var(--primary)) 85%,transparent)}}}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=open\]\:rotate-180[data-state=open]{rotate:180deg}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}@media(hover:hover){.hover\:data-\[state\=unchecked\]\:bg-input\/70:hover[data-state=unchecked]{background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.hover\:data-\[state\=unchecked\]\:bg-input\/70:hover[data-state=unchecked]{background-color:color-mix(in oklab,hsl(var(--input)) 70%,transparent)}}}@media(prefers-reduced-motion:reduce){.motion-reduce\:transition-none{transition-property:none}}@media(min-width:40rem){.sm\:ml-3{margin-left:calc(var(--spacing) * 3)}.sm\:inline-flex{display:inline-flex}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[9rem_1fr\]{grid-template-columns:9rem 1fr}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:text-left{text-align:left}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:float-right{float:right}.md\:ml-5{margin-left:calc(var(--spacing) * 5)}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:aspect-\[5\/4\]{aspect-ratio:5/4}.md\:w-64{width:calc(var(--spacing) * 64)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-\[minmax\(0\,1fr\)_220px\]{grid-template-columns:minmax(0,1fr) 220px}.md\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,0\.82fr\)_minmax\(0\,1\.18fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,.82fr) minmax(0,1.18fr)}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:justify-between{justify-content:space-between}.md\:p-7{padding:calc(var(--spacing) * 7)}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.md\:text-\[15px\]{font-size:15px}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-14{top:calc(var(--spacing) * 14)}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-start-3{grid-row-start:3}.lg\:block{display:block}.lg\:aspect-auto{aspect-ratio:auto}.lg\:h-\[calc\(100dvh-3\.5rem\)\]{height:calc(100dvh - 3.5rem)}.lg\:h-auto{height:auto}.lg\:min-h-0{min-height:calc(var(--spacing) * 0)}.lg\:flex-1{flex:1}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[260px_minmax\(0\,1fr\)\]{grid-template-columns:260px minmax(0,1fr)}.lg\:grid-cols-\[360px_minmax\(0\,1fr\)\]{grid-template-columns:360px minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,0\.75fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,.75fr) minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1\.2fr\)_minmax\(280px\,0\.8fr\)\]{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.lg\:grid-cols-\[minmax\(0\,1\.05fr\)_minmax\(260px\,0\.58fr\)_minmax\(260px\,0\.72fr\)\]{grid-template-columns:minmax(0,1.05fr) minmax(260px,.58fr) minmax(260px,.72fr)}.lg\:grid-cols-\[minmax\(0\,1\.05fr\)_minmax\(280px\,0\.95fr\)\]{grid-template-columns:minmax(0,1.05fr) minmax(280px,.95fr)}.lg\:grid-cols-\[minmax\(0\,1\.15fr\)_minmax\(260px\,0\.85fr\)\]{grid-template-columns:minmax(0,1.15fr) minmax(260px,.85fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(420px\,0\.94fr\)\]{grid-template-columns:minmax(0,1fr) minmax(420px,.94fr)}.lg\:grid-rows-\[13rem_14rem_12rem\]{grid-template-rows:13rem 14rem 12rem}.lg\:grid-rows-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-rows:auto minmax(0,1fr) auto}.lg\:overflow-hidden{overflow:hidden}.lg\:px-12{padding-inline:calc(var(--spacing) * 12)}.lg\:py-10{padding-block:calc(var(--spacing) * 10)}}@media(min-width:80rem){.xl\:px-16{padding-inline:calc(var(--spacing) * 16)}}.dark\:bg-background\/10:is(.dark *){background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/10:is(.dark *){background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.dark\:via-background\/65:is(.dark *){--tw-gradient-via:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.dark\:via-background\/65:is(.dark *){--tw-gradient-via:color-mix(in oklab, hsl(var(--background)) 65%, transparent)}}.dark\:via-background\/65:is(.dark *){--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:to-background:is(.dark *){--tw-gradient-to:hsl(var(--background));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:text-amber-100:is(.dark *){color:var(--color-amber-100)}.dark\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\:text-emerald-300:is(.dark *){color:var(--color-emerald-300)}.dark\:text-sky-300:is(.dark *){color:var(--color-sky-300)}.dark\:brightness-\[0\.68\]:is(.dark *){--tw-brightness:brightness(.68);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:contrast-\[0\.95\]:is(.dark *){--tw-contrast:contrast(.95);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:saturate-\[0\.72\]:is(.dark *){--tw-saturate:saturate(.72);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}}html{scrollbar-gutter:stable}html body[data-scroll-locked]{margin-right:0!important}@keyframes nav-menu-in{0%{opacity:0;transform:translateY(4px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes nav-menu-out{0%{opacity:1;transform:translateY(0)scale(1)}to{opacity:0;transform:translateY(4px)scale(.98)}}.nav-menu-anim{transform-origin:50%;will-change:transform,opacity}.nav-menu-anim[data-state=open]{animation:.18s cubic-bezier(.2,.7,.3,1) nav-menu-in}.nav-menu-anim[data-state=closed]{animation:.14s cubic-bezier(.4,0,.6,1) nav-menu-out}@keyframes dialog-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes dialog-overlay-out{0%{opacity:1}to{opacity:0}}@keyframes dialog-content-in{0%{opacity:0;transform:translateY(10px)scale(.97)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes dialog-content-out{0%{opacity:1;transform:translateY(0)scale(1)}to{opacity:0;transform:translateY(10px)scale(.97)}}.dialog-overlay-anim{will-change:opacity}.dialog-overlay-anim[data-state=open]{animation:.18s cubic-bezier(.16,1,.3,1) dialog-overlay-in}.dialog-overlay-anim[data-state=closed]{animation:.14s cubic-bezier(.4,0,1,1) dialog-overlay-out}.dialog-content-anim{transform-origin:50%;will-change:transform,opacity}.dialog-content-anim[data-state=open]{animation:.22s cubic-bezier(.16,1,.3,1) dialog-content-in}.dialog-content-anim[data-state=closed]{animation:.16s cubic-bezier(.4,0,1,1) dialog-content-out}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}.wrapperLayer__Br2mJ{position:fixed;margin:0;padding:0;top:0;left:0;right:0;bottom:0;overflow:hidden;z-index:999}.viewportLayer__c6flH{position:absolute;margin:0;padding:0;top:0;left:0;right:0;bottom:0;overflow:hidden}@keyframes zoomShake__eNalV{0%,to{transform:translate(0)}20%{transform:translate(-3px)}40%{transform:translate(3px)}60%{transform:translate(-2px)}80%{transform:translate(2px)}}.baseButton__8nNxq{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center}.baseButton__8nNxq>svg{display:block;width:2rem;height:2rem}.controls__9U729{box-sizing:border-box;position:absolute;padding:0 .4rem;opacity:0;display:flex;z-index:1000;border-radius:5rem;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s}.topRight__bDRMJ{top:.6rem;top:var(--zmage-toolbar-top-offset, .6rem);right:.6rem;right:var(--zmage-toolbar-right-offset, .6rem);transform:translate(100%)}.topLeft__BodEu{top:.6rem;top:var(--zmage-toolbar-top-offset, .6rem);left:.6rem;left:var(--zmage-toolbar-left-offset, .6rem);transform:translate(-100%)}.bottomRight__Hd0jy{right:.6rem;right:var(--zmage-toolbar-right-offset, .6rem);bottom:.6rem;bottom:var(--zmage-toolbar-bottom-offset, .6rem);transform:translate(100%)}.bottomLeft__762V9{bottom:.6rem;bottom:var(--zmage-toolbar-bottom-offset, .6rem);left:.6rem;left:var(--zmage-toolbar-left-offset, .6rem);transform:translate(-100%)}.topCenter__jexvO{top:.6rem;top:var(--zmage-toolbar-top-offset, .6rem);left:50%;left:var(--zmage-toolbar-left-offset, 50%);transform:translate(-50%,-100%)}.bottomCenter__DEEUV{bottom:.6rem;bottom:var(--zmage-toolbar-bottom-offset, .6rem);left:50%;left:var(--zmage-toolbar-left-offset, 50%);transform:translate(-50%,100%)}.leftCenter__8PTu3{top:50%;top:var(--zmage-toolbar-top-offset, 50%);left:.6rem;left:var(--zmage-toolbar-left-offset, .6rem);transform:translate(-100%,-50%)}.rightCenter__mHTFQ{top:50%;top:var(--zmage-toolbar-top-offset, 50%);right:.6rem;right:var(--zmage-toolbar-right-offset, .6rem);transform:translate(100%,-50%)}.topRight__bDRMJ.show__GPCB-,.topLeft__BodEu.show__GPCB-,.bottomRight__Hd0jy.show__GPCB-,.bottomLeft__762V9.show__GPCB-{opacity:.8;transform:translate(0)}.topCenter__jexvO.show__GPCB-,.bottomCenter__DEEUV.show__GPCB-{opacity:.8;transform:translate(-50%)}.leftCenter__8PTu3.show__GPCB-,.rightCenter__mHTFQ.show__GPCB-{opacity:.8;transform:translateY(-50%)}.controls__9U729 .pinButton__WM-eb{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .pinButton__WM-eb>svg{display:block;width:2rem;height:2rem}.controls__9U729 .pinButton__WM-eb>svg{width:1.5rem;height:1.5rem}.controls__9U729 .pinButton__WM-eb:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .pinButton__WM-eb:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotate__-FSm5{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotate__-FSm5>svg{display:block;width:2rem;height:2rem}.controls__9U729 .rotate__-FSm5>svg{width:1.5rem;height:1.5rem}.controls__9U729 .rotate__-FSm5:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .rotate__-FSm5:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotate__-FSm5 svg{transition:transform .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateLeft__xjHZr{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateLeft__xjHZr>svg{display:block;width:2rem;height:2rem}.controls__9U729 .rotateLeft__xjHZr>svg{width:1.5rem;height:1.5rem}.controls__9U729 .rotateLeft__xjHZr:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .rotateLeft__xjHZr:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotateLeft__xjHZr svg{transition:transform .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateLeft__xjHZr:hover svg{transform:rotate(-30deg)}.controls__9U729 .rotateRight__Q71ZR{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateRight__Q71ZR>svg{display:block;width:2rem;height:2rem}.controls__9U729 .rotateRight__Q71ZR>svg{width:1.5rem;height:1.5rem}.controls__9U729 .rotateRight__Q71ZR:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .rotateRight__Q71ZR:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotateRight__Q71ZR svg{transition:transform .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateRight__Q71ZR:hover svg{transform:rotate(30deg)}.controls__9U729 .download__z6NFZ{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .download__z6NFZ>svg{display:block;width:2rem;height:2rem}.controls__9U729 .download__z6NFZ>svg{width:1.5rem;height:1.5rem}.controls__9U729 .download__z6NFZ:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .download__z6NFZ:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .download__z6NFZ svg{margin-top:-.06rem}.controls__9U729 .zoom__VWyU-{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .zoom__VWyU->svg{display:block;width:2rem;height:2rem}.controls__9U729 .zoom__VWyU->svg{width:1.5rem;height:1.5rem}.controls__9U729 .zoom__VWyU-:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .zoom__VWyU-:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .zoom__VWyU-.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.controls__9U729 .zoom__VWyU-.disabled__l7PPn:hover,.controls__9U729 .zoom__VWyU-.disabled__l7PPn:active{opacity:.35!important;transform:none!important}.controls__9U729 .zoom__VWyU-.shake__ul2tL{animation:zoomShake__eNalV .32s cubic-bezier(.6,0,.1,1)}.controls__9U729 .close__N7GMd{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .close__N7GMd>svg{display:block;width:2rem;height:2rem}.controls__9U729 .close__N7GMd>svg{width:1.5rem;height:1.5rem}.controls__9U729 .close__N7GMd:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .close__N7GMd:active{opacity:1!important;transform:scale(1)!important}.sideButton__u3mXw{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;position:absolute;top:50%;padding:.4rem;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.sideButton__u3mXw>svg{display:block;width:2rem;height:2rem}.sideButton__u3mXw:hover{opacity:.8!important;transform:translate(0) translateY(-50%)!important}.sideButton__u3mXw:active{opacity:1!important}.sideButton__u3mXw.show__GPCB-{opacity:.8}.sideButton__u3mXw.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.sideButton__u3mXw.disabled__l7PPn:hover,.sideButton__u3mXw.disabled__l7PPn:active{opacity:.35!important}.flipLeft__OgnvQ{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;position:absolute;top:50%;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1);left:0;left:var(--zmage-flip-left-offset, 0);padding:.4rem .4rem .4rem .6rem;border-radius:0 .5em .5em 0;transform:translate(-100%) translateY(-50%)}.flipLeft__OgnvQ>svg{display:block;width:2rem;height:2rem}.flipLeft__OgnvQ:hover{opacity:.8!important;transform:translate(0) translateY(-50%)!important}.flipLeft__OgnvQ:active{opacity:1!important}.flipLeft__OgnvQ.show__GPCB-{opacity:.8}.flipLeft__OgnvQ.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.flipLeft__OgnvQ.disabled__l7PPn:hover,.flipLeft__OgnvQ.disabled__l7PPn:active{opacity:.35!important}.flipLeft__OgnvQ:active{transform:translate(-.2em) translateY(-50%)!important}.flipLeft__OgnvQ.show__GPCB-{opacity:.8;transform:translate(-.2em) translateY(-50%)}.flipLeft__OgnvQ.disabled__l7PPn:hover,.flipLeft__OgnvQ.disabled__l7PPn:active{transform:translate(-.2em) translateY(-50%)!important}.flipLeft__OgnvQ.detachedSideButton__SKxNE{border-radius:.5rem;padding-left:.4rem}.flipRight__wywuu{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;position:absolute;top:50%;padding:.4rem .6rem .4rem .4rem;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1);right:0;right:var(--zmage-flip-right-offset, 0);border-radius:.5rem 0 0 .5rem;transform:translate(100%) translateY(-50%)}.flipRight__wywuu>svg{display:block;width:2rem;height:2rem}.flipRight__wywuu:hover{opacity:.8!important;transform:translate(0) translateY(-50%)!important}.flipRight__wywuu:active{opacity:1!important}.flipRight__wywuu.show__GPCB-{opacity:.8}.flipRight__wywuu.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.flipRight__wywuu.disabled__l7PPn:hover,.flipRight__wywuu.disabled__l7PPn:active{opacity:.35!important}.flipRight__wywuu:active{transform:translate(.2em) translateY(-50%)!important}.flipRight__wywuu.show__GPCB-{opacity:.8;transform:translate(.2em) translateY(-50%)}.flipRight__wywuu.disabled__l7PPn:hover,.flipRight__wywuu.disabled__l7PPn:active{transform:translate(.2em) translateY(-50%)!important}.flipRight__wywuu.detachedSideButton__SKxNE{border-radius:.5rem;padding-right:.4rem}.pages__5GsnL{box-sizing:border-box;display:flex;position:absolute;top:auto;top:var(--zmage-pagination-top-offset, auto);right:auto;right:var(--zmage-pagination-right-offset, auto);bottom:.6rem;bottom:var(--zmage-pagination-bottom-offset, .6rem);left:50%;left:var(--zmage-pagination-left-offset, 50%);z-index:110;opacity:0;border-radius:2rem;transform:translate(-50%,100px);transform:translate(var(--zmage-pagination-translate-x, -50%),100px);transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.pages__5GsnL.show__GPCB-{opacity:.8;transform:translate(-50%);transform:translate(var(--zmage-pagination-translate-x, -50%))}.pages__5GsnL.mobile__6jMYl{bottom:2rem;bottom:var(--zmage-pagination-bottom-offset, 2rem)}.pages__5GsnL .dot__kUakb{cursor:pointer;margin:.45rem .25rem;display:block;width:.6rem;height:.6rem;border-radius:1.2rem;background:#000;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),width .35s cubic-bezier(.6,0,.1,1)}.pages__5GsnL .dot__kUakb:first-of-type{margin-left:.6rem}.pages__5GsnL .dot__kUakb:last-of-type{margin-right:.6rem}.pages__5GsnL .blackDot__bhplt{cursor:pointer;margin:.45rem .25rem;display:block;width:.6rem;height:.6rem;border-radius:1.2rem;background:#000;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),width .35s cubic-bezier(.6,0,.1,1);cursor:auto;cursor:initial;width:1rem;background:currentcolor;box-shadow:0 0 0 1px #00000059,0 0 0 2px #ffffff73}.pages__5GsnL .blackDot__bhplt:first-of-type{margin-left:.6rem}.pages__5GsnL .blackDot__bhplt:last-of-type{margin-right:.6rem}.pages__5GsnL .whiteDot__P7lUz{cursor:pointer;margin:.45rem .25rem;display:block;width:.6rem;height:.6rem;border-radius:1.2rem;background:#000;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),width .35s cubic-bezier(.6,0,.1,1);background:#999}.pages__5GsnL .whiteDot__P7lUz:first-of-type{margin-left:.6rem}.pages__5GsnL .whiteDot__P7lUz:last-of-type{margin-right:.6rem}.pages__5GsnL .whiteDot__P7lUz:hover{opacity:.8!important;transform:scale(1.1)!important}.pages__5GsnL .whiteDot__P7lUz:active{opacity:1!important;transform:scale(1)!important}.caption__JgbQx{box-sizing:border-box;position:absolute;top:auto;top:var(--zmage-caption-top-offset, auto);right:auto;right:var(--zmage-caption-right-offset, auto);bottom:3rem;bottom:var(--zmage-caption-bottom-offset, 3rem);left:50%;left:var(--zmage-caption-left-offset, 50%);z-index:110;max-width:60vw;padding:.35rem .85rem;border-radius:1rem;opacity:0;text-align:center;font-size:.75rem;line-height:1.45;word-break:break-word;color:#fff;background:#0000008c;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);pointer-events:none;transform:translate(-50%,100px);transform:translate(var(--zmage-caption-translate-x, -50%),100px);transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.show__tlkZ3{opacity:1;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}.caption__JgbQx.mobile__5qSC9{bottom:4.5rem;bottom:var(--zmage-caption-bottom-offset, 4.5rem);max-width:80vw}.caption__JgbQx.switchFade__T69y8{animation:capFade__x70-f .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchCrossFade__X9cH8{animation:capCrossFade__7nIUY .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchSwipe__1UDK0{animation:capSwipe__4eDDl .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchZoom__27vZs{animation:capZoom__-hpdF .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchBlur__DwX02{animation:capBlur__6kymE .35s cubic-bezier(.6,0,.1,1)}@keyframes capFade__x70-f{0%{opacity:0;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}to{opacity:1;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}}@keyframes capCrossFade__7nIUY{0%{opacity:0;transform:translate(calc(-50% + 24px));transform:translate(calc(var(--zmage-caption-translate-x, -50%) + 24px))}to{opacity:1;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}}@keyframes capSwipe__4eDDl{0%{transform:translate(calc(-50% + 60vw));transform:translate(calc(var(--zmage-caption-translate-x, -50%) + 60vw))}to{transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}}@keyframes capZoom__-hpdF{0%{opacity:0;transform:translate(-50%) scale(.92);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(.92)}to{opacity:1;transform:translate(-50%) scale(1);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(1)}}@keyframes capBlur__6kymE{0%{opacity:0;filter:blur(8px);transform:translate(-50%) scale(.985);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(.985)}to{opacity:1;filter:blur(0);transform:translate(-50%) scale(1);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(1)}}.imageLayer__yjPf3{-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),filter .35s cubic-bezier(.6,0,.1,1),clip-path .35s cubic-bezier(.6,0,.1,1),border-radius .35s cubic-bezier(.6,0,.1,1);position:absolute;left:50%;top:50%;will-change:transform,top,opacity,filter,clip-path,border-radius;max-width:none;max-height:none;width:auto;height:auto}.imageLayer__yjPf3.zooming__3mMU7{transition-timing-function:cubic-bezier(0,.1,.1,1);-ms-transition-duration:0ms}.imageLayer__yjPf3.invalidate__MJYkk{opacity:0!important;pointer-events:none}@keyframes zmageJumpFadeIn__SoglW{0%{opacity:0}to{opacity:1}}.jumpFadeIn__4wa75{animation:zmageJumpFadeIn__SoglW .35s cubic-bezier(.6,0,.1,1) both}.loadingContainer__-joiS{-webkit-user-select:none;-moz-user-select:none;user-select:none;position:absolute;left:50%;top:50%;opacity:0;transition:opacity cubic-bezier(.6,0,.1,1) 175ms}.loadingContainer__-joiS.show__-FZiR{opacity:1}.loadingContainer__-joiS .reload__bc5Ze{border:2px solid;border-radius:5px;font-size:1rem;padding:.5rem;cursor:pointer;outline:none;transform:translate(-50%,-50%)}.loadingContainer__-joiS .reload__bc5Ze:hover{opacity:.8}.loadingContainer__-joiS .reload__bc5Ze:hover svg{transform:rotate(30deg)}.loadingContainer__-joiS .reload__bc5Ze:active{opacity:1}.loadingContainer__-joiS .reload__bc5Ze svg{display:block;transition:transform .35s cubic-bezier(.6,0,.1,1)}.loadingContainer__-joiS .loading__I-J4i{width:24px;height:24px;transform:translate(-50%,-50%);animation:spin__VlJlO 1s linear infinite}@keyframes fadeIn__pJo4c{0%{opacity:0}50%{opacity:0}to{opacity:1}}@keyframes fadeOut__WgOXl{0%{opacity:1}50%{opacity:0}to{opacity:0}}@keyframes spin__VlJlO{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}:root{--rz-stylesheet-loaded: 1}.backgroundLayer__CGbNW{position:absolute;top:0;left:0;right:0;bottom:0;cursor:zoom-out;background-color:#fff;transition:opacity .2s;will-change:opacity;-webkit-tap-highlight-color:transparent} diff --git a/docs/assets/index-DMpwH-Fy.css b/docs/assets/index-DMpwH-Fy.css deleted file mode 100644 index dfca8ef..0000000 --- a/docs/assets/index-DMpwH-Fy.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:0 0% 100%;--foreground:240 10% 3.9%;--card:0 0% 100%;--card-foreground:240 10% 3.9%;--popover:0 0% 100%;--popover-foreground:240 10% 3.9%;--primary:240 5.9% 10%;--primary-foreground:0 0% 98%;--secondary:240 4.8% 95.9%;--secondary-foreground:240 5.9% 10%;--muted:240 4.8% 95.9%;--muted-foreground:240 3.8% 46.1%;--accent:240 4.8% 95.9%;--accent-foreground:240 5.9% 10%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 5.9% 90%;--input:240 5.9% 90%;--ring:240 5.9% 10%;--radius:.5rem}.dark{color-scheme:dark;--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 10% 3.9%;--card-foreground:0 0% 98%;--popover:240 10% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:240 5.9% 10%;--secondary:240 3.7% 15.9%;--secondary-foreground:0 0% 98%;--muted:240 3.7% 15.9%;--muted-foreground:240 5% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 15.9%;--ring:240 4.9% 83.9%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-feature-settings:"rlig" 1,"calt" 1}.code-block-scroll{scrollbar-width:thin;scrollbar-color:hsl(var(--muted-foreground) / .35) transparent}.code-block-scroll::-webkit-scrollbar{width:8px;height:8px}.code-block-scroll::-webkit-scrollbar-track{background:0 0}.code-block-scroll::-webkit-scrollbar-thumb{background-color:hsl(var(--muted-foreground) / .3);border-radius:4px}.code-block-scroll::-webkit-scrollbar-thumb:hover{background-color:hsl(var(--muted-foreground) / .55)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-20{top:calc(var(--spacing) * 20)}.top-\[50\%\]{top:50%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3{left:calc(var(--spacing) * 3)}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.-z-10{z-index:-10}.-z-20{z-index:-20}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-6{margin-block:calc(var(--spacing) * 6)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mt-32{margin-top:calc(var(--spacing) * 32)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-px{margin-left:-1px}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.aspect-\[3\/4\]{aspect-ratio:3/4}.aspect-\[3\/5\]{aspect-ratio:3/5}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[5\/4\]{aspect-ratio:5/4}.aspect-\[16\/7\]{aspect-ratio:16/7}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[16\/10\]{aspect-ratio:16/10}.aspect-square{aspect-ratio:1}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-28{height:calc(var(--spacing) * 28)}.h-36{height:calc(var(--spacing) * 36)}.h-64{height:calc(var(--spacing) * 64)}.h-\[1px\]{height:1px}.h-\[62dvh\]{height:62dvh}.h-\[min\(70dvh\,720px\)\]{height:min(70dvh,720px)}.h-\[min\(600px\,150vw\)\]{height:min(600px,150vw)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.max-h-\[88dvh\]{max-height:88dvh}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-\[360px\]{min-height:360px}.min-h-\[420px\]{min-height:420px}.min-h-\[calc\(100dvh-3\.5rem\)\]{min-height:calc(100dvh - 3.5rem)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-\[1px\]{width:1px}.w-\[calc\(var\(--spacing\)\*100\)\]{width:calc(var(--spacing) * 100)}.w-\[min\(900px\,190vw\)\]{width:min(900px,190vw)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[68ch\]{max-width:68ch}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[720px\]{min-width:720px}.min-w-\[var\(--radix-dropdown-menu-trigger-width\)\]{min-width:var(--radix-dropdown-menu-trigger-width)}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:--radix-dropdown-menu-content-transform-origin}.origin-\[--radix-popover-content-transform-origin\]{transform-origin:--radix-popover-content-transform-origin}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:--radix-tooltip-content-transform-origin}.origin-right{transform-origin:100%}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-mt-24{scroll-margin-top:calc(var(--spacing) * 24)}.list-disc{list-style-type:disc}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[5\.5rem_7rem_minmax\(0\,1fr\)\]{grid-template-columns:5.5rem 7rem minmax(0,1fr)}.grid-cols-\[6rem_8rem_minmax\(0\,1fr\)\]{grid-template-columns:6rem 8rem minmax(0,1fr)}.grid-cols-\[72px_1fr\]{grid-template-columns:72px 1fr}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:hsl(var(--border))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[1\.5px\]{border-radius:1.5px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-400\/30{border-color:#fcbb004d}@supports (color:color-mix(in lab,red,red)){.border-amber-400\/30{border-color:color-mix(in oklab,var(--color-amber-400) 30%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-border,.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-foreground{border-color:hsl(var(--foreground))}.border-input{border-color:hsl(var(--input))}.border-primary-foreground\/15{border-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.border-primary-foreground\/15{border-color:color-mix(in oklab,hsl(var(--primary-foreground)) 15%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.border-transparent{border-color:#0000}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/10{background-color:color-mix(in oklab,var(--color-amber-400) 10%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-background,.bg-background\/0{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/0{background-color:color-mix(in oklab,hsl(var(--background)) 0%,transparent)}}.bg-background\/70{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/70{background-color:color-mix(in oklab,hsl(var(--background)) 70%,transparent)}}.bg-background\/80{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-border{background-color:hsl(var(--border))}.bg-card,.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-foreground\/25{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/25{background-color:color-mix(in oklab,hsl(var(--foreground)) 25%,transparent)}}.bg-foreground\/55{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/55{background-color:color-mix(in oklab,hsl(var(--foreground)) 55%,transparent)}}.bg-muted,.bg-muted\/20{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,hsl(var(--muted)) 20%,transparent)}}.bg-muted\/25{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/25{background-color:color-mix(in oklab,hsl(var(--muted)) 25%,transparent)}}.bg-muted\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,hsl(var(--muted)) 30%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.bg-popover{background-color:hsl(var(--popover))}.bg-primary,.bg-primary\/20{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[radial-gradient\(closest-side\,hsl\(var\(--foreground\)\/0\.08\)\,transparent\)\]{background-image:radial-gradient(closest-side,hsl(var(--foreground)/.08),transparent)}.from-background\/20{--tw-gradient-from:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.from-background\/20{--tw-gradient-from:color-mix(in oklab, hsl(var(--background)) 20%, transparent)}}.from-background\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-black\/70{--tw-gradient-from:#000000b3}@supports (color:color-mix(in lab,red,red)){.from-black\/70{--tw-gradient-from:color-mix(in oklab, var(--color-black) 70%, transparent)}}.from-black\/70{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-background\/45{--tw-gradient-via:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.via-background\/45{--tw-gradient-via:color-mix(in oklab, hsl(var(--background)) 45%, transparent)}}.via-background\/45{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-black\/15{--tw-gradient-via:#00000026}@supports (color:color-mix(in lab,red,red)){.via-black\/15{--tw-gradient-via:color-mix(in oklab, var(--color-black) 15%, transparent)}}.via-black\/15{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-background{--tw-gradient-to:hsl(var(--background));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-foreground\/40{--tw-gradient-to:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.to-foreground\/40{--tw-gradient-to:color-mix(in oklab, hsl(var(--foreground)) 40%, transparent)}}.to-foreground\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-center{object-position:center}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pr-44{padding-right:calc(var(--spacing) * 44)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-28{padding-bottom:calc(var(--spacing) * 28)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[clamp\(2\.5rem\,7vw\,5\.5rem\)\]{font-size:clamp(2.5rem,7vw,5.5rem)}.text-\[clamp\(2rem\,5\.5vw\,4rem\)\]{font-size:clamp(2rem,5.5vw,4rem)}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-950{color:var(--color-amber-950)}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground,.text-foreground\/40{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/40{color:color-mix(in oklab,hsl(var(--foreground)) 40%,transparent)}}.text-foreground\/60{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/60{color:color-mix(in oklab,hsl(var(--foreground)) 60%,transparent)}}.text-foreground\/85{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/85{color:color-mix(in oklab,hsl(var(--foreground)) 85%,transparent)}}.text-muted-foreground,.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/65{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/65{color:color-mix(in oklab,hsl(var(--muted-foreground)) 65%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground,.text-primary-foreground\/70{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/70{color:color-mix(in oklab,hsl(var(--primary-foreground)) 70%,transparent)}}.text-primary-foreground\/80{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/80{color:color-mix(in oklab,hsl(var(--primary-foreground)) 80%,transparent)}}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sky-700{color:var(--color-sky-700)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.decoration-dotted{text-decoration-style:dotted}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-foreground\/15{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/15{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 15%, transparent)}}.ring-foreground\/40{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/40{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 40%, transparent)}}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.brightness-\[1\.02\]{--tw-brightness:brightness(1.02);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_30px_hsl\(var\(--foreground\)\/0\.18\)\]{--tw-drop-shadow-size:drop-shadow(0 0 30px var(--tw-drop-shadow-color,hsl(var(--foreground)/.18)));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.saturate-\[0\.95\]{--tw-saturate:saturate(.95);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\,opacity\,transform\]{transition-property:grid-template-rows,opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,width\,height\,opacity\]{transition-property:transform,width,height,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-\[220ms\]{--tw-duration:.22s;transition-duration:.22s}.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{--tw-ease:cubic-bezier(.16,1,.3,1);transition-timing-function:cubic-bezier(.16,1,.3,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-\[1\.012\]:is(:where(.group):hover *){scale:1.012}.group-hover\:opacity-60:is(:where(.group):hover *){opacity:.6}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}@media(hover:hover){.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:bg-accent:hover,.hover\:bg-accent\/40:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/40:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 40%,transparent)}}.hover\:bg-accent\/60:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/60:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 60%,transparent)}}.hover\:bg-card\/70:hover{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card\/70:hover{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 10%,transparent)}}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 80%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,hsl(var(--destructive)) 90%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,hsl(var(--secondary)) 80%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-100:hover{opacity:1}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-foreground\/15:hover{--tw-ring-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:ring-foreground\/15:hover{--tw-ring-color:color-mix(in oklab, hsl(var(--foreground)) 15%, transparent)}}}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}@media(hover:hover){.hover\:data-\[state\=checked\]\:bg-primary\/85:hover[data-state=checked]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:data-\[state\=checked\]\:bg-primary\/85:hover[data-state=checked]{background-color:color-mix(in oklab,hsl(var(--primary)) 85%,transparent)}}}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=open\]\:rotate-180[data-state=open]{rotate:180deg}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}@media(hover:hover){.hover\:data-\[state\=unchecked\]\:bg-input\/70:hover[data-state=unchecked]{background-color:hsl(var(--input))}@supports (color:color-mix(in lab,red,red)){.hover\:data-\[state\=unchecked\]\:bg-input\/70:hover[data-state=unchecked]{background-color:color-mix(in oklab,hsl(var(--input)) 70%,transparent)}}}@media(prefers-reduced-motion:reduce){.motion-reduce\:transition-none{transition-property:none}}@media(min-width:40rem){.sm\:ml-3{margin-left:calc(var(--spacing) * 3)}.sm\:inline-flex{display:inline-flex}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[9rem_1fr\]{grid-template-columns:9rem 1fr}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:text-left{text-align:left}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:float-right{float:right}.md\:ml-5{margin-left:calc(var(--spacing) * 5)}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:aspect-\[5\/4\]{aspect-ratio:5/4}.md\:w-64{width:calc(var(--spacing) * 64)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,0\.82fr\)_minmax\(0\,1\.18fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,.82fr) minmax(0,1.18fr)}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:justify-between{justify-content:space-between}.md\:p-7{padding:calc(var(--spacing) * 7)}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.md\:text-\[15px\]{font-size:15px}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-14{top:calc(var(--spacing) * 14)}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-start-3{grid-row-start:3}.lg\:block{display:block}.lg\:aspect-auto{aspect-ratio:auto}.lg\:h-\[calc\(100dvh-3\.5rem\)\]{height:calc(100dvh - 3.5rem)}.lg\:h-auto{height:auto}.lg\:min-h-0{min-height:calc(var(--spacing) * 0)}.lg\:flex-1{flex:1}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[260px_minmax\(0\,1fr\)\]{grid-template-columns:260px minmax(0,1fr)}.lg\:grid-cols-\[360px_minmax\(0\,1fr\)\]{grid-template-columns:360px minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,0\.75fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,.75fr) minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1\.2fr\)_minmax\(280px\,0\.8fr\)\]{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.lg\:grid-cols-\[minmax\(0\,1\.05fr\)_minmax\(260px\,0\.58fr\)_minmax\(260px\,0\.72fr\)\]{grid-template-columns:minmax(0,1.05fr) minmax(260px,.58fr) minmax(260px,.72fr)}.lg\:grid-cols-\[minmax\(0\,1\.05fr\)_minmax\(280px\,0\.95fr\)\]{grid-template-columns:minmax(0,1.05fr) minmax(280px,.95fr)}.lg\:grid-cols-\[minmax\(0\,1\.15fr\)_minmax\(260px\,0\.85fr\)\]{grid-template-columns:minmax(0,1.15fr) minmax(260px,.85fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(420px\,0\.94fr\)\]{grid-template-columns:minmax(0,1fr) minmax(420px,.94fr)}.lg\:grid-rows-\[13rem_14rem_12rem\]{grid-template-rows:13rem 14rem 12rem}.lg\:grid-rows-\[minmax\(0\,1fr\)_auto\]{grid-template-rows:minmax(0,1fr) auto}.lg\:overflow-hidden{overflow:hidden}.lg\:px-12{padding-inline:calc(var(--spacing) * 12)}.lg\:py-10{padding-block:calc(var(--spacing) * 10)}}@media(min-width:80rem){.xl\:px-16{padding-inline:calc(var(--spacing) * 16)}}.dark\:bg-background\/10:is(.dark *){background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/10:is(.dark *){background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.dark\:via-background\/65:is(.dark *){--tw-gradient-via:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.dark\:via-background\/65:is(.dark *){--tw-gradient-via:color-mix(in oklab, hsl(var(--background)) 65%, transparent)}}.dark\:via-background\/65:is(.dark *){--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:to-background:is(.dark *){--tw-gradient-to:hsl(var(--background));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:text-amber-100:is(.dark *){color:var(--color-amber-100)}.dark\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\:text-emerald-300:is(.dark *){color:var(--color-emerald-300)}.dark\:text-sky-300:is(.dark *){color:var(--color-sky-300)}.dark\:brightness-\[0\.68\]:is(.dark *){--tw-brightness:brightness(.68);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:contrast-\[0\.95\]:is(.dark *){--tw-contrast:contrast(.95);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:saturate-\[0\.72\]:is(.dark *){--tw-saturate:saturate(.72);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}}html{scrollbar-gutter:stable}html body[data-scroll-locked]{margin-right:0!important}@keyframes nav-menu-in{0%{opacity:0;transform:translateY(4px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes nav-menu-out{0%{opacity:1;transform:translateY(0)scale(1)}to{opacity:0;transform:translateY(4px)scale(.98)}}.nav-menu-anim{transform-origin:50%;will-change:transform,opacity}.nav-menu-anim[data-state=open]{animation:.18s cubic-bezier(.2,.7,.3,1) nav-menu-in}.nav-menu-anim[data-state=closed]{animation:.14s cubic-bezier(.4,0,.6,1) nav-menu-out}@keyframes dialog-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes dialog-overlay-out{0%{opacity:1}to{opacity:0}}@keyframes dialog-content-in{0%{opacity:0;transform:translateY(10px)scale(.97)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes dialog-content-out{0%{opacity:1;transform:translateY(0)scale(1)}to{opacity:0;transform:translateY(10px)scale(.97)}}.dialog-overlay-anim{will-change:opacity}.dialog-overlay-anim[data-state=open]{animation:.18s cubic-bezier(.16,1,.3,1) dialog-overlay-in}.dialog-overlay-anim[data-state=closed]{animation:.14s cubic-bezier(.4,0,1,1) dialog-overlay-out}.dialog-content-anim{transform-origin:50%;will-change:transform,opacity}.dialog-content-anim[data-state=open]{animation:.22s cubic-bezier(.16,1,.3,1) dialog-content-in}.dialog-content-anim[data-state=closed]{animation:.16s cubic-bezier(.4,0,1,1) dialog-content-out}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}.wrapperLayer__Br2mJ{position:fixed;margin:0;padding:0;top:0;left:0;right:0;bottom:0;overflow:hidden;z-index:999}.viewportLayer__c6flH{position:absolute;margin:0;padding:0;top:0;left:0;right:0;bottom:0;overflow:hidden}@keyframes zoomShake__eNalV{0%,to{transform:translate(0)}20%{transform:translate(-3px)}40%{transform:translate(3px)}60%{transform:translate(-2px)}80%{transform:translate(2px)}}.baseButton__8nNxq{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center}.baseButton__8nNxq>svg{display:block;width:2rem;height:2rem}.controls__9U729{box-sizing:border-box;position:absolute;padding:0 .4rem;opacity:0;display:flex;z-index:1000;border-radius:5rem;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s}.topRight__bDRMJ{top:.6rem;top:var(--zmage-toolbar-top-offset, .6rem);right:.6rem;right:var(--zmage-toolbar-right-offset, .6rem);transform:translate(100%)}.topLeft__BodEu{top:.6rem;top:var(--zmage-toolbar-top-offset, .6rem);left:.6rem;left:var(--zmage-toolbar-left-offset, .6rem);transform:translate(-100%)}.bottomRight__Hd0jy{right:.6rem;right:var(--zmage-toolbar-right-offset, .6rem);bottom:.6rem;bottom:var(--zmage-toolbar-bottom-offset, .6rem);transform:translate(100%)}.bottomLeft__762V9{bottom:.6rem;bottom:var(--zmage-toolbar-bottom-offset, .6rem);left:.6rem;left:var(--zmage-toolbar-left-offset, .6rem);transform:translate(-100%)}.topCenter__jexvO{top:.6rem;top:var(--zmage-toolbar-top-offset, .6rem);left:50%;left:var(--zmage-toolbar-left-offset, 50%);transform:translate(-50%,-100%)}.bottomCenter__DEEUV{bottom:.6rem;bottom:var(--zmage-toolbar-bottom-offset, .6rem);left:50%;left:var(--zmage-toolbar-left-offset, 50%);transform:translate(-50%,100%)}.leftCenter__8PTu3{top:50%;top:var(--zmage-toolbar-top-offset, 50%);left:.6rem;left:var(--zmage-toolbar-left-offset, .6rem);transform:translate(-100%,-50%)}.rightCenter__mHTFQ{top:50%;top:var(--zmage-toolbar-top-offset, 50%);right:.6rem;right:var(--zmage-toolbar-right-offset, .6rem);transform:translate(100%,-50%)}.topRight__bDRMJ.show__GPCB-,.topLeft__BodEu.show__GPCB-,.bottomRight__Hd0jy.show__GPCB-,.bottomLeft__762V9.show__GPCB-{opacity:.8;transform:translate(0)}.topCenter__jexvO.show__GPCB-,.bottomCenter__DEEUV.show__GPCB-{opacity:.8;transform:translate(-50%)}.leftCenter__8PTu3.show__GPCB-,.rightCenter__mHTFQ.show__GPCB-{opacity:.8;transform:translateY(-50%)}.controls__9U729 .pinButton__WM-eb{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .pinButton__WM-eb>svg{display:block;width:2rem;height:2rem}.controls__9U729 .pinButton__WM-eb>svg{width:1.5rem;height:1.5rem}.controls__9U729 .pinButton__WM-eb:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .pinButton__WM-eb:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotate__-FSm5{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotate__-FSm5>svg{display:block;width:2rem;height:2rem}.controls__9U729 .rotate__-FSm5>svg{width:1.5rem;height:1.5rem}.controls__9U729 .rotate__-FSm5:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .rotate__-FSm5:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotate__-FSm5 svg{transition:transform .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateLeft__xjHZr{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateLeft__xjHZr>svg{display:block;width:2rem;height:2rem}.controls__9U729 .rotateLeft__xjHZr>svg{width:1.5rem;height:1.5rem}.controls__9U729 .rotateLeft__xjHZr:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .rotateLeft__xjHZr:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotateLeft__xjHZr svg{transition:transform .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateLeft__xjHZr:hover svg{transform:rotate(-30deg)}.controls__9U729 .rotateRight__Q71ZR{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateRight__Q71ZR>svg{display:block;width:2rem;height:2rem}.controls__9U729 .rotateRight__Q71ZR>svg{width:1.5rem;height:1.5rem}.controls__9U729 .rotateRight__Q71ZR:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .rotateRight__Q71ZR:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .rotateRight__Q71ZR svg{transition:transform .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .rotateRight__Q71ZR:hover svg{transform:rotate(30deg)}.controls__9U729 .download__z6NFZ{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .download__z6NFZ>svg{display:block;width:2rem;height:2rem}.controls__9U729 .download__z6NFZ>svg{width:1.5rem;height:1.5rem}.controls__9U729 .download__z6NFZ:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .download__z6NFZ:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .download__z6NFZ svg{margin-top:-.06rem}.controls__9U729 .zoom__VWyU-{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .zoom__VWyU->svg{display:block;width:2rem;height:2rem}.controls__9U729 .zoom__VWyU->svg{width:1.5rem;height:1.5rem}.controls__9U729 .zoom__VWyU-:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .zoom__VWyU-:active{opacity:1!important;transform:scale(1)!important}.controls__9U729 .zoom__VWyU-.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.controls__9U729 .zoom__VWyU-.disabled__l7PPn:hover,.controls__9U729 .zoom__VWyU-.disabled__l7PPn:active{opacity:.35!important;transform:none!important}.controls__9U729 .zoom__VWyU-.shake__ul2tL{animation:zoomShake__eNalV .32s cubic-bezier(.6,0,.1,1)}.controls__9U729 .close__N7GMd{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.4em 0;width:2rem;height:2rem;transition:transform 175ms cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.controls__9U729 .close__N7GMd>svg{display:block;width:2rem;height:2rem}.controls__9U729 .close__N7GMd>svg{width:1.5rem;height:1.5rem}.controls__9U729 .close__N7GMd:hover{opacity:.8!important;transform:scale(1.1)!important}.controls__9U729 .close__N7GMd:active{opacity:1!important;transform:scale(1)!important}.sideButton__u3mXw{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;position:absolute;top:50%;padding:.4rem;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.sideButton__u3mXw>svg{display:block;width:2rem;height:2rem}.sideButton__u3mXw:hover{opacity:.8!important;transform:translate(0) translateY(-50%)!important}.sideButton__u3mXw:active{opacity:1!important}.sideButton__u3mXw.show__GPCB-{opacity:.8}.sideButton__u3mXw.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.sideButton__u3mXw.disabled__l7PPn:hover,.sideButton__u3mXw.disabled__l7PPn:active{opacity:.35!important}.flipLeft__OgnvQ{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;position:absolute;top:50%;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1);left:0;left:var(--zmage-flip-left-offset, 0);padding:.4rem .4rem .4rem .6rem;border-radius:0 .5em .5em 0;transform:translate(-100%) translateY(-50%)}.flipLeft__OgnvQ>svg{display:block;width:2rem;height:2rem}.flipLeft__OgnvQ:hover{opacity:.8!important;transform:translate(0) translateY(-50%)!important}.flipLeft__OgnvQ:active{opacity:1!important}.flipLeft__OgnvQ.show__GPCB-{opacity:.8}.flipLeft__OgnvQ.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.flipLeft__OgnvQ.disabled__l7PPn:hover,.flipLeft__OgnvQ.disabled__l7PPn:active{opacity:.35!important}.flipLeft__OgnvQ:active{transform:translate(-.2em) translateY(-50%)!important}.flipLeft__OgnvQ.show__GPCB-{opacity:.8;transform:translate(-.2em) translateY(-50%)}.flipLeft__OgnvQ.disabled__l7PPn:hover,.flipLeft__OgnvQ.disabled__l7PPn:active{transform:translate(-.2em) translateY(-50%)!important}.flipLeft__OgnvQ.detachedSideButton__SKxNE{border-radius:.5rem;padding-left:.4rem}.flipRight__wywuu{z-index:1000;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;position:absolute;top:50%;padding:.4rem .6rem .4rem .4rem;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1);right:0;right:var(--zmage-flip-right-offset, 0);border-radius:.5rem 0 0 .5rem;transform:translate(100%) translateY(-50%)}.flipRight__wywuu>svg{display:block;width:2rem;height:2rem}.flipRight__wywuu:hover{opacity:.8!important;transform:translate(0) translateY(-50%)!important}.flipRight__wywuu:active{opacity:1!important}.flipRight__wywuu.show__GPCB-{opacity:.8}.flipRight__wywuu.disabled__l7PPn{opacity:.35!important;cursor:not-allowed}.flipRight__wywuu.disabled__l7PPn:hover,.flipRight__wywuu.disabled__l7PPn:active{opacity:.35!important}.flipRight__wywuu:active{transform:translate(.2em) translateY(-50%)!important}.flipRight__wywuu.show__GPCB-{opacity:.8;transform:translate(.2em) translateY(-50%)}.flipRight__wywuu.disabled__l7PPn:hover,.flipRight__wywuu.disabled__l7PPn:active{transform:translate(.2em) translateY(-50%)!important}.flipRight__wywuu.detachedSideButton__SKxNE{border-radius:.5rem;padding-right:.4rem}.pages__5GsnL{box-sizing:border-box;display:flex;position:absolute;top:auto;top:var(--zmage-pagination-top-offset, auto);right:auto;right:var(--zmage-pagination-right-offset, auto);bottom:.6rem;bottom:var(--zmage-pagination-bottom-offset, .6rem);left:50%;left:var(--zmage-pagination-left-offset, 50%);z-index:110;opacity:0;border-radius:2rem;transform:translate(-50%,100px);transform:translate(var(--zmage-pagination-translate-x, -50%),100px);transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.pages__5GsnL.show__GPCB-{opacity:.8;transform:translate(-50%);transform:translate(var(--zmage-pagination-translate-x, -50%))}.pages__5GsnL.mobile__6jMYl{bottom:2rem;bottom:var(--zmage-pagination-bottom-offset, 2rem)}.pages__5GsnL .dot__kUakb{cursor:pointer;margin:.45rem .25rem;display:block;width:.6rem;height:.6rem;border-radius:1.2rem;background:#000;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),width .35s cubic-bezier(.6,0,.1,1)}.pages__5GsnL .dot__kUakb:first-of-type{margin-left:.6rem}.pages__5GsnL .dot__kUakb:last-of-type{margin-right:.6rem}.pages__5GsnL .blackDot__bhplt{cursor:pointer;margin:.45rem .25rem;display:block;width:.6rem;height:.6rem;border-radius:1.2rem;background:#000;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),width .35s cubic-bezier(.6,0,.1,1);cursor:auto;cursor:initial;width:1rem;background:currentcolor;box-shadow:0 0 0 1px #00000059,0 0 0 2px #ffffff73}.pages__5GsnL .blackDot__bhplt:first-of-type{margin-left:.6rem}.pages__5GsnL .blackDot__bhplt:last-of-type{margin-right:.6rem}.pages__5GsnL .whiteDot__P7lUz{cursor:pointer;margin:.45rem .25rem;display:block;width:.6rem;height:.6rem;border-radius:1.2rem;background:#000;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),width .35s cubic-bezier(.6,0,.1,1);background:#999}.pages__5GsnL .whiteDot__P7lUz:first-of-type{margin-left:.6rem}.pages__5GsnL .whiteDot__P7lUz:last-of-type{margin-right:.6rem}.pages__5GsnL .whiteDot__P7lUz:hover{opacity:.8!important;transform:scale(1.1)!important}.pages__5GsnL .whiteDot__P7lUz:active{opacity:1!important;transform:scale(1)!important}.caption__JgbQx{box-sizing:border-box;position:absolute;top:auto;top:var(--zmage-caption-top-offset, auto);right:auto;right:var(--zmage-caption-right-offset, auto);bottom:3rem;bottom:var(--zmage-caption-bottom-offset, 3rem);left:50%;left:var(--zmage-caption-left-offset, 50%);z-index:110;max-width:60vw;padding:.35rem .85rem;border-radius:1rem;opacity:0;text-align:center;font-size:.75rem;line-height:1.45;word-break:break-word;color:#fff;background:#0000008c;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);pointer-events:none;transform:translate(-50%,100px);transform:translate(var(--zmage-caption-translate-x, -50%),100px);transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.show__tlkZ3{opacity:1;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}.caption__JgbQx.mobile__5qSC9{bottom:4.5rem;bottom:var(--zmage-caption-bottom-offset, 4.5rem);max-width:80vw}.caption__JgbQx.switchFade__T69y8{animation:capFade__x70-f .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchCrossFade__X9cH8{animation:capCrossFade__7nIUY .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchSwipe__1UDK0{animation:capSwipe__4eDDl .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchZoom__27vZs{animation:capZoom__-hpdF .35s cubic-bezier(.6,0,.1,1)}.caption__JgbQx.switchBlur__DwX02{animation:capBlur__6kymE .35s cubic-bezier(.6,0,.1,1)}@keyframes capFade__x70-f{0%{opacity:0;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}to{opacity:1;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}}@keyframes capCrossFade__7nIUY{0%{opacity:0;transform:translate(calc(-50% + 24px));transform:translate(calc(var(--zmage-caption-translate-x, -50%) + 24px))}to{opacity:1;transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}}@keyframes capSwipe__4eDDl{0%{transform:translate(calc(-50% + 60vw));transform:translate(calc(var(--zmage-caption-translate-x, -50%) + 60vw))}to{transform:translate(-50%);transform:translate(var(--zmage-caption-translate-x, -50%))}}@keyframes capZoom__-hpdF{0%{opacity:0;transform:translate(-50%) scale(.92);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(.92)}to{opacity:1;transform:translate(-50%) scale(1);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(1)}}@keyframes capBlur__6kymE{0%{opacity:0;filter:blur(8px);transform:translate(-50%) scale(.985);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(.985)}to{opacity:1;filter:blur(0);transform:translate(-50%) scale(1);transform:translate(var(--zmage-caption-translate-x, -50%)) scale(1)}}.imageLayer__yjPf3{-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:transform .35s cubic-bezier(.6,0,.1,1),opacity .35s cubic-bezier(.6,0,.1,1),filter .35s cubic-bezier(.6,0,.1,1),clip-path .35s cubic-bezier(.6,0,.1,1),border-radius .35s cubic-bezier(.6,0,.1,1);position:absolute;left:50%;top:50%;will-change:transform,top,opacity,filter,clip-path,border-radius;max-width:none;max-height:none;width:auto;height:auto}.imageLayer__yjPf3.zooming__3mMU7{transition-timing-function:cubic-bezier(0,.1,.1,1);-ms-transition-duration:0ms}.imageLayer__yjPf3.invalidate__MJYkk{opacity:0!important;pointer-events:none}@keyframes zmageJumpFadeIn__SoglW{0%{opacity:0}to{opacity:1}}.jumpFadeIn__4wa75{animation:zmageJumpFadeIn__SoglW .35s cubic-bezier(.6,0,.1,1) both}.loadingContainer__-joiS{-webkit-user-select:none;-moz-user-select:none;user-select:none;position:absolute;left:50%;top:50%;opacity:0;transition:opacity cubic-bezier(.6,0,.1,1) 175ms}.loadingContainer__-joiS.show__-FZiR{opacity:1}.loadingContainer__-joiS .reload__bc5Ze{border:2px solid;border-radius:5px;font-size:1rem;padding:.5rem;cursor:pointer;outline:none;transform:translate(-50%,-50%)}.loadingContainer__-joiS .reload__bc5Ze:hover{opacity:.8}.loadingContainer__-joiS .reload__bc5Ze:hover svg{transform:rotate(30deg)}.loadingContainer__-joiS .reload__bc5Ze:active{opacity:1}.loadingContainer__-joiS .reload__bc5Ze svg{display:block;transition:transform .35s cubic-bezier(.6,0,.1,1)}.loadingContainer__-joiS .loading__I-J4i{width:24px;height:24px;transform:translate(-50%,-50%);animation:spin__VlJlO 1s linear infinite}@keyframes fadeIn__pJo4c{0%{opacity:0}50%{opacity:0}to{opacity:1}}@keyframes fadeOut__WgOXl{0%{opacity:1}50%{opacity:0}to{opacity:0}}@keyframes spin__VlJlO{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}:root{--rz-stylesheet-loaded: 1}.backgroundLayer__CGbNW{position:absolute;top:0;left:0;right:0;bottom:0;cursor:zoom-out;background-color:#fff;transition:opacity .2s;will-change:opacity;-webkit-tap-highlight-color:transparent} diff --git a/docs/assets/index-Do1OB0YD.js b/docs/assets/index-Do1OB0YD.js deleted file mode 100644 index af68b99..0000000 --- a/docs/assets/index-Do1OB0YD.js +++ /dev/null @@ -1,703 +0,0 @@ -function aE(e,a){for(var r=0;rs[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))s(l);new MutationObserver(l=>{for(const d of l)if(d.type==="childList")for(const u of d.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&s(u)}).observe(document,{childList:!0,subtree:!0});function r(l){const d={};return l.integrity&&(d.integrity=l.integrity),l.referrerPolicy&&(d.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?d.credentials="include":l.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function s(l){if(l.ep)return;l.ep=!0;const d=r(l);fetch(l.href,d)}})();function sx(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var vp={exports:{}},Zs={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Nb;function nE(){if(Nb)return Zs;Nb=1;var e=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function r(s,l,d){var u=null;if(d!==void 0&&(u=""+d),l.key!==void 0&&(u=""+l.key),"key"in l){d={};for(var m in l)m!=="key"&&(d[m]=l[m])}else d=l;return l=d.ref,{$$typeof:e,type:s,key:u,ref:l!==void 0?l:null,props:d}}return Zs.Fragment=a,Zs.jsx=r,Zs.jsxs=r,Zs}var zb;function rE(){return zb||(zb=1,vp.exports=nE()),vp.exports}var c=rE(),xp={exports:{}},ve={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Mb;function sE(){if(Mb)return ve;Mb=1;var e=Symbol.for("react.transitional.element"),a=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),u=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),S=Symbol.iterator;function T(N){return N===null||typeof N!="object"?null:(N=S&&N[S]||N["@@iterator"],typeof N=="function"?N:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},x=Object.assign,k={};function R(N,K,ee){this.props=N,this.context=K,this.refs=k,this.updater=ee||C}R.prototype.isReactComponent={},R.prototype.setState=function(N,K){if(typeof N!="object"&&typeof N!="function"&&N!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,N,K,"setState")},R.prototype.forceUpdate=function(N){this.updater.enqueueForceUpdate(this,N,"forceUpdate")};function j(){}j.prototype=R.prototype;function A(N,K,ee){this.props=N,this.context=K,this.refs=k,this.updater=ee||C}var M=A.prototype=new j;M.constructor=A,x(M,R.prototype),M.isPureReactComponent=!0;var q=Array.isArray;function P(){}var I={H:null,A:null,T:null,S:null},X=Object.prototype.hasOwnProperty;function ae(N,K,ee){var oe=ee.ref;return{$$typeof:e,type:N,key:K,ref:oe!==void 0?oe:null,props:ee}}function re(N,K){return ae(N.type,K,N.props)}function te(N){return typeof N=="object"&&N!==null&&N.$$typeof===e}function J(N){var K={"=":"=0",":":"=2"};return"$"+N.replace(/[=:]/g,function(ee){return K[ee]})}var pe=/\/+/g;function ne(N,K){return typeof N=="object"&&N!==null&&N.key!=null?J(""+N.key):K.toString(36)}function ue(N){switch(N.status){case"fulfilled":return N.value;case"rejected":throw N.reason;default:switch(typeof N.status=="string"?N.then(P,P):(N.status="pending",N.then(function(K){N.status==="pending"&&(N.status="fulfilled",N.value=K)},function(K){N.status==="pending"&&(N.status="rejected",N.reason=K)})),N.status){case"fulfilled":return N.value;case"rejected":throw N.reason}}throw N}function O(N,K,ee,oe,fe){var he=typeof N;(he==="undefined"||he==="boolean")&&(N=null);var ye=!1;if(N===null)ye=!0;else switch(he){case"bigint":case"string":case"number":ye=!0;break;case"object":switch(N.$$typeof){case e:case a:ye=!0;break;case y:return ye=N._init,O(ye(N._payload),K,ee,oe,fe)}}if(ye)return fe=fe(N),ye=oe===""?"."+ne(N,0):oe,q(fe)?(ee="",ye!=null&&(ee=ye.replace(pe,"$&/")+"/"),O(fe,K,ee,"",function(vt){return vt})):fe!=null&&(te(fe)&&(fe=re(fe,ee+(fe.key==null||N&&N.key===fe.key?"":(""+fe.key).replace(pe,"$&/")+"/")+ye)),K.push(fe)),1;ye=0;var Ke=oe===""?".":oe+":";if(q(N))for(var xe=0;xe>>1,se=O[Y];if(0>>1;Yl(ee,H))oel(fe,ee)?(O[Y]=fe,O[oe]=H,Y=oe):(O[Y]=ee,O[K]=H,Y=K);else if(oel(fe,H))O[Y]=fe,O[oe]=H,Y=oe;else break e}}return V}function l(O,V){var H=O.sortIndex-V.sortIndex;return H!==0?H:O.id-V.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;e.unstable_now=function(){return d.now()}}else{var u=Date,m=u.now();e.unstable_now=function(){return u.now()-m}}var h=[],g=[],y=1,b=null,S=3,T=!1,C=!1,x=!1,k=!1,R=typeof setTimeout=="function"?setTimeout:null,j=typeof clearTimeout=="function"?clearTimeout:null,A=typeof setImmediate<"u"?setImmediate:null;function M(O){for(var V=r(g);V!==null;){if(V.callback===null)s(g);else if(V.startTime<=O)s(g),V.sortIndex=V.expirationTime,a(h,V);else break;V=r(g)}}function q(O){if(x=!1,M(O),!C)if(r(h)!==null)C=!0,P||(P=!0,J());else{var V=r(g);V!==null&&ue(q,V.startTime-O)}}var P=!1,I=-1,X=5,ae=-1;function re(){return k?!0:!(e.unstable_now()-aeO&&re());){var Y=b.callback;if(typeof Y=="function"){b.callback=null,S=b.priorityLevel;var se=Y(b.expirationTime<=O);if(O=e.unstable_now(),typeof se=="function"){b.callback=se,M(O),V=!0;break t}b===r(h)&&s(h),M(O)}else s(h);b=r(h)}if(b!==null)V=!0;else{var N=r(g);N!==null&&ue(q,N.startTime-O),V=!1}}break e}finally{b=null,S=H,T=!1}V=void 0}}finally{V?J():P=!1}}}var J;if(typeof A=="function")J=function(){A(te)};else if(typeof MessageChannel<"u"){var pe=new MessageChannel,ne=pe.port2;pe.port1.onmessage=te,J=function(){ne.postMessage(null)}}else J=function(){R(te,0)};function ue(O,V){I=R(function(){O(e.unstable_now())},V)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(O){O.callback=null},e.unstable_forceFrameRate=function(O){0>O||125Y?(O.sortIndex=H,a(g,O),r(h)===null&&O===r(g)&&(x?(j(I),I=-1):x=!0,ue(q,H-Y))):(O.sortIndex=se,a(h,O),C||T||(C=!0,P||(P=!0,J()))),O},e.unstable_shouldYield=re,e.unstable_wrapCallback=function(O){var V=S;return function(){var H=S;S=V;try{return O.apply(this,arguments)}finally{S=H}}}})(Cp)),Cp}var Ob;function lE(){return Ob||(Ob=1,Sp.exports=iE()),Sp.exports}var kp={exports:{}},bt={};/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Lb;function cE(){if(Lb)return bt;Lb=1;var e=Tm();function a(h){var g="https://react.dev/errors/"+h;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(a){console.error(a)}}return e(),kp.exports=cE(),kp.exports}/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Pb;function dE(){if(Pb)return Ps;Pb=1;var e=lE(),a=Tm(),r=ix();function s(t){var o="https://react.dev/errors/"+t;if(1se||(t.current=Y[se],Y[se]=null,se--)}function ee(t,o){se++,Y[se]=t.current,t.current=o}var oe=N(null),fe=N(null),he=N(null),ye=N(null);function Ke(t,o){switch(ee(he,o),ee(fe,t),ee(oe,null),o.nodeType){case 9:case 11:t=(t=o.documentElement)&&(t=t.namespaceURI)?Jy(t):0;break;default:if(t=o.tagName,o=o.namespaceURI)o=Jy(o),t=eb(o,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}K(oe),ee(oe,t)}function xe(){K(oe),K(fe),K(he)}function vt(t){t.memoizedState!==null&&ee(ye,t);var o=oe.current,n=eb(o,t.type);o!==n&&(ee(fe,t),ee(oe,n))}function vo(t){fe.current===t&&(K(oe),K(fe)),ye.current===t&&(K(ye),Ds._currentValue=H)}var Oo,so;function Dt(t){if(Oo===void 0)try{throw Error()}catch(n){var o=n.stack.trim().match(/\n( *(at )?)/);Oo=o&&o[1]||"",so=-1)":-1p||z[i]!==Z[p]){var U=` -`+z[i].replace(" at new "," at ");return t.displayName&&U.includes("")&&(U=U.replace("",t.displayName)),U}while(1<=i&&0<=p);break}}}finally{ua=!1,Error.prepareStackTrace=n}return(n=t?t.displayName||t.name:"")?Dt(n):""}function Ur(t,o){switch(t.tag){case 26:case 27:case 5:return Dt(t.type);case 16:return Dt("Lazy");case 13:return t.child!==o&&o!==null?Dt("Suspense Fallback"):Dt("Suspense");case 19:return Dt("SuspenseList");case 0:case 15:return Xa(t.type,!1);case 11:return Xa(t.type.render,!1);case 1:return Xa(t.type,!0);case 31:return Dt("Activity");default:return""}}function Nn(t){try{var o="",n=null;do o+=Ur(t,n),n=t,t=t.return;while(t);return o}catch(i){return` -Error generating stack: `+i.message+` -`+i.stack}}var xo=Object.prototype.hasOwnProperty,xt=e.unstable_scheduleCallback,pa=e.unstable_cancelCallback,O1=e.unstable_shouldYield,L1=e.unstable_requestPaint,_t=e.unstable_now,Z1=e.unstable_getCurrentPriorityLevel,zf=e.unstable_ImmediatePriority,Mf=e.unstable_UserBlockingPriority,yi=e.unstable_NormalPriority,P1=e.unstable_LowPriority,Df=e.unstable_IdlePriority,B1=e.log,I1=e.unstable_setDisableYieldValue,Hr=null,Ot=null;function ma(t){if(typeof B1=="function"&&I1(t),Ot&&typeof Ot.setStrictMode=="function")try{Ot.setStrictMode(Hr,t)}catch{}}var Lt=Math.clz32?Math.clz32:K1,q1=Math.log,F1=Math.LN2;function K1(t){return t>>>=0,t===0?32:31-(q1(t)/F1|0)|0}var bi=256,vi=262144,xi=4194304;function Qa(t){var o=t&42;if(o!==0)return o;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&261888;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function wi(t,o,n){var i=t.pendingLanes;if(i===0)return 0;var p=0,f=t.suspendedLanes,w=t.pingedLanes;t=t.warmLanes;var E=i&134217727;return E!==0?(i=E&~f,i!==0?p=Qa(i):(w&=E,w!==0?p=Qa(w):n||(n=E&~t,n!==0&&(p=Qa(n))))):(E=i&~f,E!==0?p=Qa(E):w!==0?p=Qa(w):n||(n=i&~t,n!==0&&(p=Qa(n)))),p===0?0:o!==0&&o!==p&&(o&f)===0&&(f=p&-p,n=o&-o,f>=n||f===32&&(n&4194048)!==0)?o:p}function Gr(t,o){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&o)===0}function U1(t,o){switch(t){case 1:case 2:case 4:case 8:case 64:return o+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function _f(){var t=xi;return xi<<=1,(xi&62914560)===0&&(xi=4194304),t}function id(t){for(var o=[],n=0;31>n;n++)o.push(t);return o}function Vr(t,o){t.pendingLanes|=o,o!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function H1(t,o,n,i,p,f){var w=t.pendingLanes;t.pendingLanes=n,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=n,t.entangledLanes&=n,t.errorRecoveryDisabledLanes&=n,t.shellSuspendCounter=0;var E=t.entanglements,z=t.expirationTimes,Z=t.hiddenUpdates;for(n=w&~n;0"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var X1=/[\n"\\]/g;function $t(t){return t.replace(X1,function(o){return"\\"+o.charCodeAt(0).toString(16)+" "})}function md(t,o,n,i,p,f,w,E){t.name="",w!=null&&typeof w!="function"&&typeof w!="symbol"&&typeof w!="boolean"?t.type=w:t.removeAttribute("type"),o!=null?w==="number"?(o===0&&t.value===""||t.value!=o)&&(t.value=""+Wt(o)):t.value!==""+Wt(o)&&(t.value=""+Wt(o)):w!=="submit"&&w!=="reset"||t.removeAttribute("value"),o!=null?fd(t,w,Wt(o)):n!=null?fd(t,w,Wt(n)):i!=null&&t.removeAttribute("value"),p==null&&f!=null&&(t.defaultChecked=!!f),p!=null&&(t.checked=p&&typeof p!="function"&&typeof p!="symbol"),E!=null&&typeof E!="function"&&typeof E!="symbol"&&typeof E!="boolean"?t.name=""+Wt(E):t.removeAttribute("name")}function Vf(t,o,n,i,p,f,w,E){if(f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"&&(t.type=f),o!=null||n!=null){if(!(f!=="submit"&&f!=="reset"||o!=null)){pd(t);return}n=n!=null?""+Wt(n):"",o=o!=null?""+Wt(o):n,E||o===t.value||(t.value=o),t.defaultValue=o}i=i??p,i=typeof i!="function"&&typeof i!="symbol"&&!!i,t.checked=E?t.checked:!!i,t.defaultChecked=!!i,w!=null&&typeof w!="function"&&typeof w!="symbol"&&typeof w!="boolean"&&(t.name=w),pd(t)}function fd(t,o,n){o==="number"&&ki(t.ownerDocument)===t||t.defaultValue===""+n||(t.defaultValue=""+n)}function Ln(t,o,n,i){if(t=t.options,o){o={};for(var p=0;p"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vd=!1;if(Po)try{var Xr={};Object.defineProperty(Xr,"passive",{get:function(){vd=!0}}),window.addEventListener("test",Xr,Xr),window.removeEventListener("test",Xr,Xr)}catch{vd=!1}var ha=null,xd=null,Ei=null;function eh(){if(Ei)return Ei;var t,o=xd,n=o.length,i,p="value"in ha?ha.value:ha.textContent,f=p.length;for(t=0;t=es),sh=" ",ih=!1;function lh(t,o){switch(t){case"keyup":return Tk.indexOf(o.keyCode)!==-1;case"keydown":return o.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ch(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var In=!1;function Rk(t,o){switch(t){case"compositionend":return ch(o);case"keypress":return o.which!==32?null:(ih=!0,sh);case"textInput":return t=o.data,t===sh&&ih?null:t;default:return null}}function jk(t,o){if(In)return t==="compositionend"||!Td&&lh(t,o)?(t=eh(),Ei=xd=ha=null,In=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(o.ctrlKey||o.altKey||o.metaKey)||o.ctrlKey&&o.altKey){if(o.char&&1=o)return{node:n,offset:o-t};t=i}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=yh(n)}}function vh(t,o){return t&&o?t===o?!0:t&&t.nodeType===3?!1:o&&o.nodeType===3?vh(t,o.parentNode):"contains"in t?t.contains(o):t.compareDocumentPosition?!!(t.compareDocumentPosition(o)&16):!1:!1}function xh(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var o=ki(t.document);o instanceof t.HTMLIFrameElement;){try{var n=typeof o.contentWindow.location.href=="string"}catch{n=!1}if(n)t=o.contentWindow;else break;o=ki(t.document)}return o}function jd(t){var o=t&&t.nodeName&&t.nodeName.toLowerCase();return o&&(o==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||o==="textarea"||t.contentEditable==="true")}var Lk=Po&&"documentMode"in document&&11>=document.documentMode,qn=null,Ad=null,ns=null,Nd=!1;function wh(t,o,n){var i=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nd||qn==null||qn!==ki(i)||(i=qn,"selectionStart"in i&&jd(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),ns&&as(ns,i)||(ns=i,i=vl(Ad,"onSelect"),0>=w,p-=w,wo=1<<32-Lt(o)+p|n<Ce?(Ne=de,de=null):Ne=de.sibling;var Oe=B(_,de,L[Ce],G);if(Oe===null){de===null&&(de=Ne);break}t&&de&&Oe.alternate===null&&o(_,de),D=f(Oe,D,Ce),_e===null?me=Oe:_e.sibling=Oe,_e=Oe,de=Ne}if(Ce===L.length)return n(_,de),Me&&Io(_,Ce),me;if(de===null){for(;CeCe?(Ne=de,de=null):Ne=de.sibling;var Za=B(_,de,Oe.value,G);if(Za===null){de===null&&(de=Ne);break}t&&de&&Za.alternate===null&&o(_,de),D=f(Za,D,Ce),_e===null?me=Za:_e.sibling=Za,_e=Za,de=Ne}if(Oe.done)return n(_,de),Me&&Io(_,Ce),me;if(de===null){for(;!Oe.done;Ce++,Oe=L.next())Oe=W(_,Oe.value,G),Oe!==null&&(D=f(Oe,D,Ce),_e===null?me=Oe:_e.sibling=Oe,_e=Oe);return Me&&Io(_,Ce),me}for(de=i(de);!Oe.done;Ce++,Oe=L.next())Oe=F(de,_,Ce,Oe.value,G),Oe!==null&&(t&&Oe.alternate!==null&&de.delete(Oe.key===null?Ce:Oe.key),D=f(Oe,D,Ce),_e===null?me=Oe:_e.sibling=Oe,_e=Oe);return t&&de.forEach(function(oE){return o(_,oE)}),Me&&Io(_,Ce),me}function Fe(_,D,L,G){if(typeof L=="object"&&L!==null&&L.type===x&&L.key===null&&(L=L.props.children),typeof L=="object"&&L!==null){switch(L.$$typeof){case T:e:{for(var me=L.key;D!==null;){if(D.key===me){if(me=L.type,me===x){if(D.tag===7){n(_,D.sibling),G=p(D,L.props.children),G.return=_,_=G;break e}}else if(D.elementType===me||typeof me=="object"&&me!==null&&me.$$typeof===X&&dn(me)===D.type){n(_,D.sibling),G=p(D,L.props),ds(G,L),G.return=_,_=G;break e}n(_,D);break}else o(_,D);D=D.sibling}L.type===x?(G=nn(L.props.children,_.mode,G,L.key),G.return=_,_=G):(G=Li(L.type,L.key,L.props,null,_.mode,G),ds(G,L),G.return=_,_=G)}return w(_);case C:e:{for(me=L.key;D!==null;){if(D.key===me)if(D.tag===4&&D.stateNode.containerInfo===L.containerInfo&&D.stateNode.implementation===L.implementation){n(_,D.sibling),G=p(D,L.children||[]),G.return=_,_=G;break e}else{n(_,D);break}else o(_,D);D=D.sibling}G=Zd(L,_.mode,G),G.return=_,_=G}return w(_);case X:return L=dn(L),Fe(_,D,L,G)}if(ue(L))return le(_,D,L,G);if(J(L)){if(me=J(L),typeof me!="function")throw Error(s(150));return L=me.call(L),ge(_,D,L,G)}if(typeof L.then=="function")return Fe(_,D,Ki(L),G);if(L.$$typeof===A)return Fe(_,D,Bi(_,L),G);Ui(_,L)}return typeof L=="string"&&L!==""||typeof L=="number"||typeof L=="bigint"?(L=""+L,D!==null&&D.tag===6?(n(_,D.sibling),G=p(D,L),G.return=_,_=G):(n(_,D),G=Ld(L,_.mode,G),G.return=_,_=G),w(_)):n(_,D)}return function(_,D,L,G){try{cs=0;var me=Fe(_,D,L,G);return Qn=null,me}catch(de){if(de===Xn||de===qi)throw de;var _e=Pt(29,de,null,_.mode);return _e.lanes=G,_e.return=_,_e}finally{}}}var pn=Uh(!0),Hh=Uh(!1),xa=!1;function $d(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Yd(t,o){t=t.updateQueue,o.updateQueue===t&&(o.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function wa(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function Sa(t,o,n){var i=t.updateQueue;if(i===null)return null;if(i=i.shared,(Le&2)!==0){var p=i.pending;return p===null?o.next=o:(o.next=p.next,p.next=o),i.pending=o,o=Oi(t),jh(t,null,n),o}return _i(t,i,o,n),Oi(t)}function us(t,o,n){if(o=o.updateQueue,o!==null&&(o=o.shared,(n&4194048)!==0)){var i=o.lanes;i&=t.pendingLanes,n|=i,o.lanes=n,Lf(t,n)}}function Xd(t,o){var n=t.updateQueue,i=t.alternate;if(i!==null&&(i=i.updateQueue,n===i)){var p=null,f=null;if(n=n.firstBaseUpdate,n!==null){do{var w={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};f===null?p=f=w:f=f.next=w,n=n.next}while(n!==null);f===null?p=f=o:f=f.next=o}else p=f=o;n={baseState:i.baseState,firstBaseUpdate:p,lastBaseUpdate:f,shared:i.shared,callbacks:i.callbacks},t.updateQueue=n;return}t=n.lastBaseUpdate,t===null?n.firstBaseUpdate=o:t.next=o,n.lastBaseUpdate=o}var Qd=!1;function ps(){if(Qd){var t=Yn;if(t!==null)throw t}}function ms(t,o,n,i){Qd=!1;var p=t.updateQueue;xa=!1;var f=p.firstBaseUpdate,w=p.lastBaseUpdate,E=p.shared.pending;if(E!==null){p.shared.pending=null;var z=E,Z=z.next;z.next=null,w===null?f=Z:w.next=Z,w=z;var U=t.alternate;U!==null&&(U=U.updateQueue,E=U.lastBaseUpdate,E!==w&&(E===null?U.firstBaseUpdate=Z:E.next=Z,U.lastBaseUpdate=z))}if(f!==null){var W=p.baseState;w=0,U=Z=z=null,E=f;do{var B=E.lane&-536870913,F=B!==E.lane;if(F?(Ae&B)===B:(i&B)===B){B!==0&&B===$n&&(Qd=!0),U!==null&&(U=U.next={lane:0,tag:E.tag,payload:E.payload,callback:null,next:null});e:{var le=t,ge=E;B=o;var Fe=n;switch(ge.tag){case 1:if(le=ge.payload,typeof le=="function"){W=le.call(Fe,W,B);break e}W=le;break e;case 3:le.flags=le.flags&-65537|128;case 0:if(le=ge.payload,B=typeof le=="function"?le.call(Fe,W,B):le,B==null)break e;W=b({},W,B);break e;case 2:xa=!0}}B=E.callback,B!==null&&(t.flags|=64,F&&(t.flags|=8192),F=p.callbacks,F===null?p.callbacks=[B]:F.push(B))}else F={lane:B,tag:E.tag,payload:E.payload,callback:E.callback,next:null},U===null?(Z=U=F,z=W):U=U.next=F,w|=B;if(E=E.next,E===null){if(E=p.shared.pending,E===null)break;F=E,E=F.next,F.next=null,p.lastBaseUpdate=F,p.shared.pending=null}}while(!0);U===null&&(z=W),p.baseState=z,p.firstBaseUpdate=Z,p.lastBaseUpdate=U,f===null&&(p.shared.lanes=0),Ra|=w,t.lanes=w,t.memoizedState=W}}function Gh(t,o){if(typeof t!="function")throw Error(s(191,t));t.call(o)}function Vh(t,o){var n=t.callbacks;if(n!==null)for(t.callbacks=null,t=0;tf?f:8;var w=O.T,E={};O.T=E,yu(t,!1,o,n);try{var z=p(),Z=O.S;if(Z!==null&&Z(E,z),z!==null&&typeof z=="object"&&typeof z.then=="function"){var U=Hk(z,i);gs(t,o,U,Kt(t))}else gs(t,o,i,Kt(t))}catch(W){gs(t,o,{then:function(){},status:"rejected",reason:W},Kt())}finally{V.p=f,w!==null&&E.types!==null&&(w.types=E.types),O.T=w}}function Xk(){}function hu(t,o,n,i){if(t.tag!==5)throw Error(s(476));var p=Tg(t).queue;kg(t,p,o,H,n===null?Xk:function(){return Eg(t),n(i)})}function Tg(t){var o=t.memoizedState;if(o!==null)return o;o={memoizedState:H,baseState:H,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Uo,lastRenderedState:H},next:null};var n={};return o.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Uo,lastRenderedState:n},next:null},t.memoizedState=o,t=t.alternate,t!==null&&(t.memoizedState=o),o}function Eg(t){var o=Tg(t);o.next===null&&(o=t.alternate.memoizedState),gs(t,o.next.queue,{},Kt())}function gu(){return ht(Ds)}function Rg(){return et().memoizedState}function jg(){return et().memoizedState}function Qk(t){for(var o=t.return;o!==null;){switch(o.tag){case 24:case 3:var n=Kt();t=wa(n);var i=Sa(o,t,n);i!==null&&(zt(i,o,n),us(i,o,n)),o={cache:Hd()},t.payload=o;return}o=o.return}}function Jk(t,o,n){var i=Kt();n={lane:i,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},el(t)?Ng(o,n):(n=_d(t,o,n,i),n!==null&&(zt(n,t,i),zg(n,o,i)))}function Ag(t,o,n){var i=Kt();gs(t,o,n,i)}function gs(t,o,n,i){var p={lane:i,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(el(t))Ng(o,p);else{var f=t.alternate;if(t.lanes===0&&(f===null||f.lanes===0)&&(f=o.lastRenderedReducer,f!==null))try{var w=o.lastRenderedState,E=f(w,n);if(p.hasEagerState=!0,p.eagerState=E,Zt(E,w))return _i(t,o,p,0),Ue===null&&Di(),!1}catch{}finally{}if(n=_d(t,o,p,i),n!==null)return zt(n,t,i),zg(n,o,i),!0}return!1}function yu(t,o,n,i){if(i={lane:2,revertLane:$u(),gesture:null,action:i,hasEagerState:!1,eagerState:null,next:null},el(t)){if(o)throw Error(s(479))}else o=_d(t,n,i,2),o!==null&&zt(o,t,2)}function el(t){var o=t.alternate;return t===we||o!==null&&o===we}function Ng(t,o){er=Vi=!0;var n=t.pending;n===null?o.next=o:(o.next=n.next,n.next=o),t.pending=o}function zg(t,o,n){if((n&4194048)!==0){var i=o.lanes;i&=t.pendingLanes,n|=i,o.lanes=n,Lf(t,n)}}var ys={readContext:ht,use:Yi,useCallback:$e,useContext:$e,useEffect:$e,useImperativeHandle:$e,useLayoutEffect:$e,useInsertionEffect:$e,useMemo:$e,useReducer:$e,useRef:$e,useState:$e,useDebugValue:$e,useDeferredValue:$e,useTransition:$e,useSyncExternalStore:$e,useId:$e,useHostTransitionStatus:$e,useFormState:$e,useActionState:$e,useOptimistic:$e,useMemoCache:$e,useCacheRefresh:$e};ys.useEffectEvent=$e;var Mg={readContext:ht,use:Yi,useCallback:function(t,o){return wt().memoizedState=[t,o===void 0?null:o],t},useContext:ht,useEffect:hg,useImperativeHandle:function(t,o,n){n=n!=null?n.concat([t]):null,Qi(4194308,4,vg.bind(null,o,t),n)},useLayoutEffect:function(t,o){return Qi(4194308,4,t,o)},useInsertionEffect:function(t,o){Qi(4,2,t,o)},useMemo:function(t,o){var n=wt();o=o===void 0?null:o;var i=t();if(mn){ma(!0);try{t()}finally{ma(!1)}}return n.memoizedState=[i,o],i},useReducer:function(t,o,n){var i=wt();if(n!==void 0){var p=n(o);if(mn){ma(!0);try{n(o)}finally{ma(!1)}}}else p=o;return i.memoizedState=i.baseState=p,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:p},i.queue=t,t=t.dispatch=Jk.bind(null,we,t),[i.memoizedState,t]},useRef:function(t){var o=wt();return t={current:t},o.memoizedState=t},useState:function(t){t=du(t);var o=t.queue,n=Ag.bind(null,we,o);return o.dispatch=n,[t.memoizedState,n]},useDebugValue:mu,useDeferredValue:function(t,o){var n=wt();return fu(n,t,o)},useTransition:function(){var t=du(!1);return t=kg.bind(null,we,t.queue,!0,!1),wt().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,o,n){var i=we,p=wt();if(Me){if(n===void 0)throw Error(s(407));n=n()}else{if(n=o(),Ue===null)throw Error(s(349));(Ae&127)!==0||Jh(i,o,n)}p.memoizedState=n;var f={value:n,getSnapshot:o};return p.queue=f,hg(tg.bind(null,i,f,t),[t]),i.flags|=2048,or(9,{destroy:void 0},eg.bind(null,i,f,n,o),null),n},useId:function(){var t=wt(),o=Ue.identifierPrefix;if(Me){var n=So,i=wo;n=(i&~(1<<32-Lt(i)-1)).toString(32)+n,o="_"+o+"R_"+n,n=Wi++,0<\/script>",f=f.removeChild(f.firstChild);break;case"select":f=typeof i.is=="string"?w.createElement("select",{is:i.is}):w.createElement("select"),i.multiple?f.multiple=!0:i.size&&(f.size=i.size);break;default:f=typeof i.is=="string"?w.createElement(p,{is:i.is}):w.createElement(p)}}f[mt]=o,f[Tt]=i;e:for(w=o.child;w!==null;){if(w.tag===5||w.tag===6)f.appendChild(w.stateNode);else if(w.tag!==4&&w.tag!==27&&w.child!==null){w.child.return=w,w=w.child;continue}if(w===o)break e;for(;w.sibling===null;){if(w.return===null||w.return===o)break e;w=w.return}w.sibling.return=w.return,w=w.sibling}o.stateNode=f;e:switch(yt(f,p,i),p){case"button":case"input":case"select":case"textarea":i=!!i.autoFocus;break e;case"img":i=!0;break e;default:i=!1}i&&Go(o)}}return Ge(o),zu(o,o.type,t===null?null:t.memoizedProps,o.pendingProps,n),null;case 6:if(t&&o.stateNode!=null)t.memoizedProps!==i&&Go(o);else{if(typeof i!="string"&&o.stateNode===null)throw Error(s(166));if(t=he.current,Vn(o)){if(t=o.stateNode,n=o.memoizedProps,i=null,p=ft,p!==null)switch(p.tag){case 27:case 5:i=p.memoizedProps}t[mt]=o,t=!!(t.nodeValue===n||i!==null&&i.suppressHydrationWarning===!0||Xy(t.nodeValue,n)),t||ba(o,!0)}else t=xl(t).createTextNode(i),t[mt]=o,o.stateNode=t}return Ge(o),null;case 31:if(n=o.memoizedState,t===null||t.memoizedState!==null){if(i=Vn(o),n!==null){if(t===null){if(!i)throw Error(s(318));if(t=o.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(s(557));t[mt]=o}else rn(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;Ge(o),t=!1}else n=qd(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),t=!0;if(!t)return o.flags&256?(It(o),o):(It(o),null);if((o.flags&128)!==0)throw Error(s(558))}return Ge(o),null;case 13:if(i=o.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(p=Vn(o),i!==null&&i.dehydrated!==null){if(t===null){if(!p)throw Error(s(318));if(p=o.memoizedState,p=p!==null?p.dehydrated:null,!p)throw Error(s(317));p[mt]=o}else rn(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;Ge(o),p=!1}else p=qd(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=p),p=!0;if(!p)return o.flags&256?(It(o),o):(It(o),null)}return It(o),(o.flags&128)!==0?(o.lanes=n,o):(n=i!==null,t=t!==null&&t.memoizedState!==null,n&&(i=o.child,p=null,i.alternate!==null&&i.alternate.memoizedState!==null&&i.alternate.memoizedState.cachePool!==null&&(p=i.alternate.memoizedState.cachePool.pool),f=null,i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(f=i.memoizedState.cachePool.pool),f!==p&&(i.flags|=2048)),n!==t&&n&&(o.child.flags|=8192),rl(o,o.updateQueue),Ge(o),null);case 4:return xe(),t===null&&Ju(o.stateNode.containerInfo),Ge(o),null;case 10:return Fo(o.type),Ge(o),null;case 19:if(K(Je),i=o.memoizedState,i===null)return Ge(o),null;if(p=(o.flags&128)!==0,f=i.rendering,f===null)if(p)vs(i,!1);else{if(Ye!==0||t!==null&&(t.flags&128)!==0)for(t=o.child;t!==null;){if(f=Gi(t),f!==null){for(o.flags|=128,vs(i,!1),t=f.updateQueue,o.updateQueue=t,rl(o,t),o.subtreeFlags=0,t=n,n=o.child;n!==null;)Ah(n,t),n=n.sibling;return ee(Je,Je.current&1|2),Me&&Io(o,i.treeForkCount),o.child}t=t.sibling}i.tail!==null&&_t()>dl&&(o.flags|=128,p=!0,vs(i,!1),o.lanes=4194304)}else{if(!p)if(t=Gi(f),t!==null){if(o.flags|=128,p=!0,t=t.updateQueue,o.updateQueue=t,rl(o,t),vs(i,!0),i.tail===null&&i.tailMode==="hidden"&&!f.alternate&&!Me)return Ge(o),null}else 2*_t()-i.renderingStartTime>dl&&n!==536870912&&(o.flags|=128,p=!0,vs(i,!1),o.lanes=4194304);i.isBackwards?(f.sibling=o.child,o.child=f):(t=i.last,t!==null?t.sibling=f:o.child=f,i.last=f)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=_t(),t.sibling=null,n=Je.current,ee(Je,p?n&1|2:n&1),Me&&Io(o,i.treeForkCount),t):(Ge(o),null);case 22:case 23:return It(o),eu(),i=o.memoizedState!==null,t!==null?t.memoizedState!==null!==i&&(o.flags|=8192):i&&(o.flags|=8192),i?(n&536870912)!==0&&(o.flags&128)===0&&(Ge(o),o.subtreeFlags&6&&(o.flags|=8192)):Ge(o),n=o.updateQueue,n!==null&&rl(o,n.retryQueue),n=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(n=t.memoizedState.cachePool.pool),i=null,o.memoizedState!==null&&o.memoizedState.cachePool!==null&&(i=o.memoizedState.cachePool.pool),i!==n&&(o.flags|=2048),t!==null&&K(cn),null;case 24:return n=null,t!==null&&(n=t.memoizedState.cache),o.memoizedState.cache!==n&&(o.flags|=2048),Fo(tt),Ge(o),null;case 25:return null;case 30:return null}throw Error(s(156,o.tag))}function nT(t,o){switch(Bd(o),o.tag){case 1:return t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 3:return Fo(tt),xe(),t=o.flags,(t&65536)!==0&&(t&128)===0?(o.flags=t&-65537|128,o):null;case 26:case 27:case 5:return vo(o),null;case 31:if(o.memoizedState!==null){if(It(o),o.alternate===null)throw Error(s(340));rn()}return t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 13:if(It(o),t=o.memoizedState,t!==null&&t.dehydrated!==null){if(o.alternate===null)throw Error(s(340));rn()}return t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 19:return K(Je),null;case 4:return xe(),null;case 10:return Fo(o.type),null;case 22:case 23:return It(o),eu(),t!==null&&K(cn),t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 24:return Fo(tt),null;case 25:return null;default:return null}}function oy(t,o){switch(Bd(o),o.tag){case 3:Fo(tt),xe();break;case 26:case 27:case 5:vo(o);break;case 4:xe();break;case 31:o.memoizedState!==null&&It(o);break;case 13:It(o);break;case 19:K(Je);break;case 10:Fo(o.type);break;case 22:case 23:It(o),eu(),t!==null&&K(cn);break;case 24:Fo(tt)}}function xs(t,o){try{var n=o.updateQueue,i=n!==null?n.lastEffect:null;if(i!==null){var p=i.next;n=p;do{if((n.tag&t)===t){i=void 0;var f=n.create,w=n.inst;i=f(),w.destroy=i}n=n.next}while(n!==p)}}catch(E){Be(o,o.return,E)}}function Ta(t,o,n){try{var i=o.updateQueue,p=i!==null?i.lastEffect:null;if(p!==null){var f=p.next;i=f;do{if((i.tag&t)===t){var w=i.inst,E=w.destroy;if(E!==void 0){w.destroy=void 0,p=o;var z=n,Z=E;try{Z()}catch(U){Be(p,z,U)}}}i=i.next}while(i!==f)}}catch(U){Be(o,o.return,U)}}function ay(t){var o=t.updateQueue;if(o!==null){var n=t.stateNode;try{Vh(o,n)}catch(i){Be(t,t.return,i)}}}function ny(t,o,n){n.props=fn(t.type,t.memoizedProps),n.state=t.memoizedState;try{n.componentWillUnmount()}catch(i){Be(t,o,i)}}function ws(t,o){try{var n=t.ref;if(n!==null){switch(t.tag){case 26:case 27:case 5:var i=t.stateNode;break;case 30:i=t.stateNode;break;default:i=t.stateNode}typeof n=="function"?t.refCleanup=n(i):n.current=i}}catch(p){Be(t,o,p)}}function Co(t,o){var n=t.ref,i=t.refCleanup;if(n!==null)if(typeof i=="function")try{i()}catch(p){Be(t,o,p)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(p){Be(t,o,p)}else n.current=null}function ry(t){var o=t.type,n=t.memoizedProps,i=t.stateNode;try{e:switch(o){case"button":case"input":case"select":case"textarea":n.autoFocus&&i.focus();break e;case"img":n.src?i.src=n.src:n.srcSet&&(i.srcset=n.srcSet)}}catch(p){Be(t,t.return,p)}}function Mu(t,o,n){try{var i=t.stateNode;ET(i,t.type,n,o),i[Tt]=o}catch(p){Be(t,t.return,p)}}function sy(t){return t.tag===5||t.tag===3||t.tag===26||t.tag===27&&Ma(t.type)||t.tag===4}function Du(t){e:for(;;){for(;t.sibling===null;){if(t.return===null||sy(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.tag===27&&Ma(t.type)||t.flags&2||t.child===null||t.tag===4)continue e;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function _u(t,o,n){var i=t.tag;if(i===5||i===6)t=t.stateNode,o?(n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n).insertBefore(t,o):(o=n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n,o.appendChild(t),n=n._reactRootContainer,n!=null||o.onclick!==null||(o.onclick=Zo));else if(i!==4&&(i===27&&Ma(t.type)&&(n=t.stateNode,o=null),t=t.child,t!==null))for(_u(t,o,n),t=t.sibling;t!==null;)_u(t,o,n),t=t.sibling}function sl(t,o,n){var i=t.tag;if(i===5||i===6)t=t.stateNode,o?n.insertBefore(t,o):n.appendChild(t);else if(i!==4&&(i===27&&Ma(t.type)&&(n=t.stateNode),t=t.child,t!==null))for(sl(t,o,n),t=t.sibling;t!==null;)sl(t,o,n),t=t.sibling}function iy(t){var o=t.stateNode,n=t.memoizedProps;try{for(var i=t.type,p=o.attributes;p.length;)o.removeAttributeNode(p[0]);yt(o,i,n),o[mt]=t,o[Tt]=n}catch(f){Be(t,t.return,f)}}var Vo=!1,nt=!1,Ou=!1,ly=typeof WeakSet=="function"?WeakSet:Set,ct=null;function rT(t,o){if(t=t.containerInfo,op=Rl,t=xh(t),jd(t)){if("selectionStart"in t)var n={start:t.selectionStart,end:t.selectionEnd};else e:{n=(n=t.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var p=i.anchorOffset,f=i.focusNode;i=i.focusOffset;try{n.nodeType,f.nodeType}catch{n=null;break e}var w=0,E=-1,z=-1,Z=0,U=0,W=t,B=null;t:for(;;){for(var F;W!==n||p!==0&&W.nodeType!==3||(E=w+p),W!==f||i!==0&&W.nodeType!==3||(z=w+i),W.nodeType===3&&(w+=W.nodeValue.length),(F=W.firstChild)!==null;)B=W,W=F;for(;;){if(W===t)break t;if(B===n&&++Z===p&&(E=w),B===f&&++U===i&&(z=w),(F=W.nextSibling)!==null)break;W=B,B=W.parentNode}W=F}n=E===-1||z===-1?null:{start:E,end:z}}else n=null}n=n||{start:0,end:0}}else n=null;for(ap={focusedElem:t,selectionRange:n},Rl=!1,ct=o;ct!==null;)if(o=ct,t=o.child,(o.subtreeFlags&1028)!==0&&t!==null)t.return=o,ct=t;else for(;ct!==null;){switch(o=ct,f=o.alternate,t=o.flags,o.tag){case 0:if((t&4)!==0&&(t=o.updateQueue,t=t!==null?t.events:null,t!==null))for(n=0;n title"))),yt(f,i,n),f[mt]=t,lt(f),i=f;break e;case"link":var w=fb("link","href",p).get(i+(n.href||""));if(w){for(var E=0;EFe&&(w=Fe,Fe=ge,ge=w);var _=bh(E,ge),D=bh(E,Fe);if(_&&D&&(F.rangeCount!==1||F.anchorNode!==_.node||F.anchorOffset!==_.offset||F.focusNode!==D.node||F.focusOffset!==D.offset)){var L=W.createRange();L.setStart(_.node,_.offset),F.removeAllRanges(),ge>Fe?(F.addRange(L),F.extend(D.node,D.offset)):(L.setEnd(D.node,D.offset),F.addRange(L))}}}}for(W=[],F=E;F=F.parentNode;)F.nodeType===1&&W.push({element:F,left:F.scrollLeft,top:F.scrollTop});for(typeof E.focus=="function"&&E.focus(),E=0;En?32:n,O.T=null,n=Fu,Fu=null;var f=Aa,w=Qo;if(rt=0,ir=Aa=null,Qo=0,(Le&6)!==0)throw Error(s(331));var E=Le;if(Le|=4,vy(f.current),gy(f,f.current,w,n),Le=E,Rs(0,!1),Ot&&typeof Ot.onPostCommitFiberRoot=="function")try{Ot.onPostCommitFiberRoot(Hr,f)}catch{}return!0}finally{V.p=p,O.T=i,Zy(t,o)}}function By(t,o,n){o=Xt(n,o),o=wu(t.stateNode,o,2),t=Sa(t,o,2),t!==null&&(Vr(t,2),ko(t))}function Be(t,o,n){if(t.tag===3)By(t,t,n);else for(;o!==null;){if(o.tag===3){By(o,t,n);break}else if(o.tag===1){var i=o.stateNode;if(typeof o.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(ja===null||!ja.has(i))){t=Xt(n,t),n=Ig(2),i=Sa(o,n,2),i!==null&&(qg(n,i,o,t),Vr(i,2),ko(i));break}}o=o.return}}function Gu(t,o,n){var i=t.pingCache;if(i===null){i=t.pingCache=new lT;var p=new Set;i.set(o,p)}else p=i.get(o),p===void 0&&(p=new Set,i.set(o,p));p.has(n)||(Pu=!0,p.add(n),t=mT.bind(null,t,o,n),o.then(t,t))}function mT(t,o,n){var i=t.pingCache;i!==null&&i.delete(o),t.pingedLanes|=t.suspendedLanes&n,t.warmLanes&=~n,Ue===t&&(Ae&n)===n&&(Ye===4||Ye===3&&(Ae&62914560)===Ae&&300>_t()-cl?(Le&2)===0&&lr(t,0):Bu|=n,sr===Ae&&(sr=0)),ko(t)}function Iy(t,o){o===0&&(o=_f()),t=an(t,o),t!==null&&(Vr(t,o),ko(t))}function fT(t){var o=t.memoizedState,n=0;o!==null&&(n=o.retryLane),Iy(t,n)}function hT(t,o){var n=0;switch(t.tag){case 31:case 13:var i=t.stateNode,p=t.memoizedState;p!==null&&(n=p.retryLane);break;case 19:i=t.stateNode;break;case 22:i=t.stateNode._retryCache;break;default:throw Error(s(314))}i!==null&&i.delete(o),Iy(t,n)}function gT(t,o){return xt(t,o)}var gl=null,dr=null,Vu=!1,yl=!1,Wu=!1,za=0;function ko(t){t!==dr&&t.next===null&&(dr===null?gl=dr=t:dr=dr.next=t),yl=!0,Vu||(Vu=!0,bT())}function Rs(t,o){if(!Wu&&yl){Wu=!0;do for(var n=!1,i=gl;i!==null;){if(t!==0){var p=i.pendingLanes;if(p===0)var f=0;else{var w=i.suspendedLanes,E=i.pingedLanes;f=(1<<31-Lt(42|t)+1)-1,f&=p&~(w&~E),f=f&201326741?f&201326741|1:f?f|2:0}f!==0&&(n=!0,Uy(i,f))}else f=Ae,f=wi(i,i===Ue?f:0,i.cancelPendingCommit!==null||i.timeoutHandle!==-1),(f&3)===0||Gr(i,f)||(n=!0,Uy(i,f));i=i.next}while(n);Wu=!1}}function yT(){qy()}function qy(){yl=Vu=!1;var t=0;za!==0&&jT()&&(t=za);for(var o=_t(),n=null,i=gl;i!==null;){var p=i.next,f=Fy(i,o);f===0?(i.next=null,n===null?gl=p:n.next=p,p===null&&(dr=n)):(n=i,(t!==0||(f&3)!==0)&&(yl=!0)),i=p}rt!==0&&rt!==5||Rs(t),za!==0&&(za=0)}function Fy(t,o){for(var n=t.suspendedLanes,i=t.pingedLanes,p=t.expirationTimes,f=t.pendingLanes&-62914561;0E)break;var U=z.transferSize,W=z.initiatorType;U&&Qy(W)&&(z=z.responseEnd,w+=U*(z"u"?null:document;function db(t,o,n){var i=ur;if(i&&typeof o=="string"&&o){var p=$t(o);p='link[rel="'+t+'"][href="'+p+'"]',typeof n=="string"&&(p+='[crossorigin="'+n+'"]'),cb.has(p)||(cb.add(p),t={rel:t,crossOrigin:n,href:o},i.querySelector(p)===null&&(o=i.createElement("link"),yt(o,"link",t),lt(o),i.head.appendChild(o)))}}function ZT(t){Jo.D(t),db("dns-prefetch",t,null)}function PT(t,o){Jo.C(t,o),db("preconnect",t,o)}function BT(t,o,n){Jo.L(t,o,n);var i=ur;if(i&&t&&o){var p='link[rel="preload"][as="'+$t(o)+'"]';o==="image"&&n&&n.imageSrcSet?(p+='[imagesrcset="'+$t(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(p+='[imagesizes="'+$t(n.imageSizes)+'"]')):p+='[href="'+$t(t)+'"]';var f=p;switch(o){case"style":f=pr(t);break;case"script":f=mr(t)}ao.has(f)||(t=b({rel:"preload",href:o==="image"&&n&&n.imageSrcSet?void 0:t,as:o},n),ao.set(f,t),i.querySelector(p)!==null||o==="style"&&i.querySelector(zs(f))||o==="script"&&i.querySelector(Ms(f))||(o=i.createElement("link"),yt(o,"link",t),lt(o),i.head.appendChild(o)))}}function IT(t,o){Jo.m(t,o);var n=ur;if(n&&t){var i=o&&typeof o.as=="string"?o.as:"script",p='link[rel="modulepreload"][as="'+$t(i)+'"][href="'+$t(t)+'"]',f=p;switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":f=mr(t)}if(!ao.has(f)&&(t=b({rel:"modulepreload",href:t},o),ao.set(f,t),n.querySelector(p)===null)){switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Ms(f)))return}i=n.createElement("link"),yt(i,"link",t),lt(i),n.head.appendChild(i)}}}function qT(t,o,n){Jo.S(t,o,n);var i=ur;if(i&&t){var p=_n(i).hoistableStyles,f=pr(t);o=o||"default";var w=p.get(f);if(!w){var E={loading:0,preload:null};if(w=i.querySelector(zs(f)))E.loading=5;else{t=b({rel:"stylesheet",href:t,"data-precedence":o},n),(n=ao.get(f))&&dp(t,n);var z=w=i.createElement("link");lt(z),yt(z,"link",t),z._p=new Promise(function(Z,U){z.onload=Z,z.onerror=U}),z.addEventListener("load",function(){E.loading|=1}),z.addEventListener("error",function(){E.loading|=2}),E.loading|=4,Sl(w,o,i)}w={type:"stylesheet",instance:w,count:1,state:E},p.set(f,w)}}}function FT(t,o){Jo.X(t,o);var n=ur;if(n&&t){var i=_n(n).hoistableScripts,p=mr(t),f=i.get(p);f||(f=n.querySelector(Ms(p)),f||(t=b({src:t,async:!0},o),(o=ao.get(p))&&up(t,o),f=n.createElement("script"),lt(f),yt(f,"link",t),n.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},i.set(p,f))}}function KT(t,o){Jo.M(t,o);var n=ur;if(n&&t){var i=_n(n).hoistableScripts,p=mr(t),f=i.get(p);f||(f=n.querySelector(Ms(p)),f||(t=b({src:t,async:!0,type:"module"},o),(o=ao.get(p))&&up(t,o),f=n.createElement("script"),lt(f),yt(f,"link",t),n.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},i.set(p,f))}}function ub(t,o,n,i){var p=(p=he.current)?wl(p):null;if(!p)throw Error(s(446));switch(t){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(o=pr(n.href),n=_n(p).hoistableStyles,i=n.get(o),i||(i={type:"style",instance:null,count:0,state:null},n.set(o,i)),i):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){t=pr(n.href);var f=_n(p).hoistableStyles,w=f.get(t);if(w||(p=p.ownerDocument||p,w={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},f.set(t,w),(f=p.querySelector(zs(t)))&&!f._p&&(w.instance=f,w.state.loading=5),ao.has(t)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},ao.set(t,n),f||UT(p,t,n,w.state))),o&&i===null)throw Error(s(528,""));return w}if(o&&i!==null)throw Error(s(529,""));return null;case"script":return o=n.async,n=n.src,typeof n=="string"&&o&&typeof o!="function"&&typeof o!="symbol"?(o=mr(n),n=_n(p).hoistableScripts,i=n.get(o),i||(i={type:"script",instance:null,count:0,state:null},n.set(o,i)),i):{type:"void",instance:null,count:0,state:null};default:throw Error(s(444,t))}}function pr(t){return'href="'+$t(t)+'"'}function zs(t){return'link[rel="stylesheet"]['+t+"]"}function pb(t){return b({},t,{"data-precedence":t.precedence,precedence:null})}function UT(t,o,n,i){t.querySelector('link[rel="preload"][as="style"]['+o+"]")?i.loading=1:(o=t.createElement("link"),i.preload=o,o.addEventListener("load",function(){return i.loading|=1}),o.addEventListener("error",function(){return i.loading|=2}),yt(o,"link",n),lt(o),t.head.appendChild(o))}function mr(t){return'[src="'+$t(t)+'"]'}function Ms(t){return"script[async]"+t}function mb(t,o,n){if(o.count++,o.instance===null)switch(o.type){case"style":var i=t.querySelector('style[data-href~="'+$t(n.href)+'"]');if(i)return o.instance=i,lt(i),i;var p=b({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return i=(t.ownerDocument||t).createElement("style"),lt(i),yt(i,"style",p),Sl(i,n.precedence,t),o.instance=i;case"stylesheet":p=pr(n.href);var f=t.querySelector(zs(p));if(f)return o.state.loading|=4,o.instance=f,lt(f),f;i=pb(n),(p=ao.get(p))&&dp(i,p),f=(t.ownerDocument||t).createElement("link"),lt(f);var w=f;return w._p=new Promise(function(E,z){w.onload=E,w.onerror=z}),yt(f,"link",i),o.state.loading|=4,Sl(f,n.precedence,t),o.instance=f;case"script":return f=mr(n.src),(p=t.querySelector(Ms(f)))?(o.instance=p,lt(p),p):(i=n,(p=ao.get(f))&&(i=b({},n),up(i,p)),t=t.ownerDocument||t,p=t.createElement("script"),lt(p),yt(p,"link",i),t.head.appendChild(p),o.instance=p);case"void":return null;default:throw Error(s(443,o.type))}else o.type==="stylesheet"&&(o.state.loading&4)===0&&(i=o.instance,o.state.loading|=4,Sl(i,n.precedence,t));return o.instance}function Sl(t,o,n){for(var i=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),p=i.length?i[i.length-1]:null,f=p,w=0;w title"):null)}function HT(t,o,n){if(n===1||o.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof o.precedence!="string"||typeof o.href!="string"||o.href==="")break;return!0;case"link":if(typeof o.rel!="string"||typeof o.href!="string"||o.href===""||o.onLoad||o.onError)break;switch(o.rel){case"stylesheet":return t=o.disabled,typeof o.precedence=="string"&&t==null;default:return!0}case"script":if(o.async&&typeof o.async!="function"&&typeof o.async!="symbol"&&!o.onLoad&&!o.onError&&o.src&&typeof o.src=="string")return!0}return!1}function gb(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function GT(t,o,n,i){if(n.type==="stylesheet"&&(typeof i.media!="string"||matchMedia(i.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var p=pr(i.href),f=o.querySelector(zs(p));if(f){o=f._p,o!==null&&typeof o=="object"&&typeof o.then=="function"&&(t.count++,t=kl.bind(t),o.then(t,t)),n.state.loading|=4,n.instance=f,lt(f);return}f=o.ownerDocument||o,i=pb(i),(p=ao.get(p))&&dp(i,p),f=f.createElement("link"),lt(f);var w=f;w._p=new Promise(function(E,z){w.onload=E,w.onerror=z}),yt(f,"link",i),n.instance=f}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(n,o),(o=n.state.preload)&&(n.state.loading&3)===0&&(t.count++,n=kl.bind(t),o.addEventListener("load",n),o.addEventListener("error",n))}}var pp=0;function VT(t,o){return t.stylesheets&&t.count===0&&El(t,t.stylesheets),0pp?50:800)+o);return t.unsuspend=n,function(){t.unsuspend=null,clearTimeout(i),clearTimeout(p)}}:null}function kl(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)El(this,this.stylesheets);else if(this.unsuspend){var t=this.unsuspend;this.unsuspend=null,t()}}}var Tl=null;function El(t,o){t.stylesheets=null,t.unsuspend!==null&&(t.count++,Tl=new Map,o.forEach(WT,t),Tl=null,kl.call(t))}function WT(t,o){if(!(o.state.loading&4)){var n=Tl.get(t);if(n)var i=n.get(null);else{n=new Map,Tl.set(t,n);for(var p=t.querySelectorAll("link[data-precedence],style[data-precedence]"),f=0;f"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(a){console.error(a)}}return e(),wp.exports=dE(),wp.exports}var lx=uE(),Em=ix();const Rm=sx(Em);/** - * @remix-run/router v1.23.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Gs(){return Gs=Object.assign?Object.assign.bind():function(e){for(var a=1;a"u")throw new Error(a)}function jm(e,a){if(!e){typeof console<"u"&&console.warn(a);try{throw new Error(a)}catch{}}}function mE(){return Math.random().toString(36).substr(2,8)}function qb(e,a){return{usr:e.state,key:e.key,idx:a}}function Yp(e,a,r,s){return r===void 0&&(r=null),Gs({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof a=="string"?Lr(a):a,{state:r,key:a&&a.key||s||mE()})}function Jl(e){let{pathname:a="/",search:r="",hash:s=""}=e;return r&&r!=="?"&&(a+=r.charAt(0)==="?"?r:"?"+r),s&&s!=="#"&&(a+=s.charAt(0)==="#"?s:"#"+s),a}function Lr(e){let a={};if(e){let r=e.indexOf("#");r>=0&&(a.hash=e.substr(r),e=e.substr(0,r));let s=e.indexOf("?");s>=0&&(a.search=e.substr(s),e=e.substr(0,s)),e&&(a.pathname=e)}return a}function fE(e,a,r,s){s===void 0&&(s={});let{window:l=document.defaultView,v5Compat:d=!1}=s,u=l.history,m=Fa.Pop,h=null,g=y();g==null&&(g=0,u.replaceState(Gs({},u.state,{idx:g}),""));function y(){return(u.state||{idx:null}).idx}function b(){m=Fa.Pop;let k=y(),R=k==null?null:k-g;g=k,h&&h({action:m,location:x.location,delta:R})}function S(k,R){m=Fa.Push;let j=Yp(x.location,k,R);g=y()+1;let A=qb(j,g),M=x.createHref(j);try{u.pushState(A,"",M)}catch(q){if(q instanceof DOMException&&q.name==="DataCloneError")throw q;l.location.assign(M)}d&&h&&h({action:m,location:x.location,delta:1})}function T(k,R){m=Fa.Replace;let j=Yp(x.location,k,R);g=y();let A=qb(j,g),M=x.createHref(j);u.replaceState(A,"",M),d&&h&&h({action:m,location:x.location,delta:0})}function C(k){let R=l.location.origin!=="null"?l.location.origin:l.location.href,j=typeof k=="string"?k:Jl(k);return j=j.replace(/ $/,"%20"),Qe(R,"No window.location.(origin|href) available to create URL for href: "+j),new URL(j,R)}let x={get action(){return m},get location(){return e(l,u)},listen(k){if(h)throw new Error("A history only accepts one active listener");return l.addEventListener(Ib,b),h=k,()=>{l.removeEventListener(Ib,b),h=null}},createHref(k){return a(l,k)},createURL:C,encodeLocation(k){let R=C(k);return{pathname:R.pathname,search:R.search,hash:R.hash}},push:S,replace:T,go(k){return u.go(k)}};return x}var Fb;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Fb||(Fb={}));function hE(e,a,r){return r===void 0&&(r="/"),gE(e,a,r)}function gE(e,a,r,s){let l=typeof a=="string"?Lr(a):a,d=zr(l.pathname||"/",r);if(d==null)return null;let u=cx(e);yE(u);let m=null;for(let h=0;m==null&&h{let h={relativePath:m===void 0?d.path||"":m,caseSensitive:d.caseSensitive===!0,childrenIndex:u,route:d};h.relativePath.startsWith("/")&&(Qe(h.relativePath.startsWith(s),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+s+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(s.length));let g=Ka([s,h.relativePath]),y=r.concat(h);d.children&&d.children.length>0&&(Qe(d.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+g+'".')),cx(d.children,a,y,g)),!(d.path==null&&!d.index)&&a.push({path:g,score:kE(g,d.index),routesMeta:y})};return e.forEach((d,u)=>{var m;if(d.path===""||!((m=d.path)!=null&&m.includes("?")))l(d,u);else for(let h of dx(d.path))l(d,u,h)}),a}function dx(e){let a=e.split("/");if(a.length===0)return[];let[r,...s]=a,l=r.endsWith("?"),d=r.replace(/\?$/,"");if(s.length===0)return l?[d,""]:[d];let u=dx(s.join("/")),m=[];return m.push(...u.map(h=>h===""?d:[d,h].join("/"))),l&&m.push(...u),m.map(h=>e.startsWith("/")&&h===""?"/":h)}function yE(e){e.sort((a,r)=>a.score!==r.score?r.score-a.score:TE(a.routesMeta.map(s=>s.childrenIndex),r.routesMeta.map(s=>s.childrenIndex)))}const bE=/^:[\w-]+$/,vE=3,xE=2,wE=1,SE=10,CE=-2,Kb=e=>e==="*";function kE(e,a){let r=e.split("/"),s=r.length;return r.some(Kb)&&(s+=CE),a&&(s+=xE),r.filter(l=>!Kb(l)).reduce((l,d)=>l+(bE.test(d)?vE:d===""?wE:SE),s)}function TE(e,a){return e.length===a.length&&e.slice(0,-1).every((s,l)=>s===a[l])?e[e.length-1]-a[a.length-1]:0}function EE(e,a,r){let{routesMeta:s}=e,l={},d="/",u=[];for(let m=0;m{let{paramName:S,isOptional:T}=y;if(S==="*"){let x=m[b]||"";u=d.slice(0,d.length-x.length).replace(/(.)\/+$/,"$1")}const C=m[b];return T&&!C?g[S]=void 0:g[S]=(C||"").replace(/%2F/g,"/"),g},{}),pathname:d,pathnameBase:u,pattern:e}}function RE(e,a,r){a===void 0&&(a=!1),r===void 0&&(r=!0),jm(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let s=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(u,m,h)=>(s.push({paramName:m,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(s.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,a?void 0:"i"),s]}function jE(e){try{return e.split("/").map(a=>decodeURIComponent(a).replace(/\//g,"%2F")).join("/")}catch(a){return jm(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+a+").")),e}}function zr(e,a){if(a==="/")return e;if(!e.toLowerCase().startsWith(a.toLowerCase()))return null;let r=a.endsWith("/")?a.length-1:a.length,s=e.charAt(r);return s&&s!=="/"?null:e.slice(r)||"/"}const AE=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,NE=e=>AE.test(e);function zE(e,a){a===void 0&&(a="/");let{pathname:r,search:s="",hash:l=""}=typeof e=="string"?Lr(e):e,d;if(r)if(NE(r))d=r;else{if(r.includes("//")){let u=r;r=r.replace(/\/\/+/g,"/"),jm(!1,"Pathnames cannot have embedded double slashes - normalizing "+(u+" -> "+r))}r.startsWith("/")?d=Ub(r.substring(1),"/"):d=Ub(r,a)}else d=a;return{pathname:d,search:_E(s),hash:OE(l)}}function Ub(e,a){let r=a.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?r.length>1&&r.pop():l!=="."&&r.push(l)}),r.length>1?r.join("/"):"/"}function Tp(e,a,r,s){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+a+"` field ["+JSON.stringify(s)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function ME(e){return e.filter((a,r)=>r===0||a.route.path&&a.route.path.length>0)}function ux(e,a){let r=ME(e);return a?r.map((s,l)=>l===r.length-1?s.pathname:s.pathnameBase):r.map(s=>s.pathnameBase)}function px(e,a,r,s){s===void 0&&(s=!1);let l;typeof e=="string"?l=Lr(e):(l=Gs({},e),Qe(!l.pathname||!l.pathname.includes("?"),Tp("?","pathname","search",l)),Qe(!l.pathname||!l.pathname.includes("#"),Tp("#","pathname","hash",l)),Qe(!l.search||!l.search.includes("#"),Tp("#","search","hash",l)));let d=e===""||l.pathname==="",u=d?"/":l.pathname,m;if(u==null)m=r;else{let b=a.length-1;if(!s&&u.startsWith("..")){let S=u.split("/");for(;S[0]==="..";)S.shift(),b-=1;l.pathname=S.join("/")}m=b>=0?a[b]:"/"}let h=zE(l,m),g=u&&u!=="/"&&u.endsWith("/"),y=(d||u===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(g||y)&&(h.pathname+="/"),h}const Ka=e=>e.join("/").replace(/\/\/+/g,"/"),DE=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),_E=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,OE=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function LE(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const mx=["post","put","patch","delete"];new Set(mx);const ZE=["get",...mx];new Set(ZE);/** - * React Router v6.30.3 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Vs(){return Vs=Object.assign?Object.assign.bind():function(e){for(var a=1;a{m.current=!0}),v.useCallback(function(g,y){if(y===void 0&&(y={}),!m.current)return;if(typeof g=="number"){s.go(g);return}let b=px(g,JSON.parse(u),d,y.relative==="path");e==null&&a!=="/"&&(b.pathname=b.pathname==="/"?a:Ka([a,b.pathname])),(y.replace?s.replace:s.push)(b,y.state,y)},[a,s,u,d,e])}function gc(e,a){let{relative:r}=a===void 0?{}:a,{future:s}=v.useContext(Wa),{matches:l}=v.useContext(Rn),{pathname:d}=$a(),u=JSON.stringify(ux(l,s.v7_relativeSplatPath));return v.useMemo(()=>px(e,JSON.parse(u),d,r==="path"),[e,u,d,r])}function IE(e,a){return qE(e,a)}function qE(e,a,r,s){ei()||Qe(!1);let{navigator:l}=v.useContext(Wa),{matches:d}=v.useContext(Rn),u=d[d.length-1],m=u?u.params:{};u&&u.pathname;let h=u?u.pathnameBase:"/";u&&u.route;let g=$a(),y;if(a){var b;let k=typeof a=="string"?Lr(a):a;h==="/"||(b=k.pathname)!=null&&b.startsWith(h)||Qe(!1),y=k}else y=g;let S=y.pathname||"/",T=S;if(h!=="/"){let k=h.replace(/^\//,"").split("/");T="/"+S.replace(/^\//,"").split("/").slice(k.length).join("/")}let C=hE(e,{pathname:T}),x=GE(C&&C.map(k=>Object.assign({},k,{params:Object.assign({},m,k.params),pathname:Ka([h,l.encodeLocation?l.encodeLocation(k.pathname).pathname:k.pathname]),pathnameBase:k.pathnameBase==="/"?h:Ka([h,l.encodeLocation?l.encodeLocation(k.pathnameBase).pathname:k.pathnameBase])})),d,r,s);return a&&x?v.createElement(hc.Provider,{value:{location:Vs({pathname:"/",search:"",hash:"",state:null,key:"default"},y),navigationType:Fa.Pop}},x):x}function FE(){let e=YE(),a=LE(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return v.createElement(v.Fragment,null,v.createElement("h2",null,"Unexpected Application Error!"),v.createElement("h3",{style:{fontStyle:"italic"}},a),r?v.createElement("pre",{style:l},r):null,null)}const KE=v.createElement(FE,null);class UE extends v.Component{constructor(a){super(a),this.state={location:a.location,revalidation:a.revalidation,error:a.error}}static getDerivedStateFromError(a){return{error:a}}static getDerivedStateFromProps(a,r){return r.location!==a.location||r.revalidation!=="idle"&&a.revalidation==="idle"?{error:a.error,location:a.location,revalidation:a.revalidation}:{error:a.error!==void 0?a.error:r.error,location:r.location,revalidation:a.revalidation||r.revalidation}}componentDidCatch(a,r){console.error("React Router caught the following error during render",a,r)}render(){return this.state.error!==void 0?v.createElement(Rn.Provider,{value:this.props.routeContext},v.createElement(hx.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function HE(e){let{routeContext:a,match:r,children:s}=e,l=v.useContext(fc);return l&&l.static&&l.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=r.route.id),v.createElement(Rn.Provider,{value:a},s)}function GE(e,a,r,s){var l;if(a===void 0&&(a=[]),r===void 0&&(r=null),s===void 0&&(s=null),e==null){var d;if(!r)return null;if(r.errors)e=r.matches;else if((d=s)!=null&&d.v7_partialHydration&&a.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let u=e,m=(l=r)==null?void 0:l.errors;if(m!=null){let y=u.findIndex(b=>b.route.id&&(m==null?void 0:m[b.route.id])!==void 0);y>=0||Qe(!1),u=u.slice(0,Math.min(u.length,y+1))}let h=!1,g=-1;if(r&&s&&s.v7_partialHydration)for(let y=0;y=0?u=u.slice(0,g+1):u=[u[0]];break}}}return u.reduceRight((y,b,S)=>{let T,C=!1,x=null,k=null;r&&(T=m&&b.route.id?m[b.route.id]:void 0,x=b.route.errorElement||KE,h&&(g<0&&S===0?(QE("route-fallback"),C=!0,k=null):g===S&&(C=!0,k=b.route.hydrateFallbackElement||null)));let R=a.concat(u.slice(0,S+1)),j=()=>{let A;return T?A=x:C?A=k:b.route.Component?A=v.createElement(b.route.Component,null):b.route.element?A=b.route.element:A=y,v.createElement(HE,{match:b,routeContext:{outlet:y,matches:R,isDataRoute:r!=null},children:A})};return r&&(b.route.ErrorBoundary||b.route.errorElement||S===0)?v.createElement(UE,{location:r.location,revalidation:r.revalidation,component:x,error:T,children:j(),routeContext:{outlet:null,matches:R,isDataRoute:!0}}):j()},null)}var bx=(function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e})(bx||{}),vx=(function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e})(vx||{});function VE(e){let a=v.useContext(fc);return a||Qe(!1),a}function WE(e){let a=v.useContext(fx);return a||Qe(!1),a}function $E(e){let a=v.useContext(Rn);return a||Qe(!1),a}function xx(e){let a=$E(),r=a.matches[a.matches.length-1];return r.route.id||Qe(!1),r.route.id}function YE(){var e;let a=v.useContext(hx),r=WE(),s=xx();return a!==void 0?a:(e=r.errors)==null?void 0:e[s]}function XE(){let{router:e}=VE(bx.UseNavigateStable),a=xx(vx.UseNavigateStable),r=v.useRef(!1);return gx(()=>{r.current=!0}),v.useCallback(function(l,d){d===void 0&&(d={}),r.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,Vs({fromRouteId:a},d)))},[e,a])}const Hb={};function QE(e,a,r){Hb[e]||(Hb[e]=!0)}function JE(e,a){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function ut(e){Qe(!1)}function eR(e){let{basename:a="/",children:r=null,location:s,navigationType:l=Fa.Pop,navigator:d,static:u=!1,future:m}=e;ei()&&Qe(!1);let h=a.replace(/^\/*/,"/"),g=v.useMemo(()=>({basename:h,navigator:d,static:u,future:Vs({v7_relativeSplatPath:!1},m)}),[h,m,d,u]);typeof s=="string"&&(s=Lr(s));let{pathname:y="/",search:b="",hash:S="",state:T=null,key:C="default"}=s,x=v.useMemo(()=>{let k=zr(y,h);return k==null?null:{location:{pathname:k,search:b,hash:S,state:T,key:C},navigationType:l}},[h,y,b,S,T,C,l]);return x==null?null:v.createElement(Wa.Provider,{value:g},v.createElement(hc.Provider,{children:r,value:x}))}function wx(e){let{children:a,location:r}=e;return IE(Qp(a),r)}new Promise(()=>{});function Qp(e,a){a===void 0&&(a=[]);let r=[];return v.Children.forEach(e,(s,l)=>{if(!v.isValidElement(s))return;let d=[...a,l];if(s.type===v.Fragment){r.push.apply(r,Qp(s.props.children,d));return}s.type!==ut&&Qe(!1),!s.props.index||!s.props.children||Qe(!1);let u={id:s.props.id||d.join("-"),caseSensitive:s.props.caseSensitive,element:s.props.element,Component:s.props.Component,index:s.props.index,path:s.props.path,loader:s.props.loader,action:s.props.action,errorElement:s.props.errorElement,ErrorBoundary:s.props.ErrorBoundary,hasErrorBoundary:s.props.ErrorBoundary!=null||s.props.errorElement!=null,shouldRevalidate:s.props.shouldRevalidate,handle:s.props.handle,lazy:s.props.lazy};s.props.children&&(u.children=Qp(s.props.children,d)),r.push(u)}),r}/** - * React Router DOM v6.30.3 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function ec(){return ec=Object.assign?Object.assign.bind():function(e){for(var a=1;a=0)&&(r[l]=e[l]);return r}function tR(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function oR(e,a){return e.button===0&&(!a||a==="_self")&&!tR(e)}const aR=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],nR=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],rR="6";try{window.__reactRouterVersion=rR}catch{}const sR=v.createContext({isTransitioning:!1}),iR="startTransition",Gb=mc[iR];function lR(e){let{basename:a,children:r,future:s,window:l}=e,d=v.useRef();d.current==null&&(d.current=pE({window:l,v5Compat:!0}));let u=d.current,[m,h]=v.useState({action:u.action,location:u.location}),{v7_startTransition:g}=s||{},y=v.useCallback(b=>{g&&Gb?Gb(()=>h(b)):h(b)},[h,g]);return v.useLayoutEffect(()=>u.listen(y),[u,y]),v.useEffect(()=>JE(s),[s]),v.createElement(eR,{basename:a,children:r,location:m.location,navigationType:m.action,navigator:u,future:s})}const cR=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",dR=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,st=v.forwardRef(function(a,r){let{onClick:s,relative:l,reloadDocument:d,replace:u,state:m,target:h,to:g,preventScrollReset:y,viewTransition:b}=a,S=Sx(a,aR),{basename:T}=v.useContext(Wa),C,x=!1;if(typeof g=="string"&&dR.test(g)&&(C=g,cR))try{let A=new URL(window.location.href),M=g.startsWith("//")?new URL(A.protocol+g):new URL(g),q=zr(M.pathname,T);M.origin===A.origin&&q!=null?g=q+M.search+M.hash:x=!0}catch{}let k=PE(g,{relative:l}),R=pR(g,{replace:u,state:m,target:h,preventScrollReset:y,relative:l,viewTransition:b});function j(A){s&&s(A),A.defaultPrevented||R(A)}return v.createElement("a",ec({},S,{href:C||k,onClick:x||d?s:j,ref:r,target:h}))}),Jp=v.forwardRef(function(a,r){let{"aria-current":s="page",caseSensitive:l=!1,className:d="",end:u=!1,style:m,to:h,viewTransition:g,children:y}=a,b=Sx(a,nR),S=gc(h,{relative:b.relative}),T=$a(),C=v.useContext(fx),{navigator:x,basename:k}=v.useContext(Wa),R=C!=null&&mR(S)&&g===!0,j=x.encodeLocation?x.encodeLocation(S).pathname:S.pathname,A=T.pathname,M=C&&C.navigation&&C.navigation.location?C.navigation.location.pathname:null;l||(A=A.toLowerCase(),M=M?M.toLowerCase():null,j=j.toLowerCase()),M&&k&&(M=zr(M,k)||M);const q=j!=="/"&&j.endsWith("/")?j.length-1:j.length;let P=A===j||!u&&A.startsWith(j)&&A.charAt(q)==="/",I=M!=null&&(M===j||!u&&M.startsWith(j)&&M.charAt(j.length)==="/"),X={isActive:P,isPending:I,isTransitioning:R},ae=P?s:void 0,re;typeof d=="function"?re=d(X):re=[d,P?"active":null,I?"pending":null,R?"transitioning":null].filter(Boolean).join(" ");let te=typeof m=="function"?m(X):m;return v.createElement(st,ec({},b,{"aria-current":ae,className:re,ref:r,style:te,to:h,viewTransition:g}),typeof y=="function"?y(X):y)});var em;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(em||(em={}));var Vb;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Vb||(Vb={}));function uR(e){let a=v.useContext(fc);return a||Qe(!1),a}function pR(e,a){let{target:r,replace:s,state:l,preventScrollReset:d,relative:u,viewTransition:m}=a===void 0?{}:a,h=yx(),g=$a(),y=gc(e,{relative:u});return v.useCallback(b=>{if(oR(b,r)){b.preventDefault();let S=s!==void 0?s:Jl(g)===Jl(y);h(e,{replace:S,state:l,preventScrollReset:d,relative:u,viewTransition:m})}},[g,h,y,s,l,r,e,d,u,m])}function mR(e,a){a===void 0&&(a={});let r=v.useContext(sR);r==null&&Qe(!1);let{basename:s}=uR(em.useViewTransitionState),l=gc(e,{relative:a.relative});if(!r.isTransitioning)return!1;let d=zr(r.currentLocation.pathname,s)||r.currentLocation.pathname,u=zr(r.nextLocation.pathname,s)||r.nextLocation.pathname;return Xp(l.pathname,u)!=null||Xp(l.pathname,d)!=null}const Cx="zmage.theme",kx=v.createContext(null);function fR(){if(typeof window>"u")return"system";const e=localStorage.getItem(Cx);return e==="light"||e==="dark"||e==="system"?e:"system"}function Wb(){return typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches}function hR({children:e}){const[a,r]=v.useState(fR),[s,l]=v.useState(()=>a==="system"?Wb()?"dark":"light":a);v.useEffect(()=>{const u=()=>{const h=a==="system"?Wb()?"dark":"light":a;l(h),document.documentElement.classList.toggle("dark",h==="dark")};if(u(),a!=="system")return;const m=window.matchMedia("(prefers-color-scheme: dark)");return m.addEventListener("change",u),()=>m.removeEventListener("change",u)},[a]);const d=v.useCallback(u=>{localStorage.setItem(Cx,u),r(u)},[]);return c.jsx(kx.Provider,{value:{theme:a,resolved:s,setTheme:d},children:e})}function Am(){const e=v.useContext(kx);if(!e)throw new Error("useTheme must be inside ThemeProvider");return e}const gR={"nav.playground":"调试","nav.docs":"文档","nav.ai":"AI 接入指南","nav.github":"GitHub","useCases.eyebrow":"使用场景","useCases.title":"适合博客、CMS、MDX 和新闻页面的 React 图片预览","useCases.body":"react-zmage 是一个 React 图片查看器, 可以把普通 变成可原位展开的全屏图片预览。它支持多图浏览、键盘操作、移动端手势、事件触发、富文本 Wrapper 模式, 也支持 SSR/RSC 场景。","useCases.cta.docs":"查看文档","useCases.cta.wrapper":"试试 Wrapper 模式","useCases.card.blog.title":"博客图片预览","useCases.card.blog.body":"让文章里的图片可以全屏查看, 不需要改掉原本的文章排版, 也不需要额外做一套相册页面。","useCases.card.cms.title":"CMS 富文本图片","useCases.card.cms.body":"包住 CMS、Markdown 解析器或编辑器输出的 HTML, 让已有 自动接入查看器。","useCases.card.news.title":"新闻文章图集","useCases.card.news.body":"正文仍然保持可读, 读者需要看细节时再进入支持键盘、手势和多图浏览的查看器。","useCases.card.mdx.title":"MDX 和文档图片","useCases.card.mdx.body":"适合内容作者负责图片、React 应用负责页面外壳的文档页面, 直接用 Wrapper 模式接入。","useCases.card.lightbox.title":"React lightbox 替代方案","useCases.card.lightbox.body":"当你只需要一层原位展开的图片预览, 又想保留现有 HTML 结构时, 不必接入更重的相册框架。","useCases.card.ssr.title":"Next.js、SSR 和 RSC","useCases.card.ssr.body":"服务端渲染应用可以使用 SSR 安全入口, 再在客户端边界里打开交互式查看器。","useCases.mode.eyebrow":"如何选择模式","useCases.mode.title":"按你是否掌控图片 HTML 来选","useCases.mode.component":"你掌控 JSX, 可以直接把 换成 。","useCases.mode.imperative":"按钮、命令、事件或回调需要主动打开查看器。","useCases.mode.wrapper":"图片来自 CMS、MDX、Markdown 或富文本 HTML。","useCases.facts.eyebrow":"实体信息","useCases.facts.title":"希望搜索引擎和 AI 抓住的简短事实","useCases.fact.react":"兼容 React 16.8 到 19","useCases.fact.modes":"支持组件、命令式和 Wrapper 三种模式","useCases.fact.input":"支持键盘导航和移动端手势","useCases.fact.ssr":"提供 SSR/RSC 安全入口","useCases.fact.gallery":"不重构页面也能做多图浏览","useCases.fact.origin":"原位展开的全屏图片预览","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"人和 AI Agent 通常会问的问题","useCases.faq.what.q":"react-zmage 是什么?","useCases.faq.what.a":"react-zmage 是一个 React 图片查看器, 可以把普通 变成可原位展开的全屏图片预览, 并支持多图浏览、键盘导航、移动端手势、Wrapper 模式和 SSR/RSC。","useCases.faq.lightbox.q":"什么时候应该用 react-zmage, 而不是 React lightbox?","useCases.faq.lightbox.a":"当你希望已有图片可以全屏查看, 但不想围绕相册组件重写页面结构时, react-zmage 更合适。博客、CMS 富文本、MDX 文档、新闻文章和图片较多的内容页都适合。","useCases.faq.richText.q":"react-zmage 能处理 CMS、Markdown 或富文本图片吗?","useCases.faq.richText.a":"可以。Zmage.Wrapper 会绑定后代 , 适合 CMS、Markdown、MDX 或 dangerouslySetInnerHTML 渲染出来的内容, 同时保留原页面结构。","useCases.faq.ssr.q":"react-zmage 支持 Next.js、SSR 或 RSC 吗?","useCases.faq.ssr.a":"支持。SSR 或 RSC 场景使用 react-zmage/ssr 子路径导入, 交互式查看器 API 放在客户端事件或 Client Component 中调用。","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"让每张 ","hero.title.line2":"原位展开","hero.subtitle":"把任意 变成可原位展开的全屏图片查看器,支持键盘、手势和多图浏览。","hero.cta.start":"查看文档","hero.cta.playground":"玩玩各种参数","hero.ai.label":"AI 接入指南: 先读 llms.txt","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"复制快速 Prompt","hero.ai.copyLabel":"复制快速 AI Prompt","hero.ai.viewLlms":"查看 llms.txt →","ai.badge":"AI 接入指南","ai.title":"生成 react-zmage Agent 接入 Prompt","ai.subtitle":"先从 llms.txt 开始。保留 Auto, 让你的 Agent 先读项目再决定接入方式; 如果你想细控, 也可以手动指定环境、图片来源和交互策略。","ai.field.agent":"你使用哪个 Agent?","ai.field.depth":"配置深度","ai.field.environment":"项目环境","ai.field.mode":"使用模式","ai.field.imageSource":"图片来源","ai.field.interaction":"交互策略","ai.field.project":"项目描述","ai.autoTip":"不确定就保持 Auto。你的 Agent 会先检查项目结构、图片来源、渲染方式和样式入口, 再选择合适的 Zmage 模式和参数。","ai.project.placeholder":"描述你的应用、图片来源, 以及希望查看器完成什么。","ai.action.copy":"复制 Setup Prompt","ai.action.copied":"已复制","ai.action.openLlms":"打开 llms.txt","ai.copy.error":"复制失败。请在右侧预览中手动选择 prompt。","ai.preview.title":"Setup Prompt","ai.preview.subtitle":"会随左侧选择实时更新","ai.preview.copy":"复制","ai.preview.expand":"展开","ai.preview.show":"预览 Prompt","ai.preview.hide":"收起预览","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"生成适合通用 Coding Agent 的 prompt。","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"让 Agent 先检查项目, 再替你选择。","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"手动指定接入偏好。","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"真实交互示例","demo.title":"把童梦的图像故事铺成一页真实文章","demo.body":"这些图片来自《童梦》项目: 旧书、时间通道、狐狸、森林和水晶封印被排进同一个不规则版面。点击任意一张,首帧会从当前裁剪位置顺滑放大到查看模式。","demo.shiftHint":"按住 SHIFT 点击图片, 感受细腻流畅的过渡动画","demo.zoomHint":"打开后按 Space 进入缩放,再用滚轮继续缩放。","demo.story.project":"童梦","demo.story.author":"Guihuahuzi","demo.story.title":"一本积满尘的书,在图书馆角落打开了旧时间的入口。","demo.story.lead":"书页上原本不起眼的文字变成微缩场景,男孩看见森林从纸面生长,也听见结界另一端传来的召唤。","demo.story.middle":"狐狸成为他的同行伙伴。穿过潮汐、树冠和粉色火烈鸟之后,故事把视线推向密林深处的水晶封印。","demo.tile.cover":"旧书与时间通道","demo.tile.gallery":"森林里第一次相遇","demo.tile.ratio":"潮汐边缘的路径","demo.tile.controller":"水晶封印","demo.tile.zoom":"火烈鸟栖息地","demo.tile.lamp":"叶片下的灯光","demo.tile.rescue":"密林中的解封","demo.feature.cover":"封面裁剪与圆角匹配","demo.feature.space":"移动鼠标指针在放大模式下快速扫视","demo.feature.wheel":"使用鼠标滚轮顺滑切换缩放比例","demo.feature.shift":"Shift 慢动作打开/关闭","demo.caption":"点击图片进入查看模式;桌面端可按住 SHIFT 打开,进入放大后移动鼠标或滚动滚轮观察细节。","demo.scene.portal.alt":"旧书上的发光时间通道","demo.scene.portal.caption":"旧书中央亮起时间通道,森林从文字里立起来。","demo.scene.forest.alt":"男孩在森林里遇见狐狸","demo.scene.forest.caption":"狐狸在林间出现,成为男孩穿过异世界的伙伴。","demo.scene.tide.alt":"男孩站在潮汐边缘","demo.scene.tide.caption":"水面卷起螺旋,通向下一段未知路径。","demo.scene.canopy.alt":"男孩躺在巨大树冠下","demo.scene.canopy.caption":"树冠像书页一样展开,微光把路线标出来。","demo.scene.flamingo.alt":"男孩坐在粉色火烈鸟之间","demo.scene.flamingo.caption":"轻盈的火烈鸟群让旅程短暂停下来。","demo.scene.lamp.alt":"男孩在叶片下点亮灯光","demo.scene.lamp.caption":"叶片遮住黑暗,灯光把书里的线索照出来。","demo.scene.crystal.alt":"男孩站在水晶封印前","demo.scene.crystal.caption":"密林深处的水晶封印开始显露。","demo.scene.rescue.alt":"狐狸和男孩靠近水晶封印","demo.scene.rescue.caption":"钥匙靠近晶体,封印里的秘密即将被打开。","feature.dropin.title":"原位展开","feature.dropin.hint":"从页面原图的位置、尺寸、圆角和裁剪状态进入全屏,关闭时回到原位。","feature.mobile.title":"移动端兼容","feature.mobile.hint":"默认按设备选择交互:触屏端支持滑动翻页、下滑关闭、双击和双指缩放。","feature.set.title":"浏览操作完整","feature.set.hint":"缩放、旋转、翻页、下载和 caption 共用同一套浏览状态,多图时也保持连续。","feature.ssr.title":"SSR/RSC 友好","feature.ssr.hint":"提供服务端安全入口,在 Next.js、SSR 或 RSC 项目里可以把交互留给客户端边界。","modes.title":"按你的页面结构接入","modes.component.label":"组件模式","modes.component.desc":"你能控制 JSX 时,把 换成 ,原生属性继续透传。","modes.imperative.label":"命令式调用","modes.imperative.desc":"从按钮、回调或异步流程打开查看器,不要求页面上已有封面图。","modes.wrapper.label":"包裹器模式","modes.wrapper.desc":"包住 Markdown / CMS / dangerouslySetInnerHTML,让内部图片自动原位展开。","modes.try":"打开示例 →","modes.component.when":"当你完全控制要渲染的 JSX 时优先选组件模式。把 直接换成 ,原生属性继续透传,打开和关闭都会按原位展开过渡。","modes.imperative.when":"当入口不是图片本身时使用命令式调用。从事件处理器、第三方回调、异步流程等任意位置打开查看器,不需要额外挂一个封面 。","modes.wrapper.when":"当渲染出的 HTML 不在你的控制之内时使用包裹器模式 —— markdown 输出、CMS 富文本、dangerouslySetInnerHTML 等。包住子树,内部所有 自动获得查看能力。","footer.project":"项目","footer.repo":"代码仓库","footer.issues":"反馈与建议","footer.changelog":"更新日志","footer.useCases":"使用场景","footer.madeby":"作者","footer.illustrator":"插图作者","footer.license":"MIT 许可证","pg.title":"参数调试台","pg.subtitle":"调整任意 prop,实时查看 的反馈。","pg.reset":"重置","pg.share":"分享链接","pg.shared":"已复制链接","pg.tab.component":"组件","pg.tab.imperative":"命令式","pg.tab.wrapper":"包裹器","pg.preview.tip":"提示:Space 缩放 · ←/→ 翻页 · ESC 关闭","pg.preview.trigger":"触发查看器","pg.params.title":"参数","pg.params.subtitle":"悬停参数名查看说明, 点击书本图标跳转文档。","pg.events.title":"事件","pg.events.subtitle":"生命周期回调输出, 可展开查看完整事件流。","pg.events.empty":"启用任意 lifecycle 回调以查看事件流。","pg.code.title":"代码","pg.code.subtitle":"当前模式的可复制代码, 可展开查看完整内容。","pg.code.hideDefaults":"隐藏默认值","pg.copy":"复制","pg.copied":"已复制","group.data":"数据","group.preset":"预设","group.interface":"界面与交互","group.controller":"控制器","group.hotkey":"快捷键","group.animate":"动画","group.gesture":"手势","group.lifecycle":"生命周期","group.controlled":"受控","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"桌面端范围","common.presetScope.desktop.desc":"偏桌面端的参数。desktop preset 默认启用它, 或者它只在桌面端有实际作用。","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"移动端范围","common.presetScope.mobile.desc":"偏移动端或触控的参数。mobile preset 默认启用它, 或者它只在触控交互中有意义。","common.expand":"展开","common.required":"必填","common.default":"默认","common.add":"新增","common.remove":"删除","common.enable":"启用","common.disable":"禁用","param.viewInDocs":"在文档中查看","docs.title":"API 文档","docs.search.placeholder":"搜索文档...","docs.search.empty":"没有匹配项","docs.toc.title":"本页目录","docs.sidebar.gettingStarted":"开始使用","docs.sidebar.quickstart":"快速开始","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"概念","docs.sidebar.modes":"三种模式","docs.sidebar.theming":"主题集成","docs.sidebar.props":"API 参数","docs.sidebar.recipes":"场景示例","docs.sidebar.examples":"示例","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"参考","docs.sidebar.migration":"迁移指南","docs.sidebar.faq":"常见问题","preset.desktop":"桌面端","preset.mobile":"移动端","preset.auto":"自动","animate.flip.fade":"淡入淡出","animate.flip.crossFade":"交叉淡入","animate.flip.swipe":"滑动","animate.flip.zoom":"缩放","animate.flip.blur":"失焦","animate.flip.none":"无","animate.slowMotion":"慢动作","gesture.swipe":"拖拽翻页","gesture.dragExit":"拖拽退出","gesture.wheelZoom":"滚轮缩放","gesture.pinchZoom":"双指缩放","gesture.doubleTapZoom":"双击缩放","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"跟随 preset 的手势配置。桌面预设在 zoom 态开启滚轮缩放;移动端预设开启拖拽翻页、拖拽退出、双指缩放和双击缩放。","gesture.swipe.desc":"横向拖拽切换 set 中的图片。单图模式下自动忽略。","gesture.dragExit.desc":"纵向拖拽关闭查看器,走现有 onBrowsing(false) 关闭路径。","gesture.wheelZoom.desc":"查看器已经处于 zoom 态时,用鼠标滚轮或触控板继续缩放。桌面预设默认开启,移动端预设默认关闭。","gesture.pinchZoom.desc":"移动端双指缩放。缩回 fit 比例时退出 zoom,并把图片回中。","gesture.doubleTapZoom.desc":"移动端单指双击缩放。首次双击按 tap 位置放大;zoom 态再次双击回到 fit 视图。","gesture.touchAction.desc":"CSS touch-action 策略。managed 会在启用 pinch 时使用 none,仅启用双击缩放时使用 manipulation;显式值会原样写入。","gesture.threshold.desc":"接受手势所需的最小拖拽距离,单位 px。","gesture.velocity.desc":"接受手势所需的最小速度,单位 px/ms。","gesture.axisLock.desc":"轴向锁定比例,用于避免斜向移动同时触发横向和纵向手势。","gesture.resistance.desc":"loop=false 且位于首尾页时的边界阻尼比例。","gesture.opacity.desc":"纵向拖拽退出时是否随拖拽距离降低图片透明度。","gesture.wheelZoom.step.desc":"滚轮缩放灵敏度。值越大,同样的滚轮距离缩放越快。","gesture.wheelZoom.smooth.desc":"是否通过现有 zoom-follow RAF 平滑插值;关闭后立即跳到目标缩放。","gesture.wheelZoom.minScale.desc":"滚轮缩小的最小比例。继续缩小时到达该比例会退出 zoom。","gesture.wheelZoom.maxScale.desc":"滚轮放大的最大比例。","gesture.wheelZoom.center.desc":"滚轮缩放焦点。pointer 使用滚轮事件位置;viewport 使用屏幕中心。","gesture.wheelZoom.reverse.desc":"反转滚轮缩放方向,其它滚轮行为保持不变。","gesture.wheelZoom.exitGuardDuration.desc":"wheel 缩小退出 zoom 后的保护时间,单位 ms。保护期内会拦截残留滚轮事件。","gesture.pinchZoom.minScale.desc":"双指缩放的最小比例。fit 表示适配屏幕的浏览态尺寸。","gesture.pinchZoom.maxScale.desc":"双指缩放的最大比例。","gesture.pinchZoom.resetBelowFit.desc":"双指缩小到 fit 比例时退出 zoom 并把图片回中。","gesture.pinchZoom.center.desc":"双指缩放焦点。gesture 使用双指中点;viewport 使用屏幕中心。","gesture.doubleTapZoom.scale.desc":"双击进入 zoom 时的目标缩放比例。","gesture.doubleTapZoom.minScale.desc":"双击缩放的最小限制。","gesture.doubleTapZoom.maxScale.desc":"双击缩放的最大限制。","gesture.doubleTapZoom.center.desc":"双击缩放焦点。tap 使用点击位置;viewport 使用屏幕中心。","gesture.doubleTapZoom.interval.desc":"两次 tap 的最大间隔,单位 ms。","gesture.doubleTapZoom.distance.desc":"两次 tap 允许的最大位移,单位 px。","controller.pagination":"分页指示器","controller.rotate":"旋转","controller.rotateLeft":"左旋","controller.rotateRight":"右旋","controller.zoom":"缩放","controller.download":"下载","controller.close":"关闭","controller.flip":"翻页","controller.flipLeft":"上一张","controller.flipRight":"下一张","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"顶部页码指示器,展示当前位置 / 总页数","controller.rotate.desc":"旋转控制组(包含左旋与右旋按钮)","controller.rotateLeft.desc":"逆时针旋转 90°","controller.rotateRight.desc":"顺时针旋转 90°","controller.zoom.desc":"进入 / 退出 1:1 放大模式","controller.download.desc":"下载当前图片","controller.close.desc":"关闭查看器","controller.flip.desc":"翻页控制组(包含上 / 下一张按钮)","controller.flipLeft.desc":"切换到上一张图片","controller.flipRight.desc":"切换到下一张图片","controller.backdrop.desc":"工具栏背景色。未传时沿用顶层 backdrop。当顶层 backdrop 为深色实色时建议设为半透明值 (例如 `rgba(0,0,0,0.4)`)。","controller.color.desc":'工具栏图标默认色。未传时使用 currentColor。单按钮字符串覆盖 (例如 `controller.zoom = "#ff8800"`) 仍优先生效。',"controller.placement.desc":"工具栏位置。只移动工具栏本体,左右翻页按钮和分页指示器位置不变。","controller.layout.desc":"调整工具栏、左右翻页按钮、分页器和 caption 的安全偏移。数值按 px 处理,字符串可传任意 CSS 长度;标量 inset 会按目标自身进入方向生效,layout.mobile 可覆盖移动端位置。","controller.layout.toolbarInset.desc":"工具栏安全偏移。标量会按当前 placement 自动作用在 top / right / bottom / left 的对应边。","controller.layout.flipInset.desc":"左右翻页按钮安全偏移。标量会同时作用在左侧和右侧按钮。","controller.layout.paginationInset.desc":"分页器安全偏移。标量会作用在分页器的底部进入方向,用于避开 caption 或页面自定义 UI。","controller.layout.captionInset.desc":"caption 安全偏移。标量会作用在 caption 的底部进入方向,用于避免与分页器或底部控制区相切。","controller.render.desc":"完全自定义控制器渲染函数。接收 state、actions 和内置 slots;controller=false 时不会调用。","controller.overriddenBy":"由组合开关启用","snippet.overriddenByProp":"由 {umbrella} 属性覆盖","hotkey.close":"关闭 (Escape)","hotkey.zoom":"缩放 (Space)","hotkey.flip":"翻页 (←/→)","hotkey.flipLeft":"上一张 (←)","hotkey.flipRight":"下一张 (→)","hotkey.rotate":"旋转 ([ / ])","hotkey.rotateLeft":"逆时针旋转 ([)","hotkey.rotateRight":"顺时针旋转 (])","hotkey.download":"下载 (Mod+S)","hotkey.close.desc":"按 Escape 关闭查看器","hotkey.zoom.desc":"按 Space 切换 1:1 放大模式","hotkey.flip.desc":"按 ← / → 在 set 中翻页","hotkey.flipLeft.desc":"按 ← 切换到上一张","hotkey.flipRight.desc":"按 → 切换到下一张","hotkey.rotate.desc":"按 [ / ] 旋转图片 (组合开关; 同时绑定左右两个方向)","hotkey.rotateLeft.desc":"按 [ 逆时针旋转 90°","hotkey.rotateRight.desc":"按 ] 顺时针旋转 90°","hotkey.download.desc":'按 Cmd+S (macOS) 或 Ctrl+S (Windows/Linux) 下载当前图片。默认关闭 — 启用后会劫持浏览器"另存为网页"快捷键。',"animate.browsing.desc":"查看器开 / 关时的过渡动画","animate.flip.desc":"在 set 中翻页时的过渡方式","animate.slowMotion.desc":"启用后,按住 Shift 打开或关闭会把整条浏览转场放慢到 10 倍,便于观察或演示","animate.cover.desc":"封面到查看器的几何过渡","animate.cover.objectFit.desc":"打开前匹配封面图片的 object-fit / object-position 几何","animate.cover.clip.desc":"用 clip-path 匹配 img 自身可见裁切区域; 动画期间可能触发重绘, 移动端性能敏感时可关闭","animate.cover.radius.desc":"从封面圆角过渡到查看器圆角","param.src.label":"src","param.src.desc":"图片地址,必填项。","param.alt.label":"alt","param.alt.desc":"图片标题,作为大图查看时的标题显示。","param.caption.label":"caption","param.caption.desc":"大图下方的辅助文案。可传字符串使用默认胶囊样式,或传 { text, style?, className? } 自定义样式。多图时可由 set[i].caption 单独覆盖。","param.set.label":"set","param.set.desc":"图片集合;传入后启用画廊模式,左右键翻页。","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"初始页索引,从 0 开始。","param.preset.label":"preset","param.preset.desc":"预设方案,默认 auto,决定 controller / hotKey / animate / gesture 的默认值。","param.backdrop.label":"backdrop","param.backdrop.desc":"查看器背景颜色,任意有效 CSS 颜色字符串。","param.zIndex.label":"zIndex","param.zIndex.desc":"查看器层级。","param.radius.label":"radius","param.radius.desc":"图片圆角,单位 px。","param.edge.label":"edge","param.edge.desc":"图片到视口的最小边距,单位 px。","param.loop.label":"loop","param.loop.desc":"到达末尾时是否循环回到第一张。","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"滚动页面时自动关闭查看器。","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"双击图片时关闭查看器。默认关闭,启用后浏览态双击图片即退出。","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"查看时保留封面图。","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Loading 指示器显示前的延迟 (ms)。在此期间内图片加载完成则不显示 loading,避免快速切换缓存图时的视觉闪烁。默认 200ms (业界 react-loadable 经典值);设为 0 = 立即显示 (旧行为)。","param.controller.label":"controller","param.controller.desc":"控制器配置;传 false 关闭整组,或传部分对象覆盖按钮、位置、覆盖层布局和自定义渲染。","param.hotKey.label":"hotKey","param.hotKey.desc":"快捷键开关。","param.animate.label":"animate","param.animate.desc":"动画配置:浏览、封面几何、慢动作和翻页动画。","param.gesture.label":"gesture","param.gesture.desc":"跟随 preset 的手势配置。桌面在 zoom 态开启 wheelZoom;移动端默认开启 swipe、dragExit、pinchZoom 和 doubleTapZoom。gesture=false 可全部关闭。","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"查看器打开/关闭时回调,参数 boolean。","param.onZooming.label":"onZooming","param.onZooming.desc":"进入/退出放大模式时回调,参数 boolean。","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"翻页时回调,参数为新页索引。","param.onRotating.label":"onRotating","param.onRotating.desc":"旋转时回调,参数为角度。","param.onError.label":"onError","param.onError.desc":"图片加载失败时回调(封面与浏览态共用),参数为原生 SyntheticEvent。","param.browsing.label":"browsing","param.browsing.desc":"受控的浏览状态;给值即转为受控模式,需要配套 onBrowsing。","playground.preset.aria":"切换数据预设","playground.preset.default.label":"默认","playground.preset.default.hint":"童夢 · 2 张","playground.preset.testset.label":"测试集","playground.preset.testset.hint":"6 张 · 多比例多格式","docs.section.installation.title":"安装","docs.section.installation.intro":"通过包管理器安装:","docs.section.installation.agent":"AI Agent 应先阅读 https://zmage.caldis.me/llms.txt, 然后保持基础接入最小化。","docs.section.installation.then":"然后导入组件和样式表:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"对于服务端渲染应用,使用 /ssr 入口可避免在 import 阶段触碰 document:","docs.section.modes.title":"三种调用方式","docs.section.modes.intro":"react-zmage 通过三种调用方式暴露相同的配置接口,选择哪一种取决于你对页面 HTML 的控制权:","docs.section.modes.componentTitle":"组件","docs.section.modes.componentBody":"默认调用方式 —— 当你完全控制要渲染的 JSX 时使用。把 替换为 即可,所有原生 HTML 属性(className / style / onClick 等)按原样转发到内部 。","docs.section.modes.imperativeTitle":"命令式","docs.section.modes.imperativeBody":"当你没有合适的封面 ,或不希望在组件树里多挂载节点时使用。可以从事件处理器、第三方回调或异步流程中调用,在任意位置弹出查看器。返回值是一个 destructor 闭包,用于手动关闭。","docs.section.modes.wrapperTitle":"包裹器","docs.section.modes.wrapperBody":"当渲染出的 HTML 不在你的控制之内时使用 —— markdown 输出、CMS 富文本、dangerouslySetInnerHTML 等。Wrapper 会从被点击的 读取 src / alt; backdrop、控制器、快捷键、动画、回调、set 等查看器配置仍然写在 上。","docs.section.modes.wrapperNote":"包裹器会在 componentDidMount / componentDidUpdate 期间查找子节点中的 img。包裹器渲染之后再注入的图片,需等到包裹器重新渲染时才会被绑定。传入 set 时,Wrapper 会用被点击图片的 src 匹配 set 并作为初始页;不传 set 时,可从 data-zmage-caption 或最近的 figcaption 读取 caption。","docs.section.theming.title":"主题集成","docs.section.theming.intro":"react-zmage 在设计上不感知宿主站点的主题系统 —— 它不读取 prefers-color-scheme,也不绑定任何 CSS 变量框架。是否切换深浅色完全由消费方决定:","docs.section.theming.bullet.backdrop":"通过 backdrop 属性传入查看器背景色(任意有效 CSS 颜色字符串)。默认值为白色 #FFFFFF。","docs.section.theming.bullet.icons":"控制器图标使用 SVG currentColor;在你的全局样式里覆盖即可与设计系统对齐。","docs.section.theming.bullet.scoped":"所有运行时样式作用域被收敛到 #zmage 容器内,不会污染外层应用。","docs.section.theming.defaultTitle":"默认行为","docs.section.theming.defaultBody":"不传 backdrop 时,查看器使用白色背景。这在浅色站点是无感的,在深色站点会与控制器白色图标产生对比丢失:","docs.section.theming.patternTitle":"组件用法 / 受控","docs.section.theming.patternBody":"从你已有的主题 hook(next-themes / 自家 ThemeProvider 等)读 resolved 值,映射到具体颜色后传给 backdrop。建议封装成一个本地组件,集中管理:","docs.section.theming.imperativeTitle":"命令式调用","docs.section.theming.imperativeBody":"在事件处理器中读取当前 DOM 状态(例如 document.documentElement 上的主题 class),换算成 backdrop 后再调用 Zmage.browsing:","docs.section.theming.iconsTitle":"与设计系统的图标颜色对齐","docs.section.theming.iconsBody":"控制器图标在 #zmage 容器内,可以用任意 CSS 选择器覆盖颜色。如果你用 CSS 变量做主题(Tailwind shadcn 等),直接绑定到设计令牌即可:","docs.section.theming.toolbarTitle":"将工具栏与蒙版背景解耦","docs.section.theming.toolbarBody":'默认情况下工具栏容器底色等于顶层 backdrop,图标用 currentColor 渲染。当 backdrop 是深色实色时,深色图标融在深色容器上,几乎不可辨。传 controller.backdrop (容器底色) 和 controller.color (图标色) 即可解耦。单按钮字符串覆盖 (例如 controller.zoom = "#ff8800") 仍优先于 controller.color。',"docs.search.desc.installation":"通过包管理器安装并引入样式表","docs.search.desc.ssr":"服务端渲染入口,import 时不会触碰 document","docs.search.desc.modes":"组件 / 命令式 / 包裹器 —— 三种调用方式","docs.search.desc.theming":"让查看器的背景与图标与你的站点主题保持一致","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"预设选择: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"controller、hotKey、animate 与 gesture 的默认组合","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex 等界面参数","docs.search.desc.propsController":"控制栏按钮、位置和自定义渲染","docs.search.desc.propsHotkey":"快捷键: ESC / 空格 / 方向键","docs.search.desc.propsAnimate":"浏览动画与翻页动画","docs.search.desc.propsGesture":"滚轮缩放、拖拽翻页、拖拽退出、双指缩放和双击缩放","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"受控的浏览状态","docs.search.desc.examples":"单图与多图画廊示例","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet 等类型声明","docs.search.desc.migration":"从 0.x 升级的注意事项","docs.search.desc.faq":"常见集成问题与版本相关的修复说明","docs.section.props.title":"API 参数","docs.section.props.intro":"BaseType 上的所有属性,在三种调用方式中均可使用。","docs.section.props.wrapperScope.title":"Wrapper 模式下的参数范围","docs.section.props.wrapperScope.intro":" 自己不渲染封面图,而是给已有的子级 绑定查看器。因此有些参数在包裹器模式下有不同语义。","docs.section.props.wrapperScope.data":"src 和 alt 应放在子级 上。顶层 src / alt 会被点击的 DOM 节点覆盖。不传 set 时,caption 可从 data-zmage-caption 或最近的 figcaption 读取。","docs.section.props.wrapperScope.config":"set 和 defaultPage 可用于显式共享图库。若被点击图片的 src 出现在 set 中,Wrapper 会打开匹配索引;defaultPage 只作为兜底。preset、controller、hotKey、animate、backdrop、zIndex、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay 正常生效。","docs.section.props.wrapperScope.lifecycle":"onBrowsing、onZooming、onSwitching、onRotating、onError 正常生效,因为 Wrapper 内部打开的是同一个查看器。","docs.section.props.wrapperScope.controlled":"browsing 是组件模式的受控态,不能控制 Wrapper。需要用外部状态打开时,使用组件模式,或自行调用 Zmage.browsing()。","docs.section.props.interface":"界面与交互","docs.section.props.controller.keyHeader":"名称","docs.section.props.controller.descHeader":"说明","docs.section.props.controller.umbrella":"rotate 是 rotateLeft / rotateRight 的组合开关 — 启用时同时显示左右两个旋转按钮;flip 与 flipLeft / flipRight 同理。","docs.section.props.controller.layoutTitle":"覆盖层布局","docs.section.props.controller.layoutIntro":"layout 只调整工具栏、左右翻页按钮、分页器和 caption 的覆盖层偏移,不参与图片首帧和缩放动画的几何计算。数值按 px 处理,字符串按 CSS 长度透传;标量 inset 会按目标自身进入方向生效,layout.mobile 会在移动端覆盖基础布局。","docs.section.props.controller.renderTitle":"自定义渲染","docs.section.props.controller.renderIntro":"render 接收 { state, actions, slots } 并返回 React 节点。返回 null 可隐藏整个控制器层;只想替换部分 UI 时可以复用 slots。","docs.section.props.hotkey.umbrella":"flip 是 flipLeft / flipRight 的组合开关, rotate 是 rotateLeft / rotateRight 的组合开关 — 启用任一组合时同时绑定左右两侧;每侧也可单独配置。每个 entry 支持字符串描述符 (如 'Mod+S' / 'BracketLeft') 自定义按键, Mod 跨平台代表 ⌘ (mac) 或 Ctrl (win/linux)。","docs.section.props.hotkey.customTitle":"自定义按键","docs.section.props.hotkey.customIntro":"每个 hotKey 入口接受 boolean (启/禁)、string (自定义描述符) 或 string[] (多绑)。描述符使用 e.code 命名 (按键物理位置, 与键盘布局无关), Mod 前缀跨平台代表 ⌘/Ctrl, 未声明的修饰键不可同时按下 (例如 Space 不会被 Cmd+Space 误触发)。","docs.section.props.hotkey.cheatsheetTitle":"描述符速查","docs.section.props.hotkey.cheatsheet.shorthand":"单字母 / 数字短形式自动归一化","docs.section.props.hotkey.cheatsheet.arrows":"方向键","docs.section.props.hotkey.cheatsheet.punct":"标点 / 符号 (按键物理名)","docs.section.props.hotkey.cheatsheet.whitespace":"空白 / 控制键","docs.section.props.hotkey.cheatsheet.modifier":"修饰键前缀 (用 + 拼接)","docs.section.props.animate.typeHeader":"类型","set.src.desc":"图片地址,必填项","set.alt.desc":"该张图片的标题","set.caption.desc":"该张图片下方的辅助文案;若提供则覆盖外层 caption","set.className.desc":"应用到该张图片的自定义类名","set.style.desc":"应用到该张图片的自定义内联样式","docs.section.props.preset.title":"预设默认值表","docs.section.props.preset.intro":"preset 是一组打包好的默认值,会作用于 controller / hotKey / animate / gesture 四组子参数。省略 preset 时默认使用 auto。auto 在运行时根据 matchMedia('(pointer: coarse) and (hover: none)') 解析为 desktop 或 mobile;SSR 与无 matchMedia 环境下回退到 desktop。","docs.section.props.preset.subParamHeader":"子参数","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"示例","docs.section.examples.singleTitle":"单图","docs.section.examples.galleryTitle":"多图画廊","docs.section.examples.mobileTitle":"移动端手势","docs.section.examples.mobileBody":"强制使用 mobile preset,在触控设备上体验拖曳切图、拖曳退出、双指缩放和单指双击缩放。","docs.section.examples.controllerTitle":"自定义控制器","docs.section.examples.controllerBody":"可以把控制器放到屏幕边缘,也可以用 render 回调完全替换 UI,回调会收到 state 和 actions。","docs.section.examples.coverTitle":"裁剪封面","docs.section.examples.coverBody":"把 object-fit 和圆角放在封面 img 本身,打开时的首帧就能匹配封面可见裁切区域。","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"类型与运行时导出位于同一处,完整的属性联合类型为 BaseType:","docs.section.typescript.refIntro":"组件接受 ref,会转发到封面 img:","docs.section.migration.title":"迁移指南","docs.section.migration.from":"从 0.x 升级:","docs.section.migration.bullet1":"组件是 forwardRef exotic;请勿使用 new Zmage()。","docs.section.migration.bullet2":"如果你引用的是 SSR 入口,请改为 react-zmage/ssr。","docs.section.faq.title":"常见问题","docs.section.faq.tailwind-shrink.q":"为什么用了 Tailwind / normalize.css / Bootstrap 后,大图打开时比封面更小?","docs.section.faq.tailwind-shrink.a":"这些样式重置默认设置 img { max-width: 100% },会把查看器内的大图限制成封面尺寸。1.1.2 之前的版本受此影响;1.1.2+ 已为 .imageLayer 内部 img 加了防御样式,建议升级到 >=1.1.2。","docs.section.faq.r19-imperative.q":"在 React 18 / 19 下 Zmage.browsing() 返回 undefined,为什么?","docs.section.faq.r19-imperative.a":"React 17 时 RENDER.REF.current?.outBrowsing 是同步可用的,React 18+ 提交是异步的,导致旧版本拿不到引用。1.1.2 已改为返回稳定的销毁闭包,升级到 >=1.1.2 即可。","docs.section.faq.wrapper-empty.q":"为什么 打开了一个空白查看器,且控制台报 src 为空?","docs.section.faq.wrapper-empty.a":"旧版包裹器把 defaultProps.src='' 直接展开覆盖了被点击 img 的 src。1.1.2 已改为读取被点击 DOM 节点上的真实 src / alt,升级即可解决。","docs.section.faq.vite-esm.q":'在 Vite / Next.js 浏览器端调用命令式 API 时报 "no compatible mount API",为什么?',"docs.section.faq.vite-esm.a":"1.1.2 之前用 require('react-dom/client') 做运行时探测,而浏览器 ESM 没有 require 全局。1.1.2 已改为静态 import,升级到 >=1.1.2 即可。","docs.section.faq.wrapper-dynamic.q":"我在挂载之后注入的 img 没有被包裹器绑定点击事件?","docs.section.faq.wrapper-dynamic.a":"包裹器只在 componentDidMount / componentDidUpdate 时查找子节点 img。如果你绕过 React 渲染树注入 DOM(例如 dangerouslySetInnerHTML 在父级未重渲染时改动),要么强制让包裹器重渲染,要么从你自己的点击处理器中调用 Zmage.browsing()。","docs.section.faq.lazy-src.q":"我的 用 data-src / 懒加载, src 是占位图 — 打开 Zmage 看到的也是占位图, 怎么办?","docs.section.faq.lazy-src.a":"Zmage 默认从 的 src 读图, 占位图就是它能看到的全部。把要预览的真实 URL 通过 set 显式传入即可: 。命令式调用同理: Zmage.browsing({ src: realUrl })。","docs.section.faq.cover-vs-set.q":"想在页面上放缩略图, 点开时显示高清大图 — 不传 set 行吗?","docs.section.faq.cover-vs-set.a":'不行。不传 set 时, cover 的 src 就是预览图; 要"小图入口 + 大图查看"必须显式分离: 。这套模式同时解决 data-src 懒加载 (上一条 FAQ) 和 CDN 多尺寸场景。如果你想要的是"图墙/网格 + 点击进入查看模式" (gallery UI), Zmage 不直接提供 — 把图墙自己渲染好, 点击时调用 Zmage.browsing({ src, set }) 即可。',"docs.section.faq.controlled-mismatch.q":"我的受控 browsing 属性和查看器实际状态总是对不上?","docs.section.faq.controlled-mismatch.a":"受控模式必须同时提供 browsing 和 onBrowsing。只传 browsing 时内部状态只会同步一次,之后就会漂移 —— 始终成对使用即可。","docs.section.faq.ssr.q":"在 Next.js / Remix / SSR 框架中怎么用 react-zmage?","docs.section.faq.ssr.a":"使用 react-zmage/ssr 入口,它在 import 时不会触碰 document。命令式 Zmage.browsing() 如果可能在服务端代码路径或渲染期间被调用,需要加 typeof window !== 'undefined' 的保护。","docs.section.faq.theme.q":"怎么让查看器跟随我的深色 / 浅色主题?","docs.section.faq.theme.a":"按照上方「主题集成」章节传入 backdrop 即可。本库刻意不感知主题系统,也不读 prefers-color-scheme,主题映射由你的应用决定。"},yR={"nav.playground":"Playground","nav.docs":"Docs","nav.ai":"AI install guide","nav.github":"GitHub","useCases.eyebrow":"Use cases","useCases.title":"React image preview for blogs, CMS, MDX, and news pages","useCases.body":"react-zmage is a React image viewer that turns ordinary elements into a fullscreen, origin-expand image preview. It supports galleries, keyboard navigation, mobile gestures, imperative opening, Wrapper mode for rich text, and SSR/RSC usage.","useCases.cta.docs":"Read docs","useCases.cta.wrapper":"Try Wrapper mode","useCases.card.blog.title":"Blog image preview","useCases.card.blog.body":"Make article images open fullscreen without replacing your post layout or building a separate gallery surface.","useCases.card.cms.title":"CMS rich text images","useCases.card.cms.body":"Wrap rendered HTML from a CMS, markdown parser, or editor output and let existing nodes open in the viewer.","useCases.card.news.title":"News article galleries","useCases.card.news.body":"Keep editorial pages readable while giving readers keyboard, gesture, and multi-image browsing when they need detail.","useCases.card.mdx.title":"MDX and documentation images","useCases.card.mdx.body":"Use Wrapper mode for docs pages where content authors control images but the React app owns the shell.","useCases.card.lightbox.title":"React lightbox alternative","useCases.card.lightbox.body":"Use a smaller image preview layer when you want origin-expand zoom and existing markup support instead of a full gallery framework.","useCases.card.ssr.title":"Next.js, SSR, and RSC","useCases.card.ssr.body":"Import the SSR-safe subpath for server-rendered apps, then open the interactive viewer from client boundaries.","useCases.mode.eyebrow":"Choosing a mode","useCases.mode.title":"Pick based on who owns the image markup","useCases.mode.component":"You own the JSX and can replace with .","useCases.mode.imperative":"A button, command, event, or callback should open the viewer.","useCases.mode.wrapper":"The images come from CMS, MDX, markdown, or rich text HTML.","useCases.facts.eyebrow":"Entity facts","useCases.facts.title":"The short version crawlers should understand","useCases.fact.react":"React 16.8 through 19","useCases.fact.modes":"Component, imperative, and Wrapper mode","useCases.fact.input":"Keyboard navigation and mobile gestures","useCases.fact.ssr":"SSR/RSC-safe import path","useCases.fact.gallery":"Gallery browsing without page restructuring","useCases.fact.origin":"Origin-expand fullscreen image preview","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Questions people and AI agents usually ask","useCases.faq.what.q":"What is react-zmage?","useCases.faq.what.a":"react-zmage is a React image viewer that turns ordinary elements into a fullscreen, origin-expand image preview with gallery browsing, keyboard navigation, mobile gestures, Wrapper mode, and SSR/RSC support.","useCases.faq.lightbox.q":"When should I use react-zmage instead of a React lightbox?","useCases.faq.lightbox.a":"Use react-zmage when you want existing images to open fullscreen without rebuilding the page around a gallery component. It works well for blogs, CMS rich text, MDX docs, news articles, and image-heavy content pages.","useCases.faq.richText.q":"Can react-zmage handle CMS, markdown, or rich text images?","useCases.faq.richText.a":"Yes. Zmage.Wrapper can bind descendant nodes inside CMS, markdown, MDX, or dangerouslySetInnerHTML content, while preserving the page markup and layout.","useCases.faq.ssr.q":"Does react-zmage support Next.js, SSR, or RSC?","useCases.faq.ssr.a":"Yes. Use the react-zmage/ssr subpath for SSR or RSC-safe imports, and call interactive viewer APIs from client-side event handlers or client components.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Let every ","hero.title.line2":"expand in place","hero.subtitle":"Turn any into a fullscreen image viewer that expands from its original position, with keyboard, gestures, and multi-image browsing.","hero.cta.start":"Read docs","hero.cta.playground":"Play with parameters","hero.ai.label":"AI install guide: read llms.txt first","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Copy quick prompt","hero.ai.copyLabel":"Copy quick AI prompt","hero.ai.viewLlms":"view llms.txt →","ai.badge":"AI install guide","ai.title":"Create a react-zmage agent integration prompt","ai.subtitle":"Start from llms.txt. Keep Auto so your agent can inspect the project first, or fine-tune the environment, image source, and interaction strategy before copying.","ai.field.agent":"Which agent are you using?","ai.field.depth":"Setup depth","ai.field.environment":"Project environment","ai.field.mode":"Usage mode","ai.field.imageSource":"Image source","ai.field.interaction":"Interaction strategy","ai.field.project":"Project description","ai.autoTip":"Keep Auto if you are unsure. Your agent will inspect the project structure, image source, render mode, and style entry before choosing the right Zmage mode and props.","ai.project.placeholder":"Describe your app, image source, and what the viewer should do.","ai.action.copy":"Copy setup prompt","ai.action.copied":"Copied","ai.action.openLlms":"Open llms.txt","ai.copy.error":"Copy failed. Select the prompt manually from the preview.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"Updates as you choose options","ai.preview.copy":"Copy","ai.preview.expand":"Expand","ai.preview.show":"Preview prompt","ai.preview.hide":"Hide preview","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Makes the prompt fit a general coding agent.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Let the agent inspect the project first.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Set integration preferences manually.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Live interaction surface","demo.title":"A story page built from Child's Dream","demo.body":"These images come from Child's Dream: an old book, a time portal, a fox companion, a forest route, and a crystal seal. Click any image and the first frame expands from that exact crop into the viewer.","demo.shiftHint":"Hold SHIFT while clicking an image to feel the smooth transition","demo.zoomHint":"Open a tile, press Space to enter zoom, then use the wheel to keep scaling.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"A dusty book in the library corner opens a doorway to old time.","demo.story.lead":"The plain words on the page turn into a miniature scene. The boy sees a forest rising from paper and hears a call from the other side of the barrier.","demo.story.middle":"A fox becomes his companion. After tides, canopies, and pink flamingos, the route leads deeper into the forest toward a crystal seal.","demo.tile.cover":"Old book and time portal","demo.tile.gallery":"First meeting in the woods","demo.tile.ratio":"Path at the tide edge","demo.tile.controller":"Crystal seal","demo.tile.zoom":"Flamingo stopover","demo.tile.lamp":"Light under the leaves","demo.tile.rescue":"Release in the forest","demo.feature.cover":"Cover clip and radius match","demo.feature.space":"Move the pointer to scan quickly while zoomed in","demo.feature.wheel":"Use the mouse wheel to scale smoothly","demo.feature.shift":"Shift slows open and close","demo.caption":"Click an image to open the viewer. On desktop, hold SHIFT while opening, then move the pointer or use the wheel after zooming in.","demo.scene.portal.alt":"A glowing time portal on an old book","demo.scene.portal.caption":"A time portal lights up inside the old book and a forest rises from the words.","demo.scene.forest.alt":"The boy meets a fox in the forest","demo.scene.forest.caption":"The fox appears among the trees and becomes the boy's companion.","demo.scene.tide.alt":"The boy stands at the edge of a tide","demo.scene.tide.caption":"The water curls into a spiral and points toward the next unknown path.","demo.scene.canopy.alt":"The boy lies under a giant canopy","demo.scene.canopy.caption":"The canopy opens like pages while small lights mark the route.","demo.scene.flamingo.alt":"The boy sits among pink flamingos","demo.scene.flamingo.caption":"A flock of light flamingos gives the journey a quiet pause.","demo.scene.lamp.alt":"The boy lights a lamp under broad leaves","demo.scene.lamp.caption":"Leaves hold back the dark while the lamp reveals clues in the book.","demo.scene.crystal.alt":"The boy stands before a crystal seal","demo.scene.crystal.caption":"The crystal seal begins to show itself deep in the forest.","demo.scene.rescue.alt":"The fox and the boy approach the crystal seal","demo.scene.rescue.caption":"The key nears the crystal and the secret inside the seal is about to open.","feature.dropin.title":"Origin Expand","feature.dropin.hint":"Open from the image's original position, size, radius, and crop; close back to the same place.","feature.mobile.title":"Mobile ready","feature.mobile.hint":"Auto preset selects touch behavior: swipe between images, drag down to close, double tap, and pinch zoom.","feature.set.title":"Complete browsing tools","feature.set.hint":"Zoom, rotate, flip, download, and captions share one browsing state, even across multi-image sets.","feature.ssr.title":"SSR/RSC friendly","feature.ssr.hint":"Use the server-safe entry in Next.js, SSR, or RSC projects, then keep viewer interaction inside client boundaries.","modes.title":"Fit the page you already have","modes.component.label":"Component mode","modes.component.desc":"When you control JSX, replace with and keep native props passing through.","modes.imperative.label":"Imperative call","modes.imperative.desc":"Open the viewer from buttons, callbacks, or async flows without requiring a cover image.","modes.wrapper.label":"Wrapper mode","modes.wrapper.desc":"Wrap Markdown / CMS / dangerouslySetInnerHTML so inner images expand in place automatically.","modes.try":"Open example →","modes.component.when":"Choose component mode when you control the JSX you render. Replace any with ; native props keep passing through, and open / close uses the same in-place transition.","modes.imperative.when":"Choose the imperative call when the entry point is not the image itself. Open the viewer from event handlers, third-party callbacks, or async flows without mounting a cover .","modes.wrapper.when":"Choose wrapper mode when you don't control the rendered HTML — markdown output, CMS rich text, dangerouslySetInnerHTML. Wrap the subtree and every inner automatically gains the viewer.","footer.project":"Project","footer.repo":"Repository","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Use cases","footer.madeby":"Made by","footer.illustrator":"Illustrator","footer.license":"MIT License","pg.title":"Playground","pg.subtitle":"Tweak every prop and watch the viewer react in real time.","pg.reset":"Reset","pg.share":"Share","pg.shared":"Link copied","pg.tab.component":"Component","pg.tab.imperative":"Imperative","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Tip: Space to zoom · ←/→ to flip · ESC to close","pg.preview.trigger":"Trigger viewer","pg.params.title":"Parameters","pg.params.subtitle":"Hover a prop name for help, or use the book icon to open its docs.","pg.events.title":"Events","pg.events.subtitle":"Lifecycle callback output for the current session.","pg.events.empty":"Enable any lifecycle callback to see events stream here.","pg.code.title":"Code","pg.code.subtitle":"Copy-ready code for the active mode.","pg.code.hideDefaults":"Hide defaults","pg.copy":"Copy","pg.copied":"Copied","group.data":"Data","group.preset":"Preset","group.interface":"Interface","group.controller":"Controller","group.hotkey":"HotKey","group.animate":"Animate","group.gesture":"Gesture","group.lifecycle":"Lifecycle","group.controlled":"Controlled","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Desktop scope","common.presetScope.desktop.desc":"Desktop-focused parameter. The desktop preset enables it by default or is the only environment where it has practical effect.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Mobile scope","common.presetScope.mobile.desc":"Mobile or touch-focused parameter. The mobile preset enables it by default or it only matters for touch interaction.","common.expand":"Expand","common.required":"Required","common.default":"Default","common.add":"Add","common.remove":"Remove","common.enable":"Enable","common.disable":"Disable","param.viewInDocs":"View in docs","docs.title":"API Reference","docs.search.placeholder":"Search docs...","docs.search.empty":"No matches","docs.toc.title":"On this page","docs.sidebar.gettingStarted":"Getting started","docs.sidebar.quickstart":"Quickstart","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Concepts","docs.sidebar.modes":"Modes","docs.sidebar.theming":"Theming","docs.sidebar.props":"Props","docs.sidebar.recipes":"Recipes","docs.sidebar.examples":"Examples","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Reference","docs.sidebar.migration":"Migration","docs.sidebar.faq":"FAQ","preset.desktop":"Desktop","preset.mobile":"Mobile","preset.auto":"Auto","animate.flip.fade":"Fade","animate.flip.crossFade":"Cross fade","animate.flip.swipe":"Swipe","animate.flip.zoom":"Zoom","animate.flip.blur":"Blur","animate.flip.none":"None","animate.slowMotion":"Slow motion","gesture.swipe":"Swipe","gesture.dragExit":"Drag exit","gesture.wheelZoom":"Wheel zoom","gesture.pinchZoom":"Pinch zoom","gesture.doubleTapZoom":"Double-tap zoom","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Preset-driven gesture config. Desktop preset enables wheel zoom while zoomed; mobile preset enables drag paging, drag-to-exit, pinch zoom, and double-tap zoom.","gesture.swipe.desc":"Horizontal drag paging within a set. Ignored for single-image viewers.","gesture.dragExit.desc":"Vertical drag-to-exit. Closes through the existing onBrowsing(false) close path.","gesture.wheelZoom.desc":"Mouse-wheel or trackpad zoom while the viewer is already zoomed. Desktop preset enables it; mobile preset disables it.","gesture.pinchZoom.desc":"Two-finger pinch zoom on mobile. Shrinking back to the fit scale exits zoom and recenters the image.","gesture.doubleTapZoom.desc":"Single-finger double tap on mobile. First double tap zooms around the tap position; double tap while zoomed returns to the fit view.","gesture.touchAction.desc":"CSS touch-action strategy. managed chooses none for pinch zoom and manipulation for double-tap-only setups; explicit values are passed through.","gesture.threshold.desc":"Minimum drag distance required to accept the gesture, in px.","gesture.velocity.desc":"Minimum velocity required to accept the gesture, in px/ms.","gesture.axisLock.desc":"Axis-lock ratio used to avoid diagonal movement triggering both horizontal and vertical gestures.","gesture.resistance.desc":"Boundary resistance ratio when loop=false and the viewer is at the first or last image.","gesture.opacity.desc":"Whether vertical drag-to-exit lowers image opacity as drag distance grows.","gesture.wheelZoom.step.desc":"Wheel zoom sensitivity. Higher values zoom faster for the same wheel delta.","gesture.wheelZoom.smooth.desc":"Interpolate wheel zoom through the existing zoom-follow RAF instead of snapping immediately.","gesture.wheelZoom.minScale.desc":"Minimum wheel zoom scale. Reaching it with zoom-out exits zoom mode.","gesture.wheelZoom.maxScale.desc":"Maximum wheel zoom scale.","gesture.wheelZoom.center.desc":"Wheel zoom focal point: pointer uses the wheel event position; viewport uses the screen center.","gesture.wheelZoom.reverse.desc":"Reverse wheel zoom direction while keeping all other wheel behavior unchanged.","gesture.wheelZoom.exitGuardDuration.desc":"Protection time after wheel zoom-out exits zoom mode, in ms. Residual wheel events are ignored during this window.","gesture.pinchZoom.minScale.desc":"Minimum pinch scale. fit means the screen-fitting browsing size.","gesture.pinchZoom.maxScale.desc":"Maximum pinch scale.","gesture.pinchZoom.resetBelowFit.desc":"When pinch shrinks to the fit scale, exit zoom and recenter the image.","gesture.pinchZoom.center.desc":"Pinch focal point: gesture uses the two-finger midpoint; viewport uses the screen center.","gesture.doubleTapZoom.scale.desc":"Target scale for entering zoom with a double tap.","gesture.doubleTapZoom.minScale.desc":"Minimum scale used to clamp double-tap zoom.","gesture.doubleTapZoom.maxScale.desc":"Maximum scale used to clamp double-tap zoom.","gesture.doubleTapZoom.center.desc":"Double-tap focal point: tap uses the tap position; viewport uses the screen center.","gesture.doubleTapZoom.interval.desc":"Maximum time between taps, in ms.","gesture.doubleTapZoom.distance.desc":"Maximum movement between taps, in px.","controller.pagination":"Pagination","controller.rotate":"Rotate","controller.rotateLeft":"Rotate left","controller.rotateRight":"Rotate right","controller.zoom":"Zoom","controller.download":"Download","controller.close":"Close","controller.flip":"Flip","controller.flipLeft":"Previous","controller.flipRight":"Next","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Top-bar page indicator showing current position / total pages","controller.rotate.desc":"Rotation control group (includes left and right buttons)","controller.rotateLeft.desc":"Rotate 90° counter-clockwise","controller.rotateRight.desc":"Rotate 90° clockwise","controller.zoom.desc":"Enter / leave 1:1 zoom mode","controller.download.desc":"Download the current image","controller.close.desc":"Close the viewer","controller.flip.desc":"Flip control group (includes previous and next buttons)","controller.flipLeft.desc":"Move to the previous image","controller.flipRight.desc":"Move to the next image","controller.backdrop.desc":"Toolbar background. Falls back to top-level `backdrop` when omitted. Set to a translucent value (e.g. `rgba(0,0,0,0.4)`) when `backdrop` is solid dark.","controller.color.desc":'Toolbar icon color. Falls back to `currentColor` when omitted. Per-button string overrides (e.g. `controller.zoom = "#ff8800"`) still take precedence.',"controller.placement.desc":"Toolbar placement. Only moves the toolbar capsule; side flip buttons and pagination keep their normal positions.","controller.layout.desc":"Adjust safe insets for the toolbar, side flip buttons, pagination, and caption. Numbers are px, strings are CSS lengths; scalar inset follows each target's natural entry edge, and layout.mobile overrides the mobile preset.","controller.layout.toolbarInset.desc":"Safe inset for the toolbar. A scalar follows the current placement and applies to the matching top / right / bottom / left edge.","controller.layout.flipInset.desc":"Safe inset for the side flip buttons. A scalar applies to both left and right buttons.","controller.layout.paginationInset.desc":"Safe inset for pagination dots. A scalar applies to the pagination bottom entry edge, useful when caption or custom page UI needs extra space.","controller.layout.captionInset.desc":"Safe inset for the caption. A scalar applies to the caption bottom entry edge, useful when it should sit above pagination or bottom controls.","controller.render.desc":"Fully custom controller render callback. Receives state, actions, and built-in slots; disabled when controller=false.","controller.overriddenBy":"Enabled by","snippet.overriddenByProp":"overridden by {umbrella}","hotkey.close":"Close (Escape)","hotkey.zoom":"Zoom (Space)","hotkey.flip":"Flip (←/→)","hotkey.flipLeft":"Previous (←)","hotkey.flipRight":"Next (→)","hotkey.rotate":"Rotate ([ / ])","hotkey.rotateLeft":"Rotate left ([)","hotkey.rotateRight":"Rotate right (])","hotkey.download":"Download (Mod+S)","hotkey.close.desc":"Press Escape to close the viewer","hotkey.zoom.desc":"Press Space to toggle 1:1 zoom mode","hotkey.flip.desc":"Press ← / → to flip pages within a set","hotkey.flipLeft.desc":"Press ← to move to the previous image","hotkey.flipRight.desc":"Press → to move to the next image","hotkey.rotate.desc":"Press [ / ] to rotate the image (umbrella; binds both directions)","hotkey.rotateLeft.desc":"Press [ to rotate counterclockwise 90°","hotkey.rotateRight.desc":"Press ] to rotate clockwise 90°","hotkey.download.desc":'Press Cmd+S (macOS) or Ctrl+S (Windows/Linux) to download the current image. Off by default — opt in to hijack the browser "Save Page As" shortcut.',"animate.browsing.desc":"Open / close transition for the viewer","animate.flip.desc":"Transition style when flipping pages within a set","animate.slowMotion.desc":"When enabled, holding Shift while opening or closing slows the full browsing transition to 10x for inspection or demos","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"Image URL. Required.","param.alt.label":"alt","param.alt.desc":"Image title, shown above the viewer.","param.caption.label":"caption","param.caption.desc":"Caption below the viewer. string for the default pill, or { text, style?, className? } to customize. set[i].caption may override per page.","param.set.label":"set","param.set.desc":"Multi-image set; enables gallery mode with arrow-key navigation.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Initial page index (0-based).","param.preset.label":"preset","param.preset.desc":"Preset bundle; defaults to auto and drives controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Viewer backdrop color. Any valid CSS color.","param.zIndex.label":"zIndex","param.zIndex.desc":"Stacking level for the viewer.","param.radius.label":"radius","param.radius.desc":"Image corner radius (px).","param.edge.label":"edge","param.edge.desc":"Minimum margin between image and viewport (px).","param.loop.label":"loop","param.loop.desc":"Loop back to the first image when reaching the end.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Close the viewer when the page scrolls.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Close the viewer on image double-click. Off by default; turn on to dismiss with a double-click.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Keep the cover image visible while browsing.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Delay (ms) before showing the loading indicator. If the image loads within this window, the indicator never appears — prevents the flash on cached page changes. Default 200ms (industry-standard react-loadable value); set 0 for legacy instant-show.","param.controller.label":"controller","param.controller.desc":"Control-bar config. Pass false to disable all, or a partial object to override buttons, placement, overlay layout, and custom render.","param.hotKey.label":"hotKey","param.hotKey.desc":"Keyboard shortcuts.","param.animate.label":"animate","param.animate.desc":"Animation config: browsing, cover geometry, slow motion, and flip animation.","param.gesture.label":"gesture","param.gesture.desc":"Preset-driven gesture config. Desktop enables wheelZoom while zoomed; mobile enables swipe, dragExit, pinchZoom, and doubleTapZoom by default. gesture=false disables all.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Fired when the viewer opens/closes (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Fired when entering/leaving zoom mode (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Fired on page change (new page index).","param.onRotating.label":"onRotating","param.onRotating.desc":"Fired on rotation (degrees).","param.onError.label":"onError","param.onError.desc":"Fired when an image (cover or viewer) fails to load. Receives the SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"Controlled browsing state. Providing this switches to controlled mode; pair with onBrowsing.","playground.preset.aria":"Switch data preset","playground.preset.default.label":"Default","playground.preset.default.hint":"Childs Dream · 2 imgs","playground.preset.testset.label":"Test set","playground.preset.testset.hint":"6 imgs · ratios + formats","docs.section.installation.title":"Installation","docs.section.installation.intro":"Install via your package manager:","docs.section.installation.agent":"AI agents should read https://zmage.caldis.me/llms.txt first, then keep basic integrations minimal.","docs.section.installation.then":"Then import the component and its stylesheet:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"For server-rendered apps, use the /ssr entry to avoid touching document at import time:","docs.section.modes.title":"Three modes","docs.section.modes.intro":"react-zmage exposes the same configuration surface through three call shapes; which one to pick depends on how much control you have over the rendered HTML:","docs.section.modes.componentTitle":"Component","docs.section.modes.componentBody":"The default — use this when you control the JSX you render. Swap any for ; every native HTML attribute (className, style, onClick, etc.) passes through to the underlying .","docs.section.modes.imperativeTitle":"Imperative","docs.section.modes.imperativeBody":"Reach for this when you have no good cover , or don't want to mount extra nodes in your component tree. Call from event handlers, async callbacks, or third-party widgets to open the viewer from anywhere. Returns a destructor closure for manual close.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"Use this when you don't control the rendered HTML — markdown output, CMS rich text, dangerouslySetInnerHTML. Wrapper reads src / alt from the clicked ; viewer props such as backdrop, controls, hotkeys, animation, callbacks, and set stay on .","docs.section.modes.wrapperNote":"Wrapper queries img children during componentDidMount / componentDidUpdate. Imgs injected after the wrapper renders won't get bound until the wrapper re-renders. If set is supplied, the clicked img's src is matched against set and used as the initial page; if no set is supplied, data-zmage-caption or the nearest figcaption can become the viewer caption.","docs.section.theming.title":"Theming","docs.section.theming.intro":"react-zmage is intentionally agnostic to the host site's theme system — it does not read prefers-color-scheme and is not bound to any CSS-variable framework. Light/dark integration is the consumer's responsibility:","docs.section.theming.bullet.backdrop":"The viewer backdrop is set via the `backdrop` prop (any valid CSS color string). Default is white (#FFFFFF).","docs.section.theming.bullet.icons":"Control-bar icons render with SVG `currentColor`; override via your global CSS to align with your design system.","docs.section.theming.bullet.scoped":"All runtime styles are scoped under the `#zmage` portal container; they will not bleed into the rest of your app.","docs.section.theming.defaultTitle":"Default behavior","docs.section.theming.defaultBody":"When you omit `backdrop`, the viewer renders with a white panel. This is fine on light sites but produces poor contrast against the white control-bar icons on a dark site:","docs.section.theming.patternTitle":"Component / controlled usage","docs.section.theming.patternBody":"Read your existing theme hook (next-themes, a custom ThemeProvider, etc.), map the resolved value to a color, and pass it as `backdrop`. Wrapping in a small local component keeps the call sites clean:","docs.section.theming.imperativeTitle":"Imperative usage","docs.section.theming.imperativeBody":"In an event handler, read the current DOM state (e.g. a theme class on `documentElement`), translate it to a color, then pass it to `Zmage.browsing`:","docs.section.theming.iconsTitle":"Aligning icons with the design system","docs.section.theming.iconsBody":"Control icons live inside the `#zmage` container; override their color from your global CSS. If you use CSS variables for theming (Tailwind / shadcn / vanilla tokens), bind directly to the design token:","docs.section.theming.toolbarTitle":"Decoupling the toolbar from the modal backdrop","docs.section.theming.toolbarBody":'By default the toolbar capsule shares the modal `backdrop` and icons render with `currentColor`. On a solid dark `backdrop` that means dark icons on a dark capsule — invisible. Pass `controller.backdrop` (capsule color) and `controller.color` (icon color) to decouple them. Per-button string overrides (e.g. `controller.zoom = "#ff8800"`) still take precedence over `controller.color`.',"docs.search.desc.installation":"Install via your package manager and import the stylesheet","docs.search.desc.ssr":"Server-side-rendering entry that does not touch document at import time","docs.search.desc.modes":"Component / imperative / wrapper — three ways to invoke the viewer","docs.search.desc.theming":"Align the viewer backdrop and icons with your host site theme","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Preset selection: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Default controller, hotKey, animate, and gesture bundles","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex and other UI knobs","docs.search.desc.propsController":"Buttons, placement, and custom controller render","docs.search.desc.propsHotkey":"Keyboard shortcuts: ESC / Space / arrows","docs.search.desc.propsAnimate":"Browsing and flip animations","docs.search.desc.propsGesture":"Wheel zoom, drag paging, drag-to-exit, pinch, and double-tap zoom","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"Controlled browsing state","docs.search.desc.examples":"Single image and multi-image gallery examples","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet type declarations","docs.search.desc.migration":"Upgrade notes from 0.x","docs.search.desc.faq":"Common integration gotchas and version-specific fixes","docs.section.props.title":"Props","docs.section.props.intro":"Every prop on BaseType can be passed in any of the three modes.","docs.section.props.wrapperScope.title":"Wrapper mode prop scope","docs.section.props.wrapperScope.intro":" does not render the cover image itself. It binds existing descendant nodes, so a few props have wrapper-specific meaning.","docs.section.props.wrapperScope.data":"src and alt should live on the child . Top-level src / alt are overridden by the clicked DOM node. caption may be read from data-zmage-caption or the nearest figcaption when no set is supplied.","docs.section.props.wrapperScope.config":"set and defaultPage are supported for an explicit shared gallery. When the clicked img src appears in set, Wrapper opens that matching index; defaultPage is only the fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, and loadingDelay apply normally.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating, and onError work because Wrapper opens the same viewer internally.","docs.section.props.wrapperScope.controlled":"browsing is component-controlled state and does not control Wrapper. To open from your own state, use component mode or call Zmage.browsing() yourself.","docs.section.props.interface":"Interface & interaction","docs.section.props.controller.keyHeader":"Key","docs.section.props.controller.descHeader":"Description","docs.section.props.controller.umbrella":"rotate is the umbrella for rotateLeft / rotateRight — enabling it shows both buttons. flip works the same way over flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Overlay layout","docs.section.props.controller.layoutIntro":"layout only offsets toolbar, side flip, pagination, and caption overlays; it does not participate in first-frame or zoom geometry. Numbers are px, strings are CSS lengths, scalar inset follows each target's natural entry edge, and layout.mobile overrides the base layout on mobile.","docs.section.props.controller.renderTitle":"Custom render","docs.section.props.controller.renderIntro":"render receives { state, actions, slots } and must return a React node. Return null to hide the controller layer; reuse slots when you only want to replace part of the UI.","docs.section.props.hotkey.umbrella":"flip is the umbrella for flipLeft / flipRight, and rotate is the umbrella for rotateLeft / rotateRight — enabling either binds both side keys. Each entry also accepts a string descriptor like 'Mod+S' or 'BracketLeft' to override the default binding (Mod = ⌘ on macOS, Ctrl on Windows/Linux).","docs.section.props.hotkey.customTitle":"Custom bindings","docs.section.props.hotkey.customIntro":"Each hotKey entry accepts a boolean (on/off), a string (custom descriptor), or a string[] (multiple bindings). Descriptors use e.code names — physical key positions, layout-independent. Modifier prefixes use Mod for cross-platform ⌘/Ctrl. Strict modifier matching: undeclared modifiers must NOT be pressed (e.g. Space is never matched by Cmd+Space).","docs.section.props.hotkey.cheatsheetTitle":"Descriptor cheatsheet","docs.section.props.hotkey.cheatsheet.shorthand":"single letters / digits auto-normalized","docs.section.props.hotkey.cheatsheet.arrows":"arrow keys","docs.section.props.hotkey.cheatsheet.punct":"punctuation (physical key names)","docs.section.props.hotkey.cheatsheet.whitespace":"whitespace / control keys","docs.section.props.hotkey.cheatsheet.modifier":"modifier prefixes (chain with +)","docs.section.props.animate.typeHeader":"Type","set.src.desc":"Image URL — required","set.alt.desc":"Image title for this entry","set.caption.desc":"Caption below this entry; overrides the outer caption when provided","set.className.desc":"Custom class applied to this entry","set.style.desc":"Custom inline style applied to this entry","docs.section.props.preset.title":"Preset bundles","docs.section.props.preset.intro":"preset is a bundle of defaults applied to the controller / hotKey / animate / gesture sub-objects. Omitting preset uses auto. auto is resolved at runtime via matchMedia('(pointer: coarse) and (hover: none)') to either desktop or mobile, falling back to desktop under SSR or when matchMedia is unavailable.","docs.section.props.preset.subParamHeader":"Sub-param","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Examples","docs.section.examples.singleTitle":"Single image","docs.section.examples.galleryTitle":"Multi-image gallery","docs.section.examples.mobileTitle":"Mobile gestures","docs.section.examples.mobileBody":"Force the mobile preset to try drag paging, drag-to-exit, pinch zoom, and double-tap zoom on touch devices.","docs.section.examples.controllerTitle":"Custom controller","docs.section.examples.controllerBody":"Place the controller at a screen edge, or replace the full UI with a render callback that receives state and actions.","docs.section.examples.coverTitle":"Cropped cover","docs.section.examples.coverBody":"Put object-fit and border radius on the cover img itself so the opening frame can match the visible crop.","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Types are co-located with the runtime export. The full prop union is BaseType:","docs.section.typescript.refIntro":"The component accepts a ref, which forwards to the cover img:","docs.section.migration.title":"Migration","docs.section.migration.from":"Upgrading from 0.x:","docs.section.migration.bullet1":"Component is a forwardRef exotic; do not new Zmage().","docs.section.migration.bullet2":"If you import the SSR entry, switch to react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"Why does the modal image start smaller than the cover when I use Tailwind / normalize.css / Bootstrap?","docs.section.faq.tailwind-shrink.a":"Those resets ship a global `img { max-width: 100% }` which clamps the modal image to its cover size. Versions before 1.1.2 were affected; 1.1.2+ defends `.imageLayer` against this. Upgrade to >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` returns undefined under React 18 / 19 — why?","docs.section.faq.r19-imperative.a":"Latent bug fixed in 1.1.2. The old code read `RENDER.REF.current?.outBrowsing` synchronously, which worked under React 17 but breaks under R18+ (commits are async). 1.1.2 returns a stable destructor closure — upgrade to >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` opens a blank modal and the browser warns about empty src. Why?","docs.section.faq.wrapper-empty.a":"The wrapper used to spread `defaultProps.src=''` over the clicked img, blanking out src/alt. 1.1.2 reads the clicked DOM node's src/alt explicitly. Upgrade to fix.","docs.section.faq.vite-esm.q":'Imperative API throws "no compatible mount API" in Vite / Next.js client. Why?',"docs.section.faq.vite-esm.a":"Pre-1.1.2 used `require('react-dom/client')` for runtime detection, but browser ESM has no `require` global. 1.1.2 switches to a static import — upgrade to >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"Wrapper isn't binding click handlers to images I added after mount.","docs.section.faq.wrapper-dynamic.a":"Wrapper queries `` only in `componentDidMount` and `componentDidUpdate`. If you inject DOM imgs outside React's render tree (e.g. dangerouslySetInnerHTML changing without a parent re-render), force the wrapper to re-render — or call `Zmage.browsing()` from your own click handler instead.","docs.section.faq.lazy-src.q":"My `` uses lazy-loading with `data-src` — opening Zmage shows the placeholder, not the real image. How do I fix it?","docs.section.faq.lazy-src.a":"Zmage reads the cover ``'s `src` by default — the placeholder is all it sees. Pass the real URL explicitly via `set`: ``. Same idea for the imperative call: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"I want a thumbnail on the page and the full-resolution image when clicked — can I skip `set`?","docs.section.faq.cover-vs-set.a":'No. Without `set`, the cover `src` is what the viewer shows. To get a "thumbnail entrypoint + full-size viewer", separate them explicitly: ``. The same pattern handles lazy-loaded `data-src` (FAQ above) and CDN multi-resolution. If you want a "grid/gallery + open viewer" UI, Zmage doesn\'t provide that — render the gallery yourself and call `Zmage.browsing({ src, set })` on click.',"docs.section.faq.controlled-mismatch.q":"My controlled `browsing` prop and the modal state are out of sync.","docs.section.faq.controlled-mismatch.a":"Controlled mode requires both `browsing` and `onBrowsing`. If you pass only `browsing` (no callback), internal state syncs once and then drifts. Always pair them.","docs.section.faq.ssr.q":"How do I use react-zmage in Next.js / Remix / SSR frameworks?","docs.section.faq.ssr.a":"Use the `react-zmage/ssr` entry — it avoids touching `document` at import time. The imperative `Zmage.browsing()` still needs a `typeof window !== 'undefined'` guard if it might run during render or in a server-only path.","docs.section.faq.theme.q":"How do I make the viewer follow my dark/light theme?","docs.section.faq.theme.a":"Pass `backdrop` per the Theming section above. The library is theme-agnostic by design and does not read prefers-color-scheme — your app owns the mapping."},bR={"nav.playground":"プレイグラウンド","nav.docs":"ドキュメント","nav.ai":"AI 導入ガイド","nav.github":"GitHub","useCases.eyebrow":"ユースケース","useCases.title":"ブログ、CMS、MDX、ニュース向けの React 画像プレビュー","useCases.body":"react-zmage は、通常の を元の位置から開くフルスクリーン画像プレビューに変える React 画像ビューアです。ギャラリー、キーボード操作、モバイルジェスチャー、命令的な起動、リッチテキスト向け Wrapper モード、SSR/RSC に対応します。","useCases.cta.docs":"ドキュメントを見る","useCases.cta.wrapper":"Wrapper モードを試す","useCases.card.blog.title":"ブログ画像プレビュー","useCases.card.blog.body":"記事レイアウトを置き換えたり別のギャラリー画面を作ったりせずに、記事内画像をフルスクリーンで開けます。","useCases.card.cms.title":"CMS リッチテキスト画像","useCases.card.cms.body":"CMS、Markdown パーサー、エディターが出力した HTML を包み、既存の からビューアを開けます。","useCases.card.news.title":"ニュース記事ギャラリー","useCases.card.news.body":"記事本文の読みやすさを保ちつつ、詳細を見たい時だけキーボード、ジェスチャー、複数画像閲覧を使えます。","useCases.card.mdx.title":"MDX とドキュメント画像","useCases.card.mdx.body":"画像はコンテンツ作者が管理し、React アプリがページシェルを持つドキュメントでは Wrapper モードが使えます。","useCases.card.lightbox.title":"React lightbox の代替","useCases.card.lightbox.body":"完全なギャラリー基盤ではなく、元位置から開く画像プレビューと既存マークアップの維持だけが必要な時に使えます。","useCases.card.ssr.title":"Next.js、SSR、RSC","useCases.card.ssr.body":"サーバーレンダリングアプリでは SSR 安全なサブパスを import し、クライアント境界からインタラクティブなビューアを開きます。","useCases.mode.eyebrow":"モード選択","useCases.mode.title":"画像マークアップを誰が持つかで選ぶ","useCases.mode.component":"JSX を管理していて、 に置き換えられる場合。","useCases.mode.imperative":"ボタン、コマンド、イベント、コールバックからビューアを開きたい場合。","useCases.mode.wrapper":"画像が CMS、MDX、Markdown、リッチテキスト HTML から来る場合。","useCases.facts.eyebrow":"エンティティ情報","useCases.facts.title":"クローラーに伝えたい短い事実","useCases.fact.react":"React 16.8 から 19 まで対応","useCases.fact.modes":"Component、imperative、Wrapper モード","useCases.fact.input":"キーボード操作とモバイルジェスチャー","useCases.fact.ssr":"SSR/RSC 安全な import パス","useCases.fact.gallery":"ページを組み替えずに複数画像を閲覧","useCases.fact.origin":"元位置から開くフルスクリーン画像プレビュー","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"人と AI Agent がよく聞くこと","useCases.faq.what.q":"react-zmage とは?","useCases.faq.what.a":"react-zmage は、通常の を元位置から開くフルスクリーン画像プレビューに変える React 画像ビューアです。ギャラリー、キーボード操作、モバイルジェスチャー、Wrapper モード、SSR/RSC に対応します。","useCases.faq.lightbox.q":"React lightbox ではなく react-zmage を使うのはどんな時?","useCases.faq.lightbox.a":"既存画像をフルスクリーンで見せたいが、ページ全体をギャラリーコンポーネント中心に作り直したくない時に向いています。ブログ、CMS リッチテキスト、MDX ドキュメント、ニュース記事、画像の多いコンテンツページに合います。","useCases.faq.richText.q":"CMS、Markdown、リッチテキスト画像も扱えますか?","useCases.faq.richText.a":"はい。Zmage.Wrapper は CMS、Markdown、MDX、dangerouslySetInnerHTML の中にある子孫 をバインドし、既存のマークアップとレイアウトを保てます。","useCases.faq.ssr.q":"Next.js、SSR、RSC に対応していますか?","useCases.faq.ssr.a":"はい。SSR や RSC では react-zmage/ssr サブパスから import し、インタラクティブな API はクライアントイベントや Client Component から呼び出します。","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"すべての を","hero.title.line2":"元の位置から開く","hero.subtitle":"任意の を、元の位置から開くフルスクリーン画像ビューアに変えます。キーボード、ジェスチャー、複数画像の閲覧に対応します。","hero.cta.start":"ドキュメントを見る","hero.cta.playground":"各種パラメータを試す","hero.ai.label":"AI 導入ガイド: まず llms.txt を読む","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"クイック Prompt をコピー","hero.ai.copyLabel":"クイック AI Prompt をコピー","hero.ai.viewLlms":"llms.txt を表示 →","ai.badge":"AI 導入ガイド","ai.title":"react-zmage の Agent 統合 Prompt を作成","ai.subtitle":"まず llms.txt から始めてください。Auto のままにすると Agent が先にプロジェクトを確認します。必要なら環境、画像ソース、操作方針を細かく指定できます。","ai.field.agent":"どの Agent を使いますか?","ai.field.depth":"設定の深さ","ai.field.environment":"プロジェクト環境","ai.field.mode":"使用モード","ai.field.imageSource":"画像ソース","ai.field.interaction":"インタラクション方針","ai.field.project":"プロジェクト説明","ai.autoTip":"迷ったら Auto のままで構いません。Agent が先にプロジェクト構造、画像ソース、レンダリング方式、スタイル入口を確認し、適切な Zmage モードと props を選びます。","ai.project.placeholder":"アプリ、画像ソース、viewer に求める動作を説明してください。","ai.action.copy":"setup prompt をコピー","ai.action.copied":"コピーしました","ai.action.openLlms":"llms.txt を開く","ai.copy.error":"コピーに失敗しました。プレビューから prompt を手動で選択してください。","ai.preview.title":"Setup prompt","ai.preview.subtitle":"選択に合わせて更新されます","ai.preview.copy":"コピー","ai.preview.expand":"展開","ai.preview.show":"Prompt をプレビュー","ai.preview.hide":"プレビューを閉じる","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"一般的なコーディング Agent 向けの prompt にします。","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Agent に先にプロジェクトを確認させます。","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"統合方針を手動で指定します。","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"実際に操作できるサーフェス","demo.title":"Child's Dream の物語を一枚の紙面に組む","demo.body":"Child's Dream の画像を使い、古い本、時間の入口、狐、森の道、水晶の封印を不規則な紙面に並べています。どの画像をクリックしても、その切り抜き位置からビューアへ滑らかに広がります。","demo.shiftHint":"SHIFT を押しながら画像をクリックし、なめらかな遷移を感じてください","demo.zoomHint":"画像を開き、Space でズームに入り、その後ホイールでさらに拡大縮小できます。","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"図書館の片隅にある埃をかぶった本が、古い時間への入口を開きます。","demo.story.lead":"ページの何気ない文字が小さな本物の景色へ変わり、少年は紙から森が立ち上がるのを見て、結界の向こうからの呼び声を聞きます。","demo.story.middle":"狐が彼の旅の仲間になります。潮、樹冠、ピンクのフラミンゴを越え、道は森の奥の水晶の封印へ続きます。","demo.tile.cover":"古い本と時間の入口","demo.tile.gallery":"森での最初の出会い","demo.tile.ratio":"潮の縁の道","demo.tile.controller":"水晶の封印","demo.tile.zoom":"フラミンゴの休息地","demo.tile.lamp":"葉の下の明かり","demo.tile.rescue":"森の中の解放","demo.feature.cover":"カバーの clip と角丸が一致","demo.feature.space":"拡大中にポインターを動かして素早く見渡す","demo.feature.wheel":"マウスホイールでなめらかに倍率を切り替える","demo.feature.shift":"Shift で開閉をスローに","demo.caption":"画像をクリックしてビューアを開きます。デスクトップでは SHIFT を押しながら開き、ズーム後にポインター移動やホイール操作を試せます。","demo.scene.portal.alt":"古い本に光る時間の入口","demo.scene.portal.caption":"古い本の中央で時間の入口が光り、文字の中から森が立ち上がります。","demo.scene.forest.alt":"少年が森で狐に出会う","demo.scene.forest.caption":"狐が木々の間に現れ、少年の旅の仲間になります。","demo.scene.tide.alt":"少年が潮の縁に立つ","demo.scene.tide.caption":"水面が渦を巻き、次の未知の道を示します。","demo.scene.canopy.alt":"少年が大きな樹冠の下に横たわる","demo.scene.canopy.caption":"樹冠がページのように開き、小さな光が道を示します。","demo.scene.flamingo.alt":"少年がピンクのフラミンゴの間に座る","demo.scene.flamingo.caption":"軽やかなフラミンゴの群れが旅に静かな間を作ります。","demo.scene.lamp.alt":"少年が大きな葉の下で灯りをともす","demo.scene.lamp.caption":"葉が暗闇を遮り、灯りが本の中の手がかりを照らします。","demo.scene.crystal.alt":"少年が水晶の封印の前に立つ","demo.scene.crystal.caption":"森の奥で水晶の封印が姿を現し始めます。","demo.scene.rescue.alt":"狐と少年が水晶の封印に近づく","demo.scene.rescue.caption":"鍵が水晶に近づき、封印の中の秘密が開こうとしています。","feature.dropin.title":"原位置展開","feature.dropin.hint":"画像の位置、サイズ、角丸、切り抜き状態から開き、閉じると同じ場所へ戻ります。","feature.mobile.title":"モバイル対応","feature.mobile.hint":"Auto preset がタッチ操作を選びます。スワイプで切替、下方向ドラッグで閉じる、ダブルタップ、ピンチズームに対応します。","feature.set.title":"閲覧操作をまとめて提供","feature.set.hint":"ズーム、回転、ページ送り、ダウンロード、caption が同じ閲覧状態で動き、複数画像でも連続します。","feature.ssr.title":"SSR/RSC に対応","feature.ssr.hint":"Next.js、SSR、RSC ではサーバー安全な入口を使い、viewer の操作はクライアント境界に置けます。","modes.title":"今あるページ構造に合わせて接続","modes.component.label":"コンポーネントモード","modes.component.desc":"JSX を制御できるなら、 に置き換え、ネイティブ props はそのまま渡します。","modes.imperative.label":"命令的呼び出し","modes.imperative.desc":"ボタン、callback、非同期処理から開けます。ページ上のカバー画像は不要です。","modes.wrapper.label":"ラッパーモード","modes.wrapper.desc":"Markdown / CMS / dangerouslySetInnerHTML を包み、内部画像を自動で原位置展開します。","modes.try":"例を開く →","modes.component.when":"レンダリングする JSX を制御できるなら、コンポーネントモードを選びます。任意の に置き換えるだけで、ネイティブ props はそのまま渡り、開閉は同じ原位置展開でつながります。","modes.imperative.when":"入口が画像そのものではない場合は、命令的呼び出しを選びます。イベントハンドラ、サードパーティ callback、非同期処理から、カバー用 を追加せずにビューアを開けます。","modes.wrapper.when":"レンダリングされる HTML を自分で制御できない場合は、ラッパーモードを選びます。markdown、CMS リッチテキスト、dangerouslySetInnerHTML などを包むだけで、内部の が自動的にビューアを獲得します。","footer.project":"プロジェクト","footer.repo":"リポジトリ","footer.issues":"Issues","footer.changelog":"変更履歴","footer.useCases":"ユースケース","footer.madeby":"制作","footer.illustrator":"イラスト","footer.license":"MIT ライセンス","pg.title":"プレイグラウンド","pg.subtitle":"各 prop を調整して、ビューアの反応をリアルタイムに確認できます。","pg.reset":"リセット","pg.share":"共有","pg.shared":"リンクをコピーしました","pg.tab.component":"コンポーネント","pg.tab.imperative":"命令式","pg.tab.wrapper":"ラッパー","pg.preview.tip":"ヒント:Space でズーム · ←/→ でページ送り · ESC で閉じる","pg.preview.trigger":"ビューアを開く","pg.params.title":"パラメータ","pg.params.subtitle":"prop 名にホバーすると説明を表示し、本アイコンから該当 docs を開けます。","pg.events.title":"イベント","pg.events.subtitle":"現在のセッションのライフサイクル callback 出力です。","pg.events.empty":"ライフサイクルコールバックを有効にすると、ここにイベントが流れます。","pg.code.title":"コード","pg.code.subtitle":"現在のモードでコピーできるコードです。","pg.code.hideDefaults":"デフォルト値を非表示","pg.copy":"コピー","pg.copied":"コピーしました","group.data":"データ","group.preset":"プリセット","group.interface":"インターフェース","group.controller":"コントローラー","group.hotkey":"ホットキー","group.animate":"アニメーション","group.gesture":"Gesture","group.lifecycle":"ライフサイクル","group.controlled":"制御コンポーネント","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"デスクトップ範囲","common.presetScope.desktop.desc":"デスクトップ向けのパラメータです。desktop preset で既定有効、またはデスクトップでのみ実用的な効果があります。","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"モバイル範囲","common.presetScope.mobile.desc":"モバイルまたはタッチ向けのパラメータです。mobile preset で既定有効、またはタッチ操作でのみ意味があります。","common.expand":"展開","common.required":"必須","common.default":"デフォルト","common.add":"追加","common.remove":"削除","common.enable":"有効","common.disable":"無効","param.viewInDocs":"ドキュメントで見る","docs.title":"API リファレンス","docs.search.placeholder":"ドキュメントを検索...","docs.search.empty":"一致する項目はありません","docs.toc.title":"このページの目次","docs.sidebar.gettingStarted":"はじめに","docs.sidebar.quickstart":"クイックスタート","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"コンセプト","docs.sidebar.modes":"3 つのモード","docs.sidebar.theming":"テーマ統合","docs.sidebar.props":"Props","docs.sidebar.recipes":"レシピ","docs.sidebar.examples":"サンプル","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"リファレンス","docs.sidebar.migration":"マイグレーション","docs.sidebar.faq":"よくある質問","preset.desktop":"デスクトップ","preset.mobile":"モバイル","preset.auto":"自動","animate.flip.fade":"フェード","animate.flip.crossFade":"クロスフェード","animate.flip.swipe":"スワイプ","animate.flip.zoom":"ズーム","animate.flip.blur":"ぼかし","animate.flip.none":"なし","animate.slowMotion":"スローモーション","gesture.swipe":"スワイプ","gesture.dragExit":"ドラッグ終了","gesture.wheelZoom":"ホイールズーム","gesture.pinchZoom":"ピンチズーム","gesture.doubleTapZoom":"ダブルタップズーム","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"preset に従うジェスチャー設定です。desktop はズーム中のホイールズームを有効化し、mobile はドラッグページング、ドラッグ終了、ピンチズーム、ダブルタップズームを有効化します。","gesture.swipe.desc":"set 内で横方向ドラッグによるページ移動を行います。単一画像ビューアでは無視されます。","gesture.dragExit.desc":"縦方向ドラッグで終了します。既存の onBrowsing(false) の閉じる経路を使います。","gesture.wheelZoom.desc":"ビューアがすでにズーム中のとき、マウスホイールまたはトラックパッドでズームします。desktop では有効、mobile では無効です。","gesture.pinchZoom.desc":"mobile での 2 本指ピンチズームです。fit スケールまで縮小するとズームを終了し、画像を中央に戻します。","gesture.doubleTapZoom.desc":"mobile での 1 本指ダブルタップです。最初のダブルタップはタップ位置を中心にズームし、ズーム中のダブルタップは fit 表示へ戻します。","gesture.touchAction.desc":"CSS touch-action の戦略です。managed は pinch zoom で none、double tap のみの設定で manipulation を選びます。明示値はそのまま渡されます。","gesture.threshold.desc":"ジェスチャーとして受理する最小ドラッグ距離(px)です。","gesture.velocity.desc":"ジェスチャーとして受理する最小速度(px/ms)です。","gesture.axisLock.desc":"斜め移動で横方向と縦方向の両方が発火しないようにする軸ロック比率です。","gesture.resistance.desc":"loop=false かつ先頭または末尾画像にいるときの端抵抗比率です。","gesture.opacity.desc":"縦方向ドラッグ終了時、距離に応じて画像の不透明度を下げるかどうかです。","gesture.wheelZoom.step.desc":"ホイールズーム感度です。同じホイール delta でも値が大きいほど速くズームします。","gesture.wheelZoom.smooth.desc":"即時ジャンプではなく、既存の zoom-follow RAF でホイールズームを補間します。","gesture.wheelZoom.minScale.desc":"ホイールズームの最小スケールです。ズームアウトでここに到達するとズームモードを終了します。","gesture.wheelZoom.maxScale.desc":"ホイールズームの最大スケールです。","gesture.wheelZoom.center.desc":"ホイールズームの焦点です。pointer は wheel イベント位置、viewport は画面中央を使います。","gesture.wheelZoom.reverse.desc":"他の wheel 動作は変えず、ホイールズーム方向だけを反転します。","gesture.wheelZoom.exitGuardDuration.desc":"ホイールズームアウトでズームモードを終了した後の保護時間(ms)です。この間の残留 wheel イベントは無視されます。","gesture.pinchZoom.minScale.desc":"ピンチの最小スケールです。fit は画面に収まる閲覧サイズを意味します。","gesture.pinchZoom.maxScale.desc":"ピンチの最大スケールです。","gesture.pinchZoom.resetBelowFit.desc":"ピンチで fit スケールまで縮小したら、ズームを終了して画像を中央に戻します。","gesture.pinchZoom.center.desc":"ピンチの焦点です。gesture は 2 本指の中点、viewport は画面中央を使います。","gesture.doubleTapZoom.scale.desc":"ダブルタップでズームに入るときの目標スケールです。","gesture.doubleTapZoom.minScale.desc":"ダブルタップズームを制限する最小スケールです。","gesture.doubleTapZoom.maxScale.desc":"ダブルタップズームを制限する最大スケールです。","gesture.doubleTapZoom.center.desc":"ダブルタップの焦点です。tap はタップ位置、viewport は画面中央を使います。","gesture.doubleTapZoom.interval.desc":"2 回のタップの最大間隔(ms)です。","gesture.doubleTapZoom.distance.desc":"2 回のタップ間で許容する最大移動量(px)です。","controller.pagination":"ページネーション","controller.rotate":"回転","controller.rotateLeft":"左回転","controller.rotateRight":"右回転","controller.zoom":"ズーム","controller.download":"ダウンロード","controller.close":"閉じる","controller.flip":"ページ送り","controller.flipLeft":"前へ","controller.flipRight":"次へ","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"上部のページインジケーター。現在位置 / 総ページ数を表示します","controller.rotate.desc":"回転コントロール群(左回転と右回転ボタンを含む)","controller.rotateLeft.desc":"反時計回りに 90° 回転","controller.rotateRight.desc":"時計回りに 90° 回転","controller.zoom.desc":"1:1 ズームモードの開始 / 終了","controller.download.desc":"現在の画像をダウンロード","controller.close.desc":"ビューアを閉じる","controller.flip.desc":"ページ送りコントロール群(前へ / 次へボタンを含む)","controller.flipLeft.desc":"前の画像へ移動","controller.flipRight.desc":"次の画像へ移動","controller.backdrop.desc":"ツールバーの背景色。未指定時は最上位の backdrop を継承。最上位 backdrop が暗い実色の場合は半透明値 (例: `rgba(0,0,0,0.4)`) を推奨。","controller.color.desc":'ツールバーアイコンの色。未指定時は currentColor を継承。単一ボタンの文字列指定 (例: `controller.zoom = "#ff8800"`) が優先されます。',"controller.placement.desc":"ツールバー位置です。移動するのはツールバー本体のみで、左右のページ送りボタンとページネーションは通常位置のままです。","controller.layout.desc":"ツールバー、左右の flip ボタン、ページネーション、caption のセーフ inset を調整します。数値は px、文字列は CSS 長として扱われ、スカラー inset は対象ごとの自然な進入辺に適用され、layout.mobile はモバイル preset で上書きされます。","controller.layout.toolbarInset.desc":"ツールバーのセーフ inset。スカラー値は現在の placement に従って、対応する top / right / bottom / left の辺に適用されます。","controller.layout.flipInset.desc":"左右の flip ボタンのセーフ inset。スカラー値は左ボタンと右ボタンの両方に適用されます。","controller.layout.paginationInset.desc":"ページネーションのセーフ inset。スカラー値は下側の進入辺に適用され、caption やページ側 UI を避けるときに使えます。","controller.layout.captionInset.desc":"caption のセーフ inset。スカラー値は下側の進入辺に適用され、ページネーションや下部コントロールより上に置きたい場合に使います。","controller.render.desc":"完全に独自のコントローラー render コールバックです。state、actions、組み込み slots を受け取ります。controller=false の場合は無効です。","controller.overriddenBy":"親スイッチで有効化","snippet.overriddenByProp":"{umbrella} により上書き","hotkey.close":"閉じる (Escape)","hotkey.zoom":"ズーム (Space)","hotkey.flip":"ページ送り (←/→)","hotkey.flipLeft":"前へ (←)","hotkey.flipRight":"次へ (→)","hotkey.rotate":"回転 ([ / ])","hotkey.rotateLeft":"左回転 ([)","hotkey.rotateRight":"右回転 (])","hotkey.download":"ダウンロード (Mod+S)","hotkey.close.desc":"Escape キーでビューアを閉じる","hotkey.zoom.desc":"Space キーで 1:1 ズームモードを切り替え","hotkey.flip.desc":"← / → キーで set 内のページを送る","hotkey.flipLeft.desc":"← キーで前の画像へ移動","hotkey.flipRight.desc":"→ キーで次の画像へ移動","hotkey.rotate.desc":"[ / ] キーで画像を回転 (組み合わせスイッチ; 左右両方をバインド)","hotkey.rotateLeft.desc":"[ キーで反時計回りに 90° 回転","hotkey.rotateRight.desc":"] キーで時計回りに 90° 回転","hotkey.download.desc":"Cmd+S (macOS) または Ctrl+S (Windows/Linux) で現在の画像をダウンロード。デフォルトはオフ — 有効化するとブラウザの「ページを保存」ショートカットを上書きします。","animate.browsing.desc":"ビューアの開閉時のトランジション","animate.flip.desc":"set 内でページを送る際のトランジションスタイル","animate.slowMotion.desc":"有効にすると、開閉時に Shift を押している間、閲覧トランジション全体が 10 倍に遅くなり、確認やデモに使えます","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"画像 URL。必須項目。","param.alt.label":"alt","param.alt.desc":"画像タイトル。ビューア上部に表示されます。","param.caption.label":"caption","param.caption.desc":"画像下部のキャプション。string でデフォルトピル、または { text, style?, className? } でカスタマイズ。set[i].caption で個別に上書き可。","param.set.label":"set","param.set.desc":"画像セット。渡すとギャラリーモードになり、矢印キーでページ送りできます。","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"初期ページのインデックス(0 始まり)。","param.preset.label":"preset","param.preset.desc":"プリセットバンドル。既定は auto で、controller / hotKey / animate / gesture のデフォルト値を決定します。","param.backdrop.label":"backdrop","param.backdrop.desc":"ビューアの背景色。任意の有効な CSS カラー文字列。","param.zIndex.label":"zIndex","param.zIndex.desc":"ビューアの重ね順。","param.radius.label":"radius","param.radius.desc":"画像の角丸(px)。","param.edge.label":"edge","param.edge.desc":"画像とビューポートの最小マージン(px)。","param.loop.label":"loop","param.loop.desc":"末尾に到達したら最初の画像に戻るかどうか。","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"ページがスクロールされたらビューアを閉じる。","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"画像をダブルクリックでビューアを閉じる。既定はオフ。","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"閲覧中もカバー画像を表示し続ける。","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"ローディングインジケータを表示するまでの遅延 (ms)。この期間内に画像が読み込まれれば、ローディングは表示されません — キャッシュ画像を素早く切り替える際のちらつきを防ぎます。既定 200ms;0 = 即時表示 (旧動作)。","param.controller.label":"controller","param.controller.desc":"コントロールバー設定です。false で全体を無効化し、部分オブジェクトでボタン、位置、オーバーレイ配置、カスタム render を上書きします。","param.hotKey.label":"hotKey","param.hotKey.desc":"キーボードショートカット。","param.animate.label":"animate","param.animate.desc":"閲覧、カバー形状、スローモーション、ページ送りのアニメーション設定です。","param.gesture.label":"gesture","param.gesture.desc":"preset に従うジェスチャー設定です。desktop はズーム中の wheelZoom を有効化し、mobile は既定で swipe、dragExit、pinchZoom、doubleTapZoom を有効化します。gesture=false ですべて無効化します。","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"ビューアの開閉時に呼ばれます(boolean)。","param.onZooming.label":"onZooming","param.onZooming.desc":"ズームモードの開始 / 終了時に呼ばれます(boolean)。","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"ページ切り替え時に呼ばれます(新しいページのインデックス)。","param.onRotating.label":"onRotating","param.onRotating.desc":"回転時に呼ばれます(角度)。","param.onError.label":"onError","param.onError.desc":"画像の読み込み失敗時に呼ばれます(カバー/ビューア共通、SyntheticEvent を受け取る)。","param.browsing.label":"browsing","param.browsing.desc":"制御された閲覧状態。値を渡すと制御モードになります。onBrowsing と組み合わせて使用してください。","docs.section.installation.title":"インストール","docs.section.installation.intro":"パッケージマネージャーでインストール:","docs.section.installation.agent":"AI Agent はまず https://zmage.caldis.me/llms.txt を読み、基本接続は最小限にしてください。","docs.section.installation.then":"コンポーネントとスタイルシートをインポート:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"サーバーレンダリングアプリでは、import 時に document に触れない /ssr エントリを使用してください:","docs.section.modes.title":"3 つの呼び出し方","docs.section.modes.intro":"react-zmage は同じ設定インターフェースを 3 つの呼び出し形式で提供します:","docs.section.modes.componentTitle":"コンポーネント","docs.section.modes.componentBody":"一番標準的な使い方 ── レンダリングする JSX を自分で制御できるときに選んでください。任意の に置き換えるだけで、ネイティブ HTML 属性 (className、style、onClick など) はすべて内側の に透過します。","docs.section.modes.imperativeTitle":"命令式","docs.section.modes.imperativeBody":"適切なカバー用 がない、あるいはコンポーネントツリーに余計なノードをマウントしたくないときに選んでください。イベントハンドラ、非同期コールバック、サードパーティ製ウィジェットから呼び出して、どこからでもビューアを開けます。戻り値は手動クローズ用のデストラクタクロージャです。","docs.section.modes.wrapperTitle":"ラッパー","docs.section.modes.wrapperBody":"レンダリングされる HTML を自分で制御できないとき(markdown 出力、CMS リッチテキスト、dangerouslySetInnerHTML など)に使ってください。Wrapper はクリックされた から src / alt を読み取り、backdrop、コントロール、ホットキー、アニメーション、コールバック、set などのビューア設定は に置きます。","docs.section.modes.wrapperNote":"Wrapper は componentDidMount / componentDidUpdate のタイミングで子の img を検索します。Wrapper がレンダリングされた後に挿入された画像は、Wrapper が再レンダリングされるまでひも付きません。set を渡した場合、クリックされた img の src を set と照合して初期ページにします。set がない場合は、data-zmage-caption または最も近い figcaption をビューアの caption として使えます。","docs.section.theming.title":"テーマ統合","docs.section.theming.intro":"react-zmage は意図的にホストサイトのテーマシステムから独立しています ── prefers-color-scheme を読まず、特定の CSS 変数フレームワークにも縛られません。ライト/ダークの統合は利用側が制御します:","docs.section.theming.bullet.backdrop":"ビューアの背景色は backdrop プロパティで指定します(任意の有効な CSS カラー文字列)。デフォルトは白 #FFFFFF です。","docs.section.theming.bullet.icons":"コントロールバーのアイコンは SVG の currentColor で描画されます。グローバル CSS で上書きすればデザインシステムと揃えられます。","docs.section.theming.bullet.scoped":"ランタイムのスタイルはすべて #zmage コンテナ内にスコープされており、アプリの他の部分に漏れません。","docs.section.theming.defaultTitle":"デフォルト動作","docs.section.theming.defaultBody":"backdrop を省略するとビューアは白い背景でレンダリングされます。ライトサイトでは違和感がありませんが、ダークサイトではコントロールバーの白いアイコンとコントラストが取れなくなります:","docs.section.theming.patternTitle":"コンポーネント / 制御パターン","docs.section.theming.patternBody":"既存のテーマフック(next-themes、独自の ThemeProvider など)から resolved 値を読み取り、色にマッピングして backdrop に渡します。小さなローカルコンポーネントにラップしておくと呼び出し側がすっきりします:","docs.section.theming.imperativeTitle":"命令式の利用","docs.section.theming.imperativeBody":"イベントハンドラ内で現在の DOM 状態(documentElement のテーマクラスなど)を読み取り、色に変換してから Zmage.browsing に渡します:","docs.section.theming.iconsTitle":"デザインシステムとアイコン色を揃える","docs.section.theming.iconsBody":"コントロールアイコンは #zmage コンテナ内に存在します。グローバル CSS から色を上書きできます。Tailwind や shadcn のように CSS 変数でテーマを管理しているなら、デザイントークンに直接バインドできます:","docs.section.theming.toolbarTitle":"ツールバーをモーダル backdrop から切り離す","docs.section.theming.toolbarBody":'デフォルトではツールバーの背景は最上位の backdrop を継承し、アイコンは currentColor で描画されます。暗い実色の backdrop では、暗いアイコンが暗いツールバーに溶け込んで見えません。controller.backdrop (ツールバー背景) と controller.color (アイコン色) を指定して切り離してください。単一ボタンの文字列指定 (例: controller.zoom = "#ff8800") は controller.color よりも優先されます。',"docs.search.desc.installation":"パッケージマネージャーでインストールしてスタイルシートを取り込む","docs.search.desc.ssr":"import 時に document に触れない SSR エントリ","docs.search.desc.modes":"コンポーネント / 命令式 / ラッパー ── 3 つの呼び出し方","docs.search.desc.theming":"ビューアの背景とアイコンをサイトのテーマと揃える","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"プリセット選択: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"controller / hotKey / animate / gesture のデフォルトセット","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex などの UI パラメータ","docs.search.desc.propsController":"コントロールバーのボタン、配置、カスタム render","docs.search.desc.propsHotkey":"キーボードショートカット: ESC / Space / 矢印キー","docs.search.desc.propsAnimate":"閲覧アニメーションとページ送りアニメーション","docs.search.desc.propsGesture":"ホイールズーム、ドラッグページング、ドラッグ終了、ピンチ、ダブルタップズーム","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"制御された閲覧状態","docs.search.desc.examples":"単一画像と複数画像ギャラリーのサンプル","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet などの型宣言","docs.search.desc.migration":"0.x からのアップグレードノート","docs.search.desc.faq":"よくある統合上の落とし穴とバージョン別の修正ノート","docs.section.props.title":"Props","docs.section.props.intro":"BaseType に定義されたすべての prop は、3 つのモードのいずれでも利用できます。","docs.section.props.wrapperScope.title":"Wrapper モードの prop 範囲","docs.section.props.wrapperScope.intro":" はカバー画像自体をレンダリングしません。既存の子孫 ノードにビューアを結び付けるため、一部の prop は Wrapper モード固有の意味を持ちます。","docs.section.props.wrapperScope.data":"src と alt は子の に置きます。トップレベルの src / alt は、クリックされた DOM ノードの値で上書きされます。set がない場合、caption は data-zmage-caption または最も近い figcaption から読み取れます。","docs.section.props.wrapperScope.config":"set と defaultPage は明示的な共有ギャラリーに使えます。クリックされた img の src が set に含まれる場合、Wrapper は対応する index を開きます。defaultPage は fallback です。preset、controller、hotKey、animate、backdrop、zIndex、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay は通常どおり適用されます。","docs.section.props.wrapperScope.lifecycle":"onBrowsing、onZooming、onSwitching、onRotating、onError は動作します。Wrapper 内部で同じビューアを開くためです。","docs.section.props.wrapperScope.controlled":"browsing はコンポーネントモードの controlled state であり、Wrapper は制御しません。外部 state から開きたい場合は、コンポーネントモードを使うか Zmage.browsing() を直接呼び出してください。","docs.section.props.interface":"インターフェースとインタラクション","docs.section.props.controller.keyHeader":"キー","docs.section.props.controller.descHeader":"説明","docs.section.props.controller.umbrella":"rotate は rotateLeft / rotateRight の親スイッチで、有効にすると両方のボタンが表示されます。flip も flipLeft / flipRight に対して同様に動作します。","docs.section.props.controller.layoutTitle":"オーバーレイ配置","docs.section.props.controller.layoutIntro":"layout は toolbar、左右 flip、pagination、caption のオーバーレイ offset だけを調整します。画像の初期フレームやズームジオメトリには関与しません。数値は px、文字列は CSS 長として透過され、スカラー inset は対象ごとの自然な進入辺に適用され、layout.mobile はモバイルで基礎配置を上書きします。","docs.section.props.controller.renderTitle":"カスタム render","docs.section.props.controller.renderIntro":"render は { state, actions, slots } を受け取り、React ノードを返します。null を返すとコントローラーレイヤーを隠せます。一部だけ差し替えたい場合は slots を再利用できます。","docs.section.props.hotkey.umbrella":"flip は flipLeft / flipRight、rotate は rotateLeft / rotateRight の親スイッチです — いずれかを有効にすると左右両方のキーがバインドされます。各 entry は 'Mod+S' / 'BracketLeft' などの文字列ディスクリプターで上書きできます (Mod は macOS で ⌘、Windows/Linux で Ctrl を表す)。","docs.section.props.hotkey.customTitle":"カスタムバインディング","docs.section.props.hotkey.customIntro":"各 hotKey エントリは boolean (オン/オフ)、string (カスタムディスクリプター)、string[] (複数バインド) を受け付けます。ディスクリプターは e.code 名 (キーの物理位置、キーボードレイアウト非依存) を使用し、Mod プレフィックスはクロスプラットフォームで ⌘/Ctrl を表します。厳密な修飾キー判定: 宣言されていない修飾キーが押されている場合は一致しません (例: Space は Cmd+Space では発火しません)。","docs.section.props.hotkey.cheatsheetTitle":"ディスクリプター早見表","docs.section.props.hotkey.cheatsheet.shorthand":"単一の英字 / 数字は自動正規化","docs.section.props.hotkey.cheatsheet.arrows":"矢印キー","docs.section.props.hotkey.cheatsheet.punct":"記号 (キーの物理名)","docs.section.props.hotkey.cheatsheet.whitespace":"空白 / 制御キー","docs.section.props.hotkey.cheatsheet.modifier":"修飾キープレフィックス (+ で連結)","docs.section.props.animate.typeHeader":"型","set.src.desc":"画像 URL(必須)","set.alt.desc":"この画像のタイトル","set.caption.desc":"この画像のキャプション。指定すると外側の caption を上書きします","set.className.desc":"この画像に適用するカスタムクラス","set.style.desc":"この画像に適用するカスタムインラインスタイル","docs.section.props.preset.title":"プリセットの内訳","docs.section.props.preset.intro":"preset は controller / hotKey / animate / gesture の各サブオブジェクトに適用されるデフォルト値の束です。preset を省略すると auto になります。auto は実行時に matchMedia('(pointer: coarse) and (hover: none)') によって desktop または mobile に解決され、SSR や matchMedia 非対応環境では desktop にフォールバックします。","docs.section.props.preset.subParamHeader":"サブパラメータ","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"サンプル","docs.section.examples.singleTitle":"単一画像","docs.section.examples.galleryTitle":"複数画像ギャラリー","docs.section.examples.mobileTitle":"モバイルジェスチャー","docs.section.examples.mobileBody":"mobile preset を強制し、タッチ端末でドラッグ切り替え、ドラッグ終了、ピンチズーム、ダブルタップズームを試せます。","docs.section.examples.controllerTitle":"カスタムコントローラー","docs.section.examples.controllerBody":"コントローラーを画面端へ移動したり、state と actions を受け取る render コールバックで UI 全体を差し替えられます。","docs.section.examples.coverTitle":"クロップされたカバー","docs.section.examples.coverBody":"object-fit と border radius をカバー img 自体に置くと、開く最初のフレームが見えている切り抜きに一致します。","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"型はランタイムのエクスポートと同じ場所に置かれています。完全な prop ユニオン型は BaseType です:","docs.section.typescript.refIntro":"コンポーネントは ref を受け取り、カバーの img に転送します:","docs.section.migration.title":"マイグレーション","docs.section.migration.from":"0.x からの移行:","docs.section.migration.bullet1":"コンポーネントは forwardRef exotic です。new Zmage() しないでください。","docs.section.migration.bullet2":"SSR エントリを参照している場合は react-zmage/ssr に切り替えてください。","docs.section.faq.title":"よくある質問","docs.section.faq.tailwind-shrink.q":"Tailwind / normalize.css / Bootstrap を使うと、ビューア内の大きな画像がカバーよりも小さく表示されるのはなぜ?","docs.section.faq.tailwind-shrink.a":"これらのリセット CSS はグローバルに `img { max-width: 100% }` を当てるため、ビューア内の画像がカバーサイズに圧縮されます。1.1.2 より前のバージョンでこの影響を受けます。1.1.2 以降は `.imageLayer` 配下の img に対してこれを防ぐスタイルを追加しているので、>=1.1.2 にアップグレードしてください。","docs.section.faq.r19-imperative.q":"React 18 / 19 で `Zmage.browsing()` が undefined を返すのはなぜ?","docs.section.faq.r19-imperative.a":"1.1.2 で修正済みのバグです。旧コードは `RENDER.REF.current?.outBrowsing` を同期的に読んでおり、React 17 では動作しましたが、R18+ ではコミットが非同期になるため壊れます。1.1.2 では安定したデストラクタクロージャを返すようになっています — >=1.1.2 にアップグレードしてください。","docs.section.faq.wrapper-empty.q":"`` が空のビューアを開き、ブラウザが空の src を警告します。なぜ?","docs.section.faq.wrapper-empty.a":"旧版のラッパーはクリックされた img の上に `defaultProps.src=''` をスプレッドしてしまい、src / alt を空にしていました。1.1.2 ではクリックされた DOM ノードから src / alt を直接読み取るように修正されています。アップグレードで解決します。","docs.section.faq.vite-esm.q":'Vite / Next.js のクライアントで命令的 API を呼ぶと "no compatible mount API" が出ます。なぜ?',"docs.section.faq.vite-esm.a":"1.1.2 より前は `require('react-dom/client')` でランタイム検出していましたが、ブラウザの ESM には `require` グローバルがありません。1.1.2 では静的 import に切り替えました — >=1.1.2 にアップグレードしてください。","docs.section.faq.wrapper-dynamic.q":"マウント後に追加した画像にラッパーがクリックハンドラをひも付けてくれません。","docs.section.faq.wrapper-dynamic.a":"ラッパーは `componentDidMount` と `componentDidUpdate` のときだけ `` を探します。React のレンダーツリー外で DOM の img を注入している場合(例: 親が再レンダーしないままの dangerouslySetInnerHTML)、ラッパーを強制的に再レンダーさせるか、自前のクリックハンドラから `Zmage.browsing()` を呼び出してください。","docs.section.faq.lazy-src.q":"`` で data-src / 遅延読み込みを使っているのですが、Zmage を開くと実画像ではなくプレースホルダが表示されます。どうすればよいですか?","docs.section.faq.lazy-src.a":"Zmage はデフォルトでカバー `` の `src` を読みます — プレースホルダしか見えません。プレビュー対象の実 URL を `set` で明示的に渡してください: ``。命令型呼び出しも同様: `Zmage.browsing({ src: realUrl })`。","docs.section.faq.cover-vs-set.q":"ページにはサムネイルを表示し、クリック時に高解像度の画像を見せたい — `set` を省略できますか?","docs.section.faq.cover-vs-set.a":"いいえ。`set` を渡さないとカバーの `src` がそのままビューアで表示されます。「サムネイル入口 + 大画像ビューア」にするには明示的に分離する必要があります: ``。同じパターンで data-src 遅延読み込み (上の FAQ) と CDN マルチ解像度の両方を解決できます。「グリッド/ギャラリー + ビューアを開く」UI が欲しい場合、Zmage 自体は提供しません — ギャラリーは自分で描画し、クリック時に `Zmage.browsing({ src, set })` を呼んでください。","docs.section.faq.controlled-mismatch.q":"受け渡した `browsing` プロップとビューアの実状態がずれてしまいます。","docs.section.faq.controlled-mismatch.a":"制御モードでは `browsing` と `onBrowsing` の両方が必要です。`browsing` だけを渡した場合、内部状態は最初に一度だけ同期され、その後ずれていきます。必ず対で使ってください。","docs.section.faq.ssr.q":"Next.js / Remix / SSR フレームワークでの使い方は?","docs.section.faq.ssr.a":"`react-zmage/ssr` エントリを使ってください — import 時に `document` に触れません。命令的な `Zmage.browsing()` は、レンダリング中やサーバー専用パスで実行され得る場合、`typeof window !== 'undefined'` のガードが必要です。","docs.section.faq.theme.q":"ビューアをダーク / ライトテーマに追従させるには?","docs.section.faq.theme.a":"上の「テーマ統合」セクションに従って `backdrop` を渡してください。本ライブラリは設計上テーマ非依存で、prefers-color-scheme も読みません — テーママッピングはアプリ側の責任です。","playground.preset.aria":"データプリセット切替","playground.preset.default.label":"デフォルト","playground.preset.default.hint":"童夢 · 2 枚","playground.preset.testset.label":"テスト集","playground.preset.testset.hint":"6 枚 · 比率と形式"},vR={"nav.playground":"플레이그라운드","nav.docs":"문서","nav.ai":"AI 설치 가이드","nav.github":"GitHub","useCases.eyebrow":"사용 사례","useCases.title":"블로그, CMS, MDX, 뉴스 페이지를 위한 React 이미지 미리보기","useCases.body":"react-zmage는 일반 를 원래 위치에서 펼쳐지는 전체 화면 이미지 미리보기로 바꾸는 React 이미지 뷰어입니다. 갤러리, 키보드 탐색, 모바일 제스처, 명령형 실행, 리치 텍스트용 Wrapper 모드, SSR/RSC를 지원합니다.","useCases.cta.docs":"문서 보기","useCases.cta.wrapper":"Wrapper 모드 체험","useCases.card.blog.title":"블로그 이미지 미리보기","useCases.card.blog.body":"게시글 레이아웃을 바꾸거나 별도 갤러리 화면을 만들지 않고도 글 안의 이미지를 전체 화면으로 열 수 있습니다.","useCases.card.cms.title":"CMS 리치 텍스트 이미지","useCases.card.cms.body":"CMS, Markdown 파서, 에디터가 렌더링한 HTML을 감싸 기존 가 뷰어를 열도록 할 수 있습니다.","useCases.card.news.title":"뉴스 기사 갤러리","useCases.card.news.body":"기사 본문은 읽기 쉽게 유지하고, 자세히 볼 때만 키보드, 제스처, 다중 이미지 탐색을 제공합니다.","useCases.card.mdx.title":"MDX와 문서 이미지","useCases.card.mdx.body":"이미지는 콘텐츠 작성자가 관리하고 React 앱은 페이지 껍데기를 담당하는 문서 페이지에 Wrapper 모드를 사용할 수 있습니다.","useCases.card.lightbox.title":"React lightbox 대안","useCases.card.lightbox.body":"전체 갤러리 프레임워크보다, 원위치 펼침 이미지 미리보기와 기존 마크업 유지가 필요할 때 가볍게 사용할 수 있습니다.","useCases.card.ssr.title":"Next.js, SSR, RSC","useCases.card.ssr.body":"서버 렌더링 앱에서는 SSR 안전 서브패스를 import하고, 클라이언트 경계에서 인터랙티브 뷰어를 엽니다.","useCases.mode.eyebrow":"모드 선택","useCases.mode.title":"이미지 마크업을 누가 소유하는지에 따라 선택","useCases.mode.component":"JSX를 직접 관리하며 로 바꿀 수 있습니다.","useCases.mode.imperative":"버튼, 명령, 이벤트, 콜백에서 뷰어를 열어야 합니다.","useCases.mode.wrapper":"이미지가 CMS, MDX, Markdown, 리치 텍스트 HTML에서 옵니다.","useCases.facts.eyebrow":"엔티티 정보","useCases.facts.title":"크롤러가 이해해야 할 짧은 사실","useCases.fact.react":"React 16.8부터 19까지 지원","useCases.fact.modes":"Component, imperative, Wrapper 모드","useCases.fact.input":"키보드 탐색과 모바일 제스처","useCases.fact.ssr":"SSR/RSC 안전 import 경로","useCases.fact.gallery":"페이지 재구성 없이 다중 이미지 탐색","useCases.fact.origin":"원위치 펼침 전체 화면 이미지 미리보기","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"사람과 AI Agent가 자주 묻는 질문","useCases.faq.what.q":"react-zmage는 무엇인가요?","useCases.faq.what.a":"react-zmage는 일반 를 원래 위치에서 펼쳐지는 전체 화면 이미지 미리보기로 바꾸는 React 이미지 뷰어입니다. 갤러리, 키보드 탐색, 모바일 제스처, Wrapper 모드, SSR/RSC를 지원합니다.","useCases.faq.lightbox.q":"React lightbox 대신 react-zmage를 언제 쓰면 좋나요?","useCases.faq.lightbox.a":"기존 이미지를 전체 화면으로 열고 싶지만 페이지를 갤러리 컴포넌트 중심으로 다시 만들고 싶지 않을 때 적합합니다. 블로그, CMS 리치 텍스트, MDX 문서, 뉴스 기사, 이미지가 많은 콘텐츠 페이지에 잘 맞습니다.","useCases.faq.richText.q":"CMS, Markdown, 리치 텍스트 이미지도 처리할 수 있나요?","useCases.faq.richText.a":"네. Zmage.Wrapper는 CMS, Markdown, MDX, dangerouslySetInnerHTML 콘텐츠 안의 하위 를 연결하면서 기존 마크업과 레이아웃을 유지할 수 있습니다.","useCases.faq.ssr.q":"Next.js, SSR, RSC를 지원하나요?","useCases.faq.ssr.a":"네. SSR 또는 RSC에서는 react-zmage/ssr 서브패스를 import하고, 인터랙티브 API는 클라이언트 이벤트나 Client Component에서 호출합니다.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"모든 를","hero.title.line2":"원래 자리에서 펼치기","hero.subtitle":"임의의 를 원래 위치에서 펼쳐지는 전체 화면 이미지 뷰어로 바꾸고, 키보드·제스처·다중 이미지 탐색을 지원합니다.","hero.cta.start":"문서 보기","hero.cta.playground":"여러 파라미터 체험","hero.ai.label":"AI 설치 가이드: 먼저 llms.txt 읽기","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"빠른 Prompt 복사","hero.ai.copyLabel":"빠른 AI Prompt 복사","hero.ai.viewLlms":"llms.txt 보기 →","ai.badge":"AI 설치 가이드","ai.title":"react-zmage Agent 통합 Prompt 만들기","ai.subtitle":"llms.txt부터 시작하세요. Auto를 유지하면 Agent가 먼저 프로젝트를 확인합니다. 필요하면 환경, 이미지 소스, 인터랙션 전략을 조정한 뒤 복사할 수 있습니다.","ai.field.agent":"어떤 Agent를 사용하나요?","ai.field.depth":"설정 깊이","ai.field.environment":"프로젝트 환경","ai.field.mode":"사용 모드","ai.field.imageSource":"이미지 소스","ai.field.interaction":"인터랙션 전략","ai.field.project":"프로젝트 설명","ai.autoTip":"확실하지 않으면 Auto를 유지하세요. Agent가 먼저 프로젝트 구조, 이미지 소스, 렌더링 방식, 스타일 진입점을 확인한 뒤 적절한 Zmage 모드와 props를 선택합니다.","ai.project.placeholder":"앱, 이미지 소스, viewer가 해야 할 일을 설명하세요.","ai.action.copy":"setup prompt 복사","ai.action.copied":"복사됨","ai.action.openLlms":"llms.txt 열기","ai.copy.error":"복사에 실패했습니다. 미리보기에서 prompt를 직접 선택하세요.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"선택에 따라 업데이트됩니다","ai.preview.copy":"복사","ai.preview.expand":"펼치기","ai.preview.show":"Prompt 미리보기","ai.preview.hide":"미리보기 접기","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"일반 코딩 Agent에 맞는 prompt를 만듭니다.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Agent가 먼저 프로젝트를 살펴보게 합니다.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"통합 선호도를 직접 지정합니다.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"실제 인터랙션 표면","demo.title":"Child's Dream 이미지를 한 편의 이야기 지면으로 배치","demo.body":"Child's Dream의 오래된 책, 시간 통로, 여우, 숲길, 수정 봉인을 불규칙한 지면에 배치했습니다. 어떤 이미지를 눌러도 현재 잘린 위치에서 뷰어로 부드럽게 확대됩니다.","demo.shiftHint":"SHIFT를 누른 채 이미지를 클릭해 섬세한 전환을 느껴보세요","demo.zoomHint":"이미지를 열고 Space로 줌에 들어간 뒤 휠로 계속 확대하거나 축소하세요.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"도서관 구석의 먼지 쌓인 책이 오래된 시간으로 통하는 문을 엽니다.","demo.story.lead":"페이지의 평범한 글자가 작은 실제 장면으로 바뀌고, 소년은 종이 위에서 숲이 자라는 모습과 결계 너머의 부름을 느낍니다.","demo.story.middle":"여우는 소년의 동행이 됩니다. 물결, 나무 그늘, 분홍 플라밍고를 지나 길은 숲 깊은 곳의 수정 봉인으로 이어집니다.","demo.tile.cover":"오래된 책과 시간 통로","demo.tile.gallery":"숲에서의 첫 만남","demo.tile.ratio":"물결 끝의 길","demo.tile.controller":"수정 봉인","demo.tile.zoom":"플라밍고 쉼터","demo.tile.lamp":"잎 아래의 빛","demo.tile.rescue":"숲속의 해방","demo.feature.cover":"커버 clip과 라운드 일치","demo.feature.space":"확대 상태에서 포인터를 움직여 빠르게 훑어보기","demo.feature.wheel":"마우스 휠로 배율을 부드럽게 전환","demo.feature.shift":"Shift로 열기와 닫기 느리게 보기","demo.caption":"이미지를 클릭해 뷰어를 여세요. 데스크톱에서는 SHIFT를 누른 채 열고, 확대 후 포인터 이동이나 휠 조작을 시도할 수 있습니다.","demo.scene.portal.alt":"오래된 책 위에 빛나는 시간 통로","demo.scene.portal.caption":"오래된 책 한가운데 시간 통로가 빛나고 글자 속에서 숲이 일어납니다.","demo.scene.forest.alt":"소년이 숲에서 여우를 만남","demo.scene.forest.caption":"여우가 나무 사이에 나타나 소년의 동행이 됩니다.","demo.scene.tide.alt":"소년이 물결 가장자리에 서 있음","demo.scene.tide.caption":"물이 나선형으로 말리며 다음 낯선 길을 가리킵니다.","demo.scene.canopy.alt":"소년이 커다란 나무 그늘 아래 누워 있음","demo.scene.canopy.caption":"나무 그늘이 책장처럼 열리고 작은 빛들이 길을 표시합니다.","demo.scene.flamingo.alt":"소년이 분홍 플라밍고 사이에 앉아 있음","demo.scene.flamingo.caption":"가벼운 플라밍고 무리가 여정에 조용한 쉼표를 만듭니다.","demo.scene.lamp.alt":"소년이 넓은 잎 아래에서 빛을 밝힘","demo.scene.lamp.caption":"잎이 어둠을 막고 빛이 책 속 단서를 드러냅니다.","demo.scene.crystal.alt":"소년이 수정 봉인 앞에 서 있음","demo.scene.crystal.caption":"숲 깊은 곳에서 수정 봉인이 모습을 드러내기 시작합니다.","demo.scene.rescue.alt":"여우와 소년이 수정 봉인에 다가감","demo.scene.rescue.caption":"열쇠가 수정에 가까워지고 봉인 속 비밀이 곧 열립니다.","feature.dropin.title":"원위치 펼치기","feature.dropin.hint":"이미지의 위치, 크기, 라운드, 잘림 상태에서 열리고 닫을 때 같은 자리로 돌아갑니다.","feature.mobile.title":"모바일 호환","feature.mobile.hint":"Auto preset이 터치 동작을 선택합니다. 스와이프 이동, 아래로 드래그해 닫기, 더블 탭, 핀치 줌을 지원합니다.","feature.set.title":"완전한 탐색 도구","feature.set.hint":"줌, 회전, 페이지 이동, 다운로드, caption이 하나의 탐색 상태를 공유하며 여러 이미지에서도 이어집니다.","feature.ssr.title":"SSR/RSC 친화적","feature.ssr.hint":"Next.js, SSR, RSC에서는 서버 안전 진입점을 쓰고 viewer 인터랙션은 클라이언트 경계 안에 둘 수 있습니다.","modes.title":"이미 있는 페이지 구조에 맞게 연결","modes.component.label":"컴포넌트 모드","modes.component.desc":"JSX를 제어할 수 있다면 로 바꾸고 네이티브 props는 그대로 전달합니다.","modes.imperative.label":"명령형 호출","modes.imperative.desc":"버튼, callback, 비동기 흐름에서 열 수 있으며 페이지에 커버 이미지가 필요하지 않습니다.","modes.wrapper.label":"래퍼 모드","modes.wrapper.desc":"Markdown / CMS / dangerouslySetInnerHTML을 감싸 내부 이미지가 자동으로 원위치에서 펼쳐집니다.","modes.try":"예제 열기 →","modes.component.when":"렌더링하는 JSX를 직접 제어할 수 있다면 컴포넌트 모드를 선택합니다. 로 바꾸기만 하면 네이티브 props는 계속 전달되고, 열기와 닫기는 같은 원위치 펼치기 전환으로 이어집니다.","modes.imperative.when":"진입점이 이미지 자체가 아니라면 명령형 호출을 선택합니다. 이벤트 핸들러, 서드파티 callback, 비동기 흐름에서 커버 를 추가하지 않고 뷰어를 열 수 있습니다.","modes.wrapper.when":"렌더링되는 HTML을 직접 제어할 수 없다면 래퍼 모드를 선택합니다 — markdown, CMS 리치 텍스트, dangerouslySetInnerHTML. 하위 트리를 감싸기만 하면 내부의 모든 가 자동으로 뷰어를 얻습니다.","footer.project":"프로젝트","footer.repo":"저장소","footer.issues":"이슈 / 피드백","footer.changelog":"변경 이력","footer.useCases":"사용 사례","footer.madeby":"제작","footer.illustrator":"일러스트","footer.license":"MIT 라이선스","pg.title":"플레이그라운드","pg.subtitle":"모든 prop을 조정하고 뷰어가 실시간으로 반응하는 모습을 확인하세요.","pg.reset":"초기화","pg.share":"공유","pg.shared":"링크가 복사되었습니다","pg.tab.component":"컴포넌트","pg.tab.imperative":"명령형","pg.tab.wrapper":"래퍼","pg.preview.tip":"팁: Space로 줌 · ←/→로 페이지 이동 · ESC로 닫기","pg.preview.trigger":"뷰어 열기","pg.params.title":"파라미터","pg.params.subtitle":"prop 이름에 hover하면 설명을 보고, 책 아이콘으로 문서를 열 수 있습니다.","pg.events.title":"이벤트","pg.events.subtitle":"현재 세션의 라이프사이클 콜백 출력입니다.","pg.events.empty":"라이프사이클 콜백을 활성화하면 이벤트 스트림이 여기에 표시됩니다.","pg.code.title":"코드","pg.code.subtitle":"현재 모드에서 복사할 수 있는 코드입니다.","pg.code.hideDefaults":"기본값 숨기기","pg.copy":"복사","pg.copied":"복사됨","group.data":"데이터","group.preset":"프리셋","group.interface":"인터페이스","group.controller":"컨트롤러","group.hotkey":"단축키","group.animate":"애니메이션","group.gesture":"Gesture","group.lifecycle":"라이프사이클","group.controlled":"제어 컴포넌트","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"데스크톱 범위","common.presetScope.desktop.desc":"데스크톱 중심 파라미터입니다. desktop preset에서 기본으로 켜지거나 데스크톱에서만 실질적인 효과가 있습니다.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"모바일 범위","common.presetScope.mobile.desc":"모바일 또는 터치 중심 파라미터입니다. mobile preset에서 기본으로 켜지거나 터치 상호작용에서만 의미가 있습니다.","common.expand":"펼치기","common.required":"필수","common.default":"기본값","common.add":"추가","common.remove":"제거","common.enable":"사용","common.disable":"사용 안 함","param.viewInDocs":"문서에서 보기","docs.title":"API 레퍼런스","docs.search.placeholder":"문서 검색...","docs.search.empty":"일치하는 항목 없음","docs.toc.title":"이 페이지의 목차","docs.sidebar.gettingStarted":"시작하기","docs.sidebar.quickstart":"빠른 시작","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"개념","docs.sidebar.modes":"세 가지 모드","docs.sidebar.theming":"테마 통합","docs.sidebar.props":"Props","docs.sidebar.recipes":"레시피","docs.sidebar.examples":"예제","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"레퍼런스","docs.sidebar.migration":"마이그레이션","docs.sidebar.faq":"자주 묻는 질문","preset.desktop":"데스크톱","preset.mobile":"모바일","preset.auto":"자동","animate.flip.fade":"페이드","animate.flip.crossFade":"크로스 페이드","animate.flip.swipe":"스와이프","animate.flip.zoom":"줌","animate.flip.blur":"블러","animate.flip.none":"없음","animate.slowMotion":"슬로 모션","gesture.swipe":"스와이프","gesture.dragExit":"드래그 종료","gesture.wheelZoom":"휠 줌","gesture.pinchZoom":"핀치 줌","gesture.doubleTapZoom":"더블 탭 줌","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"프리셋을 따르는 제스처 설정입니다. desktop은 줌 상태에서 휠 줌을 켜고, mobile은 드래그 페이징, 드래그 종료, 핀치 줌, 더블 탭 줌을 켭니다.","gesture.swipe.desc":"set 안에서 가로 드래그로 페이지를 넘깁니다. 단일 이미지 뷰어에서는 무시됩니다.","gesture.dragExit.desc":"세로 드래그로 종료합니다. 기존 onBrowsing(false) 닫기 경로를 사용합니다.","gesture.wheelZoom.desc":"뷰어가 이미 줌 상태일 때 마우스 휠 또는 트랙패드로 줌합니다. desktop은 켜고 mobile은 끕니다.","gesture.pinchZoom.desc":"mobile의 두 손가락 핀치 줌입니다. fit 스케일까지 줄이면 줌을 종료하고 이미지를 가운데로 되돌립니다.","gesture.doubleTapZoom.desc":"mobile의 한 손가락 더블 탭입니다. 첫 더블 탭은 탭 위치를 중심으로 줌하고, 줌 상태에서 더블 탭하면 fit 보기로 돌아갑니다.","gesture.touchAction.desc":"CSS touch-action 전략입니다. managed는 핀치 줌에 none을, 더블 탭만 있는 설정에 manipulation을 사용합니다. 명시한 값은 그대로 전달됩니다.","gesture.threshold.desc":"제스처로 인정할 최소 드래그 거리(px)입니다.","gesture.velocity.desc":"제스처로 인정할 최소 속도(px/ms)입니다.","gesture.axisLock.desc":"대각선 움직임이 가로와 세로 제스처를 동시에 트리거하지 않도록 하는 축 잠금 비율입니다.","gesture.resistance.desc":"loop=false이고 첫 이미지 또는 마지막 이미지에 있을 때의 경계 저항 비율입니다.","gesture.opacity.desc":"세로 드래그 종료 시 드래그 거리가 커질수록 이미지 불투명도를 낮출지 여부입니다.","gesture.wheelZoom.step.desc":"휠 줌 감도입니다. 값이 클수록 같은 wheel delta에서 더 빠르게 줌합니다.","gesture.wheelZoom.smooth.desc":"즉시 점프하지 않고 기존 zoom-follow RAF로 휠 줌을 보간합니다.","gesture.wheelZoom.minScale.desc":"휠 줌의 최소 스케일입니다. 줌아웃으로 이 값에 도달하면 줌 모드를 종료합니다.","gesture.wheelZoom.maxScale.desc":"휠 줌의 최대 스케일입니다.","gesture.wheelZoom.center.desc":"휠 줌 초점입니다. pointer는 wheel 이벤트 위치를, viewport는 화면 중앙을 사용합니다.","gesture.wheelZoom.reverse.desc":"다른 wheel 동작은 유지하면서 휠 줌 방향만 반전합니다.","gesture.wheelZoom.exitGuardDuration.desc":"휠 줌아웃으로 줌 모드를 종료한 뒤의 보호 시간(ms)입니다. 이 시간 동안 남은 wheel 이벤트는 무시됩니다.","gesture.pinchZoom.minScale.desc":"핀치 최소 스케일입니다. fit은 화면에 맞춘 브라우징 크기를 뜻합니다.","gesture.pinchZoom.maxScale.desc":"핀치 최대 스케일입니다.","gesture.pinchZoom.resetBelowFit.desc":"핀치가 fit 스케일까지 줄어들면 줌을 종료하고 이미지를 가운데로 되돌립니다.","gesture.pinchZoom.center.desc":"핀치 초점입니다. gesture는 두 손가락의 중간점을, viewport는 화면 중앙을 사용합니다.","gesture.doubleTapZoom.scale.desc":"더블 탭으로 줌에 들어갈 때의 목표 스케일입니다.","gesture.doubleTapZoom.minScale.desc":"더블 탭 줌을 제한하는 최소 스케일입니다.","gesture.doubleTapZoom.maxScale.desc":"더블 탭 줌을 제한하는 최대 스케일입니다.","gesture.doubleTapZoom.center.desc":"더블 탭 초점입니다. tap은 탭 위치를, viewport는 화면 중앙을 사용합니다.","gesture.doubleTapZoom.interval.desc":"두 탭 사이의 최대 시간(ms)입니다.","gesture.doubleTapZoom.distance.desc":"두 탭 사이의 최대 이동량(px)입니다.","controller.pagination":"페이지네이션","controller.rotate":"회전","controller.rotateLeft":"왼쪽 회전","controller.rotateRight":"오른쪽 회전","controller.zoom":"줌","controller.download":"다운로드","controller.close":"닫기","controller.flip":"페이지 이동","controller.flipLeft":"이전","controller.flipRight":"다음","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"상단의 페이지 표시기 — 현재 위치 / 전체 페이지 수","controller.rotate.desc":"회전 컨트롤 그룹(왼쪽 / 오른쪽 회전 버튼 포함)","controller.rotateLeft.desc":"반시계 방향으로 90° 회전","controller.rotateRight.desc":"시계 방향으로 90° 회전","controller.zoom.desc":"1:1 줌 모드 진입 / 종료","controller.download.desc":"현재 이미지 다운로드","controller.close.desc":"뷰어 닫기","controller.flip.desc":"페이지 이동 컨트롤 그룹(이전 / 다음 버튼 포함)","controller.flipLeft.desc":"이전 이미지로 이동","controller.flipRight.desc":"다음 이미지로 이동","controller.backdrop.desc":"툴바 배경색. 미지정 시 최상위 backdrop을 따릅니다. 최상위 backdrop이 어두운 단색일 때 반투명 값 (예: `rgba(0,0,0,0.4)`)을 권장합니다.","controller.color.desc":'툴바 아이콘 색상. 미지정 시 currentColor를 따릅니다. 개별 버튼 문자열 지정 (예: `controller.zoom = "#ff8800"`)이 우선합니다.',"controller.placement.desc":"툴바 위치입니다. 툴바 캡슐만 이동하며, 양쪽 페이지 이동 버튼과 페이지네이션은 기존 위치를 유지합니다.","controller.layout.desc":"툴바, 좌우 flip 버튼, 페이지네이션, caption의 안전 inset을 조정합니다. 숫자는 px, 문자열은 CSS 길이로 처리되며 scalar inset은 각 대상의 자연스러운 진입 방향에 적용되고 layout.mobile은 모바일 preset에서 덮어씁니다.","controller.layout.toolbarInset.desc":"툴바의 안전 inset입니다. scalar 값은 현재 placement에 따라 해당 top / right / bottom / left 가장자리에 적용됩니다.","controller.layout.flipInset.desc":"좌우 flip 버튼의 안전 inset입니다. scalar 값은 왼쪽과 오른쪽 버튼에 모두 적용됩니다.","controller.layout.paginationInset.desc":"페이지네이션의 안전 inset입니다. scalar 값은 하단 진입 방향에 적용되어 caption이나 사용자 UI와 겹치지 않게 합니다.","controller.layout.captionInset.desc":"caption의 안전 inset입니다. scalar 값은 하단 진입 방향에 적용되어 페이지네이션이나 하단 컨트롤보다 위에 둘 수 있습니다.","controller.render.desc":"완전히 사용자 지정한 컨트롤러 render 콜백입니다. state, actions, 내장 slots를 받으며 controller=false일 때는 비활성화됩니다.","controller.overriddenBy":"상위 스위치에 의해 활성화","snippet.overriddenByProp":"{umbrella}에 의해 재정의됨","hotkey.close":"닫기 (Escape)","hotkey.zoom":"줌 (Space)","hotkey.flip":"페이지 이동 (←/→)","hotkey.flipLeft":"이전 (←)","hotkey.flipRight":"다음 (→)","hotkey.rotate":"회전 ([ / ])","hotkey.rotateLeft":"왼쪽 회전 ([)","hotkey.rotateRight":"오른쪽 회전 (])","hotkey.download":"다운로드 (Mod+S)","hotkey.close.desc":"Escape를 눌러 뷰어 닫기","hotkey.zoom.desc":"Space를 눌러 1:1 줌 모드 토글","hotkey.flip.desc":"← / → 키로 set 안에서 페이지 이동","hotkey.flipLeft.desc":"← 키로 이전 이미지로 이동","hotkey.flipRight.desc":"→ 키로 다음 이미지로 이동","hotkey.rotate.desc":"[ / ] 키로 이미지 회전 (조합 스위치; 양방향 모두 바인딩)","hotkey.rotateLeft.desc":"[ 키로 시계 반대 방향 90° 회전","hotkey.rotateRight.desc":"] 키로 시계 방향 90° 회전","hotkey.download.desc":'Cmd+S (macOS) 또는 Ctrl+S (Windows/Linux)로 현재 이미지 다운로드. 기본 비활성 — 활성화 시 브라우저의 "다른 이름으로 페이지 저장" 단축키를 가로챕니다.',"animate.browsing.desc":"뷰어를 열고 닫을 때의 트랜지션","animate.flip.desc":"set 내에서 페이지를 이동할 때의 트랜지션 스타일","animate.slowMotion.desc":"켜면 열거나 닫을 때 Shift를 누르는 동안 전체 브라우징 전환이 10배 느려져 확인이나 데모에 사용할 수 있습니다","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"이미지 URL. 필수 항목.","param.alt.label":"alt","param.alt.desc":"이미지 제목. 뷰어 상단에 표시됩니다.","param.caption.label":"caption","param.caption.desc":"뷰어 하단 캡션. string 이면 기본 필 스타일, { text, style?, className? } 이면 사용자 정의. set[i].caption 으로 항목별 덮어쓰기 가능.","param.set.label":"set","param.set.desc":"다중 이미지 세트. 전달하면 화살표 키로 이동 가능한 갤러리 모드가 활성화됩니다.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"초기 페이지 인덱스 (0부터 시작).","param.preset.label":"preset","param.preset.desc":"프리셋 번들. 기본값은 auto이며 controller / hotKey / animate / gesture의 기본값을 결정합니다.","param.backdrop.label":"backdrop","param.backdrop.desc":"뷰어 배경색. 유효한 CSS 색상 문자열이면 됩니다.","param.zIndex.label":"zIndex","param.zIndex.desc":"뷰어의 쌓임 순서.","param.radius.label":"radius","param.radius.desc":"이미지 모서리 반경 (px).","param.edge.label":"edge","param.edge.desc":"이미지와 뷰포트 사이의 최소 여백 (px).","param.loop.label":"loop","param.loop.desc":"끝에 도달했을 때 첫 이미지로 순환할지 여부.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"페이지 스크롤 시 뷰어를 닫습니다.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"이미지 더블클릭으로 뷰어를 닫습니다. 기본값은 꺼짐.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"뷰어가 열려 있는 동안에도 커버 이미지를 표시합니다.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"로딩 인디케이터 표시 전 지연 (ms). 이 기간 안에 이미지 로딩이 완료되면 로딩이 표시되지 않습니다 — 캐시된 이미지를 빠르게 전환할 때 깜빡임을 방지합니다. 기본 200ms; 0 = 즉시 표시 (구버전 동작).","param.controller.label":"controller","param.controller.desc":"컨트롤 바 설정입니다. false는 전체를 끄고, 부분 객체는 버튼, 위치, 오버레이 레이아웃, 사용자 지정 render를 덮어씁니다.","param.hotKey.label":"hotKey","param.hotKey.desc":"키보드 단축키.","param.animate.label":"animate","param.animate.desc":"브라우징, 커버 기하, 슬로 모션, 페이지 전환 애니메이션 설정입니다.","param.gesture.label":"gesture","param.gesture.desc":"프리셋을 따르는 제스처 설정입니다. desktop은 줌 상태에서 wheelZoom을 켜고, mobile은 기본적으로 swipe, dragExit, pinchZoom, doubleTapZoom을 켭니다. gesture=false는 모두 끕니다.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"뷰어가 열리거나 닫힐 때 호출됩니다 (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"줌 모드 진입 / 종료 시 호출됩니다 (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"페이지 변경 시 호출됩니다 (새 페이지 인덱스).","param.onRotating.label":"onRotating","param.onRotating.desc":"회전 시 호출됩니다 (각도).","param.onError.label":"onError","param.onError.desc":"이미지 로드 실패 시 호출됩니다 (커버/뷰어 공통, SyntheticEvent 전달).","param.browsing.label":"browsing","param.browsing.desc":"제어된 브라우징 상태. 값을 전달하면 제어 모드로 전환되며 onBrowsing과 함께 사용해야 합니다.","docs.section.installation.title":"설치","docs.section.installation.intro":"패키지 매니저로 설치:","docs.section.installation.agent":"AI Agent는 먼저 https://zmage.caldis.me/llms.txt 를 읽고, 기본 통합은 최소한으로 유지해야 합니다.","docs.section.installation.then":"컴포넌트와 스타일시트를 가져오기:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"서버 렌더링 앱이라면, import 시 document에 접근하지 않는 /ssr 엔트리를 사용하세요:","docs.section.modes.title":"세 가지 호출 방식","docs.section.modes.intro":"react-zmage는 동일한 설정 인터페이스를 세 가지 호출 형태로 제공합니다:","docs.section.modes.componentTitle":"컴포넌트","docs.section.modes.componentBody":"기본 방식 — 렌더링하는 JSX를 직접 제어할 때 사용합니다. 로 바꾸기만 하면, 모든 네이티브 HTML 속성(className, style, onClick 등)이 내부의 로 그대로 전달됩니다.","docs.section.modes.imperativeTitle":"명령형","docs.section.modes.imperativeBody":"적절한 커버 가 없거나, 컴포넌트 트리에 추가 노드를 마운트하고 싶지 않을 때 사용합니다. 이벤트 핸들러, 비동기 콜백, 서드파티 위젯 등 어디에서든 호출하여 뷰어를 열 수 있습니다. 수동으로 닫을 수 있도록 destructor 클로저를 반환합니다.","docs.section.modes.wrapperTitle":"래퍼","docs.section.modes.wrapperBody":"렌더링되는 HTML을 직접 제어할 수 없을 때 사용합니다 — markdown 출력, CMS 리치 텍스트, dangerouslySetInnerHTML. Wrapper는 클릭된 에서 src / alt를 읽고, backdrop, 컨트롤, 단축키, 애니메이션, 콜백, set 같은 뷰어 설정은 에 둡니다.","docs.section.modes.wrapperNote":"Wrapper는 componentDidMount / componentDidUpdate 시점에 자식 img를 탐색합니다. Wrapper가 렌더링된 뒤에 주입된 이미지는 Wrapper가 다시 렌더될 때까지 연결되지 않습니다. set이 전달되면 클릭된 img의 src를 set과 대조해 초기 페이지로 사용하고, set이 없으면 data-zmage-caption 또는 가장 가까운 figcaption을 뷰어 caption으로 사용할 수 있습니다.","docs.section.theming.title":"테마 통합","docs.section.theming.intro":"react-zmage는 의도적으로 호스트 사이트의 테마 시스템에 종속되지 않습니다 — prefers-color-scheme을 읽지 않으며, 특정 CSS 변수 프레임워크에 묶이지도 않습니다. 라이트/다크 통합은 사용자 측의 책임입니다:","docs.section.theming.bullet.backdrop":"뷰어 배경은 backdrop 속성으로 지정합니다(유효한 CSS 색상 문자열). 기본값은 흰색 #FFFFFF입니다.","docs.section.theming.bullet.icons":"컨트롤 바 아이콘은 SVG currentColor로 렌더링됩니다. 글로벌 CSS에서 덮어쓰면 디자인 시스템과 정렬할 수 있습니다.","docs.section.theming.bullet.scoped":"런타임 스타일은 모두 #zmage 컨테이너 내부로 스코프되어 앱의 다른 부분에 누수되지 않습니다.","docs.section.theming.defaultTitle":"기본 동작","docs.section.theming.defaultBody":"backdrop을 생략하면 뷰어가 흰색 패널로 렌더링됩니다. 라이트 사이트에서는 자연스럽지만, 다크 사이트에서는 흰색 컨트롤 아이콘과 대비가 약해집니다:","docs.section.theming.patternTitle":"컴포넌트 / 제어 사용","docs.section.theming.patternBody":"기존 테마 훅(next-themes, 자체 ThemeProvider 등)에서 resolved 값을 읽고 색상으로 매핑한 뒤 backdrop으로 전달하세요. 작은 로컬 컴포넌트로 감싸두면 호출부가 깔끔해집니다:","docs.section.theming.imperativeTitle":"명령형 사용","docs.section.theming.imperativeBody":"이벤트 핸들러에서 현재 DOM 상태(예: documentElement의 테마 클래스)를 읽고 색상으로 변환한 뒤 Zmage.browsing에 전달하세요:","docs.section.theming.iconsTitle":"디자인 시스템과 아이콘 색상 정렬","docs.section.theming.iconsBody":"컨트롤 아이콘은 #zmage 컨테이너 안에 있습니다. 글로벌 CSS에서 색상을 덮어쓸 수 있습니다. CSS 변수로 테마를 관리한다면(Tailwind / shadcn 등), 디자인 토큰에 직접 바인딩할 수 있습니다:","docs.section.theming.toolbarTitle":"툴바를 모달 backdrop에서 분리하기","docs.section.theming.toolbarBody":'기본적으로 툴바 캡슐은 최상위 backdrop을 따르고 아이콘은 currentColor로 그려집니다. 어두운 단색 backdrop에서는 어두운 아이콘이 어두운 캡슐에 묻혀 보이지 않습니다. controller.backdrop(캡슐 색상)과 controller.color(아이콘 색상)을 지정해 분리하세요. 개별 버튼 문자열 지정(예: controller.zoom = "#ff8800")은 controller.color보다 우선합니다.',"docs.search.desc.installation":"패키지 매니저로 설치하고 스타일시트 가져오기","docs.search.desc.ssr":"import 시 document에 접근하지 않는 SSR 엔트리","docs.search.desc.modes":"컴포넌트 / 명령형 / 래퍼 — 세 가지 호출 방식","docs.search.desc.theming":"뷰어 배경과 아이콘을 사이트 테마와 정렬","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"프리셋 선택: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"controller / hotKey / animate / gesture 기본 묶음","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex 등 UI 옵션","docs.search.desc.propsController":"컨트롤 바 버튼, 위치, 사용자 지정 render","docs.search.desc.propsHotkey":"키보드 단축키: ESC / Space / 화살표","docs.search.desc.propsAnimate":"브라우징 및 페이지 이동 애니메이션","docs.search.desc.propsGesture":"휠 줌, 드래그 페이징, 드래그 종료, 핀치, 더블 탭 줌","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"제어된 브라우징 상태","docs.search.desc.examples":"단일 이미지와 다중 이미지 갤러리 예제","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet 타입 선언","docs.search.desc.migration":"0.x에서의 업그레이드 노트","docs.search.desc.faq":"흔한 통합 이슈와 버전별 수정 사항","docs.section.props.title":"Props","docs.section.props.intro":"BaseType의 모든 속성은 세 가지 모드 중 어떤 것에서도 사용할 수 있습니다.","docs.section.props.wrapperScope.title":"Wrapper 모드의 prop 범위","docs.section.props.wrapperScope.intro":"는 커버 이미지를 직접 렌더링하지 않습니다. 이미 존재하는 하위 노드에 뷰어를 연결하므로, 일부 prop은 Wrapper 모드에서 별도의 의미를 갖습니다.","docs.section.props.wrapperScope.data":"src와 alt는 자식 에 둡니다. 최상위 src / alt는 클릭된 DOM 노드 값으로 덮어써집니다. set이 없을 때는 caption을 data-zmage-caption 또는 가장 가까운 figcaption에서 읽을 수 있습니다.","docs.section.props.wrapperScope.config":"set과 defaultPage는 명시적인 공유 갤러리에 사용할 수 있습니다. 클릭된 img src가 set에 있으면 Wrapper는 해당 index를 열고, defaultPage는 fallback으로만 쓰입니다. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, loadingDelay는 평소처럼 적용됩니다.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating, onError는 정상 동작합니다. Wrapper 내부에서 같은 뷰어를 열기 때문입니다.","docs.section.props.wrapperScope.controlled":"browsing은 컴포넌트 모드의 controlled state이며 Wrapper를 제어하지 않습니다. 외부 state로 열고 싶다면 컴포넌트 모드를 쓰거나 Zmage.browsing()을 직접 호출하세요.","docs.section.props.interface":"인터페이스 및 인터랙션","docs.section.props.controller.keyHeader":"키","docs.section.props.controller.descHeader":"설명","docs.section.props.controller.umbrella":"rotate는 rotateLeft / rotateRight의 상위 스위치로, 활성화하면 두 버튼이 모두 표시됩니다. flip도 flipLeft / flipRight에 대해 동일하게 동작합니다.","docs.section.props.controller.layoutTitle":"오버레이 레이아웃","docs.section.props.controller.layoutIntro":"layout은 toolbar, 좌우 flip, pagination, caption 오버레이 offset만 조정하며 이미지 첫 프레임이나 zoom 지오메트리에는 참여하지 않습니다. 숫자는 px, 문자열은 CSS 길이로 전달되고 scalar inset은 각 대상의 자연스러운 진입 방향에 적용되며 layout.mobile은 모바일에서 기본 레이아웃을 덮어씁니다.","docs.section.props.controller.renderTitle":"사용자 지정 render","docs.section.props.controller.renderIntro":"render는 { state, actions, slots }를 받고 React 노드를 반환해야 합니다. null을 반환하면 컨트롤러 레이어를 숨길 수 있고, 일부 UI만 바꾸려면 slots를 재사용할 수 있습니다.","docs.section.props.hotkey.umbrella":"flip은 flipLeft / flipRight의, rotate는 rotateLeft / rotateRight의 상위 스위치입니다 — 어느 쪽이든 활성화하면 좌우 양쪽 키가 함께 바인딩됩니다. 각 entry는 'Mod+S' / 'BracketLeft' 같은 문자열 디스크립터로 기본 바인딩을 재정의할 수 있습니다 (Mod는 macOS에서 ⌘, Windows/Linux에서 Ctrl).","docs.section.props.hotkey.customTitle":"사용자 지정 바인딩","docs.section.props.hotkey.customIntro":"각 hotKey 엔트리는 boolean (켜기/끄기), string (사용자 지정 디스크립터), string[] (여러 바인딩)을 받습니다. 디스크립터는 e.code 이름을 사용하며 — 키의 물리적 위치 기반, 키보드 레이아웃과 무관합니다. Mod 접두사는 크로스 플랫폼 ⌘/Ctrl을 의미합니다. 엄격한 수정자 매칭: 선언되지 않은 수정자가 눌려 있으면 안 됩니다 (예: Space는 Cmd+Space로 발화되지 않음).","docs.section.props.hotkey.cheatsheetTitle":"디스크립터 치트시트","docs.section.props.hotkey.cheatsheet.shorthand":"단일 문자 / 숫자는 자동 정규화","docs.section.props.hotkey.cheatsheet.arrows":"화살표 키","docs.section.props.hotkey.cheatsheet.punct":"문장 부호 (키의 물리적 이름)","docs.section.props.hotkey.cheatsheet.whitespace":"공백 / 제어 키","docs.section.props.hotkey.cheatsheet.modifier":"수정자 접두사 (+로 연결)","docs.section.props.animate.typeHeader":"타입","set.src.desc":"이미지 URL — 필수","set.alt.desc":"해당 이미지의 제목","set.caption.desc":"해당 이미지의 캡션. 지정하면 외부 caption을 덮어씁니다","set.className.desc":"해당 이미지에 적용되는 사용자 정의 클래스","set.style.desc":"해당 이미지에 적용되는 사용자 정의 인라인 스타일","docs.section.props.preset.title":"프리셋 번들","docs.section.props.preset.intro":"preset은 controller / hotKey / animate / gesture 하위 객체에 적용되는 기본값 묶음입니다. preset을 생략하면 auto를 사용합니다. auto는 런타임에 matchMedia('(pointer: coarse) and (hover: none)')를 통해 desktop 또는 mobile로 해석되며, SSR 또는 matchMedia가 없는 환경에서는 desktop으로 폴백됩니다.","docs.section.props.preset.subParamHeader":"하위 파라미터","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"예제","docs.section.examples.singleTitle":"단일 이미지","docs.section.examples.galleryTitle":"다중 이미지 갤러리","docs.section.examples.mobileTitle":"모바일 제스처","docs.section.examples.mobileBody":"mobile preset을 강제로 사용해 터치 기기에서 드래그 전환, 드래그 종료, 핀치 줌, 더블 탭 줌을 확인합니다.","docs.section.examples.controllerTitle":"사용자 지정 컨트롤러","docs.section.examples.controllerBody":"컨트롤러를 화면 가장자리로 옮기거나 state와 actions를 받는 render 콜백으로 전체 UI를 교체할 수 있습니다.","docs.section.examples.coverTitle":"잘린 커버","docs.section.examples.coverBody":"object-fit과 border radius를 커버 img 자체에 두면 열리는 첫 프레임이 보이는 크롭과 맞춰집니다.","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"타입은 런타임 export와 같은 위치에 있습니다. 전체 prop 유니온 타입은 BaseType입니다:","docs.section.typescript.refIntro":"컴포넌트는 ref를 받아 커버 img로 전달합니다:","docs.section.migration.title":"마이그레이션","docs.section.migration.from":"0.x에서 업그레이드:","docs.section.migration.bullet1":"컴포넌트는 forwardRef exotic이므로 new Zmage()로 호출하지 마세요.","docs.section.migration.bullet2":"SSR 엔트리를 가져오고 있다면 react-zmage/ssr로 전환하세요.","docs.section.faq.title":"자주 묻는 질문","docs.section.faq.tailwind-shrink.q":"Tailwind / normalize.css / Bootstrap을 사용하면 모달 이미지가 커버보다 작게 시작하는 이유는?","docs.section.faq.tailwind-shrink.a":"해당 리셋들은 전역으로 `img { max-width: 100% }`를 적용하므로 모달 이미지가 커버 크기로 제한됩니다. 1.1.2 이전 버전이 영향을 받으며, 1.1.2+ 에서는 `.imageLayer`에 방어 스타일을 추가했습니다. >=1.1.2로 업그레이드하세요.","docs.section.faq.r19-imperative.q":"React 18 / 19에서 `Zmage.browsing()`이 undefined를 반환하는 이유는?","docs.section.faq.r19-imperative.a":"1.1.2에서 수정된 버그입니다. 기존 코드는 `RENDER.REF.current?.outBrowsing`을 동기적으로 읽었는데, React 17에서는 동작했지만 R18+ 에서는 커밋이 비동기라 깨집니다. 1.1.2는 안정적인 destructor 클로저를 반환합니다. >=1.1.2로 업그레이드하세요.","docs.section.faq.wrapper-empty.q":"``가 빈 모달을 열고 브라우저가 빈 src 경고를 띄웁니다. 왜죠?","docs.section.faq.wrapper-empty.a":"기존 래퍼는 클릭된 img 위에 `defaultProps.src=''`를 스프레드해 src/alt를 비웠습니다. 1.1.2는 클릭된 DOM 노드의 src/alt를 명시적으로 읽도록 수정되었습니다. 업그레이드하면 해결됩니다.","docs.section.faq.vite-esm.q":'Vite / Next.js 클라이언트에서 명령형 API가 "no compatible mount API"를 던집니다. 왜죠?',"docs.section.faq.vite-esm.a":"1.1.2 이전에는 런타임 감지에 `require('react-dom/client')`를 사용했지만 브라우저 ESM에는 `require` 전역이 없습니다. 1.1.2는 정적 import로 전환했습니다 — >=1.1.2로 업그레이드하세요.","docs.section.faq.wrapper-dynamic.q":"마운트 이후에 추가한 이미지에 래퍼가 클릭 핸들러를 연결하지 않습니다.","docs.section.faq.wrapper-dynamic.a":"래퍼는 `componentDidMount`와 `componentDidUpdate` 시점에만 ``를 탐색합니다. React 렌더 트리 바깥에서 DOM img를 주입한다면(예: 부모가 재렌더되지 않은 채로 변하는 dangerouslySetInnerHTML), 래퍼가 다시 렌더되도록 강제하거나, 직접 클릭 핸들러에서 `Zmage.browsing()`을 호출하세요.","docs.section.faq.lazy-src.q":"제 ``는 data-src / 지연 로딩을 사용합니다 — Zmage를 열면 실제 이미지가 아니라 플레이스홀더가 보입니다. 어떻게 수정하나요?","docs.section.faq.lazy-src.a":"Zmage는 기본적으로 커버 ``의 `src`를 읽습니다 — 플레이스홀더가 전부입니다. 미리보기할 실제 URL을 `set`으로 명시적으로 전달하세요: ``. 명령형 호출도 동일합니다: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"페이지에는 썸네일을 보여주고 클릭하면 고해상도 이미지를 표시하고 싶습니다 — `set`을 생략할 수 있나요?","docs.section.faq.cover-vs-set.a":'아니요. `set`을 주지 않으면 커버의 `src`가 곧 뷰어가 보여주는 것입니다. "썸네일 진입점 + 풀사이즈 뷰어"를 만들려면 명시적으로 분리해야 합니다: ``. 같은 패턴이 data-src 지연 로딩 (위 FAQ) 과 CDN 다중 해상도 시나리오를 모두 해결합니다. "그리드/갤러리 + 뷰어 열기" UI를 원한다면 Zmage가 직접 제공하지 않습니다 — 갤러리는 직접 렌더하고 클릭 시 `Zmage.browsing({ src, set })`을 호출하세요.',"docs.section.faq.controlled-mismatch.q":"제어된 `browsing` prop이 모달 상태와 어긋납니다.","docs.section.faq.controlled-mismatch.a":"제어 모드에서는 `browsing`과 `onBrowsing`이 모두 필요합니다. `browsing`만 전달하면 내부 상태가 한 번만 동기화된 뒤 점점 어긋납니다. 항상 짝으로 사용하세요.","docs.section.faq.ssr.q":"Next.js / Remix / SSR 프레임워크에서 어떻게 사용하나요?","docs.section.faq.ssr.a":"`react-zmage/ssr` 엔트리를 사용하세요 — import 시 `document`에 접근하지 않습니다. 명령형 `Zmage.browsing()`이 렌더 도중이나 서버 전용 경로에서 실행될 가능성이 있다면 `typeof window !== 'undefined'` 가드가 필요합니다.","docs.section.faq.theme.q":"뷰어를 다크 / 라이트 테마에 맞추려면?","docs.section.faq.theme.a":"위의 「테마 통합」 섹션에 따라 `backdrop`을 전달하세요. 라이브러리는 설계상 테마에 비종속적이며 prefers-color-scheme도 읽지 않습니다 — 매핑은 앱 측의 책임입니다.","playground.preset.aria":"데이터 프리셋 전환","playground.preset.default.label":"기본","playground.preset.default.hint":"童夢 · 2 장","playground.preset.testset.label":"테스트 세트","playground.preset.testset.hint":"6 장 · 비율 + 포맷"},xR={"nav.playground":"Playground","nav.docs":"Documentation","nav.ai":"Guide installation IA","nav.github":"GitHub","useCases.eyebrow":"Cas d'utilisation","useCases.title":"Apercu d'images React pour blogs, CMS, MDX et pages d'actualite","useCases.body":"react-zmage est un visualiseur d'images React qui transforme des elements ordinaires en apercu plein ecran avec ouverture depuis l'origine. Il prend en charge les galeries, le clavier, les gestes mobiles, l'ouverture imperative, le mode Wrapper pour rich text et SSR/RSC.","useCases.cta.docs":"Lire la documentation","useCases.cta.wrapper":"Essayer le mode Wrapper","useCases.card.blog.title":"Apercu d'images de blog","useCases.card.blog.body":"Ouvrez les images d'article en plein ecran sans remplacer la mise en page du post ni creer une galerie separee.","useCases.card.cms.title":"Images rich text de CMS","useCases.card.cms.body":"Encadrez le HTML rendu par un CMS, un parseur Markdown ou un editeur pour que les existants ouvrent le visualiseur.","useCases.card.news.title":"Galeries d'articles d'actualite","useCases.card.news.body":"Gardez les pages editoriales lisibles tout en offrant clavier, gestes et navigation multi-image pour voir les details.","useCases.card.mdx.title":"Images MDX et documentation","useCases.card.mdx.body":"Utilisez le mode Wrapper pour les pages de docs ou les auteurs controlent les images et l'app React controle la structure.","useCases.card.lightbox.title":"Alternative a React lightbox","useCases.card.lightbox.body":"Utilisez une couche d'apercu plus legere quand vous voulez le zoom origin-expand et conserver le markup existant sans adopter une galerie complete.","useCases.card.ssr.title":"Next.js, SSR et RSC","useCases.card.ssr.body":"Importez le sous-chemin compatible SSR dans les apps rendues cote serveur, puis ouvrez le visualiseur interactif depuis des frontieres client.","useCases.mode.eyebrow":"Choisir un mode","useCases.mode.title":"Choisissez selon qui possede le markup image","useCases.mode.component":"Vous controlez le JSX et pouvez remplacer par .","useCases.mode.imperative":"Un bouton, une commande, un evenement ou un callback doit ouvrir le visualiseur.","useCases.mode.wrapper":"Les images viennent d'un CMS, de MDX, de Markdown ou de HTML rich text.","useCases.facts.eyebrow":"Faits d'entite","useCases.facts.title":"La version courte que les crawlers doivent comprendre","useCases.fact.react":"React 16.8 a 19","useCases.fact.modes":"Modes Component, imperative et Wrapper","useCases.fact.input":"Navigation clavier et gestes mobiles","useCases.fact.ssr":"Chemin d'import compatible SSR/RSC","useCases.fact.gallery":"Navigation de galerie sans restructurer la page","useCases.fact.origin":"Apercu plein ecran avec origin-expand","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Questions frequentes des personnes et des AI Agents","useCases.faq.what.q":"Qu'est-ce que react-zmage?","useCases.faq.what.a":"react-zmage est un visualiseur d'images React qui transforme des elements ordinaires en apercu plein ecran avec origin-expand, galerie, clavier, gestes mobiles, mode Wrapper et support SSR/RSC.","useCases.faq.lightbox.q":"Quand utiliser react-zmage plutot qu'une React lightbox?","useCases.faq.lightbox.a":"Utilisez react-zmage quand vous voulez ouvrir des images existantes en plein ecran sans reconstruire la page autour d'une galerie. Il convient aux blogs, CMS rich text, docs MDX, articles d'actualite et pages riches en images.","useCases.faq.richText.q":"react-zmage gere-t-il les images CMS, Markdown ou rich text?","useCases.faq.richText.a":"Oui. Zmage.Wrapper peut lier les noeuds descendants dans du contenu CMS, Markdown, MDX ou dangerouslySetInnerHTML, tout en conservant le markup et la mise en page existants.","useCases.faq.ssr.q":"react-zmage prend-il en charge Next.js, SSR ou RSC?","useCases.faq.ssr.a":"Oui. Utilisez le sous-chemin react-zmage/ssr pour les imports SSR ou RSC, puis appelez les APIs interactives depuis des evenements client ou des Client Components.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Faites partir chaque ","hero.title.line2":"de sa position","hero.subtitle":"Transformez n'importe quel en visionneuse plein écran qui s'ouvre depuis sa position d'origine, avec clavier, gestes et navigation multi-images.","hero.cta.start":"Lire la doc","hero.cta.playground":"Essayer les paramètres","hero.ai.label":"Guide installation IA : lire llms.txt d’abord","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Copier le prompt rapide","hero.ai.copyLabel":"Copier le prompt AI rapide","hero.ai.viewLlms":"voir llms.txt →","ai.badge":"Guide installation IA","ai.title":"Créez un prompt d’intégration react-zmage","ai.subtitle":"Commencez par llms.txt. Gardez Auto pour laisser votre agent inspecter le projet, ou ajustez l’environnement, la source d’images et les interactions avant de copier.","ai.field.agent":"Quel agent utilisez-vous ?","ai.field.depth":"Niveau de configuration","ai.field.environment":"Environnement du projet","ai.field.mode":"Mode d’utilisation","ai.field.imageSource":"Source des images","ai.field.interaction":"Stratégie d’interaction","ai.field.project":"Description du projet","ai.autoTip":"Gardez Auto si vous hésitez. Votre agent inspectera d’abord la structure du projet, la source des images, le mode de rendu et l’entrée des styles, puis choisira le bon mode Zmage et les bonnes props.","ai.project.placeholder":"Décrivez votre app, la source des images et ce que le viewer doit faire.","ai.action.copy":"Copier le setup prompt","ai.action.copied":"Copié","ai.action.openLlms":"Ouvrir llms.txt","ai.copy.error":"La copie a échoué. Sélectionnez le prompt manuellement dans l’aperçu.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"Se met à jour avec vos options","ai.preview.copy":"Copier","ai.preview.expand":"Agrandir","ai.preview.show":"Voir le prompt","ai.preview.hide":"Masquer l’aperçu","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Rend le prompt compatible avec un agent de code général.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Laissez l’agent inspecter le projet d’abord.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Spécifiez manuellement les préférences d’intégration.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Surface interactive réelle","demo.title":"Une page narrative construite avec Child's Dream","demo.body":"Ces images viennent de Child's Dream: un vieux livre, un portail temporel, un renard, une route forestière et un sceau de cristal. Cliquez une image; la première image s’agrandit depuis ce recadrage exact vers le viewer.","demo.shiftHint":"Maintenez SHIFT en cliquant une image pour sentir la transition fluide","demo.zoomHint":"Ouvrez une image, appuyez sur Space pour zoomer, puis utilisez la molette pour continuer.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"Un livre poussiéreux dans un coin de bibliothèque ouvre une porte vers un temps ancien.","demo.story.lead":"Les mots ordinaires de la page deviennent une scène miniature. Le garçon voit une forêt sortir du papier et entend un appel depuis l’autre côté de la barrière.","demo.story.middle":"Un renard devient son compagnon. Après les marées, les canopées et les flamants roses, la route mène plus loin dans la forêt vers un sceau de cristal.","demo.tile.cover":"Vieux livre et portail","demo.tile.gallery":"Première rencontre en forêt","demo.tile.ratio":"Chemin au bord de la marée","demo.tile.controller":"Sceau de cristal","demo.tile.zoom":"Halte des flamants","demo.tile.lamp":"Lumière sous les feuilles","demo.tile.rescue":"Libération dans la forêt","demo.feature.cover":"Clip et rayon de cover alignés","demo.feature.space":"Déplacez le pointeur pour parcourir vite l’image zoomée","demo.feature.wheel":"Utilisez la molette pour changer l’échelle avec douceur","demo.feature.shift":"Shift ralentit ouverture et fermeture","demo.caption":"Cliquez une image pour ouvrir le viewer. Sur desktop, maintenez SHIFT à l’ouverture, puis déplacez le pointeur ou utilisez la molette après zoom.","demo.scene.portal.alt":"Un portail temporel lumineux sur un vieux livre","demo.scene.portal.caption":"Un portail temporel s’allume dans le vieux livre et une forêt sort des mots.","demo.scene.forest.alt":"Le garçon rencontre un renard dans la forêt","demo.scene.forest.caption":"Le renard apparaît entre les arbres et devient le compagnon du garçon.","demo.scene.tide.alt":"Le garçon se tient au bord d’une marée","demo.scene.tide.caption":"L’eau se courbe en spirale et indique le prochain chemin inconnu.","demo.scene.canopy.alt":"Le garçon repose sous une immense canopée","demo.scene.canopy.caption":"La canopée s’ouvre comme des pages pendant que de petites lumières marquent la route.","demo.scene.flamingo.alt":"Le garçon est assis parmi des flamants roses","demo.scene.flamingo.caption":"Un vol léger de flamants offre une pause calme au voyage.","demo.scene.lamp.alt":"Le garçon allume une lampe sous de larges feuilles","demo.scene.lamp.caption":"Les feuilles retiennent l’obscurité pendant que la lampe révèle des indices dans le livre.","demo.scene.crystal.alt":"Le garçon se tient devant un sceau de cristal","demo.scene.crystal.caption":"Le sceau de cristal commence à apparaître au fond de la forêt.","demo.scene.rescue.alt":"Le renard et le garçon approchent du sceau de cristal","demo.scene.rescue.caption":"La clé approche du cristal et le secret du sceau est sur le point de s’ouvrir.","feature.dropin.title":"Ouverture depuis l'origine","feature.dropin.hint":"Ouvre depuis la position, la taille, le rayon et le recadrage de l'image, puis revient au même endroit.","feature.mobile.title":"Compatible mobile","feature.mobile.hint":"Le preset Auto choisit les gestes tactiles: glisser entre les images, tirer vers le bas pour fermer, double tap et pinch zoom.","feature.set.title":"Outils de navigation complets","feature.set.hint":"Zoom, rotation, changement d'image, telechargement et captions partagent un meme etat, meme dans les sets multi-image.","feature.ssr.title":"Compatible SSR/RSC","feature.ssr.hint":"Utilisez l'entree sure cote serveur dans Next.js, SSR ou RSC, puis gardez l'interaction du viewer dans les frontieres client.","modes.title":"S'adapte à votre page existante","modes.component.label":"Mode composant","modes.component.desc":"Quand vous contrôlez le JSX, remplacez par et gardez les props natives.","modes.imperative.label":"Appel impératif","modes.imperative.desc":"Ouvrez la visionneuse depuis boutons, callbacks ou flux asynchrones, sans image de couverture.","modes.wrapper.label":"Mode wrapper","modes.wrapper.desc":"Encapsulez Markdown / CMS / dangerouslySetInnerHTML pour que les images internes s'ouvrent depuis leur place.","modes.try":"Ouvrir l'exemple →","modes.component.when":"Choisissez le mode composant quand vous contrôlez le JSX rendu. Remplacez n'importe quel par ; les props natives continuent de passer, et ouverture / fermeture utilisent la même transition depuis l'origine.","modes.imperative.when":"Choisissez l'appel impératif quand le point d'entrée n'est pas l'image elle-même. Ouvrez la visionneuse depuis gestionnaires d'événement, callbacks tiers ou flux asynchrones sans monter de de couverture.","modes.wrapper.when":"Choisissez le mode wrapper quand vous ne contrôlez pas le HTML rendu — markdown, rich text CMS, dangerouslySetInnerHTML. Encapsulez le sous-arbre, et chaque interne gagne automatiquement la visionneuse.","footer.project":"Projet","footer.repo":"Dépôt","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Cas d'utilisation","footer.madeby":"Créé par","footer.illustrator":"Illustration","footer.license":"Licence MIT","pg.title":"Playground","pg.subtitle":"Ajustez chaque prop et regardez la visionneuse réagir en temps réel.","pg.reset":"Réinitialiser","pg.share":"Partager","pg.shared":"Lien copié","pg.tab.component":"Composant","pg.tab.imperative":"Impératif","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Astuce : Espace pour zoomer · ←/→ pour changer de page · ESC pour fermer","pg.preview.trigger":"Déclencher la visionneuse","pg.params.title":"Paramètres","pg.params.subtitle":"Survolez un prop pour l’aide, ou ouvrez sa doc avec l’icône livre.","pg.events.title":"Événements","pg.events.subtitle":"Sortie des callbacks de cycle de vie pour cette session.","pg.events.empty":"Activez n'importe quel callback de cycle de vie pour voir le flux d'événements ici.","pg.code.title":"Code","pg.code.subtitle":"Code prêt à copier pour le mode actif.","pg.code.hideDefaults":"Masquer les valeurs par défaut","pg.copy":"Copier","pg.copied":"Copié","group.data":"Données","group.preset":"Préréglage","group.interface":"Interface","group.controller":"Contrôleur","group.hotkey":"Raccourcis","group.animate":"Animation","group.gesture":"Gesture","group.lifecycle":"Cycle de vie","group.controlled":"Contrôlé","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Portée bureau","common.presetScope.desktop.desc":"Option orientée bureau. Le preset desktop l'active par défaut ou c'est le seul environnement où elle a un effet pratique.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Portée mobile","common.presetScope.mobile.desc":"Option orientée mobile ou tactile. Le preset mobile l'active par défaut ou elle ne compte que pour l'interaction tactile.","common.expand":"Agrandir","common.required":"Obligatoire","common.default":"Par défaut","common.add":"Ajouter","common.remove":"Supprimer","common.enable":"Activer","common.disable":"Désactiver","param.viewInDocs":"Voir dans la doc","docs.title":"Référence API","docs.search.placeholder":"Rechercher dans la doc...","docs.search.empty":"Aucun résultat","docs.toc.title":"Sur cette page","docs.sidebar.gettingStarted":"Premiers pas","docs.sidebar.quickstart":"Démarrage rapide","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Concepts","docs.sidebar.modes":"Modes","docs.sidebar.theming":"Thèmes","docs.sidebar.props":"Props","docs.sidebar.recipes":"Recettes","docs.sidebar.examples":"Exemples","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Référence","docs.sidebar.migration":"Migration","docs.sidebar.faq":"FAQ","preset.desktop":"Bureau","preset.mobile":"Mobile","preset.auto":"Auto","animate.flip.fade":"Fondu","animate.flip.crossFade":"Fondu enchaîné","animate.flip.swipe":"Glissement","animate.flip.zoom":"Zoom","animate.flip.blur":"Flou","animate.flip.none":"Aucun","animate.slowMotion":"Ralenti","gesture.swipe":"Glissement","gesture.dragExit":"Glisser pour fermer","gesture.wheelZoom":"Zoom molette","gesture.pinchZoom":"Pinch zoom","gesture.doubleTapZoom":"Zoom double tap","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Configuration des gestes pilotée par preset. Desktop active le zoom molette quand l’image est déjà zoomée ; mobile active le glissement de page, le glissement pour fermer, le pinch zoom et le double tap.","gesture.swipe.desc":"Glissement horizontal pour changer de page dans un set. Ignoré pour les visionneuses à image unique.","gesture.dragExit.desc":"Glissement vertical pour fermer. Passe par le chemin de fermeture onBrowsing(false) existant.","gesture.wheelZoom.desc":"Zoom à la molette ou au trackpad quand la visionneuse est déjà zoomée. Desktop l’active ; mobile le désactive.","gesture.pinchZoom.desc":"Pinch zoom à deux doigts sur mobile. Revenir à l’échelle fit quitte le zoom et recentre l’image.","gesture.doubleTapZoom.desc":"Double tap à un doigt sur mobile. Le premier double tap zoome autour du point touché ; un double tap en zoom revient à la vue fit.","gesture.touchAction.desc":"Stratégie CSS touch-action. managed choisit none pour pinch zoom et manipulation pour les configs double tap seules ; les valeurs explicites sont transmises telles quelles.","gesture.threshold.desc":"Distance minimale de glissement pour accepter le geste, en px.","gesture.velocity.desc":"Vitesse minimale pour accepter le geste, en px/ms.","gesture.axisLock.desc":"Ratio de verrouillage d’axe pour éviter qu’un mouvement diagonal déclenche les gestes horizontal et vertical à la fois.","gesture.resistance.desc":"Résistance en bord quand loop=false et que la visionneuse est sur la première ou la dernière image.","gesture.opacity.desc":"Indique si le glissement vertical pour fermer réduit l’opacité de l’image avec la distance.","gesture.wheelZoom.step.desc":"Sensibilité du zoom molette. Des valeurs plus hautes zooment plus vite pour le même delta de molette.","gesture.wheelZoom.smooth.desc":"Interpoler le zoom molette via le RAF zoom-follow existant au lieu de sauter immédiatement.","gesture.wheelZoom.minScale.desc":"Échelle minimale du zoom molette. L’atteindre en dézoomant quitte le mode zoom.","gesture.wheelZoom.maxScale.desc":"Échelle maximale du zoom molette.","gesture.wheelZoom.center.desc":"Point focal du zoom molette : pointer utilise la position de l’événement molette ; viewport utilise le centre de l’écran.","gesture.wheelZoom.reverse.desc":"Inverse la direction du zoom molette sans modifier le reste du comportement wheel.","gesture.wheelZoom.exitGuardDuration.desc":"Temps de protection après une sortie de zoom par la molette, en ms. Les événements wheel résiduels sont ignorés pendant cette fenêtre.","gesture.pinchZoom.minScale.desc":"Échelle minimale du pinch. fit signifie la taille de navigation adaptée à l’écran.","gesture.pinchZoom.maxScale.desc":"Échelle maximale du pinch.","gesture.pinchZoom.resetBelowFit.desc":"Quand le pinch revient à l’échelle fit, quitter le zoom et recentrer l’image.","gesture.pinchZoom.center.desc":"Point focal du pinch : gesture utilise le milieu des deux doigts ; viewport utilise le centre de l’écran.","gesture.doubleTapZoom.scale.desc":"Échelle cible pour entrer en zoom avec un double tap.","gesture.doubleTapZoom.minScale.desc":"Échelle minimale utilisée pour borner le zoom double tap.","gesture.doubleTapZoom.maxScale.desc":"Échelle maximale utilisée pour borner le zoom double tap.","gesture.doubleTapZoom.center.desc":"Point focal du double tap : tap utilise la position touchée ; viewport utilise le centre de l’écran.","gesture.doubleTapZoom.interval.desc":"Temps maximal entre deux taps, en ms.","gesture.doubleTapZoom.distance.desc":"Mouvement maximal entre deux taps, en px.","controller.pagination":"Pagination","controller.rotate":"Rotation","controller.rotateLeft":"Rotation gauche","controller.rotateRight":"Rotation droite","controller.zoom":"Zoom","controller.download":"Télécharger","controller.close":"Fermer","controller.flip":"Pagination","controller.flipLeft":"Précédent","controller.flipRight":"Suivant","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Indicateur de page en haut, affichant la position actuelle / le nombre total de pages","controller.rotate.desc":"Groupe de contrôles de rotation (boutons gauche et droit)","controller.rotateLeft.desc":"Rotation de 90° dans le sens anti-horaire","controller.rotateRight.desc":"Rotation de 90° dans le sens horaire","controller.zoom.desc":"Activer / quitter le mode zoom 1:1","controller.download.desc":"Télécharger l'image actuelle","controller.close.desc":"Fermer la visionneuse","controller.flip.desc":"Groupe de contrôles de navigation (boutons précédent et suivant)","controller.flipLeft.desc":"Aller à l'image précédente","controller.flipRight.desc":"Aller à l'image suivante","controller.backdrop.desc":"Fond de la barre d'outils. Hérite du `backdrop` parent si non défini. Sur un `backdrop` sombre uni, préférer une valeur translucide (p. ex. `rgba(0,0,0,0.4)`).","controller.color.desc":'Couleur des icônes. Hérite de `currentColor` si non défini. Les overrides par bouton (p. ex. `controller.zoom = "#ff8800"`) restent prioritaires.',"controller.placement.desc":"Position de la toolbar. Ne déplace que la capsule de contrôle ; les boutons latéraux et la pagination gardent leur position normale.","controller.layout.desc":"Ajuste les marges sûres de la toolbar, des boutons flip latéraux, de la pagination et de la caption. Les nombres sont en px, les chaînes sont des longueurs CSS ; un inset scalaire suit le bord naturel d'entrée de chaque cible, et layout.mobile remplace la version mobile.","controller.layout.toolbarInset.desc":"Marge sûre de la toolbar. Une valeur scalaire suit le placement actuel et s'applique au bord top / right / bottom / left correspondant.","controller.layout.flipInset.desc":"Marge sûre des boutons flip latéraux. Une valeur scalaire s'applique aux boutons gauche et droit.","controller.layout.paginationInset.desc":"Marge sûre de la pagination. Une valeur scalaire s'applique au bord d'entrée bas, utile pour éviter une caption ou une UI personnalisée.","controller.layout.captionInset.desc":"Marge sûre de la caption. Une valeur scalaire s'applique au bord d'entrée bas, utile pour la placer au-dessus de la pagination ou des contrôles bas.","controller.render.desc":"Callback de rendu de contrôleur entièrement personnalisé. Reçoit state, actions et les slots intégrés ; désactivé quand controller=false.","controller.overriddenBy":"Activé par","snippet.overriddenByProp":"remplacé par {umbrella}","hotkey.close":"Fermer (Escape)","hotkey.zoom":"Zoom (Espace)","hotkey.flip":"Navigation (←/→)","hotkey.flipLeft":"Précédent (←)","hotkey.flipRight":"Suivant (→)","hotkey.rotate":"Rotation ([ / ])","hotkey.rotateLeft":"Rotation à gauche ([)","hotkey.rotateRight":"Rotation à droite (])","hotkey.download":"Télécharger (Mod+S)","hotkey.close.desc":"Appuyez sur Escape pour fermer la visionneuse","hotkey.zoom.desc":"Appuyez sur Espace pour basculer le mode zoom 1:1","hotkey.flip.desc":"Appuyez sur ← / → pour changer de page dans un set","hotkey.flipLeft.desc":"Appuyez sur ← pour aller à l'image précédente","hotkey.flipRight.desc":"Appuyez sur → pour aller à l'image suivante","hotkey.rotate.desc":"Appuyez sur [ / ] pour faire pivoter l'image (commutateur parent ; lie les deux directions)","hotkey.rotateLeft.desc":"Appuyez sur [ pour pivoter de 90° dans le sens antihoraire","hotkey.rotateRight.desc":"Appuyez sur ] pour pivoter de 90° dans le sens horaire","hotkey.download.desc":"Appuyez sur Cmd+S (macOS) ou Ctrl+S (Windows/Linux) pour télécharger l'image actuelle. Désactivé par défaut — l'activer remplace le raccourci « Enregistrer la page » du navigateur.","animate.browsing.desc":"Transition d'ouverture / fermeture de la visionneuse","animate.flip.desc":"Style de transition lors du changement de page dans un set","animate.slowMotion.desc":"Quand il est activé, maintenir Shift à l’ouverture ou à la fermeture ralentit toute la transition de navigation à 10x pour inspection ou démo","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"URL de l'image. Obligatoire.","param.alt.label":"alt","param.alt.desc":"Titre de l'image, affiché au-dessus de la visionneuse.","param.caption.label":"caption","param.caption.desc":"Légende sous la visionneuse. string pour le pill par défaut ou { text, style?, className? } pour personnaliser. Surchargeable par set[i].caption.","param.set.label":"set","param.set.desc":"Ensemble multi-images ; active le mode galerie avec navigation aux flèches.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Index de la page initiale (commence à 0).","param.preset.label":"preset","param.preset.desc":"Bundle de préréglages ; auto par défaut et définit controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Couleur de fond de la visionneuse. Toute couleur CSS valide.","param.zIndex.label":"zIndex","param.zIndex.desc":"Niveau d'empilement de la visionneuse.","param.radius.label":"radius","param.radius.desc":"Rayon des coins de l'image (px).","param.edge.label":"edge","param.edge.desc":"Marge minimale entre l'image et la viewport (px).","param.loop.label":"loop","param.loop.desc":"Reboucler vers la première image en atteignant la fin.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Fermer la visionneuse au défilement de la page.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Fermer la visionneuse au double-clic sur l'image. Désactivé par défaut.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Garder l'image de couverture visible pendant la navigation.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Délai (ms) avant d'afficher l'indicateur de chargement. Si l'image termine de charger dans cette fenêtre, le loading n'est pas affiché — évite le clignotement lors du basculement rapide entre images en cache. Par défaut 200ms ; 0 = affichage immédiat (comportement hérité).","param.controller.label":"controller","param.controller.desc":"Configuration de la barre de contrôle. false désactive tout ; un objet partiel remplace les boutons, la position, le layout des overlays et le rendu personnalisé.","param.hotKey.label":"hotKey","param.hotKey.desc":"Raccourcis clavier.","param.animate.label":"animate","param.animate.desc":"Configuration d’animation : navigation, géométrie de couverture, ralenti et animation de page.","param.gesture.label":"gesture","param.gesture.desc":"Configuration des gestes pilotée par preset. Desktop active wheelZoom en mode zoom ; mobile active par défaut swipe, dragExit, pinchZoom et doubleTapZoom. gesture=false désactive tout.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Déclenché à l'ouverture/fermeture de la visionneuse (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Déclenché à l'entrée/sortie du mode zoom (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Déclenché lors d'un changement de page (nouvel index).","param.onRotating.label":"onRotating","param.onRotating.desc":"Déclenché lors d'une rotation (degrés).","param.onError.label":"onError","param.onError.desc":"Déclenché lorsqu'une image (couverture ou visionneuse) ne se charge pas. Reçoit le SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"État de navigation contrôlé. Le fournir bascule en mode contrôlé ; à coupler avec onBrowsing.","docs.section.installation.title":"Installation","docs.section.installation.intro":"Installez via votre gestionnaire de paquets :","docs.section.installation.agent":"Les agents IA doivent d’abord lire https://zmage.caldis.me/llms.txt, puis garder les intégrations de base minimales.","docs.section.installation.then":"Puis importez le composant et sa feuille de style :","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"Pour les applications rendues côté serveur, utilisez l'entrée /ssr afin de ne pas toucher à document à l'import :","docs.section.modes.title":"Trois modes","docs.section.modes.intro":"react-zmage expose la même surface de configuration via trois formes d'appel :","docs.section.modes.componentTitle":"Composant","docs.section.modes.componentBody":"Le mode par défaut — à utiliser quand vous contrôlez le JSX rendu. Remplacez n'importe quel par ; chaque attribut HTML natif (className, style, onClick, etc.) est transmis à l' sous-jacent.","docs.section.modes.imperativeTitle":"Impératif","docs.section.modes.imperativeBody":"À privilégier quand vous n'avez pas de bon de couverture, ou ne voulez pas monter de nœuds supplémentaires dans votre arbre de composants. Appelez depuis des gestionnaires d'événement, des callbacks asynchrones ou des widgets tiers pour ouvrir la visionneuse depuis n'importe où. Retourne une closure de destruction pour une fermeture manuelle.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"À utiliser quand vous ne contrôlez pas le HTML rendu — sortie markdown, texte enrichi CMS, dangerouslySetInnerHTML. Wrapper lit src / alt depuis le cliqué ; les props de visionneuse comme backdrop, contrôles, raccourcis, animation, callbacks et set restent sur .","docs.section.modes.wrapperNote":"Wrapper recherche les enfants img pendant componentDidMount / componentDidUpdate. Les images injectées après le rendu du wrapper ne seront liées qu'au prochain rendu. Si set est fourni, le src du img cliqué est comparé à set et utilisé comme page initiale ; sans set, data-zmage-caption ou la figcaption la plus proche peut devenir la caption de la visionneuse.","docs.section.theming.title":"Thèmes","docs.section.theming.intro":"react-zmage est volontairement agnostique vis-à-vis du système de thème du site hôte — il ne lit pas prefers-color-scheme et n'est lié à aucun framework de variables CSS. L'intégration clair/sombre est la responsabilité du consommateur :","docs.section.theming.bullet.backdrop":"Le fond de la visionneuse est défini via la prop backdrop (toute chaîne de couleur CSS valide). La valeur par défaut est blanc (#FFFFFF).","docs.section.theming.bullet.icons":"Les icônes de la barre de contrôle utilisent SVG currentColor ; surchargez via votre CSS global pour les aligner sur votre design system.","docs.section.theming.bullet.scoped":"Tous les styles d'exécution sont confinés au conteneur #zmage ; ils ne déborderont pas dans le reste de votre application.","docs.section.theming.defaultTitle":"Comportement par défaut","docs.section.theming.defaultBody":"Si vous omettez backdrop, la visionneuse s'affiche avec un panneau blanc. C'est correct sur les sites clairs, mais le contraste devient mauvais avec les icônes blanches sur un site sombre :","docs.section.theming.patternTitle":"Usage composant / contrôlé","docs.section.theming.patternBody":"Lisez votre hook de thème existant (next-themes, un ThemeProvider personnalisé, etc.), traduisez la valeur résolue en couleur et passez-la à backdrop. Encapsuler dans un petit composant local garde les sites d'appel propres :","docs.section.theming.imperativeTitle":"Usage impératif","docs.section.theming.imperativeBody":"Dans un gestionnaire d'événement, lisez l'état actuel du DOM (par ex. une classe de thème sur documentElement), traduisez en couleur, puis passez à Zmage.browsing :","docs.section.theming.iconsTitle":"Aligner les icônes avec le design system","docs.section.theming.iconsBody":"Les icônes de contrôle vivent à l'intérieur du conteneur #zmage ; surchargez leur couleur depuis votre CSS global. Si vous utilisez des variables CSS pour le thème (Tailwind / shadcn / tokens vanilla), liez-les directement au design token :","docs.section.theming.toolbarTitle":"Découpler la barre d'outils du backdrop modal","docs.section.theming.toolbarBody":'Par défaut la capsule de la barre hérite du `backdrop` parent et les icônes sont dessinées avec `currentColor`. Sur un `backdrop` sombre uni, les icônes sombres se fondent dans la capsule sombre. Passez `controller.backdrop` (fond de capsule) et `controller.color` (couleur d\'icône) pour les découpler. Les overrides par bouton (p. ex. `controller.zoom = "#ff8800"`) restent prioritaires sur `controller.color`.',"docs.search.desc.installation":"Installer via votre gestionnaire de paquets et importer la feuille de style","docs.search.desc.ssr":"Entrée SSR qui ne touche pas à document à l'import","docs.search.desc.modes":"Composant / impératif / wrapper — trois manières d'invoquer la visionneuse","docs.search.desc.theming":"Aligner le fond et les icônes de la visionneuse sur le thème de votre site","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Choix de préréglage : auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Valeurs par défaut de controller, hotKey, animate et gesture","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex et autres réglages d'UI","docs.search.desc.propsController":"Boutons, position et rendu personnalisé de la barre de contrôle","docs.search.desc.propsHotkey":"Raccourcis clavier : ESC / Espace / flèches","docs.search.desc.propsAnimate":"Animations de navigation et de changement de page","docs.search.desc.propsGesture":"Zoom à la molette, glissement de page, glissement pour fermer, pinch et double tap","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"État de navigation contrôlé","docs.search.desc.examples":"Exemples d'image unique et de galerie multi-images","docs.search.desc.typescript":"Déclarations de types BaseType / Set / ControllerSet / GestureSet","docs.search.desc.migration":"Notes de mise à niveau depuis 0.x","docs.search.desc.faq":"Pièges d'intégration courants et correctifs par version","docs.section.props.title":"Props","docs.section.props.intro":"Toutes les props de BaseType peuvent être passées dans n'importe lequel des trois modes.","docs.section.props.wrapperScope.title":"Portée des props en mode Wrapper","docs.section.props.wrapperScope.intro":" ne rend pas lui-même l'image de couverture. Il lie des nœuds descendants déjà présents ; certaines props ont donc une signification propre en mode Wrapper.","docs.section.props.wrapperScope.data":"src et alt doivent être placés sur le enfant. Les src / alt de premier niveau sont remplacés par le nœud DOM cliqué. Sans set, caption peut être lue depuis data-zmage-caption ou depuis la figcaption la plus proche.","docs.section.props.wrapperScope.config":"set et defaultPage sont pris en charge pour une galerie partagée explicite. Quand le src du img cliqué apparaît dans set, Wrapper ouvre l'index correspondant ; defaultPage ne sert que de fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick et loadingDelay s'appliquent normalement.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating et onError fonctionnent, car Wrapper ouvre la même visionneuse en interne.","docs.section.props.wrapperScope.controlled":"browsing est l'état contrôlé du mode composant et ne contrôle pas Wrapper. Pour ouvrir depuis votre propre état, utilisez le mode composant ou appelez Zmage.browsing() vous-même.","docs.section.props.interface":"Interface et interaction","docs.section.props.controller.keyHeader":"Clé","docs.section.props.controller.descHeader":"Description","docs.section.props.controller.umbrella":"rotate est le commutateur parent de rotateLeft / rotateRight — l'activer affiche les deux boutons. flip fonctionne de la même manière sur flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Layout des overlays","docs.section.props.controller.layoutIntro":"layout ne fait que décaler les overlays toolbar, flip latéral, pagination et caption ; il ne modifie pas la géométrie de la première frame ni du zoom. Les nombres sont en px, les chaînes sont des longueurs CSS, un inset scalaire suit le bord naturel d'entrée de chaque cible, et layout.mobile remplace le layout de base sur mobile.","docs.section.props.controller.renderTitle":"Rendu personnalisé","docs.section.props.controller.renderIntro":"render reçoit { state, actions, slots } et doit retourner un nœud React. Retournez null pour masquer la couche de contrôle ; réutilisez slots si vous ne remplacez qu'une partie de l'UI.","docs.section.props.hotkey.umbrella":"flip est le commutateur parent de flipLeft / flipRight, et rotate celui de rotateLeft / rotateRight — activer l'un ou l'autre lie les deux touches latérales. Chaque entrée accepte aussi un descripteur en chaîne tel que 'Mod+S' ou 'BracketLeft' pour redéfinir la touche par défaut (Mod = ⌘ sur macOS, Ctrl sur Windows/Linux).","docs.section.props.hotkey.customTitle":"Raccourcis personnalisés","docs.section.props.hotkey.customIntro":"Chaque entrée hotKey accepte un boolean (activé/désactivé), une string (descripteur personnalisé) ou un string[] (plusieurs raccourcis). Les descripteurs utilisent les noms e.code — positions physiques des touches, indépendantes de la disposition. Le préfixe Mod représente ⌘/Ctrl multiplateforme. Correspondance stricte des modificateurs : les modificateurs non déclarés ne doivent PAS être pressés (par ex. Space n'est jamais déclenché par Cmd+Space).","docs.section.props.hotkey.cheatsheetTitle":"Aide-mémoire des descripteurs","docs.section.props.hotkey.cheatsheet.shorthand":"lettres / chiffres uniques normalisés automatiquement","docs.section.props.hotkey.cheatsheet.arrows":"flèches directionnelles","docs.section.props.hotkey.cheatsheet.punct":"ponctuation (noms physiques des touches)","docs.section.props.hotkey.cheatsheet.whitespace":"touches d'espacement / contrôle","docs.section.props.hotkey.cheatsheet.modifier":"préfixes de modificateurs (chaînés avec +)","docs.section.props.animate.typeHeader":"Type","set.src.desc":"URL de l'image — obligatoire","set.alt.desc":"Titre de cette image","set.caption.desc":"Légende de cette image ; remplace la caption externe lorsqu'elle est fournie","set.className.desc":"Classe personnalisée appliquée à cette image","set.style.desc":"Style en ligne personnalisé appliqué à cette image","docs.section.props.preset.title":"Paquets de preset","docs.section.props.preset.intro":"preset est un paquet de valeurs par défaut appliquées aux sous-objets controller / hotKey / animate / gesture. Omettre preset utilise auto. auto est résolu à l'exécution via matchMedia('(pointer: coarse) and (hover: none)') vers desktop ou mobile ; en SSR ou sans matchMedia, on retombe sur desktop.","docs.section.props.preset.subParamHeader":"Sous-paramètre","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Exemples","docs.section.examples.singleTitle":"Image unique","docs.section.examples.galleryTitle":"Galerie multi-images","docs.section.examples.mobileTitle":"Gestes mobiles","docs.section.examples.mobileBody":"Force le preset mobile pour tester le glissement entre images, le glissement pour fermer, le pinch zoom et le double tap sur les appareils tactiles.","docs.section.examples.controllerTitle":"Controleur personnalise","docs.section.examples.controllerBody":"Place le controleur sur un bord de l'ecran ou remplace toute l'UI avec un callback render qui recoit state et actions.","docs.section.examples.coverTitle":"Couverture recadree","docs.section.examples.coverBody":"Place object-fit et border radius sur le img de couverture pour que la premiere frame corresponde au recadrage visible.","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Les types sont co-localisés avec l'export d'exécution. Le type union complet des props est BaseType :","docs.section.typescript.refIntro":"Le composant accepte une ref, transférée à l'img de couverture :","docs.section.migration.title":"Migration","docs.section.migration.from":"Mise à niveau depuis 0.x :","docs.section.migration.bullet1":"Le composant est un forwardRef exotic ; n'utilisez pas new Zmage().","docs.section.migration.bullet2":"Si vous importez l'entrée SSR, basculez sur react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"Pourquoi l'image dans la modale s'ouvre-t-elle plus petite que la couverture quand j'utilise Tailwind / normalize.css / Bootstrap ?","docs.section.faq.tailwind-shrink.a":"Ces resets appliquent globalement `img { max-width: 100% }`, ce qui contraint l'image dans la modale à la taille de sa couverture. Les versions antérieures à 1.1.2 sont concernées ; 1.1.2+ ajoute un style défensif sur `.imageLayer`. Mettez à jour vers >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` retourne undefined sous React 18 / 19 — pourquoi ?","docs.section.faq.r19-imperative.a":"Bug latent corrigé en 1.1.2. L'ancien code lisait `RENDER.REF.current?.outBrowsing` de façon synchrone, ce qui marchait sous React 17 mais casse sous R18+ (les commits sont asynchrones). 1.1.2 retourne une closure de destruction stable — mettez à jour vers >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` ouvre une modale vide et le navigateur signale un src vide. Pourquoi ?","docs.section.faq.wrapper-empty.a":"L'ancien wrapper diffusait `defaultProps.src=''` par-dessus l'img cliquée, vidant src/alt. 1.1.2 lit explicitement le src/alt du nœud DOM cliqué. Mettez à jour pour corriger.","docs.section.faq.vite-esm.q":`L'API impérative lance "no compatible mount API" dans le client Vite / Next.js. Pourquoi ?`,"docs.section.faq.vite-esm.a":"Avant 1.1.2, on utilisait `require('react-dom/client')` pour la détection runtime, mais l'ESM navigateur n'a pas de global `require`. 1.1.2 passe à un import statique — mettez à jour vers >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"Le wrapper ne lie pas les handlers de clic aux images ajoutées après le montage.","docs.section.faq.wrapper-dynamic.a":"Le wrapper ne cherche les `` que dans `componentDidMount` et `componentDidUpdate`. Si vous injectez des img DOM hors de l'arbre React (par ex. un dangerouslySetInnerHTML qui change sans re-render parent), forcez le wrapper à se re-render — ou appelez `Zmage.browsing()` depuis votre propre handler de clic.","docs.section.faq.lazy-src.q":"Mon `` utilise le lazy-loading avec `data-src` — l'ouverture de Zmage affiche le placeholder au lieu de l'image réelle. Comment corriger ?","docs.section.faq.lazy-src.a":"Zmage lit par défaut la `src` du `` de couverture — le placeholder est tout ce qu'il voit. Passez l'URL réelle explicitement via `set` : ``. Idem pour l'appel impératif : `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"Je veux une miniature sur la page et l'image en pleine résolution au clic — puis-je sauter `set` ?","docs.section.faq.cover-vs-set.a":'Non. Sans `set`, la `src` de la couverture est aussi ce que le visualiseur affiche. Pour "miniature en entrée + visualiseur pleine taille", séparez-les explicitement : ``. Le même schéma gère le `data-src` lazy-loaded (FAQ précédente) et la multi-résolution CDN. Si vous voulez une UI "grille/galerie + ouvrir le visualiseur", Zmage ne la fournit pas — rendez la galerie vous-même et appelez `Zmage.browsing({ src, set })` au clic.',"docs.section.faq.controlled-mismatch.q":"Mon prop contrôlé `browsing` et l'état de la modale se désynchronisent.","docs.section.faq.controlled-mismatch.a":"Le mode contrôlé exige à la fois `browsing` et `onBrowsing`. Si vous ne passez que `browsing` (sans callback), l'état interne se synchronise une fois puis dérive. Couplez-les toujours.","docs.section.faq.ssr.q":"Comment utiliser react-zmage dans Next.js / Remix / un framework SSR ?","docs.section.faq.ssr.a":"Utilisez l'entrée `react-zmage/ssr` — elle évite de toucher à `document` à l'import. L'API impérative `Zmage.browsing()` doit être protégée par `typeof window !== 'undefined'` si elle peut s'exécuter pendant le rendu ou côté serveur.","docs.section.faq.theme.q":"Comment faire suivre le thème clair/sombre à la visionneuse ?","docs.section.faq.theme.a":"Passez `backdrop` comme expliqué dans la section Thèmes. La bibliothèque est volontairement agnostique au thème et ne lit pas prefers-color-scheme — c'est à votre application de gérer le mapping.","playground.preset.aria":"Changer le preset de données","playground.preset.default.label":"Par défaut","playground.preset.default.hint":"Childs Dream · 2 images","playground.preset.testset.label":"Jeu de test","playground.preset.testset.hint":"6 images · ratios + formats"},wR={"nav.playground":"Playground","nav.docs":"Dokumentation","nav.ai":"AI-Installation","nav.github":"GitHub","useCases.eyebrow":"Use Cases","useCases.title":"React-Bildvorschau fuer Blogs, CMS, MDX und News-Seiten","useCases.body":"react-zmage ist ein React-Bildviewer, der normale -Elemente in eine bildschirmfuellende Bildvorschau mit Origin-Expand verwandelt. Unterstuetzt werden Galerien, Tastatursteuerung, mobile Gesten, imperative Oeffnung, Wrapper-Modus fuer Rich Text sowie SSR/RSC.","useCases.cta.docs":"Dokumentation lesen","useCases.cta.wrapper":"Wrapper-Modus testen","useCases.card.blog.title":"Bildvorschau fuer Blogs","useCases.card.blog.body":"Artikelbilder lassen sich im Vollbild oeffnen, ohne das Post-Layout zu ersetzen oder eine eigene Galerieoberflaeche zu bauen.","useCases.card.cms.title":"CMS-Rich-Text-Bilder","useCases.card.cms.body":"Umschliesse HTML aus CMS, Markdown-Parser oder Editor-Ausgabe, damit vorhandene -Knoten den Viewer oeffnen.","useCases.card.news.title":"Bilderstrecken in News-Artikeln","useCases.card.news.body":"Die Artikelseite bleibt gut lesbar; Details koennen bei Bedarf mit Tastatur, Gesten und Mehrbildnavigation betrachtet werden.","useCases.card.mdx.title":"MDX- und Dokumentationsbilder","useCases.card.mdx.body":"Nutze den Wrapper-Modus fuer Dokumentationsseiten, auf denen Autoren die Bilder liefern und die React-App die Seitenhuelle stellt.","useCases.card.lightbox.title":"Alternative zu React Lightbox","useCases.card.lightbox.body":"Nutze eine leichtere Bildvorschau, wenn du Origin-Expand-Zoom und vorhandenes Markup behalten willst, statt ein komplettes Galeriesystem einzubauen.","useCases.card.ssr.title":"Next.js, SSR und RSC","useCases.card.ssr.body":"Importiere den SSR-sicheren Subpath in servergerenderten Apps und oeffne den interaktiven Viewer aus Client-Boundaries.","useCases.mode.eyebrow":"Modus waehlen","useCases.mode.title":"Waehle nach Besitz des Bild-Markups","useCases.mode.component":"Du besitzt das JSX und kannst durch ersetzen.","useCases.mode.imperative":"Ein Button, Command, Event oder Callback soll den Viewer oeffnen.","useCases.mode.wrapper":"Die Bilder kommen aus CMS, MDX, Markdown oder Rich-Text-HTML.","useCases.facts.eyebrow":"Entity-Fakten","useCases.facts.title":"Die Kurzfassung fuer Crawler","useCases.fact.react":"React 16.8 bis 19","useCases.fact.modes":"Component-, imperative und Wrapper-Modus","useCases.fact.input":"Tastaturnavigation und mobile Gesten","useCases.fact.ssr":"SSR/RSC-sicherer Importpfad","useCases.fact.gallery":"Mehrbildnavigation ohne Seitenumbau","useCases.fact.origin":"Origin-Expand-Vollbild-Bildvorschau","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Fragen, die Menschen und AI Agents meist stellen","useCases.faq.what.q":"Was ist react-zmage?","useCases.faq.what.a":"react-zmage ist ein React-Bildviewer, der normale -Elemente in eine bildschirmfuellende Origin-Expand-Bildvorschau verwandelt, mit Galerien, Tastatursteuerung, mobilen Gesten, Wrapper-Modus und SSR/RSC-Unterstuetzung.","useCases.faq.lightbox.q":"Wann sollte ich react-zmage statt einer React Lightbox verwenden?","useCases.faq.lightbox.a":"Nutze react-zmage, wenn vorhandene Bilder im Vollbild oeffnen sollen, ohne die Seite um eine Galeriekomponente herum neu zu bauen. Das passt gut fuer Blogs, CMS-Rich-Text, MDX-Dokumente, News-Artikel und bildlastige Inhaltsseiten.","useCases.faq.richText.q":"Kann react-zmage CMS-, Markdown- oder Rich-Text-Bilder behandeln?","useCases.faq.richText.a":"Ja. Zmage.Wrapper kann untergeordnete -Knoten in CMS-, Markdown-, MDX- oder dangerouslySetInnerHTML-Inhalten binden und das bestehende Layout erhalten.","useCases.faq.ssr.q":"Unterstuetzt react-zmage Next.js, SSR oder RSC?","useCases.faq.ssr.a":"Ja. Verwende fuer SSR oder RSC den Subpath react-zmage/ssr und rufe interaktive Viewer-APIs aus Client-Events oder Client Components auf.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Jedes ","hero.title.line2":"am Ursprung öffnen","hero.subtitle":"Mach aus jedem einen Vollbild-Bildviewer, der von seiner ursprünglichen Position aus öffnet und Tastatur, Gesten sowie Bildserien unterstützt.","hero.cta.start":"Docs lesen","hero.cta.playground":"Parameter ausprobieren","hero.ai.label":"AI-Installationsguide: zuerst llms.txt lesen","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Schnellen Prompt kopieren","hero.ai.copyLabel":"Schnellen AI Prompt kopieren","hero.ai.viewLlms":"llms.txt ansehen →","ai.badge":"AI-Installationsguide","ai.title":"Erstelle einen react-zmage Agent-Integrationsprompt","ai.subtitle":"Beginne mit llms.txt. Lass Auto aktiv, damit dein Agent zuerst das Projekt prüft, oder stimme Umgebung, Bildquelle und Interaktion vor dem Kopieren fein ab.","ai.field.agent":"Welchen Agent verwendest du?","ai.field.depth":"Setup-Tiefe","ai.field.environment":"Projektumgebung","ai.field.mode":"Nutzungsmodus","ai.field.imageSource":"Bildquelle","ai.field.interaction":"Interaktionsstrategie","ai.field.project":"Projektbeschreibung","ai.autoTip":"Lass Auto aktiv, wenn du unsicher bist. Dein Agent prüft zuerst Projektstruktur, Bildquelle, Rendering-Modus und Style-Einstieg und wählt dann den passenden Zmage-Modus und die passenden Props.","ai.project.placeholder":"Beschreibe deine App, die Bildquelle und was der Viewer leisten soll.","ai.action.copy":"Setup Prompt kopieren","ai.action.copied":"Kopiert","ai.action.openLlms":"llms.txt öffnen","ai.copy.error":"Kopieren fehlgeschlagen. Wähle den Prompt manuell in der Vorschau aus.","ai.preview.title":"Setup Prompt","ai.preview.subtitle":"Aktualisiert sich mit deinen Optionen","ai.preview.copy":"Kopieren","ai.preview.expand":"Erweitern","ai.preview.show":"Prompt ansehen","ai.preview.hide":"Vorschau ausblenden","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Macht den Prompt passend für einen allgemeinen Coding Agent.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Der Agent prüft zuerst das Projekt.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Integrationswünsche manuell festlegen.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Live-Interaktionsfläche","demo.title":"Eine Story-Seite aus Child's Dream","demo.body":"Die Bilder stammen aus Child's Dream: ein altes Buch, ein Zeitportal, ein Fuchs, eine Waldroute und ein Kristallsiegel. Klicke ein Bild an; der erste Frame wächst aus genau diesem Ausschnitt in den Viewer.","demo.shiftHint":"Halte SHIFT beim Klick auf ein Bild, um den feinen Übergang zu spüren","demo.zoomHint":"Öffne ein Bild, drücke Space zum Zoomen und nutze danach das Wheel zum Weiterzoomen.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"Ein staubiges Buch in der Bibliothek öffnet eine Tür in eine alte Zeit.","demo.story.lead":"Die unscheinbaren Wörter auf der Seite werden zu einer Miniaturszene. Der Junge sieht einen Wald aus Papier wachsen und hört einen Ruf von der anderen Seite der Barriere.","demo.story.middle":"Ein Fuchs begleitet ihn. Nach Gezeiten, Baumkronen und rosa Flamingos führt der Weg tiefer in den Wald zum Kristallsiegel.","demo.tile.cover":"Altes Buch und Zeitportal","demo.tile.gallery":"Erste Begegnung im Wald","demo.tile.ratio":"Pfad am Rand der Flut","demo.tile.controller":"Kristallsiegel","demo.tile.zoom":"Flamingo-Rast","demo.tile.lamp":"Licht unter den Blättern","demo.tile.rescue":"Lösung im Wald","demo.feature.cover":"Cover-Clip und Radius stimmen überein","demo.feature.space":"Bewege den Mauszeiger, um im Zoom schnell zu scannen","demo.feature.wheel":"Nutze das Mausrad für weiches Skalieren","demo.feature.shift":"Shift verlangsamt Öffnen und Schließen","demo.caption":"Klicke ein Bild an, um den Viewer zu öffnen. Auf dem Desktop kannst du beim Öffnen SHIFT halten und nach dem Zoomen Mauszeiger oder Mausrad nutzen.","demo.scene.portal.alt":"Ein leuchtendes Zeitportal auf einem alten Buch","demo.scene.portal.caption":"Im alten Buch leuchtet ein Zeitportal auf, und aus den Wörtern wächst ein Wald.","demo.scene.forest.alt":"Der Junge trifft im Wald einen Fuchs","demo.scene.forest.caption":"Der Fuchs erscheint zwischen den Bäumen und wird zum Begleiter des Jungen.","demo.scene.tide.alt":"Der Junge steht am Rand der Flut","demo.scene.tide.caption":"Das Wasser rollt sich zu einer Spirale und weist zum nächsten unbekannten Pfad.","demo.scene.canopy.alt":"Der Junge liegt unter einem riesigen Blätterdach","demo.scene.canopy.caption":"Das Blätterdach öffnet sich wie Seiten, während kleine Lichter den Weg markieren.","demo.scene.flamingo.alt":"Der Junge sitzt zwischen rosa Flamingos","demo.scene.flamingo.caption":"Eine leichte Flamingo-Schar lässt die Reise kurz ruhen.","demo.scene.lamp.alt":"Der Junge entzündet Licht unter breiten Blättern","demo.scene.lamp.caption":"Blätter halten die Dunkelheit zurück, während das Licht Hinweise im Buch zeigt.","demo.scene.crystal.alt":"Der Junge steht vor einem Kristallsiegel","demo.scene.crystal.caption":"Tief im Wald beginnt das Kristallsiegel sichtbar zu werden.","demo.scene.rescue.alt":"Fuchs und Junge nähern sich dem Kristallsiegel","demo.scene.rescue.caption":"Der Schlüssel nähert sich dem Kristall, und das Geheimnis im Siegel öffnet sich bald.","feature.dropin.title":"Ursprungsöffnung","feature.dropin.hint":"Öffnet aus Position, Größe, Radius und Zuschnitt des Bildes und schließt wieder dorthin zurück.","feature.mobile.title":"Mobil kompatibel","feature.mobile.hint":"Das Auto-Preset waehlt Touch-Verhalten: Wischen zum Blaettern, nach unten ziehen zum Schliessen, Doppeltipp und Pinch-Zoom.","feature.set.title":"Komplette Browsing-Werkzeuge","feature.set.hint":"Zoom, Rotation, Blaettern, Download und Captions teilen sich einen Browsing-Zustand, auch in Bildserien.","feature.ssr.title":"SSR/RSC-freundlich","feature.ssr.hint":"Nutze den server-sicheren Einstieg in Next.js-, SSR- oder RSC-Projekten und halte die Viewer-Interaktion in Client-Boundaries.","modes.title":"Passt zu deiner vorhandenen Seite","modes.component.label":"Komponentenmodus","modes.component.desc":"Wenn du JSX kontrollierst, ersetze durch ; native Props laufen weiter durch.","modes.imperative.label":"Imperativer Aufruf","modes.imperative.desc":"Öffne den Viewer aus Buttons, Callbacks oder async Abläufen, ohne ein Cover-Bild vorauszusetzen.","modes.wrapper.label":"Wrapper-Modus","modes.wrapper.desc":"Umschließe Markdown / CMS / dangerouslySetInnerHTML, damit innere Bilder automatisch aus ihrem Ursprung öffnen.","modes.try":"Beispiel öffnen →","modes.component.when":"Wähle den Komponentenmodus, wenn du das gerenderte JSX kontrollierst. Ersetze jedes durch ; native Props laufen weiter durch, und Öffnen / Schließen nutzt dieselbe Ursprungsöffnung.","modes.imperative.when":"Wähle den imperativen Aufruf, wenn der Einstieg nicht das Bild selbst ist. Öffne den Viewer aus Event-Handlern, Drittanbieter-Callbacks oder async Abläufen, ohne ein Cover- zu montieren.","modes.wrapper.when":"Wähle den Wrapper-Modus, wenn du das gerenderte HTML nicht kontrollierst — markdown, CMS-Rich-Text, dangerouslySetInnerHTML. Umschließe den Teilbaum, und jedes innere erhält automatisch den Viewer.","footer.project":"Projekt","footer.repo":"Repository","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Use Cases","footer.madeby":"Erstellt von","footer.illustrator":"Illustration","footer.license":"MIT-Lizenz","pg.title":"Playground","pg.subtitle":"Justiere jeden Prop und sieh dem Viewer in Echtzeit beim Reagieren zu.","pg.reset":"Zurücksetzen","pg.share":"Teilen","pg.shared":"Link kopiert","pg.tab.component":"Komponente","pg.tab.imperative":"Imperativ","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Tipp: Leertaste zum Zoomen · ←/→ zum Blättern · ESC zum Schließen","pg.preview.trigger":"Viewer öffnen","pg.params.title":"Parameter","pg.params.subtitle":"Prop-Namen zeigen Hilfe beim Hover, das Buchsymbol öffnet die Docs.","pg.events.title":"Events","pg.events.subtitle":"Lifecycle-Ausgabe für die aktuelle Sitzung.","pg.events.empty":"Aktiviere einen Lifecycle-Callback, um den Event-Stream hier zu sehen.","pg.code.title":"Code","pg.code.subtitle":"Kopierfertiger Code für den aktiven Modus.","pg.code.hideDefaults":"Standardwerte ausblenden","pg.copy":"Kopieren","pg.copied":"Kopiert","group.data":"Daten","group.preset":"Preset","group.interface":"Oberfläche","group.controller":"Controller","group.hotkey":"Tastenkürzel","group.animate":"Animation","group.gesture":"Gesture","group.lifecycle":"Lifecycle","group.controlled":"Controlled","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Desktop-Bereich","common.presetScope.desktop.desc":"Desktop-orientierte Option. Das Desktop-Preset aktiviert sie standardmäßig oder sie hat nur dort praktische Wirkung.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Mobiler Bereich","common.presetScope.mobile.desc":"Mobile oder touch-orientierte Option. Das mobile Preset aktiviert sie standardmäßig oder sie ist nur für Touch-Interaktion relevant.","common.expand":"Erweitern","common.required":"Erforderlich","common.default":"Standard","common.add":"Hinzufügen","common.remove":"Entfernen","common.enable":"Aktivieren","common.disable":"Deaktivieren","param.viewInDocs":"In Doku ansehen","docs.title":"API-Referenz","docs.search.placeholder":"Doku durchsuchen...","docs.search.empty":"Keine Treffer","docs.toc.title":"Auf dieser Seite","docs.sidebar.gettingStarted":"Erste Schritte","docs.sidebar.quickstart":"Schnellstart","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Konzepte","docs.sidebar.modes":"Modi","docs.sidebar.theming":"Theming","docs.sidebar.props":"Props","docs.sidebar.recipes":"Rezepte","docs.sidebar.examples":"Beispiele","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Referenz","docs.sidebar.migration":"Migration","docs.sidebar.faq":"FAQ","preset.desktop":"Desktop","preset.mobile":"Mobil","preset.auto":"Auto","animate.flip.fade":"Fade","animate.flip.crossFade":"Cross-Fade","animate.flip.swipe":"Swipe","animate.flip.zoom":"Zoom","animate.flip.blur":"Unschärfe","animate.flip.none":"Keine","animate.slowMotion":"Zeitlupe","gesture.swipe":"Swipe","gesture.dragExit":"Drag exit","gesture.wheelZoom":"Wheel-Zoom","gesture.pinchZoom":"Pinch-Zoom","gesture.doubleTapZoom":"Double-Tap-Zoom","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Preset-gesteuerte Gesten. Desktop aktiviert Wheel-Zoom im Zoomzustand; Mobile aktiviert Ziehen zum Blättern, Ziehen-zum-Schließen, Pinch-Zoom und Double-Tap-Zoom.","gesture.swipe.desc":"Horizontales Drag-Paging innerhalb eines Sets. Bei Einzelbild-Viewern ignoriert.","gesture.dragExit.desc":"Vertikales Ziehen-zum-Schließen. Schließt über den bestehenden onBrowsing(false)-Schließpfad.","gesture.wheelZoom.desc":"Mausrad- oder Trackpad-Zoom, während der Viewer bereits gezoomt ist. Desktop aktiviert ihn, Mobile deaktiviert ihn.","gesture.pinchZoom.desc":"Zwei-Finger-Pinch-Zoom auf Mobilgeräten. Zurück auf die Fit-Skalierung verkleinern beendet Zoom und zentriert das Bild.","gesture.doubleTapZoom.desc":"Ein-Finger-Doppeltipp auf Mobilgeräten. Der erste Doppeltipp zoomt um die Tipp-Position; ein Doppeltipp im Zoom kehrt zur Fit-Ansicht zurück.","gesture.touchAction.desc":"CSS-touch-action-Strategie. managed nutzt none für Pinch-Zoom und manipulation für reine Double-Tap-Setups; explizite Werte werden unverändert gesetzt.","gesture.threshold.desc":"Mindest-Dragdistanz zum Akzeptieren der Geste, in px.","gesture.velocity.desc":"Mindestgeschwindigkeit zum Akzeptieren der Geste, in px/ms.","gesture.axisLock.desc":"Achsen-Sperrverhältnis, damit diagonale Bewegung nicht horizontale und vertikale Gesten zugleich auslöst.","gesture.resistance.desc":"Randwiderstand, wenn loop=false ist und der Viewer am ersten oder letzten Bild steht.","gesture.opacity.desc":"Ob vertikales Ziehen-zum-Schließen die Bilddeckkraft mit wachsender Distanz senkt.","gesture.wheelZoom.step.desc":"Wheel-Zoom-Empfindlichkeit. Höhere Werte zoomen bei gleichem Wheel-Delta schneller.","gesture.wheelZoom.smooth.desc":"Wheel-Zoom über den bestehenden zoom-follow-RAF interpolieren statt sofort zu springen.","gesture.wheelZoom.minScale.desc":"Minimale Wheel-Zoom-Skalierung. Beim Herauszoomen bis dorthin wird der Zoommodus verlassen.","gesture.wheelZoom.maxScale.desc":"Maximale Wheel-Zoom-Skalierung.","gesture.wheelZoom.center.desc":"Fokuspunkt des Wheel-Zooms: pointer nutzt die Wheel-Event-Position, viewport die Bildschirmmitte.","gesture.wheelZoom.reverse.desc":"Wheel-Zoom-Richtung umkehren, ohne anderes Wheel-Verhalten zu ändern.","gesture.wheelZoom.exitGuardDuration.desc":"Schutzzeit nach dem Wheel-Zoom-out aus dem Zoommodus, in ms. Restliche Wheel-Events werden in diesem Fenster ignoriert.","gesture.pinchZoom.minScale.desc":"Minimale Pinch-Skalierung. fit bedeutet die viewport-passende Browsing-Größe.","gesture.pinchZoom.maxScale.desc":"Maximale Pinch-Skalierung.","gesture.pinchZoom.resetBelowFit.desc":"Wenn Pinch bis zur Fit-Skalierung schrumpft, Zoom verlassen und das Bild neu zentrieren.","gesture.pinchZoom.center.desc":"Fokuspunkt des Pinch: gesture nutzt den Zwei-Finger-Mittelpunkt, viewport die Bildschirmmitte.","gesture.doubleTapZoom.scale.desc":"Zielskalierung beim Eintritt in Zoom per Doppeltipp.","gesture.doubleTapZoom.minScale.desc":"Minimale Skalierung für Double-Tap-Zoom.","gesture.doubleTapZoom.maxScale.desc":"Maximale Skalierung für Double-Tap-Zoom.","gesture.doubleTapZoom.center.desc":"Fokuspunkt des Doppeltipps: tap nutzt die Tipp-Position, viewport die Bildschirmmitte.","gesture.doubleTapZoom.interval.desc":"Maximale Zeit zwischen zwei Tipps, in ms.","gesture.doubleTapZoom.distance.desc":"Maximale Bewegung zwischen zwei Tipps, in px.","controller.pagination":"Seitennavigation","controller.rotate":"Drehen","controller.rotateLeft":"Links drehen","controller.rotateRight":"Rechts drehen","controller.zoom":"Zoom","controller.download":"Download","controller.close":"Schließen","controller.flip":"Blättern","controller.flipLeft":"Vorherige","controller.flipRight":"Nächste","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Seitenanzeige oben — zeigt aktuelle Position / Gesamtseiten","controller.rotate.desc":"Rotations-Steuergruppe (mit Links- und Rechts-Buttons)","controller.rotateLeft.desc":"Um 90° gegen den Uhrzeigersinn drehen","controller.rotateRight.desc":"Um 90° im Uhrzeigersinn drehen","controller.zoom.desc":"1:1-Zoom-Modus betreten / verlassen","controller.download.desc":"Aktuelles Bild herunterladen","controller.close.desc":"Viewer schließen","controller.flip.desc":"Blätter-Steuergruppe (mit Vorherige- und Nächste-Buttons)","controller.flipLeft.desc":"Zum vorherigen Bild wechseln","controller.flipRight.desc":"Zum nächsten Bild wechseln","controller.backdrop.desc":"Hintergrund der Toolbar. Fällt auf das übergeordnete `backdrop` zurück. Bei dunklem Volltonhintergrund einen Halbtransparentwert empfohlen (z. B. `rgba(0,0,0,0.4)`).","controller.color.desc":'Symbolfarbe der Toolbar. Fällt auf `currentColor` zurück. Einzelbutton-String-Override (z. B. `controller.zoom = "#ff8800"`) hat weiterhin Vorrang.',"controller.placement.desc":"Toolbar-Position. Bewegt nur die Toolbar-Kapsel; seitliche Blätter-Buttons und Pagination behalten ihre normalen Positionen.","controller.layout.desc":"Passt die sicheren Abstände von Toolbar, seitlichen Flip-Buttons, Pagination und caption an. Zahlen sind px, Strings sind CSS-Längen; ein skalarer inset folgt der natürlichen Eintrittskante des Ziels, layout.mobile überschreibt das mobile Preset.","controller.layout.toolbarInset.desc":"Sicherer Abstand der Toolbar. Ein skalarer Wert folgt dem aktuellen placement und wirkt auf die passende top / right / bottom / left-Kante.","controller.layout.flipInset.desc":"Sicherer Abstand der seitlichen Flip-Buttons. Ein skalarer Wert wirkt auf den linken und rechten Button.","controller.layout.paginationInset.desc":"Sicherer Abstand der Pagination. Ein skalarer Wert wirkt auf die untere Eintrittskante und hilft, caption oder eigene Seiten-UI zu meiden.","controller.layout.captionInset.desc":"Sicherer Abstand der caption. Ein skalarer Wert wirkt auf die untere Eintrittskante, damit caption über Pagination oder unteren Controls sitzt.","controller.render.desc":"Vollständig eigener Controller-Render-Callback. Erhält state, actions und eingebaute slots; bei controller=false deaktiviert.","controller.overriddenBy":"Aktiviert durch","snippet.overriddenByProp":"überschrieben durch {umbrella}","hotkey.close":"Schließen (Escape)","hotkey.zoom":"Zoom (Leertaste)","hotkey.flip":"Blättern (←/→)","hotkey.flipLeft":"Vorherige (←)","hotkey.flipRight":"Nächste (→)","hotkey.rotate":"Drehen ([ / ])","hotkey.rotateLeft":"Links drehen ([)","hotkey.rotateRight":"Rechts drehen (])","hotkey.download":"Herunterladen (Mod+S)","hotkey.close.desc":"Escape drücken, um den Viewer zu schließen","hotkey.zoom.desc":"Leertaste drücken, um 1:1-Zoom umzuschalten","hotkey.flip.desc":"← / → drücken, um in einem set zu blättern","hotkey.flipLeft.desc":"← drücken, um zum vorherigen Bild zu wechseln","hotkey.flipRight.desc":"→ drücken, um zum nächsten Bild zu wechseln","hotkey.rotate.desc":"[ / ] drücken, um das Bild zu drehen (Sammelschalter; bindet beide Richtungen)","hotkey.rotateLeft.desc":"[ drücken, um 90° gegen den Uhrzeigersinn zu drehen","hotkey.rotateRight.desc":"] drücken, um 90° im Uhrzeigersinn zu drehen","hotkey.download.desc":'Cmd+S (macOS) oder Ctrl+S (Windows/Linux) drücken, um das aktuelle Bild herunterzuladen. Standardmäßig aus — beim Aktivieren wird der Browser-Shortcut „Seite speichern unter" überschrieben.',"animate.browsing.desc":"Übergang beim Öffnen / Schließen des Viewers","animate.flip.desc":"Übergangsstil beim Blättern in einem set","animate.slowMotion.desc":"Wenn aktiviert, verlangsamt gehaltenes Shift beim Öffnen oder Schließen den gesamten Browsing-Übergang auf 10x für Inspektion oder Demos","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"Bild-URL. Pflichtfeld.","param.alt.label":"alt","param.alt.desc":"Bildtitel, wird über dem Viewer angezeigt.","param.caption.label":"caption","param.caption.desc":"Bildunterschrift unter dem Viewer. string für das Standard-Pill oder { text, style?, className? } zum Anpassen. Pro Eintrag überschreibbar via set[i].caption.","param.set.label":"set","param.set.desc":"Multi-Bild-Set; aktiviert den Galerie-Modus mit Pfeiltastennavigation.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Initialer Seitenindex (0-basiert).","param.preset.label":"preset","param.preset.desc":"Preset-Bundle; Standard ist auto und es bestimmt controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Hintergrundfarbe des Viewers. Beliebige gültige CSS-Farbe.","param.zIndex.label":"zIndex","param.zIndex.desc":"Stapelreihenfolge des Viewers.","param.radius.label":"radius","param.radius.desc":"Eckenradius des Bildes (px).","param.edge.label":"edge","param.edge.desc":"Mindestabstand zwischen Bild und Viewport (px).","param.loop.label":"loop","param.loop.desc":"Beim Erreichen des Endes wieder zum ersten Bild springen.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Viewer beim Scrollen der Seite schließen.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Viewer per Doppelklick auf das Bild schließen. Standardmäßig aus.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Coverbild beim Browsen sichtbar lassen.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Verzögerung (ms) vor Anzeige der Ladeanzeige. Lädt das Bild innerhalb dieses Fensters, wird kein Loading angezeigt — verhindert das Aufblitzen beim schnellen Wechsel zwischengespeicherter Bilder. Standard 200ms; 0 = sofortige Anzeige (altes Verhalten).","param.controller.label":"controller","param.controller.desc":"Konfiguration der Steuerleiste. false deaktiviert alles; ein Teilobjekt überschreibt Buttons, Position, Overlay-Layout und eigenen Render.","param.hotKey.label":"hotKey","param.hotKey.desc":"Tastaturkürzel.","param.animate.label":"animate","param.animate.desc":"Animationskonfiguration: Browsing, Cover-Geometrie, Zeitlupe und Blätteranimation.","param.gesture.label":"gesture","param.gesture.desc":"Preset-gesteuerte Gestenkonfiguration. Desktop aktiviert wheelZoom im Zoomzustand; Mobile aktiviert standardmäßig swipe, dragExit, pinchZoom und doubleTapZoom. gesture=false deaktiviert alles.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Wird beim Öffnen/Schließen des Viewers ausgelöst (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Wird beim Betreten/Verlassen des Zoom-Modus ausgelöst (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Wird beim Seitenwechsel ausgelöst (neuer Seitenindex).","param.onRotating.label":"onRotating","param.onRotating.desc":"Wird bei Rotation ausgelöst (Grad).","param.onError.label":"onError","param.onError.desc":"Wird ausgelöst, wenn ein Bild (Cover oder Viewer) nicht geladen werden kann. Erhält das SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"Controlled-Browsing-Status. Mit Wert wechselst du in den controlled-Modus; mit onBrowsing kombinieren.","docs.section.installation.title":"Installation","docs.section.installation.intro":"Über deinen Paketmanager installieren:","docs.section.installation.agent":"AI Agents sollten zuerst https://zmage.caldis.me/llms.txt lesen und einfache Integrationen minimal halten.","docs.section.installation.then":"Anschließend Komponente und Stylesheet importieren:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"Für serverseitig gerenderte Apps verwende den /ssr-Eintrag, um document beim Import nicht zu berühren:","docs.section.modes.title":"Drei Modi","docs.section.modes.intro":"react-zmage stellt dieselbe Konfigurationsfläche über drei Aufrufformen bereit:","docs.section.modes.componentTitle":"Komponente","docs.section.modes.componentBody":"Der Standardfall — nutze dies, wenn du das gerenderte JSX kontrollierst. Tausche jedes gegen ; jedes native HTML-Attribut (className, style, onClick usw.) wird an das zugrundeliegende durchgereicht.","docs.section.modes.imperativeTitle":"Imperativ","docs.section.modes.imperativeBody":"Greif hierzu, wenn du kein passendes Cover- hast oder keine zusätzlichen Knoten in deinen Komponentenbaum hängen willst. Aufruf aus Event-Handlern, async Callbacks oder Drittanbieter-Widgets, um den Viewer von überall zu öffnen. Gibt eine Destruktor-Closure zum manuellen Schließen zurück.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"Nutze dies, wenn du das gerenderte HTML nicht kontrollierst — Markdown-Output, CMS-Rich-Text, dangerouslySetInnerHTML. Wrapper liest src / alt aus dem angeklickten ; Viewer-Props wie backdrop, Controls, Hotkeys, Animation, Callbacks und set bleiben auf .","docs.section.modes.wrapperNote":"Wrapper sucht img-Kinder während componentDidMount / componentDidUpdate. Bilder, die nach dem Rendering eingefügt werden, werden erst beim nächsten Re-Render gebunden. Wenn set gesetzt ist, wird das src des angeklickten img mit set abgeglichen und als Startseite verwendet; ohne set kann data-zmage-caption oder die nächste figcaption zur Viewer-Caption werden.","docs.section.theming.title":"Theming","docs.section.theming.intro":"react-zmage ist bewusst agnostisch gegenüber dem Theme-System der Host-Site — es liest weder prefers-color-scheme noch ist es an ein bestimmtes CSS-Variablen-Framework gebunden. Hell/Dunkel-Integration liegt beim Konsumenten:","docs.section.theming.bullet.backdrop":"Der Viewer-Hintergrund wird via backdrop-Prop gesetzt (jede gültige CSS-Farbe). Standard ist Weiß (#FFFFFF).","docs.section.theming.bullet.icons":"Steuerleisten-Icons werden mit SVG currentColor gerendert; per globalem CSS überschreiben, um sie an dein Design-System anzugleichen.","docs.section.theming.bullet.scoped":"Alle Runtime-Styles sind im #zmage-Container gescopt; sie schwappen nicht in den Rest deiner App über.","docs.section.theming.defaultTitle":"Standardverhalten","docs.section.theming.defaultBody":"Wenn du backdrop weglässt, rendert der Viewer mit weißem Panel. Auf hellen Seiten ist das unauffällig, auf dunklen Seiten ergibt sich aber schlechter Kontrast zu den weißen Steuer-Icons:","docs.section.theming.patternTitle":"Komponenten- / Controlled-Nutzung","docs.section.theming.patternBody":"Lies deinen bestehenden Theme-Hook (next-themes, einen eigenen ThemeProvider usw.), bilde den Wert auf eine Farbe ab und übergib ihn an backdrop. Eine kleine lokale Komponente hält die Aufrufstellen sauber:","docs.section.theming.imperativeTitle":"Imperative Nutzung","docs.section.theming.imperativeBody":"Lies im Event-Handler den aktuellen DOM-Status (z. B. eine Theme-Klasse auf documentElement), übersetze ihn in eine Farbe und übergib sie an Zmage.browsing:","docs.section.theming.iconsTitle":"Icons mit dem Design-System angleichen","docs.section.theming.iconsBody":"Steuer-Icons leben innerhalb des #zmage-Containers; überschreibe ihre Farbe per globalem CSS. Wenn du CSS-Variablen für Theming nutzt (Tailwind / shadcn / vanilla Tokens), binde direkt an den Design-Token:","docs.section.theming.toolbarTitle":"Toolbar vom Modal-Backdrop entkoppeln","docs.section.theming.toolbarBody":'Standardmäßig erbt die Toolbar-Kapsel den obersten `backdrop` und Icons werden mit `currentColor` gezeichnet. Auf einem dunklen Volltonhintergrund verschwinden dunkle Icons in der dunklen Kapsel. Mit `controller.backdrop` (Kapselhintergrund) und `controller.color` (Icon-Farbe) lassen sich beide entkoppeln. Einzelbutton-String-Overrides (z. B. `controller.zoom = "#ff8800"`) haben weiterhin Vorrang vor `controller.color`.',"docs.search.desc.installation":"Über Paketmanager installieren und Stylesheet importieren","docs.search.desc.ssr":"SSR-Eintrag, der document beim Import nicht berührt","docs.search.desc.modes":"Komponente / imperativ / Wrapper — drei Aufrufweisen","docs.search.desc.theming":"Viewer-Hintergrund und Icons an das Site-Theme angleichen","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Preset-Auswahl: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Standard-Bundles für controller, hotKey, animate und gesture","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex und weitere UI-Stellschrauben","docs.search.desc.propsController":"Steuerleisten-Buttons, Position und eigener Render","docs.search.desc.propsHotkey":"Tastenkürzel: ESC / Leertaste / Pfeile","docs.search.desc.propsAnimate":"Browsing- und Blätter-Animationen","docs.search.desc.propsGesture":"Wheel-Zoom, Ziehen zum Blättern, Ziehen-zum-Schließen, Pinch und Double-Tap-Zoom","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"Controlled-Browsing-Status","docs.search.desc.examples":"Beispiele für Einzelbild und Multi-Bild-Galerie","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet Typdeklarationen","docs.search.desc.migration":"Upgrade-Hinweise von 0.x","docs.search.desc.faq":"Häufige Integrations-Fallstricke und versionsspezifische Fixes","docs.section.props.title":"Props","docs.section.props.intro":"Jeder Prop von BaseType kann in jedem der drei Modi übergeben werden.","docs.section.props.wrapperScope.title":"Prop-Bereich im Wrapper-Modus","docs.section.props.wrapperScope.intro":" rendert das Cover-Bild nicht selbst. Er bindet vorhandene untergeordnete -Knoten, daher haben einige Props im Wrapper-Modus eine eigene Bedeutung.","docs.section.props.wrapperScope.data":"src und alt gehören auf das untergeordnete . Top-Level src / alt werden durch den angeklickten DOM-Knoten überschrieben. Ohne set kann caption aus data-zmage-caption oder der nächsten figcaption gelesen werden.","docs.section.props.wrapperScope.config":"set und defaultPage werden für eine explizite gemeinsame Galerie unterstützt. Wenn das angeklickte img-src in set vorkommt, öffnet Wrapper diesen passenden Index; defaultPage ist nur der Fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick und loadingDelay gelten normal.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating und onError funktionieren, weil Wrapper intern denselben Viewer öffnet.","docs.section.props.wrapperScope.controlled":"browsing ist der kontrollierte Zustand des Komponentenmodus und steuert Wrapper nicht. Wenn du aus eigenem State öffnen willst, nutze den Komponentenmodus oder rufe Zmage.browsing() selbst auf.","docs.section.props.interface":"Oberfläche & Interaktion","docs.section.props.controller.keyHeader":"Schlüssel","docs.section.props.controller.descHeader":"Beschreibung","docs.section.props.controller.umbrella":"rotate ist der übergeordnete Schalter für rotateLeft / rotateRight — beim Aktivieren werden beide Buttons angezeigt. flip funktioniert genauso für flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Overlay-Layout","docs.section.props.controller.layoutIntro":"layout verschiebt nur Toolbar-, seitliche Flip-, Pagination- und caption-Overlays; es ist nicht Teil der Geometrie für First Frame oder Zoom. Zahlen sind px, Strings CSS-Längen, ein skalarer inset folgt der natürlichen Eintrittskante des Ziels, und layout.mobile überschreibt das Basislayout auf Mobile.","docs.section.props.controller.renderTitle":"Eigener Render","docs.section.props.controller.renderIntro":"render erhält { state, actions, slots } und muss einen React-Knoten zurückgeben. Gib null zurück, um die Controller-Ebene auszublenden; verwende slots, wenn du nur Teile der UI ersetzen willst.","docs.section.props.hotkey.umbrella":"flip ist der übergeordnete Schalter für flipLeft / flipRight, rotate für rotateLeft / rotateRight — beim Aktivieren werden beide Seitentasten gebunden. Jeder Eintrag akzeptiert zudem einen String-Deskriptor wie 'Mod+S' oder 'BracketLeft', um die Standardbindung zu überschreiben (Mod = ⌘ unter macOS, Ctrl unter Windows/Linux).","docs.section.props.hotkey.customTitle":"Eigene Tastenbindungen","docs.section.props.hotkey.customIntro":"Jeder hotKey-Eintrag akzeptiert ein boolean (ein/aus), einen string (eigener Deskriptor) oder ein string[] (mehrere Bindungen). Deskriptoren verwenden e.code-Namen — physische Tastenpositionen, layoutunabhängig. Modifizierer-Präfixe nutzen Mod als plattformübergreifendes ⌘/Ctrl. Strenge Modifizierer-Prüfung: nicht deklarierte Modifizierer dürfen NICHT gedrückt sein (z. B. wird Space niemals durch Cmd+Space ausgelöst).","docs.section.props.hotkey.cheatsheetTitle":"Deskriptor-Spickzettel","docs.section.props.hotkey.cheatsheet.shorthand":"einzelne Buchstaben / Ziffern werden automatisch normalisiert","docs.section.props.hotkey.cheatsheet.arrows":"Pfeiltasten","docs.section.props.hotkey.cheatsheet.punct":"Satzzeichen (physische Tastennamen)","docs.section.props.hotkey.cheatsheet.whitespace":"Leer- / Steuertasten","docs.section.props.hotkey.cheatsheet.modifier":"Modifizierer-Präfixe (mit + verkettet)","docs.section.props.animate.typeHeader":"Typ","set.src.desc":"Bild-URL — erforderlich","set.alt.desc":"Titel für diesen Eintrag","set.caption.desc":"Bildunterschrift für diesen Eintrag; überschreibt die äußere caption, falls gesetzt","set.className.desc":"Benutzerdefinierte Klasse für diesen Eintrag","set.style.desc":"Benutzerdefiniertes Inline-Style für diesen Eintrag","docs.section.props.preset.title":"Preset-Bundles","docs.section.props.preset.intro":"preset bündelt Standardwerte für die Unterobjekte controller / hotKey / animate / gesture. Ohne preset gilt auto. auto wird zur Laufzeit über matchMedia('(pointer: coarse) and (hover: none)') zu desktop oder mobile aufgelöst; in SSR oder ohne matchMedia greift desktop.","docs.section.props.preset.subParamHeader":"Unterparameter","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Beispiele","docs.section.examples.singleTitle":"Einzelnes Bild","docs.section.examples.galleryTitle":"Multi-Bild-Galerie","docs.section.examples.mobileTitle":"Mobile Gesten","docs.section.examples.mobileBody":"Erzwinge das mobile Preset, um Drag-Paging, Drag-to-exit, Pinch-Zoom und Double-Tap-Zoom auf Touch-Geräten zu testen.","docs.section.examples.controllerTitle":"Eigener Controller","docs.section.examples.controllerBody":"Platziere den Controller an einem Bildschirmrand oder ersetze die gesamte UI mit einem render-Callback, der state und actions erhält.","docs.section.examples.coverTitle":"Zugeschnittenes Cover","docs.section.examples.coverBody":"Lege object-fit und border radius direkt auf das Cover-img, damit der erste Öffnungsframe den sichtbaren Zuschnitt trifft.","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Typen liegen am selben Ort wie der Runtime-Export. Die vollständige Prop-Union ist BaseType:","docs.section.typescript.refIntro":"Die Komponente akzeptiert eine ref, die an das Cover-img weitergeleitet wird:","docs.section.migration.title":"Migration","docs.section.migration.from":"Upgrade von 0.x:","docs.section.migration.bullet1":"Die Komponente ist ein forwardRef-Exotic; rufe sie nicht mit new Zmage() auf.","docs.section.migration.bullet2":"Falls du den SSR-Eintrag importierst, wechsle zu react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"Warum startet das Modal-Bild kleiner als das Cover, wenn ich Tailwind / normalize.css / Bootstrap nutze?","docs.section.faq.tailwind-shrink.a":"Diese Resets liefern global `img { max-width: 100% }` aus, was das Modal-Bild auf seine Cover-Größe begrenzt. Versionen vor 1.1.2 sind betroffen; 1.1.2+ schützt `.imageLayer` davor. Aktualisiere auf >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` liefert unter React 18 / 19 undefined — warum?","docs.section.faq.r19-imperative.a":"Latenter Bug, behoben in 1.1.2. Der alte Code las `RENDER.REF.current?.outBrowsing` synchron, was unter React 17 funktionierte, unter R18+ aber bricht (Commits sind asynchron). 1.1.2 gibt eine stabile Destruktor-Closure zurück — aktualisiere auf >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` öffnet ein leeres Modal und der Browser warnt vor leerem src. Warum?","docs.section.faq.wrapper-empty.a":"Der alte Wrapper hat `defaultProps.src=''` über die geklickte img gespreitet und damit src/alt geleert. 1.1.2 liest src/alt explizit vom geklickten DOM-Knoten. Aktualisieren behebt es.","docs.section.faq.vite-esm.q":'Die imperative API wirft im Vite- / Next.js-Client "no compatible mount API". Warum?',"docs.section.faq.vite-esm.a":"Vor 1.1.2 wurde `require('react-dom/client')` zur Runtime-Erkennung verwendet, aber Browser-ESM hat kein `require`-Global. 1.1.2 wechselt zu einem statischen Import — aktualisiere auf >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"Der Wrapper bindet keine Click-Handler an Bilder, die ich nach dem Mount eingefügt habe.","docs.section.faq.wrapper-dynamic.a":"Der Wrapper sucht `` nur in `componentDidMount` und `componentDidUpdate`. Wenn du DOM-imgs außerhalb des React-Render-Trees einfügst (z. B. ein dangerouslySetInnerHTML, das ohne Eltern-Re-Render mutiert), erzwinge ein Re-Render des Wrappers — oder rufe `Zmage.browsing()` aus deinem eigenen Click-Handler auf.","docs.section.faq.lazy-src.q":"Mein `` nutzt Lazy-Loading mit `data-src` — beim Öffnen von Zmage sehe ich den Platzhalter statt des echten Bildes. Wie behebe ich das?","docs.section.faq.lazy-src.a":"Zmage liest standardmäßig die `src` des Cover-`` — der Platzhalter ist alles, was es sieht. Übergib die echte URL explizit über `set`: ``. Beim imperativen Aufruf gleichermaßen: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"Ich möchte eine Thumbnail auf der Seite und das hochauflösende Bild beim Klick — kann ich `set` weglassen?","docs.section.faq.cover-vs-set.a":'Nein. Ohne `set` ist die Cover-`src` auch das, was der Viewer zeigt. Für "Thumbnail-Einstieg + Vollbild-Viewer" musst du sie explizit trennen: ``. Dasselbe Muster löst lazy-loaded `data-src` (vorherige FAQ) und CDN-Multi-Auflösung. Wenn du eine "Grid/Gallery + Viewer öffnen"-UI willst, bietet Zmage das nicht — render die Galerie selbst und rufe beim Klick `Zmage.browsing({ src, set })` auf.',"docs.section.faq.controlled-mismatch.q":"Mein controlled `browsing`-Prop und der Modal-Status laufen auseinander.","docs.section.faq.controlled-mismatch.a":"Der controlled-Modus erfordert sowohl `browsing` als auch `onBrowsing`. Wenn du nur `browsing` (ohne Callback) übergibst, synchronisiert sich der interne Status einmal und driftet dann. Immer paaren.","docs.section.faq.ssr.q":"Wie nutze ich react-zmage in Next.js / Remix / SSR-Frameworks?","docs.section.faq.ssr.a":"Verwende den `react-zmage/ssr`-Eintrag — er berührt `document` beim Import nicht. Das imperative `Zmage.browsing()` braucht einen `typeof window !== 'undefined'`-Guard, falls es während des Renderings oder in einem Server-only-Pfad ausgeführt werden könnte.","docs.section.faq.theme.q":"Wie folgt der Viewer meinem Hell-/Dunkel-Theme?","docs.section.faq.theme.a":"Übergib `backdrop` wie im Theming-Abschnitt oben beschrieben. Die Bibliothek ist bewusst theme-agnostisch und liest prefers-color-scheme nicht — dein App regelt das Mapping.","playground.preset.aria":"Datenvoreinstellung wechseln","playground.preset.default.label":"Standard","playground.preset.default.hint":"Childs Dream · 2 Bilder","playground.preset.testset.label":"Testset","playground.preset.testset.hint":"6 Bilder · Verh. + Format"},SR={"nav.playground":"Playground","nav.docs":"Documentación","nav.ai":"Guía de instalación AI","nav.github":"GitHub","useCases.eyebrow":"Casos de uso","useCases.title":"Vista previa de imagenes React para blogs, CMS, MDX y noticias","useCases.body":"react-zmage es un visor de imagenes para React que convierte elementos normales en una vista previa a pantalla completa con expansion desde el origen. Soporta galerias, teclado, gestos moviles, apertura imperativa, modo Wrapper para rich text y SSR/RSC.","useCases.cta.docs":"Leer docs","useCases.cta.wrapper":"Probar modo Wrapper","useCases.card.blog.title":"Vista previa para blogs","useCases.card.blog.body":"Abre imagenes de articulos a pantalla completa sin reemplazar el layout del post ni crear una galeria aparte.","useCases.card.cms.title":"Imagenes de rich text en CMS","useCases.card.cms.body":"Envuelve HTML renderizado por un CMS, parser Markdown o editor para que los existentes abran el visor.","useCases.card.news.title":"Galerias en articulos de noticias","useCases.card.news.body":"Mantiene legible la pagina editorial y permite ver detalles con teclado, gestos y navegacion de varias imagenes.","useCases.card.mdx.title":"Imagenes en MDX y documentacion","useCases.card.mdx.body":"Usa Wrapper mode cuando los autores controlan las imagenes y la app React controla la estructura de la pagina.","useCases.card.lightbox.title":"Alternativa a React lightbox","useCases.card.lightbox.body":"Usa una capa de vista previa mas ligera cuando quieres zoom origin-expand y soporte para markup existente, sin adoptar una galeria completa.","useCases.card.ssr.title":"Next.js, SSR y RSC","useCases.card.ssr.body":"Importa el subpath seguro para SSR en apps renderizadas en servidor y abre el visor interactivo desde fronteras cliente.","useCases.mode.eyebrow":"Elegir modo","useCases.mode.title":"Elige segun quien controla el markup de imagen","useCases.mode.component":"Controlas el JSX y puedes reemplazar por .","useCases.mode.imperative":"Un boton, comando, evento o callback debe abrir el visor.","useCases.mode.wrapper":"Las imagenes vienen de CMS, MDX, Markdown o HTML rich text.","useCases.facts.eyebrow":"Datos de entidad","useCases.facts.title":"La version corta que los crawlers deben entender","useCases.fact.react":"React 16.8 hasta 19","useCases.fact.modes":"Modo Component, imperative y Wrapper","useCases.fact.input":"Navegacion con teclado y gestos moviles","useCases.fact.ssr":"Ruta de import segura para SSR/RSC","useCases.fact.gallery":"Navegacion de galeria sin reestructurar la pagina","useCases.fact.origin":"Vista previa fullscreen con origin-expand","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Preguntas que suelen hacer personas y AI Agents","useCases.faq.what.q":"Que es react-zmage?","useCases.faq.what.a":"react-zmage es un visor de imagenes React que convierte elementos normales en una vista previa fullscreen con origin-expand, galeria, teclado, gestos moviles, Wrapper mode y soporte SSR/RSC.","useCases.faq.lightbox.q":"Cuando conviene usar react-zmage en vez de una React lightbox?","useCases.faq.lightbox.a":"Usa react-zmage cuando quieres que imagenes existentes se abran a pantalla completa sin reconstruir la pagina alrededor de una galeria. Encaja bien en blogs, CMS rich text, docs MDX, articulos de noticias y paginas con muchas imagenes.","useCases.faq.richText.q":"react-zmage puede manejar imagenes de CMS, Markdown o rich text?","useCases.faq.richText.a":"Si. Zmage.Wrapper puede enlazar nodos descendientes dentro de CMS, Markdown, MDX o dangerouslySetInnerHTML, conservando el markup y layout existentes.","useCases.faq.ssr.q":"react-zmage soporta Next.js, SSR o RSC?","useCases.faq.ssr.a":"Si. Usa el subpath react-zmage/ssr para imports seguros en SSR o RSC, y llama las APIs interactivas desde eventos cliente o Client Components.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Haz que cada ","hero.title.line2":"se abra desde su lugar","hero.subtitle":"Convierte cualquier en un visor de pantalla completa que se abre desde su posición original, con teclado, gestos y navegación multiimagen.","hero.cta.start":"Leer docs","hero.cta.playground":"Probar parámetros","hero.ai.label":"Guía de instalación AI: lee llms.txt primero","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Copiar prompt rápido","hero.ai.copyLabel":"Copiar prompt rápido de AI","hero.ai.viewLlms":"ver llms.txt →","ai.badge":"Guía de instalación AI","ai.title":"Crea un prompt de integración para react-zmage","ai.subtitle":"Empieza por llms.txt. Mantén Auto para que tu agente inspeccione el proyecto primero, o ajusta entorno, fuente de imágenes e interacción antes de copiar.","ai.field.agent":"¿Qué agente usas?","ai.field.depth":"Nivel de configuración","ai.field.environment":"Entorno del proyecto","ai.field.mode":"Modo de uso","ai.field.imageSource":"Fuente de imágenes","ai.field.interaction":"Estrategia de interacción","ai.field.project":"Descripción del proyecto","ai.autoTip":"Mantén Auto si no estás seguro. Tu agente revisará primero la estructura del proyecto, la fuente de imágenes, el modo de renderizado y la entrada de estilos, y luego elegirá el modo y las props correctas de Zmage.","ai.project.placeholder":"Describe tu app, la fuente de imágenes y lo que debe hacer el visor.","ai.action.copy":"Copiar setup prompt","ai.action.copied":"Copiado","ai.action.openLlms":"Abrir llms.txt","ai.copy.error":"No se pudo copiar. Selecciona el prompt manualmente desde la vista previa.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"Se actualiza con tus opciones","ai.preview.copy":"Copiar","ai.preview.expand":"Expandir","ai.preview.show":"Ver prompt","ai.preview.hide":"Ocultar vista previa","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Hace que el prompt funcione con un agente de código general.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Permite que el agente inspeccione primero el proyecto.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Define manualmente las preferencias de integración.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Superficie interactiva real","demo.title":"Una página narrativa hecha con Child's Dream","demo.body":"Las imágenes vienen de Child's Dream: un libro antiguo, un portal del tiempo, un zorro, una ruta por el bosque y un sello de cristal. Haz clic en cualquier imagen y el primer fotograma se expande desde ese recorte exacto hacia el visor.","demo.shiftHint":"Mantén SHIFT al hacer clic en una imagen para sentir la transición suave","demo.zoomHint":"Abre una imagen, pulsa Space para ampliar y luego usa la rueda para seguir escalando.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"Un libro cubierto de polvo en la biblioteca abre una puerta al tiempo antiguo.","demo.story.lead":"Las palabras sencillas de la página se convierten en una escena en miniatura. El niño ve crecer un bosque desde el papel y oye una llamada desde el otro lado de la barrera.","demo.story.middle":"Un zorro se vuelve su compañero. Tras mareas, copas de árboles y flamencos rosados, la ruta entra más hondo en el bosque hacia un sello de cristal.","demo.tile.cover":"Libro antiguo y portal","demo.tile.gallery":"Primer encuentro en el bosque","demo.tile.ratio":"Camino al borde de la marea","demo.tile.controller":"Sello de cristal","demo.tile.zoom":"Pausa entre flamencos","demo.tile.lamp":"Luz bajo las hojas","demo.tile.rescue":"Liberación en el bosque","demo.feature.cover":"Clip y radio de portada coinciden","demo.feature.space":"Mueve el puntero para explorar rápido en modo zoom","demo.feature.wheel":"Usa la rueda del ratón para cambiar la escala con suavidad","demo.feature.shift":"Shift ralentiza abrir y cerrar","demo.caption":"Haz clic en una imagen para abrir el visor. En escritorio, mantén SHIFT al abrir y luego mueve el puntero o usa la rueda tras ampliar.","demo.scene.portal.alt":"Un portal del tiempo luminoso sobre un libro antiguo","demo.scene.portal.caption":"Un portal del tiempo se ilumina en el libro antiguo y un bosque nace de las palabras.","demo.scene.forest.alt":"El niño encuentra un zorro en el bosque","demo.scene.forest.caption":"El zorro aparece entre los árboles y se convierte en compañero del niño.","demo.scene.tide.alt":"El niño está al borde de una marea","demo.scene.tide.caption":"El agua se curva en espiral y señala el siguiente camino desconocido.","demo.scene.canopy.alt":"El niño yace bajo una gran copa","demo.scene.canopy.caption":"La copa se abre como páginas mientras pequeñas luces marcan la ruta.","demo.scene.flamingo.alt":"El niño se sienta entre flamencos rosados","demo.scene.flamingo.caption":"Una bandada ligera de flamencos da una pausa tranquila al viaje.","demo.scene.lamp.alt":"El niño enciende una luz bajo hojas grandes","demo.scene.lamp.caption":"Las hojas contienen la oscuridad mientras la luz revela pistas del libro.","demo.scene.crystal.alt":"El niño está frente a un sello de cristal","demo.scene.crystal.caption":"El sello de cristal empieza a mostrarse en lo profundo del bosque.","demo.scene.rescue.alt":"El zorro y el niño se acercan al sello de cristal","demo.scene.rescue.caption":"La llave se acerca al cristal y el secreto del sello está por abrirse.","feature.dropin.title":"Apertura en origen","feature.dropin.hint":"Abre desde la posición, tamaño, radio y recorte de la imagen, y vuelve al mismo lugar al cerrar.","feature.mobile.title":"Compatible con movil","feature.mobile.hint":"El preset Auto elige interaccion tactil: deslizar entre imagenes, arrastrar hacia abajo para cerrar, doble toque y pinch zoom.","feature.set.title":"Herramientas completas","feature.set.hint":"Zoom, rotacion, cambio de pagina, descarga y captions comparten un mismo estado, incluso en sets de varias imagenes.","feature.ssr.title":"Compatible con SSR/RSC","feature.ssr.hint":"Usa la entrada segura para servidor en Next.js, SSR o RSC, y deja la interaccion del visor dentro de fronteras cliente.","modes.title":"Encaja con la página que ya tienes","modes.component.label":"Modo componente","modes.component.desc":"Cuando controlas el JSX, cambia por y conserva las props nativas.","modes.imperative.label":"Llamada imperativa","modes.imperative.desc":"Abre el visor desde botones, callbacks o flujos asíncronos sin exigir una imagen de portada.","modes.wrapper.label":"Modo wrapper","modes.wrapper.desc":"Envuelve Markdown / CMS / dangerouslySetInnerHTML para que las imágenes internas se abran desde su lugar.","modes.try":"Abrir ejemplo →","modes.component.when":"Elige el modo componente cuando controlas el JSX que renderizas. Sustituye cualquier por ; las props nativas siguen pasando y abrir / cerrar usa la misma transición desde el origen.","modes.imperative.when":"Elige la llamada imperativa cuando el punto de entrada no es la imagen. Abre el visor desde manejadores de eventos, callbacks de terceros o flujos asíncronos sin montar un de portada.","modes.wrapper.when":"Elige el modo wrapper cuando no controlas el HTML renderizado — markdown, rich text de CMS, dangerouslySetInnerHTML. Envuelve el subárbol y cada interno obtiene automáticamente el visor.","footer.project":"Proyecto","footer.repo":"Repositorio","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Casos de uso","footer.madeby":"Creado por","footer.illustrator":"Ilustración","footer.license":"Licencia MIT","pg.title":"Playground","pg.subtitle":"Ajusta cada prop y observa al visor reaccionar en tiempo real.","pg.reset":"Restablecer","pg.share":"Compartir","pg.shared":"Enlace copiado","pg.tab.component":"Componente","pg.tab.imperative":"Imperativa","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Tip: Espacio para zoom · ←/→ para pasar páginas · ESC para cerrar","pg.preview.trigger":"Abrir visor","pg.params.title":"Parámetros","pg.params.subtitle":"Pasa el cursor sobre un prop para ver ayuda, o abre sus docs con el icono de libro.","pg.events.title":"Eventos","pg.events.subtitle":"Salida de callbacks de ciclo de vida para esta sesión.","pg.events.empty":"Activa cualquier callback de ciclo de vida para ver el flujo de eventos aquí.","pg.code.title":"Código","pg.code.subtitle":"Código listo para copiar para el modo activo.","pg.code.hideDefaults":"Ocultar valores por defecto","pg.copy":"Copiar","pg.copied":"Copiado","group.data":"Datos","group.preset":"Preset","group.interface":"Interfaz","group.controller":"Controlador","group.hotkey":"Atajos","group.animate":"Animación","group.gesture":"Gesture","group.lifecycle":"Ciclo de vida","group.controlled":"Controlado","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Ámbito de escritorio","common.presetScope.desktop.desc":"Opción enfocada al escritorio. El preset desktop la activa por defecto o solo tiene efecto práctico en ese entorno.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Ámbito móvil","common.presetScope.mobile.desc":"Opción enfocada a móvil o touch. El preset mobile la activa por defecto o solo importa para interacción táctil.","common.expand":"Expandir","common.required":"Obligatorio","common.default":"Por defecto","common.add":"Añadir","common.remove":"Eliminar","common.enable":"Activar","common.disable":"Desactivar","param.viewInDocs":"Ver en docs","docs.title":"Referencia de la API","docs.search.placeholder":"Buscar en la documentación...","docs.search.empty":"Sin coincidencias","docs.toc.title":"En esta página","docs.sidebar.gettingStarted":"Primeros pasos","docs.sidebar.quickstart":"Inicio rápido","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Conceptos","docs.sidebar.modes":"Modos","docs.sidebar.theming":"Tematización","docs.sidebar.props":"Props","docs.sidebar.recipes":"Recetas","docs.sidebar.examples":"Ejemplos","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Referencia","docs.sidebar.migration":"Migración","docs.sidebar.faq":"FAQ","preset.desktop":"Escritorio","preset.mobile":"Móvil","preset.auto":"Auto","animate.flip.fade":"Fundido","animate.flip.crossFade":"Fundido cruzado","animate.flip.swipe":"Deslizar","animate.flip.zoom":"Zoom","animate.flip.blur":"Desenfoque","animate.flip.none":"Ninguno","animate.slowMotion":"Cámara lenta","gesture.swipe":"Deslizar","gesture.dragExit":"Salir arrastrando","gesture.wheelZoom":"Zoom con rueda","gesture.pinchZoom":"Pinch zoom","gesture.doubleTapZoom":"Zoom con doble toque","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Configuración de gestos según preset. Desktop activa zoom con rueda cuando ya está ampliado; mobile activa paginación por arrastre, arrastre para salir, pinch zoom y doble toque.","gesture.swipe.desc":"Paginación horizontal por arrastre dentro de un set. Se ignora en visores de una sola imagen.","gesture.dragExit.desc":"Arrastre vertical para salir. Cierra por la ruta existente onBrowsing(false).","gesture.wheelZoom.desc":"Zoom con rueda o trackpad mientras el visor ya está ampliado. Desktop lo activa; mobile lo desactiva.","gesture.pinchZoom.desc":"Pinch zoom de dos dedos en mobile. Reducir hasta la escala fit sale del zoom y recentra la imagen.","gesture.doubleTapZoom.desc":"Doble toque con un dedo en mobile. El primer doble toque amplía alrededor del punto tocado; otro doble toque estando ampliado vuelve a la vista fit.","gesture.touchAction.desc":"Estrategia CSS touch-action. managed usa none para pinch zoom y manipulation cuando solo hay doble toque; los valores explícitos se pasan tal cual.","gesture.threshold.desc":"Distancia mínima de arrastre para aceptar el gesto, en px.","gesture.velocity.desc":"Velocidad mínima para aceptar el gesto, en px/ms.","gesture.axisLock.desc":"Relación de bloqueo de eje para evitar que un movimiento diagonal dispare gestos horizontales y verticales a la vez.","gesture.resistance.desc":"Resistencia en los bordes cuando loop=false y el visor está en la primera o última imagen.","gesture.opacity.desc":"Si el arrastre vertical para salir reduce la opacidad de la imagen a medida que crece la distancia.","gesture.wheelZoom.step.desc":"Sensibilidad del zoom con rueda. Valores mayores amplían más rápido con el mismo delta de rueda.","gesture.wheelZoom.smooth.desc":"Interpolar el zoom con rueda con el RAF zoom-follow existente, en vez de saltar de inmediato.","gesture.wheelZoom.minScale.desc":"Escala mínima del zoom con rueda. Alcanzarla al reducir sale del modo zoom.","gesture.wheelZoom.maxScale.desc":"Escala máxima del zoom con rueda.","gesture.wheelZoom.center.desc":"Foco del zoom con rueda: pointer usa la posición del evento de rueda; viewport usa el centro de la pantalla.","gesture.wheelZoom.reverse.desc":"Invierte la dirección del zoom con rueda sin cambiar el resto del comportamiento.","gesture.wheelZoom.exitGuardDuration.desc":"Tiempo de protección tras salir del modo zoom por rueda, en ms. Los eventos de rueda residuales se ignoran durante esta ventana.","gesture.pinchZoom.minScale.desc":"Escala mínima de pinch. fit significa el tamaño de navegación ajustado a pantalla.","gesture.pinchZoom.maxScale.desc":"Escala máxima de pinch.","gesture.pinchZoom.resetBelowFit.desc":"Cuando pinch reduce hasta la escala fit, sale del zoom y recentra la imagen.","gesture.pinchZoom.center.desc":"Foco de pinch: gesture usa el punto medio de los dos dedos; viewport usa el centro de la pantalla.","gesture.doubleTapZoom.scale.desc":"Escala objetivo al entrar en zoom con doble toque.","gesture.doubleTapZoom.minScale.desc":"Escala mínima usada para limitar el zoom con doble toque.","gesture.doubleTapZoom.maxScale.desc":"Escala máxima usada para limitar el zoom con doble toque.","gesture.doubleTapZoom.center.desc":"Foco del doble toque: tap usa la posición tocada; viewport usa el centro de la pantalla.","gesture.doubleTapZoom.interval.desc":"Tiempo máximo entre toques, en ms.","gesture.doubleTapZoom.distance.desc":"Movimiento máximo entre toques, en px.","controller.pagination":"Paginación","controller.rotate":"Rotar","controller.rotateLeft":"Rotar a la izquierda","controller.rotateRight":"Rotar a la derecha","controller.zoom":"Zoom","controller.download":"Descargar","controller.close":"Cerrar","controller.flip":"Pasar","controller.flipLeft":"Anterior","controller.flipRight":"Siguiente","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Indicador de página superior con la posición actual / total","controller.rotate.desc":"Grupo de rotación (incluye botones izquierda y derecha)","controller.rotateLeft.desc":"Rotar 90° en sentido antihorario","controller.rotateRight.desc":"Rotar 90° en sentido horario","controller.zoom.desc":"Entrar / salir del modo zoom 1:1","controller.download.desc":"Descargar la imagen actual","controller.close.desc":"Cerrar el visor","controller.flip.desc":"Grupo de paginación (incluye botones anterior y siguiente)","controller.flipLeft.desc":"Ir a la imagen anterior","controller.flipRight.desc":"Ir a la siguiente imagen","controller.backdrop.desc":"Fondo de la barra. Si se omite, hereda el `backdrop` superior. Cuando el `backdrop` es un color oscuro sólido se recomienda un valor translúcido (p. ej. `rgba(0,0,0,0.4)`).","controller.color.desc":'Color de iconos de la barra. Si se omite, usa `currentColor`. Los overrides por botón (p. ej. `controller.zoom = "#ff8800"`) siguen prevaleciendo.',"controller.placement.desc":"Posición de la toolbar. Solo mueve la cápsula de controles; los botones laterales y la paginación mantienen su posición normal.","controller.layout.desc":"Ajusta los insets seguros de toolbar, botones laterales de flip, paginación y caption. Los números son px, las cadenas son longitudes CSS; un inset escalar sigue el borde natural de entrada de cada objetivo, y layout.mobile sobrescribe el preset móvil.","controller.layout.toolbarInset.desc":"Inset seguro del toolbar. Un valor escalar sigue el placement actual y se aplica al borde top / right / bottom / left correspondiente.","controller.layout.flipInset.desc":"Inset seguro de los botones laterales de flip. Un valor escalar se aplica a los botones izquierdo y derecho.","controller.layout.paginationInset.desc":"Inset seguro de la paginación. Un valor escalar se aplica al borde inferior de entrada, útil cuando una caption o UI personalizada necesita más espacio.","controller.layout.captionInset.desc":"Inset seguro de la caption. Un valor escalar se aplica al borde inferior de entrada, útil para colocarla por encima de la paginación o controles inferiores.","controller.render.desc":"Callback para renderizar un controlador completamente personalizado. Recibe state, actions y slots integrados; se desactiva con controller=false.","controller.overriddenBy":"Activado por","snippet.overriddenByProp":"sobrescrito por {umbrella}","hotkey.close":"Cerrar (Escape)","hotkey.zoom":"Zoom (Espacio)","hotkey.flip":"Pasar (←/→)","hotkey.flipLeft":"Anterior (←)","hotkey.flipRight":"Siguiente (→)","hotkey.rotate":"Rotar ([ / ])","hotkey.rotateLeft":"Rotar a la izquierda ([)","hotkey.rotateRight":"Rotar a la derecha (])","hotkey.download":"Descargar (Mod+S)","hotkey.close.desc":"Pulsa Escape para cerrar el visor","hotkey.zoom.desc":"Pulsa Espacio para alternar el modo zoom 1:1","hotkey.flip.desc":"Pulsa ← / → para pasar páginas dentro de un set","hotkey.flipLeft.desc":"Pulsa ← para ir a la imagen anterior","hotkey.flipRight.desc":"Pulsa → para ir a la siguiente imagen","hotkey.rotate.desc":"Pulsa [ / ] para rotar la imagen (interruptor maestro; vincula ambas direcciones)","hotkey.rotateLeft.desc":"Pulsa [ para rotar 90° en sentido antihorario","hotkey.rotateRight.desc":"Pulsa ] para rotar 90° en sentido horario","hotkey.download.desc":"Pulsa Cmd+S (macOS) o Ctrl+S (Windows/Linux) para descargar la imagen actual. Desactivado por defecto — al activarlo se sobrescribe el atajo «Guardar página como» del navegador.","animate.browsing.desc":"Transición al abrir / cerrar el visor","animate.flip.desc":"Estilo de transición al pasar páginas dentro de un set","animate.slowMotion.desc":"Cuando está activo, mantener Shift al abrir o cerrar ralentiza toda la transición del visor a 10x para inspección o demos","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"URL de la imagen. Obligatorio.","param.alt.label":"alt","param.alt.desc":"Título de la imagen, mostrado encima del visor.","param.caption.label":"caption","param.caption.desc":"Pie de imagen bajo el visor. string para el pill por defecto o { text, style?, className? } para personalizar. Cada set[i].caption puede sobrescribirlo.","param.set.label":"set","param.set.desc":"Conjunto de imágenes; activa el modo galería con navegación por teclas de flecha.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Índice de la página inicial (empieza en 0).","param.preset.label":"preset","param.preset.desc":"Bundle de presets; por defecto usa auto y define controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Color de fondo del visor. Cualquier color CSS válido.","param.zIndex.label":"zIndex","param.zIndex.desc":"Nivel de apilamiento del visor.","param.radius.label":"radius","param.radius.desc":"Radio de las esquinas de la imagen (px).","param.edge.label":"edge","param.edge.desc":"Margen mínimo entre la imagen y el viewport (px).","param.loop.label":"loop","param.loop.desc":"Volver a la primera imagen al llegar al final.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Cerrar el visor cuando la página se desplaza.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Cerrar el visor al hacer doble clic en la imagen. Desactivado por defecto.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Mantener la imagen de portada visible durante la navegación.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Retraso (ms) antes de mostrar el indicador de carga. Si la imagen termina de cargar dentro de esta ventana, no se muestra el loading — evita el parpadeo al cambiar entre imágenes en caché. Por defecto 200ms; 0 = mostrar al instante (comportamiento antiguo).","param.controller.label":"controller","param.controller.desc":"Configuración de la barra de control. false desactiva todo; un objeto parcial sobrescribe botones, posición, layout de overlays y render personalizado.","param.hotKey.label":"hotKey","param.hotKey.desc":"Atajos de teclado.","param.animate.label":"animate","param.animate.desc":"Configuración de animación: navegación, geometría de portada, cámara lenta y animación de página.","param.gesture.label":"gesture","param.gesture.desc":"Configuración de gestos según preset. Desktop activa wheelZoom estando ampliado; mobile activa por defecto swipe, dragExit, pinchZoom y doubleTapZoom. gesture=false desactiva todo.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Se dispara al abrir/cerrar el visor (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Se dispara al entrar/salir del modo zoom (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Se dispara al cambiar de página (nuevo índice).","param.onRotating.label":"onRotating","param.onRotating.desc":"Se dispara al rotar (grados).","param.onError.label":"onError","param.onError.desc":"Se dispara cuando una imagen (portada o visor) falla al cargar. Recibe el SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"Estado de navegación controlado. Pasarlo cambia al modo controlado; combínalo con onBrowsing.","docs.section.installation.title":"Instalación","docs.section.installation.intro":"Instala mediante tu gestor de paquetes:","docs.section.installation.agent":"Los AI agents deben leer primero https://zmage.caldis.me/llms.txt y mantener mínima la integración básica.","docs.section.installation.then":"Después importa el componente y su hoja de estilos:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"Para apps con renderizado en servidor, usa la entrada /ssr para no tocar document al importar:","docs.section.modes.title":"Tres modos","docs.section.modes.intro":"react-zmage expone la misma superficie de configuración a través de tres formas de invocación:","docs.section.modes.componentTitle":"Componente","docs.section.modes.componentBody":"La opción por defecto — úsala cuando controlas el JSX que renderizas. Cambia cualquier por ; cada atributo HTML nativo (className, style, onClick, etc.) se reenvía al subyacente.","docs.section.modes.imperativeTitle":"Imperativa","docs.section.modes.imperativeBody":"Úsala cuando no tienes una buena de portada o no quieres montar nodos extra en tu árbol de componentes. Llama desde manejadores de eventos, callbacks asíncronos o widgets de terceros para abrir el visor desde cualquier sitio. Devuelve una closure destructora para cerrar manualmente.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"Úsala cuando no controlas el HTML renderizado — salida de markdown, texto enriquecido de un CMS, dangerouslySetInnerHTML. Wrapper lee src / alt del pulsado; las props del visor, como backdrop, controles, atajos, animación, callbacks y set, se mantienen en .","docs.section.modes.wrapperNote":"Wrapper consulta los hijos img durante componentDidMount / componentDidUpdate. Las imágenes inyectadas tras el render del wrapper no se enlazarán hasta que vuelva a renderizarse. Si se pasa set, el src del img pulsado se compara con set y se usa como página inicial; si no se pasa set, data-zmage-caption o la figcaption más cercana pueden convertirse en la caption del visor.","docs.section.theming.title":"Tematización","docs.section.theming.intro":"react-zmage es deliberadamente agnóstico al sistema de temas del sitio anfitrión: no lee prefers-color-scheme y no está atado a ningún framework de variables CSS. La integración claro/oscuro corresponde al consumidor:","docs.section.theming.bullet.backdrop":"El fondo del visor se define con la prop backdrop (cualquier color CSS válido). El valor por defecto es blanco (#FFFFFF).","docs.section.theming.bullet.icons":"Los iconos de la barra de control usan SVG currentColor; sobrescríbelos en tu CSS global para alinearlos con tu sistema de diseño.","docs.section.theming.bullet.scoped":"Todos los estilos de runtime están confinados al contenedor #zmage; no se filtran al resto de tu aplicación.","docs.section.theming.defaultTitle":"Comportamiento por defecto","docs.section.theming.defaultBody":"Si omites backdrop, el visor se renderiza con un panel blanco. Va bien en sitios claros, pero produce mal contraste con los iconos blancos en sitios oscuros:","docs.section.theming.patternTitle":"Uso como componente / controlado","docs.section.theming.patternBody":"Lee tu hook de tema existente (next-themes, un ThemeProvider propio, etc.), mapea el valor resuelto a un color y pásalo como backdrop. Encapsularlo en un pequeño componente local mantiene los puntos de uso limpios:","docs.section.theming.imperativeTitle":"Uso imperativo","docs.section.theming.imperativeBody":"En un manejador de eventos, lee el estado actual del DOM (p. ej., una clase de tema en documentElement), tradúcelo a un color y pásalo a Zmage.browsing:","docs.section.theming.iconsTitle":"Alinear iconos con el sistema de diseño","docs.section.theming.iconsBody":"Los iconos de control viven dentro del contenedor #zmage; sobrescribe su color desde tu CSS global. Si usas variables CSS para temas (Tailwind / shadcn / tokens vanilla), enlaza directamente al token de diseño:","docs.section.theming.toolbarTitle":"Desacoplar la barra del backdrop del modal","docs.section.theming.toolbarBody":'Por defecto la cápsula de la barra hereda el `backdrop` superior y los iconos se dibujan con `currentColor`. En un `backdrop` oscuro sólido los iconos oscuros se confunden con la cápsula oscura. Pasa `controller.backdrop` (fondo de la cápsula) y `controller.color` (color de iconos) para desacoplarlos. Los overrides por botón (p. ej. `controller.zoom = "#ff8800"`) siguen prevaleciendo sobre `controller.color`.',"docs.search.desc.installation":"Instalar mediante tu gestor de paquetes e importar la hoja de estilos","docs.search.desc.ssr":"Entrada SSR que no toca document al importar","docs.search.desc.modes":"Componente / imperativa / wrapper — tres formas de invocar el visor","docs.search.desc.theming":"Alinea el fondo y los iconos del visor con el tema de tu sitio","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Selección de preset: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Valores por defecto de controller, hotKey, animate y gesture","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex y otros ajustes de UI","docs.search.desc.propsController":"Botones, posición y render personalizado de la barra de control","docs.search.desc.propsHotkey":"Atajos de teclado: ESC / Espacio / flechas","docs.search.desc.propsAnimate":"Animaciones de navegación y paso de página","docs.search.desc.propsGesture":"Zoom con rueda, arrastre para paginar, arrastre para salir, pinch y doble toque","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"Estado de navegación controlado","docs.search.desc.examples":"Ejemplos de imagen única y galería de varias imágenes","docs.search.desc.typescript":"Declaraciones de tipo BaseType / Set / ControllerSet / GestureSet","docs.search.desc.migration":"Notas de actualización desde 0.x","docs.search.desc.faq":"Trampas comunes de integración y correcciones por versión","docs.section.props.title":"Props","docs.section.props.intro":"Cualquier prop de BaseType puede pasarse en cualquiera de los tres modos.","docs.section.props.wrapperScope.title":"Alcance de props en modo Wrapper","docs.section.props.wrapperScope.intro":" no renderiza por sí mismo la imagen de portada. Enlaza nodos descendientes ya existentes, así que algunas props tienen significado propio en este modo.","docs.section.props.wrapperScope.data":"src y alt deben estar en el hijo. Los src / alt de nivel superior son sobrescritos por el nodo DOM pulsado. Si no se pasa set, caption puede leerse desde data-zmage-caption o desde la figcaption más cercana.","docs.section.props.wrapperScope.config":"set y defaultPage son compatibles para una galería compartida explícita. Cuando el src del img pulsado aparece en set, Wrapper abre ese índice; defaultPage queda solo como fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick y loadingDelay se aplican normalmente.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating y onError funcionan porque Wrapper abre internamente el mismo visor.","docs.section.props.wrapperScope.controlled":"browsing es el estado controlado del modo componente y no controla Wrapper. Para abrir desde tu propio estado, usa el modo componente o llama a Zmage.browsing() directamente.","docs.section.props.interface":"Interfaz e interacción","docs.section.props.controller.keyHeader":"Clave","docs.section.props.controller.descHeader":"Descripción","docs.section.props.controller.umbrella":"rotate es el interruptor maestro de rotateLeft / rotateRight — al activarlo se muestran ambos botones. flip funciona de la misma forma sobre flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Layout de overlays","docs.section.props.controller.layoutIntro":"layout solo desplaza los overlays de toolbar, flip lateral, paginación y caption; no participa en la geometría del primer frame ni del zoom. Los números son px, las cadenas son longitudes CSS, un inset escalar sigue el borde natural de entrada de cada objetivo, y layout.mobile sobrescribe el layout base en móvil.","docs.section.props.controller.renderTitle":"Render personalizado","docs.section.props.controller.renderIntro":"render recibe { state, actions, slots } y debe devolver un nodo React. Devuelve null para ocultar la capa de controles; reutiliza slots cuando solo quieras reemplazar parte de la UI.","docs.section.props.hotkey.umbrella":"flip es el interruptor maestro de flipLeft / flipRight, y rotate de rotateLeft / rotateRight — al activar cualquiera se enlazan ambas teclas laterales. Cada entrada también acepta un descriptor de cadena como 'Mod+S' o 'BracketLeft' para sustituir el atajo predeterminado (Mod = ⌘ en macOS, Ctrl en Windows/Linux).","docs.section.props.hotkey.customTitle":"Atajos personalizados","docs.section.props.hotkey.customIntro":"Cada entrada hotKey acepta un boolean (activar/desactivar), una string (descriptor personalizado) o un string[] (varios enlaces). Los descriptores usan nombres e.code — posiciones físicas de tecla, independientes del idioma del teclado. El prefijo Mod representa ⌘/Ctrl multiplataforma. Coincidencia estricta de modificadores: los modificadores no declarados NO deben estar pulsados (p. ej. Space nunca se dispara con Cmd+Space).","docs.section.props.hotkey.cheatsheetTitle":"Chuleta de descriptores","docs.section.props.hotkey.cheatsheet.shorthand":"letras / dígitos sueltos normalizados automáticamente","docs.section.props.hotkey.cheatsheet.arrows":"teclas de flecha","docs.section.props.hotkey.cheatsheet.punct":"puntuación (nombres físicos de teclas)","docs.section.props.hotkey.cheatsheet.whitespace":"teclas de espacio / control","docs.section.props.hotkey.cheatsheet.modifier":"prefijos de modificador (encadenados con +)","docs.section.props.animate.typeHeader":"Tipo","set.src.desc":"URL de la imagen — obligatorio","set.alt.desc":"Título de esta imagen","set.caption.desc":"Pie de imagen para este elemento; sobrescribe la caption externa si se indica","set.className.desc":"Clase personalizada aplicada a este elemento","set.style.desc":"Estilo en línea personalizado aplicado a este elemento","docs.section.props.preset.title":"Paquetes de preset","docs.section.props.preset.intro":"preset es un paquete de valores por defecto aplicados a los subobjetos controller / hotKey / animate / gesture. Si se omite preset se usa auto. auto se resuelve en tiempo de ejecución mediante matchMedia('(pointer: coarse) and (hover: none)') a desktop o mobile; en SSR o sin matchMedia se usa desktop.","docs.section.props.preset.subParamHeader":"Subparámetro","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Ejemplos","docs.section.examples.singleTitle":"Imagen única","docs.section.examples.galleryTitle":"Galería de varias imágenes","docs.section.examples.mobileTitle":"Gestos móviles","docs.section.examples.mobileBody":"Fuerza el preset mobile para probar arrastre entre páginas, arrastre para salir, pinch zoom y doble toque en dispositivos táctiles.","docs.section.examples.controllerTitle":"Controlador personalizado","docs.section.examples.controllerBody":"Coloca el controlador en un borde de la pantalla o reemplaza toda la UI con un callback render que recibe state y actions.","docs.section.examples.coverTitle":"Portada recortada","docs.section.examples.coverBody":"Pon object-fit y border radius en el img de portada para que el primer frame coincida con el recorte visible.","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Los tipos están junto al export de runtime. La unión completa de props es BaseType:","docs.section.typescript.refIntro":"El componente acepta una ref, que se reenvía al img de portada:","docs.section.migration.title":"Migración","docs.section.migration.from":"Actualizar desde 0.x:","docs.section.migration.bullet1":"El componente es un forwardRef exotic; no uses new Zmage().","docs.section.migration.bullet2":"Si importas la entrada SSR, cambia a react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"¿Por qué la imagen del modal se abre más pequeña que la portada cuando uso Tailwind / normalize.css / Bootstrap?","docs.section.faq.tailwind-shrink.a":"Esos resets aplican globalmente `img { max-width: 100% }`, lo que limita la imagen del modal al tamaño de su portada. Las versiones anteriores a 1.1.2 se ven afectadas; 1.1.2+ defiende `.imageLayer` frente a esto. Actualiza a >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` devuelve undefined en React 18 / 19, ¿por qué?","docs.section.faq.r19-imperative.a":"Bug latente corregido en 1.1.2. El código antiguo leía `RENDER.REF.current?.outBrowsing` de forma síncrona, lo cual funcionaba en React 17 pero falla en R18+ (los commits son asíncronos). 1.1.2 devuelve una closure destructora estable: actualiza a >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` abre un modal en blanco y el navegador advierte de src vacío. ¿Por qué?","docs.section.faq.wrapper-empty.a":"El wrapper antiguo expandía `defaultProps.src=''` sobre el img clicado, dejando src/alt en blanco. 1.1.2 lee src/alt explícitamente del nodo DOM clicado. Actualiza para arreglarlo.","docs.section.faq.vite-esm.q":'La API imperativa lanza "no compatible mount API" en el cliente de Vite / Next.js. ¿Por qué?',"docs.section.faq.vite-esm.a":"Antes de 1.1.2 se usaba `require('react-dom/client')` para la detección en runtime, pero el ESM del navegador no tiene `require` global. 1.1.2 pasa a un import estático: actualiza a >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"El wrapper no engancha los manejadores de clic en imágenes que añadí después del montaje.","docs.section.faq.wrapper-dynamic.a":"El wrapper consulta `` solo en `componentDidMount` y `componentDidUpdate`. Si inyectas imgs DOM fuera del árbol de render de React (p. ej. un dangerouslySetInnerHTML que cambia sin re-render del padre), fuerza al wrapper a re-renderizarse o llama a `Zmage.browsing()` desde tu propio manejador de clic.","docs.section.faq.lazy-src.q":"Mi `` usa lazy-loading con `data-src` — al abrir Zmage veo el placeholder en vez de la imagen real. ¿Cómo lo arreglo?","docs.section.faq.lazy-src.a":"Zmage lee por defecto la `src` del `` de portada — el placeholder es todo lo que ve. Pasa la URL real explícitamente vía `set`: ``. La llamada imperativa funciona igual: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"Quiero mostrar un thumbnail en la página y la imagen a tamaño completo al hacer clic — ¿puedo omitir `set`?","docs.section.faq.cover-vs-set.a":'No. Sin `set`, la `src` de la portada también es lo que muestra el visor. Para "thumbnail como entrada + visor a tamaño completo" debes separarlos explícitamente: ``. El mismo patrón resuelve `data-src` con lazy-loading (FAQ anterior) y multi-resolución de CDN. Si lo que quieres es un UI de "grilla/galería + abrir visor", Zmage no lo proporciona — renderiza la galería tú mismo y llama a `Zmage.browsing({ src, set })` al hacer clic.',"docs.section.faq.controlled-mismatch.q":"Mi prop controlado `browsing` y el estado del modal se desincronizan.","docs.section.faq.controlled-mismatch.a":"El modo controlado requiere tanto `browsing` como `onBrowsing`. Si solo pasas `browsing` (sin callback), el estado interno se sincroniza una vez y luego diverge. Úsalos siempre en pareja.","docs.section.faq.ssr.q":"¿Cómo uso react-zmage en Next.js / Remix / frameworks SSR?","docs.section.faq.ssr.a":"Usa la entrada `react-zmage/ssr`: evita tocar `document` al importar. La `Zmage.browsing()` imperativa necesita una guarda `typeof window !== 'undefined'` si puede ejecutarse durante el render o en una ruta solo de servidor.","docs.section.faq.theme.q":"¿Cómo hago que el visor siga mi tema claro/oscuro?","docs.section.faq.theme.a":"Pasa `backdrop` siguiendo la sección de Tematización de arriba. La biblioteca es deliberadamente agnóstica al tema y no lee prefers-color-scheme: tu app es la que controla el mapeo.","playground.preset.aria":"Cambiar preset de datos","playground.preset.default.label":"Predeterminado","playground.preset.default.hint":"Childs Dream · 2 imágenes","playground.preset.testset.label":"Set de prueba","playground.preset.testset.hint":"6 imágenes · ratios + formatos"},Tx="zmage.lang",Ex={"zh-CN":gR,en:yR,ja:bR,ko:vR,fr:xR,de:wR,es:SR};function CR(){if(typeof window>"u")return"en";const e=localStorage.getItem(Tx);if(e&&e in Ex)return e;const a=(navigator.language||"en").toLowerCase();return a.startsWith("zh")?"zh-CN":a.startsWith("ja")?"ja":a.startsWith("ko")?"ko":a.startsWith("fr")?"fr":a.startsWith("de")?"de":a.startsWith("es")?"es":"en"}const Rx=v.createContext(null);function kR({children:e}){const[a,r]=v.useState(CR),s=v.useCallback(d=>Ex[a][d]??d,[a]),l=v.useCallback(d=>{localStorage.setItem(Tx,d),r(d),document.documentElement.lang=d},[]);return v.useEffect(()=>{document.documentElement.lang=a},[a]),c.jsx(Rx.Provider,{value:{lang:a,setLang:l,t:s},children:e})}function be(){const e=v.useContext(Rx);if(!e)throw new Error("useT must be inside I18nProvider");return e}/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const TR=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),jx=(...e)=>e.filter((a,r,s)=>!!a&&a.trim()!==""&&s.indexOf(a)===r).join(" ").trim();/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var ER={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const RR=v.forwardRef(({color:e="currentColor",size:a=24,strokeWidth:r=2,absoluteStrokeWidth:s,className:l="",children:d,iconNode:u,...m},h)=>v.createElement("svg",{ref:h,...ER,width:a,height:a,stroke:e,strokeWidth:s?Number(r)*24/Number(a):r,className:jx("lucide",l),...m},[...u.map(([g,y])=>v.createElement(g,y)),...Array.isArray(d)?d:[d]]));/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const je=(e,a)=>{const r=v.forwardRef(({className:s,...l},d)=>v.createElement(RR,{ref:d,iconNode:a,className:jx(`lucide-${TR(e)}`,s),...l}));return r.displayName=`${e}`,r};/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ax=je("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Nx=je("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jR=je("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ha=je("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zx=je("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const AR=je("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const NR=je("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zR=je("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const MR=je("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ws=je("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Mx=je("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const DR=je("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _R=je("GalleryHorizontal",[["path",{d:"M2 3v18",key:"pzttux"}],["rect",{width:"12",height:"18",x:"6",y:"3",rx:"2",key:"btr8bg"}],["path",{d:"M22 3v18",key:"6jf3v"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Dx=je("Github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const OR=je("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const LR=je("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ZR=je("Keyboard",[["path",{d:"M10 8h.01",key:"1r9ogq"}],["path",{d:"M12 12h.01",key:"1mp3jc"}],["path",{d:"M14 8h.01",key:"1primd"}],["path",{d:"M16 12h.01",key:"1l6xoz"}],["path",{d:"M18 8h.01",key:"emo2bl"}],["path",{d:"M6 8h.01",key:"x9i8wu"}],["path",{d:"M7 16h10",key:"wp8him"}],["path",{d:"M8 12h.01",key:"czm47f"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const PR=je("Link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const BR=je("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const IR=je("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qR=je("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const FR=je("MousePointer2",[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const KR=je("MousePointerClick",[["path",{d:"M14 4.1 12 6",key:"ita8i4"}],["path",{d:"m5.1 8-2.9-.8",key:"1go3kf"}],["path",{d:"m6 12-1.9 2",key:"mnht97"}],["path",{d:"M7.2 2.2 8 5.1",key:"1cfko1"}],["path",{d:"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z",key:"s0h3yz"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const UR=je("Mouse",[["rect",{x:"5",y:"2",width:"14",height:"20",rx:"7",key:"11ol66"}],["path",{d:"M12 6v4",key:"16clxf"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const HR=je("Newspaper",[["path",{d:"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-2 2Zm0 0a2 2 0 0 1-2-2v-9c0-1.1.9-2 2-2h2",key:"7pis2x"}],["path",{d:"M18 14h-8",key:"sponae"}],["path",{d:"M15 18h-5",key:"95g1m2"}],["path",{d:"M10 6h8v4h-8V6Z",key:"smlsk5"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const GR=je("PanelsTopLeft",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const VR=je("Play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ks=je("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const WR=je("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $b=je("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _x=je("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $R=je("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const YR=je("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Nm=je("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const XR=je("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const QR=je("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @license lucide-react v0.469.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ox=je("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Yb(e,a){if(typeof e=="function")return e(a);e!=null&&(e.current=a)}function ti(...e){return a=>{let r=!1;const s=e.map(l=>{const d=Yb(l,a);return!r&&typeof d=="function"&&(r=!0),d});if(r)return()=>{for(let l=0;l{let{children:d,...u}=s;Lx(d)&&typeof tc=="function"&&(d=tc(d._payload));const m=v.Children.toArray(d),h=m.find(nj);if(h){const g=h.props.children,y=m.map(b=>b===h?v.Children.count(g)>1?v.Children.only(null):v.isValidElement(g)?g.props.children:null:b);return c.jsx(a,{...u,ref:l,children:v.isValidElement(g)?v.cloneElement(g,void 0,y):null})}return c.jsx(a,{...u,ref:l,children:d})});return r.displayName=`${e}.Slot`,r}var tj=Zx("Slot");function oj(e){const a=v.forwardRef((r,s)=>{let{children:l,...d}=r;if(Lx(l)&&typeof tc=="function"&&(l=tc(l._payload)),v.isValidElement(l)){const u=sj(l),m=rj(d,l.props);return l.type!==v.Fragment&&(m.ref=s?ti(s,u):u),v.cloneElement(l,m)}return v.Children.count(l)>1?v.Children.only(null):null});return a.displayName=`${e}.SlotClone`,a}var aj=Symbol("radix.slottable");function nj(e){return v.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===aj}function rj(e,a){const r={...a};for(const s in a){const l=e[s],d=a[s];/^on[A-Z]/.test(s)?l&&d?r[s]=(...m)=>{const h=d(...m);return l(...m),h}:l&&(r[s]=l):s==="style"?r[s]={...l,...d}:s==="className"&&(r[s]=[l,d].filter(Boolean).join(" "))}return{...e,...r}}function sj(e){var s,l;let a=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,r=a&&"isReactWarning"in a&&a.isReactWarning;return r?e.ref:(a=(l=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:l.get,r=a&&"isReactWarning"in a&&a.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function Px(e){var a,r,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var l=e.length;for(a=0;atypeof e=="boolean"?`${e}`:e===0?"0":e,Qb=yc,bc=(e,a)=>r=>{var s;if((a==null?void 0:a.variants)==null)return Qb(e,r==null?void 0:r.class,r==null?void 0:r.className);const{variants:l,defaultVariants:d}=a,u=Object.keys(l).map(g=>{const y=r==null?void 0:r[g],b=d==null?void 0:d[g];if(y===null)return null;const S=Xb(y)||Xb(b);return l[g][S]}),m=r&&Object.entries(r).reduce((g,y)=>{let[b,S]=y;return S===void 0||(g[b]=S),g},{}),h=a==null||(s=a.compoundVariants)===null||s===void 0?void 0:s.reduce((g,y)=>{let{class:b,className:S,...T}=y;return Object.entries(T).every(C=>{let[x,k]=C;return Array.isArray(k)?k.includes({...d,...m}[x]):{...d,...m}[x]===k})?[...g,b,S]:g},[]);return Qb(e,u,h,r==null?void 0:r.class,r==null?void 0:r.className)},zm="-",ij=e=>{const a=cj(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:s}=e;return{getClassGroupId:u=>{const m=u.split(zm);return m[0]===""&&m.length!==1&&m.shift(),Bx(m,a)||lj(u)},getConflictingClassGroupIds:(u,m)=>{const h=r[u]||[];return m&&s[u]?[...h,...s[u]]:h}}},Bx=(e,a)=>{var u;if(e.length===0)return a.classGroupId;const r=e[0],s=a.nextPart.get(r),l=s?Bx(e.slice(1),s):void 0;if(l)return l;if(a.validators.length===0)return;const d=e.join(zm);return(u=a.validators.find(({validator:m})=>m(d)))==null?void 0:u.classGroupId},Jb=/^\[(.+)\]$/,lj=e=>{if(Jb.test(e)){const a=Jb.exec(e)[1],r=a==null?void 0:a.substring(0,a.indexOf(":"));if(r)return"arbitrary.."+r}},cj=e=>{const{theme:a,prefix:r}=e,s={nextPart:new Map,validators:[]};return uj(Object.entries(e.classGroups),r).forEach(([d,u])=>{tm(u,s,d,a)}),s},tm=(e,a,r,s)=>{e.forEach(l=>{if(typeof l=="string"){const d=l===""?a:ev(a,l);d.classGroupId=r;return}if(typeof l=="function"){if(dj(l)){tm(l(s),a,r,s);return}a.validators.push({validator:l,classGroupId:r});return}Object.entries(l).forEach(([d,u])=>{tm(u,ev(a,d),r,s)})})},ev=(e,a)=>{let r=e;return a.split(zm).forEach(s=>{r.nextPart.has(s)||r.nextPart.set(s,{nextPart:new Map,validators:[]}),r=r.nextPart.get(s)}),r},dj=e=>e.isThemeGetter,uj=(e,a)=>a?e.map(([r,s])=>{const l=s.map(d=>typeof d=="string"?a+d:typeof d=="object"?Object.fromEntries(Object.entries(d).map(([u,m])=>[a+u,m])):d);return[r,l]}):e,pj=e=>{if(e<1)return{get:()=>{},set:()=>{}};let a=0,r=new Map,s=new Map;const l=(d,u)=>{r.set(d,u),a++,a>e&&(a=0,s=r,r=new Map)};return{get(d){let u=r.get(d);if(u!==void 0)return u;if((u=s.get(d))!==void 0)return l(d,u),u},set(d,u){r.has(d)?r.set(d,u):l(d,u)}}},Ix="!",mj=e=>{const{separator:a,experimentalParseClassName:r}=e,s=a.length===1,l=a[0],d=a.length,u=m=>{const h=[];let g=0,y=0,b;for(let k=0;ky?b-y:void 0;return{modifiers:h,hasImportantModifier:T,baseClassName:C,maybePostfixModifierPosition:x}};return r?m=>r({className:m,parseClassName:u}):u},fj=e=>{if(e.length<=1)return e;const a=[];let r=[];return e.forEach(s=>{s[0]==="["?(a.push(...r.sort(),s),r=[]):r.push(s)}),a.push(...r.sort()),a},hj=e=>({cache:pj(e.cacheSize),parseClassName:mj(e),...ij(e)}),gj=/\s+/,yj=(e,a)=>{const{parseClassName:r,getClassGroupId:s,getConflictingClassGroupIds:l}=a,d=[],u=e.trim().split(gj);let m="";for(let h=u.length-1;h>=0;h-=1){const g=u[h],{modifiers:y,hasImportantModifier:b,baseClassName:S,maybePostfixModifierPosition:T}=r(g);let C=!!T,x=s(C?S.substring(0,T):S);if(!x){if(!C){m=g+(m.length>0?" "+m:m);continue}if(x=s(S),!x){m=g+(m.length>0?" "+m:m);continue}C=!1}const k=fj(y).join(":"),R=b?k+Ix:k,j=R+x;if(d.includes(j))continue;d.push(j);const A=l(x,C);for(let M=0;M0?" "+m:m)}return m};function bj(){let e=0,a,r,s="";for(;e{if(typeof e=="string")return e;let a,r="";for(let s=0;sb(y),e());return r=hj(g),s=r.cache.get,l=r.cache.set,d=m,m(h)}function m(h){const g=s(h);if(g)return g;const y=yj(h,r);return l(h,y),y}return function(){return d(bj.apply(null,arguments))}}const Ve=e=>{const a=r=>r[e]||[];return a.isThemeGetter=!0,a},Fx=/^\[(?:([a-z-]+):)?(.+)\]$/i,xj=/^\d+\/\d+$/,wj=new Set(["px","full","screen"]),Sj=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Cj=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,kj=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Tj=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Ej=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ea=e=>Er(e)||wj.has(e)||xj.test(e),Pa=e=>Zr(e,"length",_j),Er=e=>!!e&&!Number.isNaN(Number(e)),Ep=e=>Zr(e,"number",Er),Bs=e=>!!e&&Number.isInteger(Number(e)),Rj=e=>e.endsWith("%")&&Er(e.slice(0,-1)),ke=e=>Fx.test(e),Ba=e=>Sj.test(e),jj=new Set(["length","size","percentage"]),Aj=e=>Zr(e,jj,Kx),Nj=e=>Zr(e,"position",Kx),zj=new Set(["image","url"]),Mj=e=>Zr(e,zj,Lj),Dj=e=>Zr(e,"",Oj),Is=()=>!0,Zr=(e,a,r)=>{const s=Fx.exec(e);return s?s[1]?typeof a=="string"?s[1]===a:a.has(s[1]):r(s[2]):!1},_j=e=>Cj.test(e)&&!kj.test(e),Kx=()=>!1,Oj=e=>Tj.test(e),Lj=e=>Ej.test(e),Zj=()=>{const e=Ve("colors"),a=Ve("spacing"),r=Ve("blur"),s=Ve("brightness"),l=Ve("borderColor"),d=Ve("borderRadius"),u=Ve("borderSpacing"),m=Ve("borderWidth"),h=Ve("contrast"),g=Ve("grayscale"),y=Ve("hueRotate"),b=Ve("invert"),S=Ve("gap"),T=Ve("gradientColorStops"),C=Ve("gradientColorStopPositions"),x=Ve("inset"),k=Ve("margin"),R=Ve("opacity"),j=Ve("padding"),A=Ve("saturate"),M=Ve("scale"),q=Ve("sepia"),P=Ve("skew"),I=Ve("space"),X=Ve("translate"),ae=()=>["auto","contain","none"],re=()=>["auto","hidden","clip","visible","scroll"],te=()=>["auto",ke,a],J=()=>[ke,a],pe=()=>["",ea,Pa],ne=()=>["auto",Er,ke],ue=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],O=()=>["solid","dashed","dotted","double","none"],V=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],H=()=>["start","end","center","between","around","evenly","stretch"],Y=()=>["","0",ke],se=()=>["auto","avoid","all","avoid-page","page","left","right","column"],N=()=>[Er,ke];return{cacheSize:500,separator:":",theme:{colors:[Is],spacing:[ea,Pa],blur:["none","",Ba,ke],brightness:N(),borderColor:[e],borderRadius:["none","","full",Ba,ke],borderSpacing:J(),borderWidth:pe(),contrast:N(),grayscale:Y(),hueRotate:N(),invert:Y(),gap:J(),gradientColorStops:[e],gradientColorStopPositions:[Rj,Pa],inset:te(),margin:te(),opacity:N(),padding:J(),saturate:N(),scale:N(),sepia:Y(),skew:N(),space:J(),translate:J()},classGroups:{aspect:[{aspect:["auto","square","video",ke]}],container:["container"],columns:[{columns:[Ba]}],"break-after":[{"break-after":se()}],"break-before":[{"break-before":se()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ue(),ke]}],overflow:[{overflow:re()}],"overflow-x":[{"overflow-x":re()}],"overflow-y":[{"overflow-y":re()}],overscroll:[{overscroll:ae()}],"overscroll-x":[{"overscroll-x":ae()}],"overscroll-y":[{"overscroll-y":ae()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[x]}],"inset-x":[{"inset-x":[x]}],"inset-y":[{"inset-y":[x]}],start:[{start:[x]}],end:[{end:[x]}],top:[{top:[x]}],right:[{right:[x]}],bottom:[{bottom:[x]}],left:[{left:[x]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Bs,ke]}],basis:[{basis:te()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",ke]}],grow:[{grow:Y()}],shrink:[{shrink:Y()}],order:[{order:["first","last","none",Bs,ke]}],"grid-cols":[{"grid-cols":[Is]}],"col-start-end":[{col:["auto",{span:["full",Bs,ke]},ke]}],"col-start":[{"col-start":ne()}],"col-end":[{"col-end":ne()}],"grid-rows":[{"grid-rows":[Is]}],"row-start-end":[{row:["auto",{span:[Bs,ke]},ke]}],"row-start":[{"row-start":ne()}],"row-end":[{"row-end":ne()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",ke]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",ke]}],gap:[{gap:[S]}],"gap-x":[{"gap-x":[S]}],"gap-y":[{"gap-y":[S]}],"justify-content":[{justify:["normal",...H()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...H(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...H(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[j]}],px:[{px:[j]}],py:[{py:[j]}],ps:[{ps:[j]}],pe:[{pe:[j]}],pt:[{pt:[j]}],pr:[{pr:[j]}],pb:[{pb:[j]}],pl:[{pl:[j]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],"space-x":[{"space-x":[I]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[I]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",ke,a]}],"min-w":[{"min-w":[ke,a,"min","max","fit"]}],"max-w":[{"max-w":[ke,a,"none","full","min","max","fit","prose",{screen:[Ba]},Ba]}],h:[{h:[ke,a,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[ke,a,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[ke,a,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[ke,a,"auto","min","max","fit"]}],"font-size":[{text:["base",Ba,Pa]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Ep]}],"font-family":[{font:[Is]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",ke]}],"line-clamp":[{"line-clamp":["none",Er,Ep]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ea,ke]}],"list-image":[{"list-image":["none",ke]}],"list-style-type":[{list:["none","disc","decimal",ke]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[R]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[R]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...O(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ea,Pa]}],"underline-offset":[{"underline-offset":["auto",ea,ke]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:J()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ke]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",ke]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[R]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ue(),Nj]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Aj]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Mj]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[C]}],"gradient-via-pos":[{via:[C]}],"gradient-to-pos":[{to:[C]}],"gradient-from":[{from:[T]}],"gradient-via":[{via:[T]}],"gradient-to":[{to:[T]}],rounded:[{rounded:[d]}],"rounded-s":[{"rounded-s":[d]}],"rounded-e":[{"rounded-e":[d]}],"rounded-t":[{"rounded-t":[d]}],"rounded-r":[{"rounded-r":[d]}],"rounded-b":[{"rounded-b":[d]}],"rounded-l":[{"rounded-l":[d]}],"rounded-ss":[{"rounded-ss":[d]}],"rounded-se":[{"rounded-se":[d]}],"rounded-ee":[{"rounded-ee":[d]}],"rounded-es":[{"rounded-es":[d]}],"rounded-tl":[{"rounded-tl":[d]}],"rounded-tr":[{"rounded-tr":[d]}],"rounded-br":[{"rounded-br":[d]}],"rounded-bl":[{"rounded-bl":[d]}],"border-w":[{border:[m]}],"border-w-x":[{"border-x":[m]}],"border-w-y":[{"border-y":[m]}],"border-w-s":[{"border-s":[m]}],"border-w-e":[{"border-e":[m]}],"border-w-t":[{"border-t":[m]}],"border-w-r":[{"border-r":[m]}],"border-w-b":[{"border-b":[m]}],"border-w-l":[{"border-l":[m]}],"border-opacity":[{"border-opacity":[R]}],"border-style":[{border:[...O(),"hidden"]}],"divide-x":[{"divide-x":[m]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[m]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[R]}],"divide-style":[{divide:O()}],"border-color":[{border:[l]}],"border-color-x":[{"border-x":[l]}],"border-color-y":[{"border-y":[l]}],"border-color-s":[{"border-s":[l]}],"border-color-e":[{"border-e":[l]}],"border-color-t":[{"border-t":[l]}],"border-color-r":[{"border-r":[l]}],"border-color-b":[{"border-b":[l]}],"border-color-l":[{"border-l":[l]}],"divide-color":[{divide:[l]}],"outline-style":[{outline:["",...O()]}],"outline-offset":[{"outline-offset":[ea,ke]}],"outline-w":[{outline:[ea,Pa]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[R]}],"ring-offset-w":[{"ring-offset":[ea,Pa]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Ba,Dj]}],"shadow-color":[{shadow:[Is]}],opacity:[{opacity:[R]}],"mix-blend":[{"mix-blend":[...V(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":V()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[s]}],contrast:[{contrast:[h]}],"drop-shadow":[{"drop-shadow":["","none",Ba,ke]}],grayscale:[{grayscale:[g]}],"hue-rotate":[{"hue-rotate":[y]}],invert:[{invert:[b]}],saturate:[{saturate:[A]}],sepia:[{sepia:[q]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[s]}],"backdrop-contrast":[{"backdrop-contrast":[h]}],"backdrop-grayscale":[{"backdrop-grayscale":[g]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[y]}],"backdrop-invert":[{"backdrop-invert":[b]}],"backdrop-opacity":[{"backdrop-opacity":[R]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[q]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[u]}],"border-spacing-x":[{"border-spacing-x":[u]}],"border-spacing-y":[{"border-spacing-y":[u]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",ke]}],duration:[{duration:N()}],ease:[{ease:["linear","in","out","in-out",ke]}],delay:[{delay:N()}],animate:[{animate:["none","spin","ping","pulse","bounce",ke]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[M]}],"scale-x":[{"scale-x":[M]}],"scale-y":[{"scale-y":[M]}],rotate:[{rotate:[Bs,ke]}],"translate-x":[{"translate-x":[X]}],"translate-y":[{"translate-y":[X]}],"skew-x":[{"skew-x":[P]}],"skew-y":[{"skew-y":[P]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",ke]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",ke]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":J()}],"scroll-mx":[{"scroll-mx":J()}],"scroll-my":[{"scroll-my":J()}],"scroll-ms":[{"scroll-ms":J()}],"scroll-me":[{"scroll-me":J()}],"scroll-mt":[{"scroll-mt":J()}],"scroll-mr":[{"scroll-mr":J()}],"scroll-mb":[{"scroll-mb":J()}],"scroll-ml":[{"scroll-ml":J()}],"scroll-p":[{"scroll-p":J()}],"scroll-px":[{"scroll-px":J()}],"scroll-py":[{"scroll-py":J()}],"scroll-ps":[{"scroll-ps":J()}],"scroll-pe":[{"scroll-pe":J()}],"scroll-pt":[{"scroll-pt":J()}],"scroll-pr":[{"scroll-pr":J()}],"scroll-pb":[{"scroll-pb":J()}],"scroll-pl":[{"scroll-pl":J()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",ke]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ea,Pa,Ep]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Pj=vj(Zj);function ie(...e){return Pj(yc(e))}const Bj=bc("inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),it=v.forwardRef(({className:e,variant:a,size:r,asChild:s=!1,...l},d)=>{const u=s?tj:"button";return c.jsx(u,{className:ie(Bj({variant:a,size:r,className:e})),ref:d,...l})});it.displayName="Button";function ce(e,a,{checkForDefaultPrevented:r=!0}={}){return function(l){if(e==null||e(l),r===!1||!l.defaultPrevented)return a==null?void 0:a(l)}}function Ij(e,a){const r=v.createContext(a),s=d=>{const{children:u,...m}=d,h=v.useMemo(()=>m,Object.values(m));return c.jsx(r.Provider,{value:h,children:u})};s.displayName=e+"Provider";function l(d){const u=v.useContext(r);if(u)return u;if(a!==void 0)return a;throw new Error(`\`${d}\` must be used within \`${e}\``)}return[s,l]}function Vt(e,a=[]){let r=[];function s(d,u){const m=v.createContext(u),h=r.length;r=[...r,u];const g=b=>{var R;const{scope:S,children:T,...C}=b,x=((R=S==null?void 0:S[e])==null?void 0:R[h])||m,k=v.useMemo(()=>C,Object.values(C));return c.jsx(x.Provider,{value:k,children:T})};g.displayName=d+"Provider";function y(b,S){var x;const T=((x=S==null?void 0:S[e])==null?void 0:x[h])||m,C=v.useContext(T);if(C)return C;if(u!==void 0)return u;throw new Error(`\`${b}\` must be used within \`${d}\``)}return[g,y]}const l=()=>{const d=r.map(u=>v.createContext(u));return function(m){const h=(m==null?void 0:m[e])||d;return v.useMemo(()=>({[`__scope${e}`]:{...m,[e]:h}}),[m,h])}};return l.scopeName=e,[s,qj(l,...a)]}function qj(...e){const a=e[0];if(e.length===1)return a;const r=()=>{const s=e.map(l=>({useScope:l(),scopeName:l.scopeName}));return function(d){const u=s.reduce((m,{useScope:h,scopeName:g})=>{const b=h(d)[`__scope${g}`];return{...m,...b}},{});return v.useMemo(()=>({[`__scope${a.scopeName}`]:u}),[u])}};return r.scopeName=a.scopeName,r}var ra=globalThis!=null&&globalThis.document?v.useLayoutEffect:()=>{},Fj=mc[" useId ".trim().toString()]||(()=>{}),Kj=0;function mo(e){const[a,r]=v.useState(Fj());return ra(()=>{r(s=>s??String(Kj++))},[e]),a?`radix-${a}`:""}var Uj=mc[" useInsertionEffect ".trim().toString()]||ra;function go({prop:e,defaultProp:a,onChange:r=()=>{},caller:s}){const[l,d,u]=Hj({defaultProp:a,onChange:r}),m=e!==void 0,h=m?e:l;{const y=v.useRef(e!==void 0);v.useEffect(()=>{const b=y.current;b!==m&&console.warn(`${s} is changing from ${b?"controlled":"uncontrolled"} to ${m?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),y.current=m},[m,s])}const g=v.useCallback(y=>{var b;if(m){const S=Gj(y)?y(e):y;S!==e&&((b=u.current)==null||b.call(u,S))}else d(y)},[m,e,d,u]);return[h,g]}function Hj({defaultProp:e,onChange:a}){const[r,s]=v.useState(e),l=v.useRef(r),d=v.useRef(a);return Uj(()=>{d.current=a},[a]),v.useEffect(()=>{var u;l.current!==r&&((u=d.current)==null||u.call(d,r),l.current=r)},[r,l]),[r,s,d]}function Gj(e){return typeof e=="function"}function Mr(e){const a=Vj(e),r=v.forwardRef((s,l)=>{const{children:d,...u}=s,m=v.Children.toArray(d),h=m.find($j);if(h){const g=h.props.children,y=m.map(b=>b===h?v.Children.count(g)>1?v.Children.only(null):v.isValidElement(g)?g.props.children:null:b);return c.jsx(a,{...u,ref:l,children:v.isValidElement(g)?v.cloneElement(g,void 0,y):null})}return c.jsx(a,{...u,ref:l,children:d})});return r.displayName=`${e}.Slot`,r}function Vj(e){const a=v.forwardRef((r,s)=>{const{children:l,...d}=r;if(v.isValidElement(l)){const u=Xj(l),m=Yj(d,l.props);return l.type!==v.Fragment&&(m.ref=s?ti(s,u):u),v.cloneElement(l,m)}return v.Children.count(l)>1?v.Children.only(null):null});return a.displayName=`${e}.SlotClone`,a}var Ux=Symbol("radix.slottable");function Wj(e){const a=({children:r})=>c.jsx(c.Fragment,{children:r});return a.displayName=`${e}.Slottable`,a.__radixId=Ux,a}function $j(e){return v.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Ux}function Yj(e,a){const r={...a};for(const s in a){const l=e[s],d=a[s];/^on[A-Z]/.test(s)?l&&d?r[s]=(...m)=>{const h=d(...m);return l(...m),h}:l&&(r[s]=l):s==="style"?r[s]={...l,...d}:s==="className"&&(r[s]=[l,d].filter(Boolean).join(" "))}return{...e,...r}}function Xj(e){var s,l;let a=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,r=a&&"isReactWarning"in a&&a.isReactWarning;return r?e.ref:(a=(l=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:l.get,r=a&&"isReactWarning"in a&&a.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}var Qj=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Te=Qj.reduce((e,a)=>{const r=Mr(`Primitive.${a}`),s=v.forwardRef((l,d)=>{const{asChild:u,...m}=l,h=u?r:a;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),c.jsx(h,{...m,ref:d})});return s.displayName=`Primitive.${a}`,{...e,[a]:s}},{});function Hx(e,a){e&&Em.flushSync(()=>e.dispatchEvent(a))}function sa(e){const a=v.useRef(e);return v.useEffect(()=>{a.current=e}),v.useMemo(()=>(...r)=>{var s;return(s=a.current)==null?void 0:s.call(a,...r)},[])}function Jj(e,a=globalThis==null?void 0:globalThis.document){const r=sa(e);v.useEffect(()=>{const s=l=>{l.key==="Escape"&&r(l)};return a.addEventListener("keydown",s,{capture:!0}),()=>a.removeEventListener("keydown",s,{capture:!0})},[r,a])}var eA="DismissableLayer",om="dismissableLayer.update",tA="dismissableLayer.pointerDownOutside",oA="dismissableLayer.focusOutside",tv,Gx=v.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),oi=v.forwardRef((e,a)=>{const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:d,onInteractOutside:u,onDismiss:m,...h}=e,g=v.useContext(Gx),[y,b]=v.useState(null),S=(y==null?void 0:y.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,T]=v.useState({}),C=Ze(a,I=>b(I)),x=Array.from(g.layers),[k]=[...g.layersWithOutsidePointerEventsDisabled].slice(-1),R=x.indexOf(k),j=y?x.indexOf(y):-1,A=g.layersWithOutsidePointerEventsDisabled.size>0,M=j>=R,q=rA(I=>{const X=I.target,ae=[...g.branches].some(re=>re.contains(X));!M||ae||(l==null||l(I),u==null||u(I),I.defaultPrevented||m==null||m())},S),P=sA(I=>{const X=I.target;[...g.branches].some(re=>re.contains(X))||(d==null||d(I),u==null||u(I),I.defaultPrevented||m==null||m())},S);return Jj(I=>{j===g.layers.size-1&&(s==null||s(I),!I.defaultPrevented&&m&&(I.preventDefault(),m()))},S),v.useEffect(()=>{if(y)return r&&(g.layersWithOutsidePointerEventsDisabled.size===0&&(tv=S.body.style.pointerEvents,S.body.style.pointerEvents="none"),g.layersWithOutsidePointerEventsDisabled.add(y)),g.layers.add(y),ov(),()=>{r&&g.layersWithOutsidePointerEventsDisabled.size===1&&(S.body.style.pointerEvents=tv)}},[y,S,r,g]),v.useEffect(()=>()=>{y&&(g.layers.delete(y),g.layersWithOutsidePointerEventsDisabled.delete(y),ov())},[y,g]),v.useEffect(()=>{const I=()=>T({});return document.addEventListener(om,I),()=>document.removeEventListener(om,I)},[]),c.jsx(Te.div,{...h,ref:C,style:{pointerEvents:A?M?"auto":"none":void 0,...e.style},onFocusCapture:ce(e.onFocusCapture,P.onFocusCapture),onBlurCapture:ce(e.onBlurCapture,P.onBlurCapture),onPointerDownCapture:ce(e.onPointerDownCapture,q.onPointerDownCapture)})});oi.displayName=eA;var aA="DismissableLayerBranch",nA=v.forwardRef((e,a)=>{const r=v.useContext(Gx),s=v.useRef(null),l=Ze(a,s);return v.useEffect(()=>{const d=s.current;if(d)return r.branches.add(d),()=>{r.branches.delete(d)}},[r.branches]),c.jsx(Te.div,{...e,ref:l})});nA.displayName=aA;function rA(e,a=globalThis==null?void 0:globalThis.document){const r=sa(e),s=v.useRef(!1),l=v.useRef(()=>{});return v.useEffect(()=>{const d=m=>{if(m.target&&!s.current){let h=function(){Vx(tA,r,g,{discrete:!0})};const g={originalEvent:m};m.pointerType==="touch"?(a.removeEventListener("click",l.current),l.current=h,a.addEventListener("click",l.current,{once:!0})):h()}else a.removeEventListener("click",l.current);s.current=!1},u=window.setTimeout(()=>{a.addEventListener("pointerdown",d)},0);return()=>{window.clearTimeout(u),a.removeEventListener("pointerdown",d),a.removeEventListener("click",l.current)}},[a,r]),{onPointerDownCapture:()=>s.current=!0}}function sA(e,a=globalThis==null?void 0:globalThis.document){const r=sa(e),s=v.useRef(!1);return v.useEffect(()=>{const l=d=>{d.target&&!s.current&&Vx(oA,r,{originalEvent:d},{discrete:!1})};return a.addEventListener("focusin",l),()=>a.removeEventListener("focusin",l)},[a,r]),{onFocusCapture:()=>s.current=!0,onBlurCapture:()=>s.current=!1}}function ov(){const e=new CustomEvent(om);document.dispatchEvent(e)}function Vx(e,a,r,{discrete:s}){const l=r.originalEvent.target,d=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});a&&l.addEventListener(e,a,{once:!0}),s?Hx(l,d):l.dispatchEvent(d)}var Rp="focusScope.autoFocusOnMount",jp="focusScope.autoFocusOnUnmount",av={bubbles:!1,cancelable:!0},iA="FocusScope",vc=v.forwardRef((e,a)=>{const{loop:r=!1,trapped:s=!1,onMountAutoFocus:l,onUnmountAutoFocus:d,...u}=e,[m,h]=v.useState(null),g=sa(l),y=sa(d),b=v.useRef(null),S=Ze(a,x=>h(x)),T=v.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;v.useEffect(()=>{if(s){let x=function(A){if(T.paused||!m)return;const M=A.target;m.contains(M)?b.current=M:Ia(b.current,{select:!0})},k=function(A){if(T.paused||!m)return;const M=A.relatedTarget;M!==null&&(m.contains(M)||Ia(b.current,{select:!0}))},R=function(A){if(document.activeElement===document.body)for(const q of A)q.removedNodes.length>0&&Ia(m)};document.addEventListener("focusin",x),document.addEventListener("focusout",k);const j=new MutationObserver(R);return m&&j.observe(m,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",x),document.removeEventListener("focusout",k),j.disconnect()}}},[s,m,T.paused]),v.useEffect(()=>{if(m){rv.add(T);const x=document.activeElement;if(!m.contains(x)){const R=new CustomEvent(Rp,av);m.addEventListener(Rp,g),m.dispatchEvent(R),R.defaultPrevented||(lA(mA(Wx(m)),{select:!0}),document.activeElement===x&&Ia(m))}return()=>{m.removeEventListener(Rp,g),setTimeout(()=>{const R=new CustomEvent(jp,av);m.addEventListener(jp,y),m.dispatchEvent(R),R.defaultPrevented||Ia(x??document.body,{select:!0}),m.removeEventListener(jp,y),rv.remove(T)},0)}}},[m,g,y,T]);const C=v.useCallback(x=>{if(!r&&!s||T.paused)return;const k=x.key==="Tab"&&!x.altKey&&!x.ctrlKey&&!x.metaKey,R=document.activeElement;if(k&&R){const j=x.currentTarget,[A,M]=cA(j);A&&M?!x.shiftKey&&R===M?(x.preventDefault(),r&&Ia(A,{select:!0})):x.shiftKey&&R===A&&(x.preventDefault(),r&&Ia(M,{select:!0})):R===j&&x.preventDefault()}},[r,s,T.paused]);return c.jsx(Te.div,{tabIndex:-1,...u,ref:S,onKeyDown:C})});vc.displayName=iA;function lA(e,{select:a=!1}={}){const r=document.activeElement;for(const s of e)if(Ia(s,{select:a}),document.activeElement!==r)return}function cA(e){const a=Wx(e),r=nv(a,e),s=nv(a.reverse(),e);return[r,s]}function Wx(e){const a=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>{const l=s.tagName==="INPUT"&&s.type==="hidden";return s.disabled||s.hidden||l?NodeFilter.FILTER_SKIP:s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)a.push(r.currentNode);return a}function nv(e,a){for(const r of e)if(!dA(r,{upTo:a}))return r}function dA(e,{upTo:a}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(a!==void 0&&e===a)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function uA(e){return e instanceof HTMLInputElement&&"select"in e}function Ia(e,{select:a=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&uA(e)&&a&&e.select()}}var rv=pA();function pA(){let e=[];return{add(a){const r=e[0];a!==r&&(r==null||r.pause()),e=sv(e,a),e.unshift(a)},remove(a){var r;e=sv(e,a),(r=e[0])==null||r.resume()}}}function sv(e,a){const r=[...e],s=r.indexOf(a);return s!==-1&&r.splice(s,1),r}function mA(e){return e.filter(a=>a.tagName!=="A")}var fA="Portal",ai=v.forwardRef((e,a)=>{var m;const{container:r,...s}=e,[l,d]=v.useState(!1);ra(()=>d(!0),[]);const u=r||l&&((m=globalThis==null?void 0:globalThis.document)==null?void 0:m.body);return u?Rm.createPortal(c.jsx(Te.div,{...s,ref:a}),u):null});ai.displayName=fA;function hA(e,a){return v.useReducer((r,s)=>a[r][s]??r,e)}var Mt=e=>{const{present:a,children:r}=e,s=gA(a),l=typeof r=="function"?r({present:s.isPresent}):v.Children.only(r),d=Ze(s.ref,yA(l));return typeof r=="function"||s.isPresent?v.cloneElement(l,{ref:d}):null};Mt.displayName="Presence";function gA(e){const[a,r]=v.useState(),s=v.useRef(null),l=v.useRef(e),d=v.useRef("none"),u=e?"mounted":"unmounted",[m,h]=hA(u,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return v.useEffect(()=>{const g=_l(s.current);d.current=m==="mounted"?g:"none"},[m]),ra(()=>{const g=s.current,y=l.current;if(y!==e){const S=d.current,T=_l(g);e?h("MOUNT"):T==="none"||(g==null?void 0:g.display)==="none"?h("UNMOUNT"):h(y&&S!==T?"ANIMATION_OUT":"UNMOUNT"),l.current=e}},[e,h]),ra(()=>{if(a){let g;const y=a.ownerDocument.defaultView??window,b=T=>{const x=_l(s.current).includes(CSS.escape(T.animationName));if(T.target===a&&x&&(h("ANIMATION_END"),!l.current)){const k=a.style.animationFillMode;a.style.animationFillMode="forwards",g=y.setTimeout(()=>{a.style.animationFillMode==="forwards"&&(a.style.animationFillMode=k)})}},S=T=>{T.target===a&&(d.current=_l(s.current))};return a.addEventListener("animationstart",S),a.addEventListener("animationcancel",b),a.addEventListener("animationend",b),()=>{y.clearTimeout(g),a.removeEventListener("animationstart",S),a.removeEventListener("animationcancel",b),a.removeEventListener("animationend",b)}}else h("ANIMATION_END")},[a,h]),{isPresent:["mounted","unmountSuspended"].includes(m),ref:v.useCallback(g=>{s.current=g?getComputedStyle(g):null,r(g)},[])}}function _l(e){return(e==null?void 0:e.animationName)||"none"}function yA(e){var s,l;let a=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,r=a&&"isReactWarning"in a&&a.isReactWarning;return r?e.ref:(a=(l=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:l.get,r=a&&"isReactWarning"in a&&a.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}var Ap=0;function Mm(){v.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??iv()),document.body.insertAdjacentElement("beforeend",e[1]??iv()),Ap++,()=>{Ap===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(a=>a.remove()),Ap--}},[])}function iv(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var Ro=function(){return Ro=Object.assign||function(a){for(var r,s=1,l=arguments.length;s"u")return _A;var a=OA(e),r=document.documentElement.clientWidth,s=window.innerWidth;return{left:a[0],top:a[1],right:a[2],gap:Math.max(0,s-r+a[2]-a[0])}},ZA=Qx(),Rr="data-scroll-locked",PA=function(e,a,r,s){var l=e.left,d=e.top,u=e.right,m=e.gap;return r===void 0&&(r="margin"),` - .`.concat(vA,` { - overflow: hidden `).concat(s,`; - padding-right: `).concat(m,"px ").concat(s,`; - } - body[`).concat(Rr,`] { - overflow: hidden `).concat(s,`; - overscroll-behavior: contain; - `).concat([a&&"position: relative ".concat(s,";"),r==="margin"&&` - padding-left: `.concat(l,`px; - padding-top: `).concat(d,`px; - padding-right: `).concat(u,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(m,"px ").concat(s,`; - `),r==="padding"&&"padding-right: ".concat(m,"px ").concat(s,";")].filter(Boolean).join(""),` - } - - .`).concat(Vl,` { - right: `).concat(m,"px ").concat(s,`; - } - - .`).concat(Wl,` { - margin-right: `).concat(m,"px ").concat(s,`; - } - - .`).concat(Vl," .").concat(Vl,` { - right: 0 `).concat(s,`; - } - - .`).concat(Wl," .").concat(Wl,` { - margin-right: 0 `).concat(s,`; - } - - body[`).concat(Rr,`] { - `).concat(xA,": ").concat(m,`px; - } -`)},cv=function(){var e=parseInt(document.body.getAttribute(Rr)||"0",10);return isFinite(e)?e:0},BA=function(){v.useEffect(function(){return document.body.setAttribute(Rr,(cv()+1).toString()),function(){var e=cv()-1;e<=0?document.body.removeAttribute(Rr):document.body.setAttribute(Rr,e.toString())}},[])},IA=function(e){var a=e.noRelative,r=e.noImportant,s=e.gapMode,l=s===void 0?"margin":s;BA();var d=v.useMemo(function(){return LA(l)},[l]);return v.createElement(ZA,{styles:PA(d,!a,l,r?"":"!important")})},am=!1;if(typeof window<"u")try{var Ol=Object.defineProperty({},"passive",{get:function(){return am=!0,!0}});window.addEventListener("test",Ol,Ol),window.removeEventListener("test",Ol,Ol)}catch{am=!1}var hr=am?{passive:!1}:!1,qA=function(e){return e.tagName==="TEXTAREA"},Jx=function(e,a){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[a]!=="hidden"&&!(r.overflowY===r.overflowX&&!qA(e)&&r[a]==="visible")},FA=function(e){return Jx(e,"overflowY")},KA=function(e){return Jx(e,"overflowX")},dv=function(e,a){var r=a.ownerDocument,s=a;do{typeof ShadowRoot<"u"&&s instanceof ShadowRoot&&(s=s.host);var l=ew(e,s);if(l){var d=tw(e,s),u=d[1],m=d[2];if(u>m)return!0}s=s.parentNode}while(s&&s!==r.body);return!1},UA=function(e){var a=e.scrollTop,r=e.scrollHeight,s=e.clientHeight;return[a,r,s]},HA=function(e){var a=e.scrollLeft,r=e.scrollWidth,s=e.clientWidth;return[a,r,s]},ew=function(e,a){return e==="v"?FA(a):KA(a)},tw=function(e,a){return e==="v"?UA(a):HA(a)},GA=function(e,a){return e==="h"&&a==="rtl"?-1:1},VA=function(e,a,r,s,l){var d=GA(e,window.getComputedStyle(a).direction),u=d*s,m=r.target,h=a.contains(m),g=!1,y=u>0,b=0,S=0;do{if(!m)break;var T=tw(e,m),C=T[0],x=T[1],k=T[2],R=x-k-d*C;(C||R)&&ew(e,m)&&(b+=R,S+=C);var j=m.parentNode;m=j&&j.nodeType===Node.DOCUMENT_FRAGMENT_NODE?j.host:j}while(!h&&m!==document.body||h&&(a.contains(m)||a===m));return(y&&Math.abs(b)<1||!y&&Math.abs(S)<1)&&(g=!0),g},Ll=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},uv=function(e){return[e.deltaX,e.deltaY]},pv=function(e){return e&&"current"in e?e.current:e},WA=function(e,a){return e[0]===a[0]&&e[1]===a[1]},$A=function(e){return` - .block-interactivity-`.concat(e,` {pointer-events: none;} - .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},YA=0,gr=[];function XA(e){var a=v.useRef([]),r=v.useRef([0,0]),s=v.useRef(),l=v.useState(YA++)[0],d=v.useState(Qx)[0],u=v.useRef(e);v.useEffect(function(){u.current=e},[e]),v.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(l));var x=bA([e.lockRef.current],(e.shards||[]).map(pv),!0).filter(Boolean);return x.forEach(function(k){return k.classList.add("allow-interactivity-".concat(l))}),function(){document.body.classList.remove("block-interactivity-".concat(l)),x.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(l))})}}},[e.inert,e.lockRef.current,e.shards]);var m=v.useCallback(function(x,k){if("touches"in x&&x.touches.length===2||x.type==="wheel"&&x.ctrlKey)return!u.current.allowPinchZoom;var R=Ll(x),j=r.current,A="deltaX"in x?x.deltaX:j[0]-R[0],M="deltaY"in x?x.deltaY:j[1]-R[1],q,P=x.target,I=Math.abs(A)>Math.abs(M)?"h":"v";if("touches"in x&&I==="h"&&P.type==="range")return!1;var X=window.getSelection(),ae=X&&X.anchorNode,re=ae?ae===P||ae.contains(P):!1;if(re)return!1;var te=dv(I,P);if(!te)return!0;if(te?q=I:(q=I==="v"?"h":"v",te=dv(I,P)),!te)return!1;if(!s.current&&"changedTouches"in x&&(A||M)&&(s.current=q),!q)return!0;var J=s.current||q;return VA(J,k,x,J==="h"?A:M)},[]),h=v.useCallback(function(x){var k=x;if(!(!gr.length||gr[gr.length-1]!==d)){var R="deltaY"in k?uv(k):Ll(k),j=a.current.filter(function(q){return q.name===k.type&&(q.target===k.target||k.target===q.shadowParent)&&WA(q.delta,R)})[0];if(j&&j.should){k.cancelable&&k.preventDefault();return}if(!j){var A=(u.current.shards||[]).map(pv).filter(Boolean).filter(function(q){return q.contains(k.target)}),M=A.length>0?m(k,A[0]):!u.current.noIsolation;M&&k.cancelable&&k.preventDefault()}}},[]),g=v.useCallback(function(x,k,R,j){var A={name:x,delta:k,target:R,should:j,shadowParent:QA(R)};a.current.push(A),setTimeout(function(){a.current=a.current.filter(function(M){return M!==A})},1)},[]),y=v.useCallback(function(x){r.current=Ll(x),s.current=void 0},[]),b=v.useCallback(function(x){g(x.type,uv(x),x.target,m(x,e.lockRef.current))},[]),S=v.useCallback(function(x){g(x.type,Ll(x),x.target,m(x,e.lockRef.current))},[]);v.useEffect(function(){return gr.push(d),e.setCallbacks({onScrollCapture:b,onWheelCapture:b,onTouchMoveCapture:S}),document.addEventListener("wheel",h,hr),document.addEventListener("touchmove",h,hr),document.addEventListener("touchstart",y,hr),function(){gr=gr.filter(function(x){return x!==d}),document.removeEventListener("wheel",h,hr),document.removeEventListener("touchmove",h,hr),document.removeEventListener("touchstart",y,hr)}},[]);var T=e.removeScrollBar,C=e.inert;return v.createElement(v.Fragment,null,C?v.createElement(d,{styles:$A(l)}):null,T?v.createElement(IA,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function QA(e){for(var a=null;e!==null;)e instanceof ShadowRoot&&(a=e.host,e=e.host),e=e.parentNode;return a}const JA=RA(Xx,XA);var wc=v.forwardRef(function(e,a){return v.createElement(xc,Ro({},e,{ref:a,sideCar:JA}))});wc.classNames=xc.classNames;var eN=function(e){if(typeof document>"u")return null;var a=Array.isArray(e)?e[0]:e;return a.ownerDocument.body},yr=new WeakMap,Zl=new WeakMap,Pl={},Dp=0,ow=function(e){return e&&(e.host||ow(e.parentNode))},tN=function(e,a){return a.map(function(r){if(e.contains(r))return r;var s=ow(r);return s&&e.contains(s)?s:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},oN=function(e,a,r,s){var l=tN(a,Array.isArray(e)?e:[e]);Pl[r]||(Pl[r]=new WeakMap);var d=Pl[r],u=[],m=new Set,h=new Set(l),g=function(b){!b||m.has(b)||(m.add(b),g(b.parentNode))};l.forEach(g);var y=function(b){!b||h.has(b)||Array.prototype.forEach.call(b.children,function(S){if(m.has(S))y(S);else try{var T=S.getAttribute(s),C=T!==null&&T!=="false",x=(yr.get(S)||0)+1,k=(d.get(S)||0)+1;yr.set(S,x),d.set(S,k),u.push(S),x===1&&C&&Zl.set(S,!0),k===1&&S.setAttribute(r,"true"),C||S.setAttribute(s,"true")}catch(R){console.error("aria-hidden: cannot operate on ",S,R)}})};return y(a),m.clear(),Dp++,function(){u.forEach(function(b){var S=yr.get(b)-1,T=d.get(b)-1;yr.set(b,S),d.set(b,T),S||(Zl.has(b)||b.removeAttribute(s),Zl.delete(b)),T||b.removeAttribute(r)}),Dp--,Dp||(yr=new WeakMap,yr=new WeakMap,Zl=new WeakMap,Pl={})}},Dm=function(e,a,r){r===void 0&&(r="data-aria-hidden");var s=Array.from(Array.isArray(e)?e:[e]),l=eN(e);return l?(s.push.apply(s,Array.from(l.querySelectorAll("[aria-live], script"))),oN(s,l,r,"aria-hidden")):function(){return null}},Sc="Dialog",[aw]=Vt(Sc),[aN,yo]=aw(Sc),nw=e=>{const{__scopeDialog:a,children:r,open:s,defaultOpen:l,onOpenChange:d,modal:u=!0}=e,m=v.useRef(null),h=v.useRef(null),[g,y]=go({prop:s,defaultProp:l??!1,onChange:d,caller:Sc});return c.jsx(aN,{scope:a,triggerRef:m,contentRef:h,contentId:mo(),titleId:mo(),descriptionId:mo(),open:g,onOpenChange:y,onOpenToggle:v.useCallback(()=>y(b=>!b),[y]),modal:u,children:r})};nw.displayName=Sc;var rw="DialogTrigger",sw=v.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=yo(rw,r),d=Ze(a,l.triggerRef);return c.jsx(Te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":l.open,"aria-controls":l.contentId,"data-state":Lm(l.open),...s,ref:d,onClick:ce(e.onClick,l.onOpenToggle)})});sw.displayName=rw;var _m="DialogPortal",[nN,iw]=aw(_m,{forceMount:void 0}),lw=e=>{const{__scopeDialog:a,forceMount:r,children:s,container:l}=e,d=yo(_m,a);return c.jsx(nN,{scope:a,forceMount:r,children:v.Children.map(s,u=>c.jsx(Mt,{present:r||d.open,children:c.jsx(ai,{asChild:!0,container:l,children:u})}))})};lw.displayName=_m;var oc="DialogOverlay",cw=v.forwardRef((e,a)=>{const r=iw(oc,e.__scopeDialog),{forceMount:s=r.forceMount,...l}=e,d=yo(oc,e.__scopeDialog);return d.modal?c.jsx(Mt,{present:s||d.open,children:c.jsx(sN,{...l,ref:a})}):null});cw.displayName=oc;var rN=Mr("DialogOverlay.RemoveScroll"),sN=v.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=yo(oc,r);return c.jsx(wc,{as:rN,allowPinchZoom:!0,shards:[l.contentRef],children:c.jsx(Te.div,{"data-state":Lm(l.open),...s,ref:a,style:{pointerEvents:"auto",...s.style}})})}),kn="DialogContent",dw=v.forwardRef((e,a)=>{const r=iw(kn,e.__scopeDialog),{forceMount:s=r.forceMount,...l}=e,d=yo(kn,e.__scopeDialog);return c.jsx(Mt,{present:s||d.open,children:d.modal?c.jsx(iN,{...l,ref:a}):c.jsx(lN,{...l,ref:a})})});dw.displayName=kn;var iN=v.forwardRef((e,a)=>{const r=yo(kn,e.__scopeDialog),s=v.useRef(null),l=Ze(a,r.contentRef,s);return v.useEffect(()=>{const d=s.current;if(d)return Dm(d)},[]),c.jsx(uw,{...e,ref:l,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ce(e.onCloseAutoFocus,d=>{var u;d.preventDefault(),(u=r.triggerRef.current)==null||u.focus()}),onPointerDownOutside:ce(e.onPointerDownOutside,d=>{const u=d.detail.originalEvent,m=u.button===0&&u.ctrlKey===!0;(u.button===2||m)&&d.preventDefault()}),onFocusOutside:ce(e.onFocusOutside,d=>d.preventDefault())})}),lN=v.forwardRef((e,a)=>{const r=yo(kn,e.__scopeDialog),s=v.useRef(!1),l=v.useRef(!1);return c.jsx(uw,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{var u,m;(u=e.onCloseAutoFocus)==null||u.call(e,d),d.defaultPrevented||(s.current||(m=r.triggerRef.current)==null||m.focus(),d.preventDefault()),s.current=!1,l.current=!1},onInteractOutside:d=>{var h,g;(h=e.onInteractOutside)==null||h.call(e,d),d.defaultPrevented||(s.current=!0,d.detail.originalEvent.type==="pointerdown"&&(l.current=!0));const u=d.target;((g=r.triggerRef.current)==null?void 0:g.contains(u))&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&l.current&&d.preventDefault()}})}),uw=v.forwardRef((e,a)=>{const{__scopeDialog:r,trapFocus:s,onOpenAutoFocus:l,onCloseAutoFocus:d,...u}=e,m=yo(kn,r),h=v.useRef(null),g=Ze(a,h);return Mm(),c.jsxs(c.Fragment,{children:[c.jsx(vc,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:l,onUnmountAutoFocus:d,children:c.jsx(oi,{role:"dialog",id:m.contentId,"aria-describedby":m.descriptionId,"aria-labelledby":m.titleId,"data-state":Lm(m.open),...u,ref:g,onDismiss:()=>m.onOpenChange(!1)})}),c.jsxs(c.Fragment,{children:[c.jsx(cN,{titleId:m.titleId}),c.jsx(uN,{contentRef:h,descriptionId:m.descriptionId})]})]})}),Om="DialogTitle",pw=v.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=yo(Om,r);return c.jsx(Te.h2,{id:l.titleId,...s,ref:a})});pw.displayName=Om;var mw="DialogDescription",fw=v.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=yo(mw,r);return c.jsx(Te.p,{id:l.descriptionId,...s,ref:a})});fw.displayName=mw;var hw="DialogClose",gw=v.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=yo(hw,r);return c.jsx(Te.button,{type:"button",...s,ref:a,onClick:ce(e.onClick,()=>l.onOpenChange(!1))})});gw.displayName=hw;function Lm(e){return e?"open":"closed"}var yw="DialogTitleWarning",[p5,bw]=Ij(yw,{contentName:kn,titleName:Om,docsSlug:"dialog"}),cN=({titleId:e})=>{const a=bw(yw),r=`\`${a.contentName}\` requires a \`${a.titleName}\` for the component to be accessible for screen reader users. - -If you want to hide the \`${a.titleName}\`, you can wrap it with our VisuallyHidden component. - -For more information, see https://radix-ui.com/primitives/docs/components/${a.docsSlug}`;return v.useEffect(()=>{e&&(document.getElementById(e)||console.error(r))},[r,e]),null},dN="DialogDescriptionWarning",uN=({contentRef:e,descriptionId:a})=>{const s=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${bw(dN).contentName}}.`;return v.useEffect(()=>{var d;const l=(d=e.current)==null?void 0:d.getAttribute("aria-describedby");a&&l&&(document.getElementById(a)||console.warn(s))},[s,e,a]),null},vw=nw,xw=sw,ww=lw,Cc=cw,kc=dw,Tc=pw,Ec=fw,Sw=gw;const pN=vw,mN=xw,fN=ww,Cw=v.forwardRef(({className:e,...a},r)=>c.jsx(Cc,{className:ie("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a,ref:r}));Cw.displayName=Cc.displayName;const hN=bc("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),kw=v.forwardRef(({side:e="right",className:a,children:r,...s},l)=>c.jsxs(fN,{children:[c.jsx(Cw,{}),c.jsxs(kc,{ref:l,className:ie(hN({side:e}),a),...s,children:[c.jsxs(Sw,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[c.jsx(Ox,{className:"h-4 w-4"}),c.jsx("span",{className:"sr-only",children:"Close"})]}),r]})]}));kw.displayName=kc.displayName;const gN=v.forwardRef(({className:e,...a},r)=>c.jsx(Tc,{ref:r,className:ie("text-lg font-semibold text-foreground",e),...a}));gN.displayName=Tc.displayName;const yN=v.forwardRef(({className:e,...a},r)=>c.jsx(Ec,{ref:r,className:ie("text-sm text-muted-foreground",e),...a}));yN.displayName=Ec.displayName;var bN=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Tw=bN.reduce((e,a)=>{const r=Zx(`Primitive.${a}`),s=v.forwardRef((l,d)=>{const{asChild:u,...m}=l,h=u?r:a;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),c.jsx(h,{...m,ref:d})});return s.displayName=`Primitive.${a}`,{...e,[a]:s}},{}),vN="Separator",mv="horizontal",xN=["horizontal","vertical"],Ew=v.forwardRef((e,a)=>{const{decorative:r,orientation:s=mv,...l}=e,d=wN(s)?s:mv,m=r?{role:"none"}:{"aria-orientation":d==="vertical"?d:void 0,role:"separator"};return c.jsx(Tw.div,{"data-orientation":d,...m,...l,ref:a})});Ew.displayName=vN;function wN(e){return xN.includes(e)}var Rw=Ew;const jw=v.forwardRef(({className:e,orientation:a="horizontal",decorative:r=!0,...s},l)=>c.jsx(Rw,{ref:l,decorative:r,orientation:a,className:ie("shrink-0 bg-border",a==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...s}));jw.displayName=Rw.displayName;function SN(){const{resolved:e,setTheme:a}=Am(),r=e==="dark"?qR:XR,s=e==="dark"?"light":"dark";return c.jsx(it,{variant:"ghost",size:"icon","aria-label":`Switch to ${s} theme`,onClick:()=>a(s),children:c.jsx(r,{className:"h-4 w-4"})})}function Rc(e){const a=e+"CollectionProvider",[r,s]=Vt(a),[l,d]=r(a,{collectionRef:{current:null},itemMap:new Map}),u=x=>{const{scope:k,children:R}=x,j=Q.useRef(null),A=Q.useRef(new Map).current;return c.jsx(l,{scope:k,itemMap:A,collectionRef:j,children:R})};u.displayName=a;const m=e+"CollectionSlot",h=Mr(m),g=Q.forwardRef((x,k)=>{const{scope:R,children:j}=x,A=d(m,R),M=Ze(k,A.collectionRef);return c.jsx(h,{ref:M,children:j})});g.displayName=m;const y=e+"CollectionItemSlot",b="data-radix-collection-item",S=Mr(y),T=Q.forwardRef((x,k)=>{const{scope:R,children:j,...A}=x,M=Q.useRef(null),q=Ze(k,M),P=d(y,R);return Q.useEffect(()=>(P.itemMap.set(M,{ref:M,...A}),()=>void P.itemMap.delete(M))),c.jsx(S,{[b]:"",ref:q,children:j})});T.displayName=y;function C(x){const k=d(e+"CollectionConsumer",x);return Q.useCallback(()=>{const j=k.collectionRef.current;if(!j)return[];const A=Array.from(j.querySelectorAll(`[${b}]`));return Array.from(k.itemMap.values()).sort((P,I)=>A.indexOf(P.ref.current)-A.indexOf(I.ref.current))},[k.collectionRef,k.itemMap])}return[{Provider:u,Slot:g,ItemSlot:T},C,s]}var CN=v.createContext(void 0);function ni(e){const a=v.useContext(CN);return e||a||"ltr"}const kN=["top","right","bottom","left"],Ga=Math.min,Ht=Math.max,ac=Math.round,Bl=Math.floor,zo=e=>({x:e,y:e}),TN={left:"right",right:"left",bottom:"top",top:"bottom"};function nm(e,a,r){return Ht(e,Ga(a,r))}function ia(e,a){return typeof e=="function"?e(a):e}function la(e){return e.split("-")[0]}function Pr(e){return e.split("-")[1]}function Zm(e){return e==="x"?"y":"x"}function Pm(e){return e==="y"?"height":"width"}function jo(e){const a=e[0];return a==="t"||a==="b"?"y":"x"}function Bm(e){return Zm(jo(e))}function EN(e,a,r){r===void 0&&(r=!1);const s=Pr(e),l=Bm(e),d=Pm(l);let u=l==="x"?s===(r?"end":"start")?"right":"left":s==="start"?"bottom":"top";return a.reference[d]>a.floating[d]&&(u=nc(u)),[u,nc(u)]}function RN(e){const a=nc(e);return[rm(e),a,rm(a)]}function rm(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const fv=["left","right"],hv=["right","left"],jN=["top","bottom"],AN=["bottom","top"];function NN(e,a,r){switch(e){case"top":case"bottom":return r?a?hv:fv:a?fv:hv;case"left":case"right":return a?jN:AN;default:return[]}}function zN(e,a,r,s){const l=Pr(e);let d=NN(la(e),r==="start",s);return l&&(d=d.map(u=>u+"-"+l),a&&(d=d.concat(d.map(rm)))),d}function nc(e){const a=la(e);return TN[a]+e.slice(a.length)}function MN(e){return{top:0,right:0,bottom:0,left:0,...e}}function Aw(e){return typeof e!="number"?MN(e):{top:e,right:e,bottom:e,left:e}}function rc(e){const{x:a,y:r,width:s,height:l}=e;return{width:s,height:l,top:r,left:a,right:a+s,bottom:r+l,x:a,y:r}}function gv(e,a,r){let{reference:s,floating:l}=e;const d=jo(a),u=Bm(a),m=Pm(u),h=la(a),g=d==="y",y=s.x+s.width/2-l.width/2,b=s.y+s.height/2-l.height/2,S=s[m]/2-l[m]/2;let T;switch(h){case"top":T={x:y,y:s.y-l.height};break;case"bottom":T={x:y,y:s.y+s.height};break;case"right":T={x:s.x+s.width,y:b};break;case"left":T={x:s.x-l.width,y:b};break;default:T={x:s.x,y:s.y}}switch(Pr(a)){case"start":T[u]-=S*(r&&g?-1:1);break;case"end":T[u]+=S*(r&&g?-1:1);break}return T}async function DN(e,a){var r;a===void 0&&(a={});const{x:s,y:l,platform:d,rects:u,elements:m,strategy:h}=e,{boundary:g="clippingAncestors",rootBoundary:y="viewport",elementContext:b="floating",altBoundary:S=!1,padding:T=0}=ia(a,e),C=Aw(T),k=m[S?b==="floating"?"reference":"floating":b],R=rc(await d.getClippingRect({element:(r=await(d.isElement==null?void 0:d.isElement(k)))==null||r?k:k.contextElement||await(d.getDocumentElement==null?void 0:d.getDocumentElement(m.floating)),boundary:g,rootBoundary:y,strategy:h})),j=b==="floating"?{x:s,y:l,width:u.floating.width,height:u.floating.height}:u.reference,A=await(d.getOffsetParent==null?void 0:d.getOffsetParent(m.floating)),M=await(d.isElement==null?void 0:d.isElement(A))?await(d.getScale==null?void 0:d.getScale(A))||{x:1,y:1}:{x:1,y:1},q=rc(d.convertOffsetParentRelativeRectToViewportRelativeRect?await d.convertOffsetParentRelativeRectToViewportRelativeRect({elements:m,rect:j,offsetParent:A,strategy:h}):j);return{top:(R.top-q.top+C.top)/M.y,bottom:(q.bottom-R.bottom+C.bottom)/M.y,left:(R.left-q.left+C.left)/M.x,right:(q.right-R.right+C.right)/M.x}}const _N=50,ON=async(e,a,r)=>{const{placement:s="bottom",strategy:l="absolute",middleware:d=[],platform:u}=r,m=u.detectOverflow?u:{...u,detectOverflow:DN},h=await(u.isRTL==null?void 0:u.isRTL(a));let g=await u.getElementRects({reference:e,floating:a,strategy:l}),{x:y,y:b}=gv(g,s,h),S=s,T=0;const C={};for(let x=0;x({name:"arrow",options:e,async fn(a){const{x:r,y:s,placement:l,rects:d,platform:u,elements:m,middlewareData:h}=a,{element:g,padding:y=0}=ia(e,a)||{};if(g==null)return{};const b=Aw(y),S={x:r,y:s},T=Bm(l),C=Pm(T),x=await u.getDimensions(g),k=T==="y",R=k?"top":"left",j=k?"bottom":"right",A=k?"clientHeight":"clientWidth",M=d.reference[C]+d.reference[T]-S[T]-d.floating[C],q=S[T]-d.reference[T],P=await(u.getOffsetParent==null?void 0:u.getOffsetParent(g));let I=P?P[A]:0;(!I||!await(u.isElement==null?void 0:u.isElement(P)))&&(I=m.floating[A]||d.floating[C]);const X=M/2-q/2,ae=I/2-x[C]/2-1,re=Ga(b[R],ae),te=Ga(b[j],ae),J=re,pe=I-x[C]-te,ne=I/2-x[C]/2+X,ue=nm(J,ne,pe),O=!h.arrow&&Pr(l)!=null&&ne!==ue&&d.reference[C]/2-(nene<=0)){var te,J;const ne=(((te=d.flip)==null?void 0:te.index)||0)+1,ue=I[ne];if(ue&&(!(b==="alignment"?j!==jo(ue):!1)||re.every(H=>jo(H.placement)===j?H.overflows[0]>0:!0)))return{data:{index:ne,overflows:re},reset:{placement:ue}};let O=(J=re.filter(V=>V.overflows[0]<=0).sort((V,H)=>V.overflows[1]-H.overflows[1])[0])==null?void 0:J.placement;if(!O)switch(T){case"bestFit":{var pe;const V=(pe=re.filter(H=>{if(P){const Y=jo(H.placement);return Y===j||Y==="y"}return!0}).map(H=>[H.placement,H.overflows.filter(Y=>Y>0).reduce((Y,se)=>Y+se,0)]).sort((H,Y)=>H[1]-Y[1])[0])==null?void 0:pe[0];V&&(O=V);break}case"initialPlacement":O=m;break}if(l!==O)return{reset:{placement:O}}}return{}}}};function yv(e,a){return{top:e.top-a.height,right:e.right-a.width,bottom:e.bottom-a.height,left:e.left-a.width}}function bv(e){return kN.some(a=>e[a]>=0)}const PN=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(a){const{rects:r,platform:s}=a,{strategy:l="referenceHidden",...d}=ia(e,a);switch(l){case"referenceHidden":{const u=await s.detectOverflow(a,{...d,elementContext:"reference"}),m=yv(u,r.reference);return{data:{referenceHiddenOffsets:m,referenceHidden:bv(m)}}}case"escaped":{const u=await s.detectOverflow(a,{...d,altBoundary:!0}),m=yv(u,r.floating);return{data:{escapedOffsets:m,escaped:bv(m)}}}default:return{}}}}},Nw=new Set(["left","top"]);async function BN(e,a){const{placement:r,platform:s,elements:l}=e,d=await(s.isRTL==null?void 0:s.isRTL(l.floating)),u=la(r),m=Pr(r),h=jo(r)==="y",g=Nw.has(u)?-1:1,y=d&&h?-1:1,b=ia(a,e);let{mainAxis:S,crossAxis:T,alignmentAxis:C}=typeof b=="number"?{mainAxis:b,crossAxis:0,alignmentAxis:null}:{mainAxis:b.mainAxis||0,crossAxis:b.crossAxis||0,alignmentAxis:b.alignmentAxis};return m&&typeof C=="number"&&(T=m==="end"?C*-1:C),h?{x:T*y,y:S*g}:{x:S*g,y:T*y}}const IN=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(a){var r,s;const{x:l,y:d,placement:u,middlewareData:m}=a,h=await BN(a,e);return u===((r=m.offset)==null?void 0:r.placement)&&(s=m.arrow)!=null&&s.alignmentOffset?{}:{x:l+h.x,y:d+h.y,data:{...h,placement:u}}}}},qN=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(a){const{x:r,y:s,placement:l,platform:d}=a,{mainAxis:u=!0,crossAxis:m=!1,limiter:h={fn:R=>{let{x:j,y:A}=R;return{x:j,y:A}}},...g}=ia(e,a),y={x:r,y:s},b=await d.detectOverflow(a,g),S=jo(la(l)),T=Zm(S);let C=y[T],x=y[S];if(u){const R=T==="y"?"top":"left",j=T==="y"?"bottom":"right",A=C+b[R],M=C-b[j];C=nm(A,C,M)}if(m){const R=S==="y"?"top":"left",j=S==="y"?"bottom":"right",A=x+b[R],M=x-b[j];x=nm(A,x,M)}const k=h.fn({...a,[T]:C,[S]:x});return{...k,data:{x:k.x-r,y:k.y-s,enabled:{[T]:u,[S]:m}}}}}},FN=function(e){return e===void 0&&(e={}),{options:e,fn(a){const{x:r,y:s,placement:l,rects:d,middlewareData:u}=a,{offset:m=0,mainAxis:h=!0,crossAxis:g=!0}=ia(e,a),y={x:r,y:s},b=jo(l),S=Zm(b);let T=y[S],C=y[b];const x=ia(m,a),k=typeof x=="number"?{mainAxis:x,crossAxis:0}:{mainAxis:0,crossAxis:0,...x};if(h){const A=S==="y"?"height":"width",M=d.reference[S]-d.floating[A]+k.mainAxis,q=d.reference[S]+d.reference[A]-k.mainAxis;Tq&&(T=q)}if(g){var R,j;const A=S==="y"?"width":"height",M=Nw.has(la(l)),q=d.reference[b]-d.floating[A]+(M&&((R=u.offset)==null?void 0:R[b])||0)+(M?0:k.crossAxis),P=d.reference[b]+d.reference[A]+(M?0:((j=u.offset)==null?void 0:j[b])||0)-(M?k.crossAxis:0);CP&&(C=P)}return{[S]:T,[b]:C}}}},KN=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(a){var r,s;const{placement:l,rects:d,platform:u,elements:m}=a,{apply:h=()=>{},...g}=ia(e,a),y=await u.detectOverflow(a,g),b=la(l),S=Pr(l),T=jo(l)==="y",{width:C,height:x}=d.floating;let k,R;b==="top"||b==="bottom"?(k=b,R=S===(await(u.isRTL==null?void 0:u.isRTL(m.floating))?"start":"end")?"left":"right"):(R=b,k=S==="end"?"top":"bottom");const j=x-y.top-y.bottom,A=C-y.left-y.right,M=Ga(x-y[k],j),q=Ga(C-y[R],A),P=!a.middlewareData.shift;let I=M,X=q;if((r=a.middlewareData.shift)!=null&&r.enabled.x&&(X=A),(s=a.middlewareData.shift)!=null&&s.enabled.y&&(I=j),P&&!S){const re=Ht(y.left,0),te=Ht(y.right,0),J=Ht(y.top,0),pe=Ht(y.bottom,0);T?X=C-2*(re!==0||te!==0?re+te:Ht(y.left,y.right)):I=x-2*(J!==0||pe!==0?J+pe:Ht(y.top,y.bottom))}await h({...a,availableWidth:X,availableHeight:I});const ae=await u.getDimensions(m.floating);return C!==ae.width||x!==ae.height?{reset:{rects:!0}}:{}}}};function jc(){return typeof window<"u"}function Br(e){return zw(e)?(e.nodeName||"").toLowerCase():"#document"}function Gt(e){var a;return(e==null||(a=e.ownerDocument)==null?void 0:a.defaultView)||window}function _o(e){var a;return(a=(zw(e)?e.ownerDocument:e.document)||window.document)==null?void 0:a.documentElement}function zw(e){return jc()?e instanceof Node||e instanceof Gt(e).Node:!1}function fo(e){return jc()?e instanceof Element||e instanceof Gt(e).Element:!1}function ca(e){return jc()?e instanceof HTMLElement||e instanceof Gt(e).HTMLElement:!1}function vv(e){return!jc()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof Gt(e).ShadowRoot}function ri(e){const{overflow:a,overflowX:r,overflowY:s,display:l}=ho(e);return/auto|scroll|overlay|hidden|clip/.test(a+s+r)&&l!=="inline"&&l!=="contents"}function UN(e){return/^(table|td|th)$/.test(Br(e))}function Ac(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const HN=/transform|translate|scale|rotate|perspective|filter/,GN=/paint|layout|strict|content/,yn=e=>!!e&&e!=="none";let _p;function Im(e){const a=fo(e)?ho(e):e;return yn(a.transform)||yn(a.translate)||yn(a.scale)||yn(a.rotate)||yn(a.perspective)||!qm()&&(yn(a.backdropFilter)||yn(a.filter))||HN.test(a.willChange||"")||GN.test(a.contain||"")}function VN(e){let a=Va(e);for(;ca(a)&&!Dr(a);){if(Im(a))return a;if(Ac(a))return null;a=Va(a)}return null}function qm(){return _p==null&&(_p=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),_p}function Dr(e){return/^(html|body|#document)$/.test(Br(e))}function ho(e){return Gt(e).getComputedStyle(e)}function Nc(e){return fo(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Va(e){if(Br(e)==="html")return e;const a=e.assignedSlot||e.parentNode||vv(e)&&e.host||_o(e);return vv(a)?a.host:a}function Mw(e){const a=Va(e);return Dr(a)?e.ownerDocument?e.ownerDocument.body:e.body:ca(a)&&ri(a)?a:Mw(a)}function $s(e,a,r){var s;a===void 0&&(a=[]),r===void 0&&(r=!0);const l=Mw(e),d=l===((s=e.ownerDocument)==null?void 0:s.body),u=Gt(l);if(d){const m=sm(u);return a.concat(u,u.visualViewport||[],ri(l)?l:[],m&&r?$s(m):[])}else return a.concat(l,$s(l,[],r))}function sm(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Dw(e){const a=ho(e);let r=parseFloat(a.width)||0,s=parseFloat(a.height)||0;const l=ca(e),d=l?e.offsetWidth:r,u=l?e.offsetHeight:s,m=ac(r)!==d||ac(s)!==u;return m&&(r=d,s=u),{width:r,height:s,$:m}}function Fm(e){return fo(e)?e:e.contextElement}function jr(e){const a=Fm(e);if(!ca(a))return zo(1);const r=a.getBoundingClientRect(),{width:s,height:l,$:d}=Dw(a);let u=(d?ac(r.width):r.width)/s,m=(d?ac(r.height):r.height)/l;return(!u||!Number.isFinite(u))&&(u=1),(!m||!Number.isFinite(m))&&(m=1),{x:u,y:m}}const WN=zo(0);function _w(e){const a=Gt(e);return!qm()||!a.visualViewport?WN:{x:a.visualViewport.offsetLeft,y:a.visualViewport.offsetTop}}function $N(e,a,r){return a===void 0&&(a=!1),!r||a&&r!==Gt(e)?!1:a}function Tn(e,a,r,s){a===void 0&&(a=!1),r===void 0&&(r=!1);const l=e.getBoundingClientRect(),d=Fm(e);let u=zo(1);a&&(s?fo(s)&&(u=jr(s)):u=jr(e));const m=$N(d,r,s)?_w(d):zo(0);let h=(l.left+m.x)/u.x,g=(l.top+m.y)/u.y,y=l.width/u.x,b=l.height/u.y;if(d){const S=Gt(d),T=s&&fo(s)?Gt(s):s;let C=S,x=sm(C);for(;x&&s&&T!==C;){const k=jr(x),R=x.getBoundingClientRect(),j=ho(x),A=R.left+(x.clientLeft+parseFloat(j.paddingLeft))*k.x,M=R.top+(x.clientTop+parseFloat(j.paddingTop))*k.y;h*=k.x,g*=k.y,y*=k.x,b*=k.y,h+=A,g+=M,C=Gt(x),x=sm(C)}}return rc({width:y,height:b,x:h,y:g})}function zc(e,a){const r=Nc(e).scrollLeft;return a?a.left+r:Tn(_o(e)).left+r}function Ow(e,a){const r=e.getBoundingClientRect(),s=r.left+a.scrollLeft-zc(e,r),l=r.top+a.scrollTop;return{x:s,y:l}}function YN(e){let{elements:a,rect:r,offsetParent:s,strategy:l}=e;const d=l==="fixed",u=_o(s),m=a?Ac(a.floating):!1;if(s===u||m&&d)return r;let h={scrollLeft:0,scrollTop:0},g=zo(1);const y=zo(0),b=ca(s);if((b||!b&&!d)&&((Br(s)!=="body"||ri(u))&&(h=Nc(s)),b)){const T=Tn(s);g=jr(s),y.x=T.x+s.clientLeft,y.y=T.y+s.clientTop}const S=u&&!b&&!d?Ow(u,h):zo(0);return{width:r.width*g.x,height:r.height*g.y,x:r.x*g.x-h.scrollLeft*g.x+y.x+S.x,y:r.y*g.y-h.scrollTop*g.y+y.y+S.y}}function XN(e){return Array.from(e.getClientRects())}function QN(e){const a=_o(e),r=Nc(e),s=e.ownerDocument.body,l=Ht(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),d=Ht(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight);let u=-r.scrollLeft+zc(e);const m=-r.scrollTop;return ho(s).direction==="rtl"&&(u+=Ht(a.clientWidth,s.clientWidth)-l),{width:l,height:d,x:u,y:m}}const xv=25;function JN(e,a){const r=Gt(e),s=_o(e),l=r.visualViewport;let d=s.clientWidth,u=s.clientHeight,m=0,h=0;if(l){d=l.width,u=l.height;const y=qm();(!y||y&&a==="fixed")&&(m=l.offsetLeft,h=l.offsetTop)}const g=zc(s);if(g<=0){const y=s.ownerDocument,b=y.body,S=getComputedStyle(b),T=y.compatMode==="CSS1Compat"&&parseFloat(S.marginLeft)+parseFloat(S.marginRight)||0,C=Math.abs(s.clientWidth-b.clientWidth-T);C<=xv&&(d-=C)}else g<=xv&&(d+=g);return{width:d,height:u,x:m,y:h}}function ez(e,a){const r=Tn(e,!0,a==="fixed"),s=r.top+e.clientTop,l=r.left+e.clientLeft,d=ca(e)?jr(e):zo(1),u=e.clientWidth*d.x,m=e.clientHeight*d.y,h=l*d.x,g=s*d.y;return{width:u,height:m,x:h,y:g}}function wv(e,a,r){let s;if(a==="viewport")s=JN(e,r);else if(a==="document")s=QN(_o(e));else if(fo(a))s=ez(a,r);else{const l=_w(e);s={x:a.x-l.x,y:a.y-l.y,width:a.width,height:a.height}}return rc(s)}function Lw(e,a){const r=Va(e);return r===a||!fo(r)||Dr(r)?!1:ho(r).position==="fixed"||Lw(r,a)}function tz(e,a){const r=a.get(e);if(r)return r;let s=$s(e,[],!1).filter(m=>fo(m)&&Br(m)!=="body"),l=null;const d=ho(e).position==="fixed";let u=d?Va(e):e;for(;fo(u)&&!Dr(u);){const m=ho(u),h=Im(u);!h&&m.position==="fixed"&&(l=null),(d?!h&&!l:!h&&m.position==="static"&&!!l&&(l.position==="absolute"||l.position==="fixed")||ri(u)&&!h&&Lw(e,u))?s=s.filter(y=>y!==u):l=m,u=Va(u)}return a.set(e,s),s}function oz(e){let{element:a,boundary:r,rootBoundary:s,strategy:l}=e;const u=[...r==="clippingAncestors"?Ac(a)?[]:tz(a,this._c):[].concat(r),s],m=wv(a,u[0],l);let h=m.top,g=m.right,y=m.bottom,b=m.left;for(let S=1;S{u(!1,1e-7)},1e3)}I===1&&!Pw(g,e.getBoundingClientRect())&&u(),M=!1}try{r=new IntersectionObserver(q,{...A,root:l.ownerDocument})}catch{r=new IntersectionObserver(q,A)}r.observe(e)}return u(!0),d}function cz(e,a,r,s){s===void 0&&(s={});const{ancestorScroll:l=!0,ancestorResize:d=!0,elementResize:u=typeof ResizeObserver=="function",layoutShift:m=typeof IntersectionObserver=="function",animationFrame:h=!1}=s,g=Fm(e),y=l||d?[...g?$s(g):[],...a?$s(a):[]]:[];y.forEach(R=>{l&&R.addEventListener("scroll",r,{passive:!0}),d&&R.addEventListener("resize",r)});const b=g&&m?lz(g,r):null;let S=-1,T=null;u&&(T=new ResizeObserver(R=>{let[j]=R;j&&j.target===g&&T&&a&&(T.unobserve(a),cancelAnimationFrame(S),S=requestAnimationFrame(()=>{var A;(A=T)==null||A.observe(a)})),r()}),g&&!h&&T.observe(g),a&&T.observe(a));let C,x=h?Tn(e):null;h&&k();function k(){const R=Tn(e);x&&!Pw(x,R)&&r(),x=R,C=requestAnimationFrame(k)}return r(),()=>{var R;y.forEach(j=>{l&&j.removeEventListener("scroll",r),d&&j.removeEventListener("resize",r)}),b==null||b(),(R=T)==null||R.disconnect(),T=null,h&&cancelAnimationFrame(C)}}const dz=IN,uz=qN,pz=ZN,mz=KN,fz=PN,Cv=LN,hz=FN,gz=(e,a,r)=>{const s=new Map,l={platform:iz,...r},d={...l.platform,_c:s};return ON(e,a,{...l,platform:d})};var yz=typeof document<"u",bz=function(){},$l=yz?v.useLayoutEffect:bz;function sc(e,a){if(e===a)return!0;if(typeof e!=typeof a)return!1;if(typeof e=="function"&&e.toString()===a.toString())return!0;let r,s,l;if(e&&a&&typeof e=="object"){if(Array.isArray(e)){if(r=e.length,r!==a.length)return!1;for(s=r;s--!==0;)if(!sc(e[s],a[s]))return!1;return!0}if(l=Object.keys(e),r=l.length,r!==Object.keys(a).length)return!1;for(s=r;s--!==0;)if(!{}.hasOwnProperty.call(a,l[s]))return!1;for(s=r;s--!==0;){const d=l[s];if(!(d==="_owner"&&e.$$typeof)&&!sc(e[d],a[d]))return!1}return!0}return e!==e&&a!==a}function Bw(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function kv(e,a){const r=Bw(e);return Math.round(a*r)/r}function Lp(e){const a=v.useRef(e);return $l(()=>{a.current=e}),a}function vz(e){e===void 0&&(e={});const{placement:a="bottom",strategy:r="absolute",middleware:s=[],platform:l,elements:{reference:d,floating:u}={},transform:m=!0,whileElementsMounted:h,open:g}=e,[y,b]=v.useState({x:0,y:0,strategy:r,placement:a,middlewareData:{},isPositioned:!1}),[S,T]=v.useState(s);sc(S,s)||T(s);const[C,x]=v.useState(null),[k,R]=v.useState(null),j=v.useCallback(H=>{H!==P.current&&(P.current=H,x(H))},[]),A=v.useCallback(H=>{H!==I.current&&(I.current=H,R(H))},[]),M=d||C,q=u||k,P=v.useRef(null),I=v.useRef(null),X=v.useRef(y),ae=h!=null,re=Lp(h),te=Lp(l),J=Lp(g),pe=v.useCallback(()=>{if(!P.current||!I.current)return;const H={placement:a,strategy:r,middleware:S};te.current&&(H.platform=te.current),gz(P.current,I.current,H).then(Y=>{const se={...Y,isPositioned:J.current!==!1};ne.current&&!sc(X.current,se)&&(X.current=se,Em.flushSync(()=>{b(se)}))})},[S,a,r,te,J]);$l(()=>{g===!1&&X.current.isPositioned&&(X.current.isPositioned=!1,b(H=>({...H,isPositioned:!1})))},[g]);const ne=v.useRef(!1);$l(()=>(ne.current=!0,()=>{ne.current=!1}),[]),$l(()=>{if(M&&(P.current=M),q&&(I.current=q),M&&q){if(re.current)return re.current(M,q,pe);pe()}},[M,q,pe,re,ae]);const ue=v.useMemo(()=>({reference:P,floating:I,setReference:j,setFloating:A}),[j,A]),O=v.useMemo(()=>({reference:M,floating:q}),[M,q]),V=v.useMemo(()=>{const H={position:r,left:0,top:0};if(!O.floating)return H;const Y=kv(O.floating,y.x),se=kv(O.floating,y.y);return m?{...H,transform:"translate("+Y+"px, "+se+"px)",...Bw(O.floating)>=1.5&&{willChange:"transform"}}:{position:r,left:Y,top:se}},[r,m,O.floating,y.x,y.y]);return v.useMemo(()=>({...y,update:pe,refs:ue,elements:O,floatingStyles:V}),[y,pe,ue,O,V])}const xz=e=>{function a(r){return{}.hasOwnProperty.call(r,"current")}return{name:"arrow",options:e,fn(r){const{element:s,padding:l}=typeof e=="function"?e(r):e;return s&&a(s)?s.current!=null?Cv({element:s.current,padding:l}).fn(r):{}:s?Cv({element:s,padding:l}).fn(r):{}}}},wz=(e,a)=>{const r=dz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Sz=(e,a)=>{const r=uz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Cz=(e,a)=>({fn:hz(e).fn,options:[e,a]}),kz=(e,a)=>{const r=pz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Tz=(e,a)=>{const r=mz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Ez=(e,a)=>{const r=fz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Rz=(e,a)=>{const r=xz(e);return{name:r.name,fn:r.fn,options:[e,a]}};var jz="Arrow",Iw=v.forwardRef((e,a)=>{const{children:r,width:s=10,height:l=5,...d}=e;return c.jsx(Te.svg,{...d,ref:a,width:s,height:l,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?r:c.jsx("polygon",{points:"0,0 30,0 15,10"})})});Iw.displayName=jz;var Az=Iw;function Km(e){const[a,r]=v.useState(void 0);return ra(()=>{if(e){r({width:e.offsetWidth,height:e.offsetHeight});const s=new ResizeObserver(l=>{if(!Array.isArray(l)||!l.length)return;const d=l[0];let u,m;if("borderBoxSize"in d){const h=d.borderBoxSize,g=Array.isArray(h)?h[0]:h;u=g.inlineSize,m=g.blockSize}else u=e.offsetWidth,m=e.offsetHeight;r({width:u,height:m})});return s.observe(e,{box:"border-box"}),()=>s.unobserve(e)}else r(void 0)},[e]),a}var Um="Popper",[qw,Ir]=Vt(Um),[Nz,Fw]=qw(Um),Kw=e=>{const{__scopePopper:a,children:r}=e,[s,l]=v.useState(null);return c.jsx(Nz,{scope:a,anchor:s,onAnchorChange:l,children:r})};Kw.displayName=Um;var Uw="PopperAnchor",Hw=v.forwardRef((e,a)=>{const{__scopePopper:r,virtualRef:s,...l}=e,d=Fw(Uw,r),u=v.useRef(null),m=Ze(a,u),h=v.useRef(null);return v.useEffect(()=>{const g=h.current;h.current=(s==null?void 0:s.current)||u.current,g!==h.current&&d.onAnchorChange(h.current)}),s?null:c.jsx(Te.div,{...l,ref:m})});Hw.displayName=Uw;var Hm="PopperContent",[zz,Mz]=qw(Hm),Gw=v.forwardRef((e,a)=>{var ye,Ke,xe,vt,vo,Oo;const{__scopePopper:r,side:s="bottom",sideOffset:l=0,align:d="center",alignOffset:u=0,arrowPadding:m=0,avoidCollisions:h=!0,collisionBoundary:g=[],collisionPadding:y=0,sticky:b="partial",hideWhenDetached:S=!1,updatePositionStrategy:T="optimized",onPlaced:C,...x}=e,k=Fw(Hm,r),[R,j]=v.useState(null),A=Ze(a,so=>j(so)),[M,q]=v.useState(null),P=Km(M),I=(P==null?void 0:P.width)??0,X=(P==null?void 0:P.height)??0,ae=s+(d!=="center"?"-"+d:""),re=typeof y=="number"?y:{top:0,right:0,bottom:0,left:0,...y},te=Array.isArray(g)?g:[g],J=te.length>0,pe={padding:re,boundary:te.filter(_z),altBoundary:J},{refs:ne,floatingStyles:ue,placement:O,isPositioned:V,middlewareData:H}=vz({strategy:"fixed",placement:ae,whileElementsMounted:(...so)=>cz(...so,{animationFrame:T==="always"}),elements:{reference:k.anchor},middleware:[wz({mainAxis:l+X,alignmentAxis:u}),h&&Sz({mainAxis:!0,crossAxis:!1,limiter:b==="partial"?Cz():void 0,...pe}),h&&kz({...pe}),Tz({...pe,apply:({elements:so,rects:Dt,availableWidth:ua,availableHeight:Xa})=>{const{width:Ur,height:Nn}=Dt.reference,xo=so.floating.style;xo.setProperty("--radix-popper-available-width",`${ua}px`),xo.setProperty("--radix-popper-available-height",`${Xa}px`),xo.setProperty("--radix-popper-anchor-width",`${Ur}px`),xo.setProperty("--radix-popper-anchor-height",`${Nn}px`)}}),M&&Rz({element:M,padding:m}),Oz({arrowWidth:I,arrowHeight:X}),S&&Ez({strategy:"referenceHidden",...pe})]}),[Y,se]=$w(O),N=sa(C);ra(()=>{V&&(N==null||N())},[V,N]);const K=(ye=H.arrow)==null?void 0:ye.x,ee=(Ke=H.arrow)==null?void 0:Ke.y,oe=((xe=H.arrow)==null?void 0:xe.centerOffset)!==0,[fe,he]=v.useState();return ra(()=>{R&&he(window.getComputedStyle(R).zIndex)},[R]),c.jsx("div",{ref:ne.setFloating,"data-radix-popper-content-wrapper":"",style:{...ue,transform:V?ue.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:fe,"--radix-popper-transform-origin":[(vt=H.transformOrigin)==null?void 0:vt.x,(vo=H.transformOrigin)==null?void 0:vo.y].join(" "),...((Oo=H.hide)==null?void 0:Oo.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:c.jsx(zz,{scope:r,placedSide:Y,onArrowChange:q,arrowX:K,arrowY:ee,shouldHideArrow:oe,children:c.jsx(Te.div,{"data-side":Y,"data-align":se,...x,ref:A,style:{...x.style,animation:V?void 0:"none"}})})})});Gw.displayName=Hm;var Vw="PopperArrow",Dz={top:"bottom",right:"left",bottom:"top",left:"right"},Ww=v.forwardRef(function(a,r){const{__scopePopper:s,...l}=a,d=Mz(Vw,s),u=Dz[d.placedSide];return c.jsx("span",{ref:d.onArrowChange,style:{position:"absolute",left:d.arrowX,top:d.arrowY,[u]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[d.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[d.placedSide],visibility:d.shouldHideArrow?"hidden":void 0},children:c.jsx(Az,{...l,ref:r,style:{...l.style,display:"block"}})})});Ww.displayName=Vw;function _z(e){return e!==null}var Oz=e=>({name:"transformOrigin",options:e,fn(a){var k,R,j;const{placement:r,rects:s,middlewareData:l}=a,u=((k=l.arrow)==null?void 0:k.centerOffset)!==0,m=u?0:e.arrowWidth,h=u?0:e.arrowHeight,[g,y]=$w(r),b={start:"0%",center:"50%",end:"100%"}[y],S=(((R=l.arrow)==null?void 0:R.x)??0)+m/2,T=(((j=l.arrow)==null?void 0:j.y)??0)+h/2;let C="",x="";return g==="bottom"?(C=u?b:`${S}px`,x=`${-h}px`):g==="top"?(C=u?b:`${S}px`,x=`${s.floating.height+h}px`):g==="right"?(C=`${-h}px`,x=u?b:`${T}px`):g==="left"&&(C=`${s.floating.width+h}px`,x=u?b:`${T}px`),{data:{x:C,y:x}}}});function $w(e){const[a,r="center"]=e.split("-");return[a,r]}var Gm=Kw,Mc=Hw,Vm=Gw,Wm=Ww,Zp="rovingFocusGroup.onEntryFocus",Lz={bubbles:!1,cancelable:!0},si="RovingFocusGroup",[im,Yw,Zz]=Rc(si),[Pz,Dc]=Vt(si,[Zz]),[Bz,Iz]=Pz(si),Xw=v.forwardRef((e,a)=>c.jsx(im.Provider,{scope:e.__scopeRovingFocusGroup,children:c.jsx(im.Slot,{scope:e.__scopeRovingFocusGroup,children:c.jsx(qz,{...e,ref:a})})}));Xw.displayName=si;var qz=v.forwardRef((e,a)=>{const{__scopeRovingFocusGroup:r,orientation:s,loop:l=!1,dir:d,currentTabStopId:u,defaultCurrentTabStopId:m,onCurrentTabStopIdChange:h,onEntryFocus:g,preventScrollOnEntryFocus:y=!1,...b}=e,S=v.useRef(null),T=Ze(a,S),C=ni(d),[x,k]=go({prop:u,defaultProp:m??null,onChange:h,caller:si}),[R,j]=v.useState(!1),A=sa(g),M=Yw(r),q=v.useRef(!1),[P,I]=v.useState(0);return v.useEffect(()=>{const X=S.current;if(X)return X.addEventListener(Zp,A),()=>X.removeEventListener(Zp,A)},[A]),c.jsx(Bz,{scope:r,orientation:s,dir:C,loop:l,currentTabStopId:x,onItemFocus:v.useCallback(X=>k(X),[k]),onItemShiftTab:v.useCallback(()=>j(!0),[]),onFocusableItemAdd:v.useCallback(()=>I(X=>X+1),[]),onFocusableItemRemove:v.useCallback(()=>I(X=>X-1),[]),children:c.jsx(Te.div,{tabIndex:R||P===0?-1:0,"data-orientation":s,...b,ref:T,style:{outline:"none",...e.style},onMouseDown:ce(e.onMouseDown,()=>{q.current=!0}),onFocus:ce(e.onFocus,X=>{const ae=!q.current;if(X.target===X.currentTarget&&ae&&!R){const re=new CustomEvent(Zp,Lz);if(X.currentTarget.dispatchEvent(re),!re.defaultPrevented){const te=M().filter(O=>O.focusable),J=te.find(O=>O.active),pe=te.find(O=>O.id===x),ue=[J,pe,...te].filter(Boolean).map(O=>O.ref.current);e0(ue,y)}}q.current=!1}),onBlur:ce(e.onBlur,()=>j(!1))})})}),Qw="RovingFocusGroupItem",Jw=v.forwardRef((e,a)=>{const{__scopeRovingFocusGroup:r,focusable:s=!0,active:l=!1,tabStopId:d,children:u,...m}=e,h=mo(),g=d||h,y=Iz(Qw,r),b=y.currentTabStopId===g,S=Yw(r),{onFocusableItemAdd:T,onFocusableItemRemove:C,currentTabStopId:x}=y;return v.useEffect(()=>{if(s)return T(),()=>C()},[s,T,C]),c.jsx(im.ItemSlot,{scope:r,id:g,focusable:s,active:l,children:c.jsx(Te.span,{tabIndex:b?0:-1,"data-orientation":y.orientation,...m,ref:a,onMouseDown:ce(e.onMouseDown,k=>{s?y.onItemFocus(g):k.preventDefault()}),onFocus:ce(e.onFocus,()=>y.onItemFocus(g)),onKeyDown:ce(e.onKeyDown,k=>{if(k.key==="Tab"&&k.shiftKey){y.onItemShiftTab();return}if(k.target!==k.currentTarget)return;const R=Uz(k,y.orientation,y.dir);if(R!==void 0){if(k.metaKey||k.ctrlKey||k.altKey||k.shiftKey)return;k.preventDefault();let A=S().filter(M=>M.focusable).map(M=>M.ref.current);if(R==="last")A.reverse();else if(R==="prev"||R==="next"){R==="prev"&&A.reverse();const M=A.indexOf(k.currentTarget);A=y.loop?Hz(A,M+1):A.slice(M+1)}setTimeout(()=>e0(A))}}),children:typeof u=="function"?u({isCurrentTabStop:b,hasTabStop:x!=null}):u})})});Jw.displayName=Qw;var Fz={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Kz(e,a){return a!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function Uz(e,a,r){const s=Kz(e.key,r);if(!(a==="vertical"&&["ArrowLeft","ArrowRight"].includes(s))&&!(a==="horizontal"&&["ArrowUp","ArrowDown"].includes(s)))return Fz[s]}function e0(e,a=!1){const r=document.activeElement;for(const s of e)if(s===r||(s.focus({preventScroll:a}),document.activeElement!==r))return}function Hz(e,a){return e.map((r,s)=>e[(a+s)%e.length])}var t0=Xw,o0=Jw,lm=["Enter"," "],Gz=["ArrowDown","PageUp","Home"],a0=["ArrowUp","PageDown","End"],Vz=[...Gz,...a0],Wz={ltr:[...lm,"ArrowRight"],rtl:[...lm,"ArrowLeft"]},$z={ltr:["ArrowLeft"],rtl:["ArrowRight"]},ii="Menu",[Ys,Yz,Xz]=Rc(ii),[jn,n0]=Vt(ii,[Xz,Ir,Dc]),_c=Ir(),r0=Dc(),[Qz,An]=jn(ii),[Jz,li]=jn(ii),s0=e=>{const{__scopeMenu:a,open:r=!1,children:s,dir:l,onOpenChange:d,modal:u=!0}=e,m=_c(a),[h,g]=v.useState(null),y=v.useRef(!1),b=sa(d),S=ni(l);return v.useEffect(()=>{const T=()=>{y.current=!0,document.addEventListener("pointerdown",C,{capture:!0,once:!0}),document.addEventListener("pointermove",C,{capture:!0,once:!0})},C=()=>y.current=!1;return document.addEventListener("keydown",T,{capture:!0}),()=>{document.removeEventListener("keydown",T,{capture:!0}),document.removeEventListener("pointerdown",C,{capture:!0}),document.removeEventListener("pointermove",C,{capture:!0})}},[]),c.jsx(Gm,{...m,children:c.jsx(Qz,{scope:a,open:r,onOpenChange:b,content:h,onContentChange:g,children:c.jsx(Jz,{scope:a,onClose:v.useCallback(()=>b(!1),[b]),isUsingKeyboardRef:y,dir:S,modal:u,children:s})})})};s0.displayName=ii;var e2="MenuAnchor",$m=v.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e,l=_c(r);return c.jsx(Mc,{...l,...s,ref:a})});$m.displayName=e2;var Ym="MenuPortal",[t2,i0]=jn(Ym,{forceMount:void 0}),l0=e=>{const{__scopeMenu:a,forceMount:r,children:s,container:l}=e,d=An(Ym,a);return c.jsx(t2,{scope:a,forceMount:r,children:c.jsx(Mt,{present:r||d.open,children:c.jsx(ai,{asChild:!0,container:l,children:s})})})};l0.displayName=Ym;var ro="MenuContent",[o2,Xm]=jn(ro),c0=v.forwardRef((e,a)=>{const r=i0(ro,e.__scopeMenu),{forceMount:s=r.forceMount,...l}=e,d=An(ro,e.__scopeMenu),u=li(ro,e.__scopeMenu);return c.jsx(Ys.Provider,{scope:e.__scopeMenu,children:c.jsx(Mt,{present:s||d.open,children:c.jsx(Ys.Slot,{scope:e.__scopeMenu,children:u.modal?c.jsx(a2,{...l,ref:a}):c.jsx(n2,{...l,ref:a})})})})}),a2=v.forwardRef((e,a)=>{const r=An(ro,e.__scopeMenu),s=v.useRef(null),l=Ze(a,s);return v.useEffect(()=>{const d=s.current;if(d)return Dm(d)},[]),c.jsx(Qm,{...e,ref:l,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:ce(e.onFocusOutside,d=>d.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)})}),n2=v.forwardRef((e,a)=>{const r=An(ro,e.__scopeMenu);return c.jsx(Qm,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)})}),r2=Mr("MenuContent.ScrollLock"),Qm=v.forwardRef((e,a)=>{const{__scopeMenu:r,loop:s=!1,trapFocus:l,onOpenAutoFocus:d,onCloseAutoFocus:u,disableOutsidePointerEvents:m,onEntryFocus:h,onEscapeKeyDown:g,onPointerDownOutside:y,onFocusOutside:b,onInteractOutside:S,onDismiss:T,disableOutsideScroll:C,...x}=e,k=An(ro,r),R=li(ro,r),j=_c(r),A=r0(r),M=Yz(r),[q,P]=v.useState(null),I=v.useRef(null),X=Ze(a,I,k.onContentChange),ae=v.useRef(0),re=v.useRef(""),te=v.useRef(0),J=v.useRef(null),pe=v.useRef("right"),ne=v.useRef(0),ue=C?wc:v.Fragment,O=C?{as:r2,allowPinchZoom:!0}:void 0,V=Y=>{var ye,Ke;const se=re.current+Y,N=M().filter(xe=>!xe.disabled),K=document.activeElement,ee=(ye=N.find(xe=>xe.ref.current===K))==null?void 0:ye.textValue,oe=N.map(xe=>xe.textValue),fe=y2(oe,se,ee),he=(Ke=N.find(xe=>xe.textValue===fe))==null?void 0:Ke.ref.current;(function xe(vt){re.current=vt,window.clearTimeout(ae.current),vt!==""&&(ae.current=window.setTimeout(()=>xe(""),1e3))})(se),he&&setTimeout(()=>he.focus())};v.useEffect(()=>()=>window.clearTimeout(ae.current),[]),Mm();const H=v.useCallback(Y=>{var N,K;return pe.current===((N=J.current)==null?void 0:N.side)&&v2(Y,(K=J.current)==null?void 0:K.area)},[]);return c.jsx(o2,{scope:r,searchRef:re,onItemEnter:v.useCallback(Y=>{H(Y)&&Y.preventDefault()},[H]),onItemLeave:v.useCallback(Y=>{var se;H(Y)||((se=I.current)==null||se.focus(),P(null))},[H]),onTriggerLeave:v.useCallback(Y=>{H(Y)&&Y.preventDefault()},[H]),pointerGraceTimerRef:te,onPointerGraceIntentChange:v.useCallback(Y=>{J.current=Y},[]),children:c.jsx(ue,{...O,children:c.jsx(vc,{asChild:!0,trapped:l,onMountAutoFocus:ce(d,Y=>{var se;Y.preventDefault(),(se=I.current)==null||se.focus({preventScroll:!0})}),onUnmountAutoFocus:u,children:c.jsx(oi,{asChild:!0,disableOutsidePointerEvents:m,onEscapeKeyDown:g,onPointerDownOutside:y,onFocusOutside:b,onInteractOutside:S,onDismiss:T,children:c.jsx(t0,{asChild:!0,...A,dir:R.dir,orientation:"vertical",loop:s,currentTabStopId:q,onCurrentTabStopIdChange:P,onEntryFocus:ce(h,Y=>{R.isUsingKeyboardRef.current||Y.preventDefault()}),preventScrollOnEntryFocus:!0,children:c.jsx(Vm,{role:"menu","aria-orientation":"vertical","data-state":T0(k.open),"data-radix-menu-content":"",dir:R.dir,...j,...x,ref:X,style:{outline:"none",...x.style},onKeyDown:ce(x.onKeyDown,Y=>{const N=Y.target.closest("[data-radix-menu-content]")===Y.currentTarget,K=Y.ctrlKey||Y.altKey||Y.metaKey,ee=Y.key.length===1;N&&(Y.key==="Tab"&&Y.preventDefault(),!K&&ee&&V(Y.key));const oe=I.current;if(Y.target!==oe||!Vz.includes(Y.key))return;Y.preventDefault();const he=M().filter(ye=>!ye.disabled).map(ye=>ye.ref.current);a0.includes(Y.key)&&he.reverse(),h2(he)}),onBlur:ce(e.onBlur,Y=>{Y.currentTarget.contains(Y.target)||(window.clearTimeout(ae.current),re.current="")}),onPointerMove:ce(e.onPointerMove,Xs(Y=>{const se=Y.target,N=ne.current!==Y.clientX;if(Y.currentTarget.contains(se)&&N){const K=Y.clientX>ne.current?"right":"left";pe.current=K,ne.current=Y.clientX}}))})})})})})})});c0.displayName=ro;var s2="MenuGroup",Jm=v.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e;return c.jsx(Te.div,{role:"group",...s,ref:a})});Jm.displayName=s2;var i2="MenuLabel",d0=v.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e;return c.jsx(Te.div,{...s,ref:a})});d0.displayName=i2;var ic="MenuItem",Tv="menu.itemSelect",Oc=v.forwardRef((e,a)=>{const{disabled:r=!1,onSelect:s,...l}=e,d=v.useRef(null),u=li(ic,e.__scopeMenu),m=Xm(ic,e.__scopeMenu),h=Ze(a,d),g=v.useRef(!1),y=()=>{const b=d.current;if(!r&&b){const S=new CustomEvent(Tv,{bubbles:!0,cancelable:!0});b.addEventListener(Tv,T=>s==null?void 0:s(T),{once:!0}),Hx(b,S),S.defaultPrevented?g.current=!1:u.onClose()}};return c.jsx(u0,{...l,ref:h,disabled:r,onClick:ce(e.onClick,y),onPointerDown:b=>{var S;(S=e.onPointerDown)==null||S.call(e,b),g.current=!0},onPointerUp:ce(e.onPointerUp,b=>{var S;g.current||(S=b.currentTarget)==null||S.click()}),onKeyDown:ce(e.onKeyDown,b=>{const S=m.searchRef.current!=="";r||S&&b.key===" "||lm.includes(b.key)&&(b.currentTarget.click(),b.preventDefault())})})});Oc.displayName=ic;var u0=v.forwardRef((e,a)=>{const{__scopeMenu:r,disabled:s=!1,textValue:l,...d}=e,u=Xm(ic,r),m=r0(r),h=v.useRef(null),g=Ze(a,h),[y,b]=v.useState(!1),[S,T]=v.useState("");return v.useEffect(()=>{const C=h.current;C&&T((C.textContent??"").trim())},[d.children]),c.jsx(Ys.ItemSlot,{scope:r,disabled:s,textValue:l??S,children:c.jsx(o0,{asChild:!0,...m,focusable:!s,children:c.jsx(Te.div,{role:"menuitem","data-highlighted":y?"":void 0,"aria-disabled":s||void 0,"data-disabled":s?"":void 0,...d,ref:g,onPointerMove:ce(e.onPointerMove,Xs(C=>{s?u.onItemLeave(C):(u.onItemEnter(C),C.defaultPrevented||C.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:ce(e.onPointerLeave,Xs(C=>u.onItemLeave(C))),onFocus:ce(e.onFocus,()=>b(!0)),onBlur:ce(e.onBlur,()=>b(!1))})})})}),l2="MenuCheckboxItem",p0=v.forwardRef((e,a)=>{const{checked:r=!1,onCheckedChange:s,...l}=e;return c.jsx(y0,{scope:e.__scopeMenu,checked:r,children:c.jsx(Oc,{role:"menuitemcheckbox","aria-checked":lc(r)?"mixed":r,...l,ref:a,"data-state":tf(r),onSelect:ce(l.onSelect,()=>s==null?void 0:s(lc(r)?!0:!r),{checkForDefaultPrevented:!1})})})});p0.displayName=l2;var m0="MenuRadioGroup",[c2,d2]=jn(m0,{value:void 0,onValueChange:()=>{}}),f0=v.forwardRef((e,a)=>{const{value:r,onValueChange:s,...l}=e,d=sa(s);return c.jsx(c2,{scope:e.__scopeMenu,value:r,onValueChange:d,children:c.jsx(Jm,{...l,ref:a})})});f0.displayName=m0;var h0="MenuRadioItem",g0=v.forwardRef((e,a)=>{const{value:r,...s}=e,l=d2(h0,e.__scopeMenu),d=r===l.value;return c.jsx(y0,{scope:e.__scopeMenu,checked:d,children:c.jsx(Oc,{role:"menuitemradio","aria-checked":d,...s,ref:a,"data-state":tf(d),onSelect:ce(s.onSelect,()=>{var u;return(u=l.onValueChange)==null?void 0:u.call(l,r)},{checkForDefaultPrevented:!1})})})});g0.displayName=h0;var ef="MenuItemIndicator",[y0,u2]=jn(ef,{checked:!1}),b0=v.forwardRef((e,a)=>{const{__scopeMenu:r,forceMount:s,...l}=e,d=u2(ef,r);return c.jsx(Mt,{present:s||lc(d.checked)||d.checked===!0,children:c.jsx(Te.span,{...l,ref:a,"data-state":tf(d.checked)})})});b0.displayName=ef;var p2="MenuSeparator",v0=v.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e;return c.jsx(Te.div,{role:"separator","aria-orientation":"horizontal",...s,ref:a})});v0.displayName=p2;var m2="MenuArrow",x0=v.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e,l=_c(r);return c.jsx(Wm,{...l,...s,ref:a})});x0.displayName=m2;var f2="MenuSub",[m5,w0]=jn(f2),Us="MenuSubTrigger",S0=v.forwardRef((e,a)=>{const r=An(Us,e.__scopeMenu),s=li(Us,e.__scopeMenu),l=w0(Us,e.__scopeMenu),d=Xm(Us,e.__scopeMenu),u=v.useRef(null),{pointerGraceTimerRef:m,onPointerGraceIntentChange:h}=d,g={__scopeMenu:e.__scopeMenu},y=v.useCallback(()=>{u.current&&window.clearTimeout(u.current),u.current=null},[]);return v.useEffect(()=>y,[y]),v.useEffect(()=>{const b=m.current;return()=>{window.clearTimeout(b),h(null)}},[m,h]),c.jsx($m,{asChild:!0,...g,children:c.jsx(u0,{id:l.triggerId,"aria-haspopup":"menu","aria-expanded":r.open,"aria-controls":l.contentId,"data-state":T0(r.open),...e,ref:ti(a,l.onTriggerChange),onClick:b=>{var S;(S=e.onClick)==null||S.call(e,b),!(e.disabled||b.defaultPrevented)&&(b.currentTarget.focus(),r.open||r.onOpenChange(!0))},onPointerMove:ce(e.onPointerMove,Xs(b=>{d.onItemEnter(b),!b.defaultPrevented&&!e.disabled&&!r.open&&!u.current&&(d.onPointerGraceIntentChange(null),u.current=window.setTimeout(()=>{r.onOpenChange(!0),y()},100))})),onPointerLeave:ce(e.onPointerLeave,Xs(b=>{var T,C;y();const S=(T=r.content)==null?void 0:T.getBoundingClientRect();if(S){const x=(C=r.content)==null?void 0:C.dataset.side,k=x==="right",R=k?-5:5,j=S[k?"left":"right"],A=S[k?"right":"left"];d.onPointerGraceIntentChange({area:[{x:b.clientX+R,y:b.clientY},{x:j,y:S.top},{x:A,y:S.top},{x:A,y:S.bottom},{x:j,y:S.bottom}],side:x}),window.clearTimeout(m.current),m.current=window.setTimeout(()=>d.onPointerGraceIntentChange(null),300)}else{if(d.onTriggerLeave(b),b.defaultPrevented)return;d.onPointerGraceIntentChange(null)}})),onKeyDown:ce(e.onKeyDown,b=>{var T;const S=d.searchRef.current!=="";e.disabled||S&&b.key===" "||Wz[s.dir].includes(b.key)&&(r.onOpenChange(!0),(T=r.content)==null||T.focus(),b.preventDefault())})})})});S0.displayName=Us;var C0="MenuSubContent",k0=v.forwardRef((e,a)=>{const r=i0(ro,e.__scopeMenu),{forceMount:s=r.forceMount,...l}=e,d=An(ro,e.__scopeMenu),u=li(ro,e.__scopeMenu),m=w0(C0,e.__scopeMenu),h=v.useRef(null),g=Ze(a,h);return c.jsx(Ys.Provider,{scope:e.__scopeMenu,children:c.jsx(Mt,{present:s||d.open,children:c.jsx(Ys.Slot,{scope:e.__scopeMenu,children:c.jsx(Qm,{id:m.contentId,"aria-labelledby":m.triggerId,...l,ref:g,align:"start",side:u.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:y=>{var b;u.isUsingKeyboardRef.current&&((b=h.current)==null||b.focus()),y.preventDefault()},onCloseAutoFocus:y=>y.preventDefault(),onFocusOutside:ce(e.onFocusOutside,y=>{y.target!==m.trigger&&d.onOpenChange(!1)}),onEscapeKeyDown:ce(e.onEscapeKeyDown,y=>{u.onClose(),y.preventDefault()}),onKeyDown:ce(e.onKeyDown,y=>{var T;const b=y.currentTarget.contains(y.target),S=$z[u.dir].includes(y.key);b&&S&&(d.onOpenChange(!1),(T=m.trigger)==null||T.focus(),y.preventDefault())})})})})})});k0.displayName=C0;function T0(e){return e?"open":"closed"}function lc(e){return e==="indeterminate"}function tf(e){return lc(e)?"indeterminate":e?"checked":"unchecked"}function h2(e){const a=document.activeElement;for(const r of e)if(r===a||(r.focus(),document.activeElement!==a))return}function g2(e,a){return e.map((r,s)=>e[(a+s)%e.length])}function y2(e,a,r){const l=a.length>1&&Array.from(a).every(g=>g===a[0])?a[0]:a,d=r?e.indexOf(r):-1;let u=g2(e,Math.max(d,0));l.length===1&&(u=u.filter(g=>g!==r));const h=u.find(g=>g.toLowerCase().startsWith(l.toLowerCase()));return h!==r?h:void 0}function b2(e,a){const{x:r,y:s}=e;let l=!1;for(let d=0,u=a.length-1;ds!=S>s&&r<(b-g)*(s-y)/(S-y)+g&&(l=!l)}return l}function v2(e,a){if(!a)return!1;const r={x:e.clientX,y:e.clientY};return b2(r,a)}function Xs(e){return a=>a.pointerType==="mouse"?e(a):void 0}var x2=s0,w2=$m,S2=l0,C2=c0,k2=Jm,T2=d0,E2=Oc,R2=p0,j2=f0,A2=g0,N2=b0,z2=v0,M2=x0,D2=S0,_2=k0,Lc="DropdownMenu",[O2]=Vt(Lc,[n0]),kt=n0(),[L2,E0]=O2(Lc),R0=e=>{const{__scopeDropdownMenu:a,children:r,dir:s,open:l,defaultOpen:d,onOpenChange:u,modal:m=!0}=e,h=kt(a),g=v.useRef(null),[y,b]=go({prop:l,defaultProp:d??!1,onChange:u,caller:Lc});return c.jsx(L2,{scope:a,triggerId:mo(),triggerRef:g,contentId:mo(),open:y,onOpenChange:b,onOpenToggle:v.useCallback(()=>b(S=>!S),[b]),modal:m,children:c.jsx(x2,{...h,open:y,onOpenChange:b,dir:s,modal:m,children:r})})};R0.displayName=Lc;var j0="DropdownMenuTrigger",A0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,disabled:s=!1,...l}=e,d=E0(j0,r),u=kt(r);return c.jsx(w2,{asChild:!0,...u,children:c.jsx(Te.button,{type:"button",id:d.triggerId,"aria-haspopup":"menu","aria-expanded":d.open,"aria-controls":d.open?d.contentId:void 0,"data-state":d.open?"open":"closed","data-disabled":s?"":void 0,disabled:s,...l,ref:ti(a,d.triggerRef),onPointerDown:ce(e.onPointerDown,m=>{!s&&m.button===0&&m.ctrlKey===!1&&(d.onOpenToggle(),d.open||m.preventDefault())}),onKeyDown:ce(e.onKeyDown,m=>{s||(["Enter"," "].includes(m.key)&&d.onOpenToggle(),m.key==="ArrowDown"&&d.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(m.key)&&m.preventDefault())})})})});A0.displayName=j0;var Z2="DropdownMenuPortal",N0=e=>{const{__scopeDropdownMenu:a,...r}=e,s=kt(a);return c.jsx(S2,{...s,...r})};N0.displayName=Z2;var z0="DropdownMenuContent",M0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=E0(z0,r),d=kt(r),u=v.useRef(!1);return c.jsx(C2,{id:l.contentId,"aria-labelledby":l.triggerId,...d,...s,ref:a,onCloseAutoFocus:ce(e.onCloseAutoFocus,m=>{var h;u.current||(h=l.triggerRef.current)==null||h.focus(),u.current=!1,m.preventDefault()}),onInteractOutside:ce(e.onInteractOutside,m=>{const h=m.detail.originalEvent,g=h.button===0&&h.ctrlKey===!0,y=h.button===2||g;(!l.modal||y)&&(u.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});M0.displayName=z0;var P2="DropdownMenuGroup",B2=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(k2,{...l,...s,ref:a})});B2.displayName=P2;var I2="DropdownMenuLabel",D0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(T2,{...l,...s,ref:a})});D0.displayName=I2;var q2="DropdownMenuItem",_0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(E2,{...l,...s,ref:a})});_0.displayName=q2;var F2="DropdownMenuCheckboxItem",O0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(R2,{...l,...s,ref:a})});O0.displayName=F2;var K2="DropdownMenuRadioGroup",U2=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(j2,{...l,...s,ref:a})});U2.displayName=K2;var H2="DropdownMenuRadioItem",L0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(A2,{...l,...s,ref:a})});L0.displayName=H2;var G2="DropdownMenuItemIndicator",Z0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(N2,{...l,...s,ref:a})});Z0.displayName=G2;var V2="DropdownMenuSeparator",P0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(z2,{...l,...s,ref:a})});P0.displayName=V2;var W2="DropdownMenuArrow",$2=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(M2,{...l,...s,ref:a})});$2.displayName=W2;var Y2="DropdownMenuSubTrigger",B0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(D2,{...l,...s,ref:a})});B0.displayName=Y2;var X2="DropdownMenuSubContent",I0=v.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(_2,{...l,...s,ref:a,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});I0.displayName=X2;var Q2=R0,J2=A0,eM=N0,q0=M0,F0=D0,K0=_0,U0=O0,H0=L0,G0=Z0,V0=P0,W0=B0,$0=I0;const Y0=({modal:e=!1,...a})=>c.jsx(Q2,{modal:e,...a}),X0=J2,tM=v.forwardRef(({className:e,inset:a,children:r,...s},l)=>c.jsxs(W0,{ref:l,className:ie("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",a&&"pl-8",e),...s,children:[r,c.jsx(AR,{className:"ml-auto"})]}));tM.displayName=W0.displayName;const oM=v.forwardRef(({className:e,...a},r)=>c.jsx($0,{ref:r,className:ie("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",e),...a}));oM.displayName=$0.displayName;const of=v.forwardRef(({className:e,sideOffset:a=4,...r},s)=>c.jsx(eM,{children:c.jsx(q0,{ref:s,sideOffset:a,className:ie("z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md","data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",e),...r})}));of.displayName=q0.displayName;const af=v.forwardRef(({className:e,inset:a,...r},s)=>c.jsx(K0,{ref:s,className:ie("relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",a&&"pl-8",e),...r}));af.displayName=K0.displayName;const aM=v.forwardRef(({className:e,children:a,checked:r,...s},l)=>c.jsxs(U0,{ref:l,className:ie("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:r,...s,children:[c.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:c.jsx(G0,{children:c.jsx(Ha,{className:"h-4 w-4"})})}),a]}));aM.displayName=U0.displayName;const nM=v.forwardRef(({className:e,children:a,...r},s)=>c.jsxs(H0,{ref:s,className:ie("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[c.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:c.jsx(G0,{children:c.jsx(zR,{className:"h-2 w-2 fill-current"})})}),a]}));nM.displayName=H0.displayName;const rM=v.forwardRef(({className:e,inset:a,...r},s)=>c.jsx(F0,{ref:s,className:ie("px-2 py-1.5 text-sm font-semibold",a&&"pl-8",e),...r}));rM.displayName=F0.displayName;const sM=v.forwardRef(({className:e,...a},r)=>c.jsx(V0,{ref:r,className:ie("-mx-1 my-1 h-px bg-muted",e),...a}));sM.displayName=V0.displayName;function iM({trigger:e,children:a,align:r="end",sideOffset:s,contentClassName:l,openDelay:d=60,closeDelay:u=140}){const[m,h]=v.useState(!1),g=v.useRef(void 0),y=()=>{g.current!==void 0&&(window.clearTimeout(g.current),g.current=void 0)},b=(C,x)=>{y(),g.current=window.setTimeout(()=>h(C),x)},S=()=>b(!0,d),T=()=>b(!1,u);return v.useEffect(()=>()=>y(),[]),c.jsxs(Y0,{open:m,onOpenChange:h,children:[c.jsx(X0,{asChild:!0,onMouseEnter:S,onMouseLeave:T,children:e}),c.jsx(of,{align:r,sideOffset:s,onMouseEnter:S,onMouseLeave:T,className:ie("nav-menu-anim",l),children:a})]})}const lM=[{value:"zh-CN",label:"中文"},{value:"en",label:"English"},{value:"ja",label:"日本語"},{value:"ko",label:"한국어"},{value:"fr",label:"Français"},{value:"de",label:"Deutsch"},{value:"es",label:"Español"}];function cM(){const{lang:e,setLang:a}=be();return c.jsx(iM,{contentClassName:"w-36",trigger:c.jsx(it,{variant:"ghost",size:"icon","aria-label":"Language",children:c.jsx(OR,{className:"h-4 w-4"})}),children:lM.map(({value:r,label:s})=>c.jsx(af,{onClick:()=>a(r),"data-active":e===r,children:s},r))})}const Q0=vw,J0=xw,dM=ww,eS=v.forwardRef(({className:e,...a},r)=>c.jsx(Cc,{ref:r,className:ie("fixed inset-0 z-50 bg-black/80 dialog-overlay-anim",e),...a}));eS.displayName=Cc.displayName;const nf=v.forwardRef(({className:e,children:a,...r},s)=>c.jsxs(dM,{children:[c.jsx(eS,{}),c.jsxs(kc,{ref:s,className:ie("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg dialog-content-anim sm:rounded-lg",e),...r,children:[a,c.jsxs(Sw,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[c.jsx(Ox,{className:"h-4 w-4"}),c.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));nf.displayName=kc.displayName;const tS=({className:e,...a})=>c.jsx("div",{className:ie("flex flex-col space-y-1.5 text-center sm:text-left",e),...a});tS.displayName="DialogHeader";const rf=v.forwardRef(({className:e,...a},r)=>c.jsx(Tc,{ref:r,className:ie("text-lg font-semibold leading-none tracking-tight",e),...a}));rf.displayName=Tc.displayName;const sf=v.forwardRef(({className:e,...a},r)=>c.jsx(Ec,{ref:r,className:ie("text-sm text-muted-foreground",e),...a}));sf.displayName=Ec.displayName;const uo=v.forwardRef(({className:e,type:a,...r},s)=>c.jsx("input",{type:a,className:ie("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),ref:s,...r}));uo.displayName="Input";const oS=[{titleKey:"docs.sidebar.gettingStarted",items:[{id:"installation",labelKey:"docs.sidebar.quickstart"},{id:"ssr",labelKey:"docs.sidebar.ssr"}]},{titleKey:"docs.sidebar.concepts",items:[{id:"modes",labelKey:"docs.sidebar.modes",items:[{id:"modes-component",labelKey:"docs.section.modes.componentTitle"},{id:"modes-imperative",labelKey:"docs.section.modes.imperativeTitle"},{id:"modes-wrapper",labelKey:"docs.section.modes.wrapperTitle"}]},{id:"theming",labelKey:"docs.sidebar.theming",items:[{id:"theming-default",labelKey:"docs.section.theming.defaultTitle"},{id:"theming-pattern",labelKey:"docs.section.theming.patternTitle"},{id:"theming-imperative",labelKey:"docs.section.theming.imperativeTitle"},{id:"theming-icons",labelKey:"docs.section.theming.iconsTitle"},{id:"theming-toolbar",labelKey:"docs.section.theming.toolbarTitle"}]}]},{titleKey:"docs.sidebar.props",items:[{id:"props",labelKey:"docs.section.props.title"},{id:"props-data",labelKey:"group.data"},{id:"props-preset",labelKey:"group.preset"},{id:"props-preset-bundles",labelKey:"docs.section.props.preset.title"},{id:"props-interface",labelKey:"group.interface"},{id:"props-controller",labelKey:"group.controller"},{id:"props-hotkey",labelKey:"group.hotkey"},{id:"props-animate",labelKey:"group.animate"},{id:"props-gesture",labelKey:"group.gesture"},{id:"props-lifecycle",labelKey:"group.lifecycle"},{id:"props-controlled",labelKey:"group.controlled"}]},{titleKey:"docs.sidebar.recipes",items:[{id:"examples",labelKey:"docs.sidebar.examples",items:[{id:"examples-single",labelKey:"docs.section.examples.singleTitle"},{id:"examples-gallery",labelKey:"docs.section.examples.galleryTitle"},{id:"examples-mobile",labelKey:"docs.section.examples.mobileTitle"},{id:"examples-controller",labelKey:"docs.section.examples.controllerTitle"},{id:"examples-cover",labelKey:"docs.section.examples.coverTitle"}]}]},{titleKey:"docs.sidebar.reference",items:[{id:"typescript",labelKey:"docs.sidebar.typescript"},{id:"migration",labelKey:"docs.sidebar.migration"},{id:"faq",labelKey:"docs.sidebar.faq",items:[{id:"faq-tailwind-shrink",labelKey:"docs.section.faq.tailwind-shrink.q"},{id:"faq-r19-imperative",labelKey:"docs.section.faq.r19-imperative.q"},{id:"faq-wrapper-empty",labelKey:"docs.section.faq.wrapper-empty.q"},{id:"faq-vite-esm",labelKey:"docs.section.faq.vite-esm.q"},{id:"faq-wrapper-dynamic",labelKey:"docs.section.faq.wrapper-dynamic.q"},{id:"faq-lazy-src",labelKey:"docs.section.faq.lazy-src.q"},{id:"faq-cover-vs-set",labelKey:"docs.section.faq.cover-vs-set.q"},{id:"faq-controlled-mismatch",labelKey:"docs.section.faq.controlled-mismatch.q"},{id:"faq-ssr",labelKey:"docs.section.faq.ssr.q"},{id:"faq-theme",labelKey:"docs.section.faq.theme.q"}]}]}];function aS(e,a){var r;return e.id===a||!!((r=e.items)!=null&&r.some(s=>aS(s,a)))}function nS({items:e,activeId:a,t:r,depth:s=0}){return c.jsx("ul",{className:ie(s===0?"space-y-1 border-l border-border/60":"mt-1 space-y-1"),children:e.map(l=>{const d=l.id===a,u=!d&&aS(l,a);return c.jsxs("li",{children:[c.jsx("a",{href:`#${l.id}`,className:ie("-ml-px block border-l-2 py-1 transition-colors",s===0?"px-3":"px-5 text-xs",d?"border-foreground text-foreground":u?"border-border text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),children:r(l.labelKey)}),l.items&&c.jsx(nS,{items:l.items,activeId:a,t:r,depth:s+1})]},l.id)})})}function uM({activeId:e}){const{t:a}=be();return c.jsx("nav",{className:"space-y-6 text-sm",children:oS.map(r=>c.jsxs("div",{children:[c.jsx("div",{className:"mb-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:a(r.titleKey)}),c.jsx(nS,{items:r.items,activeId:e,t:a})]},r.titleKey))})}function Se({id:e,level:a=2,children:r}){const s=`h${a}`;return c.jsxs(s,{id:e,className:"group scroll-mt-24 flex items-baseline gap-2",children:[c.jsx("span",{children:r}),c.jsx("a",{href:`#${e}`,"aria-label":"Anchor",className:"opacity-0 transition-opacity group-hover:opacity-60 hover:opacity-100",onClick:l=>{var d;l.preventDefault(),window.history.replaceState(null,"",`#${e}`),(d=document.getElementById(e))==null||d.scrollIntoView({behavior:"smooth",block:"start"})},children:c.jsx(PR,{className:"h-3.5 w-3.5"})})]})}var pM=Object.create,Zc=Object.defineProperty,mM=Object.defineProperties,fM=Object.getOwnPropertyDescriptor,hM=Object.getOwnPropertyDescriptors,rS=Object.getOwnPropertyNames,cc=Object.getOwnPropertySymbols,gM=Object.getPrototypeOf,lf=Object.prototype.hasOwnProperty,sS=Object.prototype.propertyIsEnumerable,Ev=(e,a,r)=>a in e?Zc(e,a,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[a]=r,Mo=(e,a)=>{for(var r in a||(a={}))lf.call(a,r)&&Ev(e,r,a[r]);if(cc)for(var r of cc(a))sS.call(a,r)&&Ev(e,r,a[r]);return e},Pc=(e,a)=>mM(e,hM(a)),iS=(e,a)=>{var r={};for(var s in e)lf.call(e,s)&&a.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&cc)for(var s of cc(e))a.indexOf(s)<0&&sS.call(e,s)&&(r[s]=e[s]);return r},yM=(e,a)=>function(){return a||(0,e[rS(e)[0]])((a={exports:{}}).exports,a),a.exports},bM=(e,a)=>{for(var r in a)Zc(e,r,{get:a[r],enumerable:!0})},vM=(e,a,r,s)=>{if(a&&typeof a=="object"||typeof a=="function")for(let l of rS(a))!lf.call(e,l)&&l!==r&&Zc(e,l,{get:()=>a[l],enumerable:!(s=fM(a,l))||s.enumerable});return e},xM=(e,a,r)=>(r=e!=null?pM(gM(e)):{},vM(!e||!e.__esModule?Zc(r,"default",{value:e,enumerable:!0}):r,e)),wM=yM({"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,a){var r=(function(){var s=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,l=0,d={},u={util:{encode:function C(x){return x instanceof m?new m(x.type,C(x.content),x.alias):Array.isArray(x)?x.map(C):x.replace(/&/g,"&").replace(/"+j.content+""};function h(C,x,k,R){C.lastIndex=x;var j=C.exec(k);if(j&&R&&j[1]){var A=j[1].length;j.index+=A,j[0]=j[0].slice(A)}return j}function g(C,x,k,R,j,A){for(var M in k)if(!(!k.hasOwnProperty(M)||!k[M])){var q=k[M];q=Array.isArray(q)?q:[q];for(var P=0;P=A.reach);ue+=ne.value.length,ne=ne.next){var O=ne.value;if(x.length>C.length)return;if(!(O instanceof m)){var V=1,H;if(re){if(H=h(pe,ue,C,ae),!H||H.index>=C.length)break;var K=H.index,Y=H.index+H[0].length,se=ue;for(se+=ne.value.length;K>=se;)ne=ne.next,se+=ne.value.length;if(se-=ne.value.length,ue=se,ne.value instanceof m)continue;for(var N=ne;N!==x.tail&&(seA.reach&&(A.reach=he);var ye=ne.prev;oe&&(ye=b(x,ye,oe),ue+=oe.length),S(x,ye,V);var Ke=new m(M,X?u.tokenize(ee,X):ee,te,ee);if(ne=b(x,ye,Ke),fe&&b(x,ne,fe),V>1){var xe={cause:M+","+P,reach:he};g(C,x,k,ne.prev,ue,xe),A&&xe.reach>A.reach&&(A.reach=xe.reach)}}}}}}function y(){var C={value:null,prev:null,next:null},x={value:null,prev:C,next:null};C.next=x,this.head=C,this.tail=x,this.length=0}function b(C,x,k){var R=x.next,j={value:k,prev:x,next:R};return x.next=j,R.prev=j,C.length++,j}function S(C,x,k){for(var R=x.next,j=0;j/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},$.languages.markup.tag.inside["attr-value"].inside.entity=$.languages.markup.entity,$.languages.markup.doctype.inside["internal-subset"].inside=$.languages.markup,$.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty($.languages.markup.tag,"addInlined",{value:function(e,s){var r={},r=(r["language-"+s]={pattern:/(^$)/i,lookbehind:!0,inside:$.languages[s]},r.cdata=/^$/i,{"included-cdata":{pattern://i,inside:r}}),s=(r["language-"+s]={pattern:/[\s\S]+/,inside:$.languages[s]},{});s[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:r},$.languages.insertBefore("markup","cdata",s)}}),Object.defineProperty($.languages.markup.tag,"addAttribute",{value:function(e,a){$.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[a,"language-"+a],inside:$.languages[a]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),$.languages.html=$.languages.markup,$.languages.mathml=$.languages.markup,$.languages.svg=$.languages.markup,$.languages.xml=$.languages.extend("markup",{}),$.languages.ssml=$.languages.xml,$.languages.atom=$.languages.xml,$.languages.rss=$.languages.xml,(function(e){var a={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},r=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,s="(?:[^\\\\-]|"+r.source+")",s=RegExp(s+"-"+s),l={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:r,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":a,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:r}},"special-escape":a,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":l}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:r,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},$.languages.javascript=$.languages.extend("clike",{"class-name":[$.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),$.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,$.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:$.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:$.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:$.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:$.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:$.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),$.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:$.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),$.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),$.languages.markup&&($.languages.markup.tag.addInlined("script","javascript"),$.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),$.languages.js=$.languages.javascript,$.languages.actionscript=$.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),$.languages.actionscript["class-name"].alias="function",delete $.languages.actionscript.parameter,delete $.languages.actionscript["literal-property"],$.languages.markup&&$.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:$.languages.markup}}),(function(e){var a=/#(?!\{).+/,r={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:a,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:r}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:a,interpolation:r}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:r}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript})($),(function(e){var a=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(r,s){(r=typeof r=="string"?[r]:r).forEach(function(l){var d=function(b){b.inside||(b.inside={}),b.inside.rest=s},u="doc-comment";if(m=e.languages[l]){var m,h=m[u];if((h=h||(m=e.languages.insertBefore(l,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[u])instanceof RegExp&&(h=m[u]={pattern:h}),Array.isArray(h))for(var g=0,y=h.length;g|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})})($),(function(e){var a=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,s="(?:"+r.source+"(?:[ ]+"+a.source+")?|"+a.source+"(?:[ ]+"+r.source+")?)",l=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),d=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function u(m,h){h=(h||"").replace(/m/g,"")+"m";var g=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return s}).replace(/<>/g,function(){return m});return RegExp(g,h)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return s})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return s}).replace(/<>/g,function(){return"(?:"+l+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:u(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:u(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:u(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:u(d),lookbehind:!0,greedy:!0},number:{pattern:u(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:r,important:a,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml})($),(function(e){var a=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function r(g){return g=g.replace(//g,function(){return a}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+g+")")}var s=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,l=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return s}),d=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,u=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+l+d+"(?:"+l+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+l+d+")(?:"+l+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(s),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+l+")"+d+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+l+"$"),inside:{"table-header":{pattern:RegExp(s),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:r(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:r(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:r(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:r(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(g){["url","bold","italic","strike","code-snippet"].forEach(function(y){g!==y&&(e.languages.markdown[g].inside.content.inside[y]=e.languages.markdown[y])})}),e.hooks.add("after-tokenize",function(g){g.language!=="markdown"&&g.language!=="md"||(function y(b){if(b&&typeof b!="string")for(var S=0,T=b.length;S",quot:'"'},h=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown})($),$.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:$.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},$.hooks.add("after-tokenize",function(e){if(e.language==="graphql")for(var a=e.tokens.filter(function(C){return typeof C!="string"&&C.type!=="comment"&&C.type!=="scalar"}),r=0;r?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},(function(e){var a=e.languages.javascript["template-string"],r=a.pattern.source,s=a.inside.interpolation,l=s.inside["interpolation-punctuation"],d=s.pattern.source;function u(b,S){if(e.languages[b])return{pattern:RegExp("((?:"+S+")\\s*)"+r),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:b}}}}function m(b,S,T){return b={code:b,grammar:S,language:T},e.hooks.run("before-tokenize",b),b.tokens=e.tokenize(b.code,b.grammar),e.hooks.run("after-tokenize",b),b.tokens}function h(b,S,T){var k=e.tokenize(b,{interpolation:{pattern:RegExp(d),lookbehind:!0}}),C=0,x={},k=m(k.map(function(j){if(typeof j=="string")return j;for(var A,M,j=j.content;b.indexOf((M=C++,A="___"+T.toUpperCase()+"_"+M+"___"))!==-1;);return x[A]=j,A}).join(""),S,T),R=Object.keys(x);return C=0,(function j(A){for(var M=0;M=R.length)return;var q,P,I,X,ae,re,te,J=A[M];typeof J=="string"||typeof J.content=="string"?(q=R[C],(te=(re=typeof J=="string"?J:J.content).indexOf(q))!==-1&&(++C,P=re.substring(0,te),ae=x[q],I=void 0,(X={})["interpolation-punctuation"]=l,(X=e.tokenize(ae,X)).length===3&&((I=[1,1]).push.apply(I,m(X[1],e.languages.javascript,"javascript")),X.splice.apply(X,I)),I=new e.Token("interpolation",X,s.alias,ae),X=re.substring(te+q.length),ae=[],P&&ae.push(P),ae.push(I),X&&(j(re=[X]),ae.push.apply(ae,re)),typeof J=="string"?(A.splice.apply(A,[M,1].concat(ae)),M+=ae.length-1):J.content=ae)):(te=J.content,Array.isArray(te)?j(te):j([te]))}})(k),new e.Token(T,k,"language-"+T,b)}e.languages.javascript["template-string"]=[u("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),u("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),u("svg",/\bsvg/.source),u("markdown",/\b(?:markdown|md)/.source),u("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),u("sql",/\bsql/.source),a].filter(Boolean);var g={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function y(b){return typeof b=="string"?b:Array.isArray(b)?b.map(y).join(""):y(b.content)}e.hooks.add("after-tokenize",function(b){b.language in g&&(function S(T){for(var C=0,x=T.length;C]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var a=e.languages.extend("typescript",{});delete a["class-name"],e.languages.typescript["class-name"].inside=a,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:a}}}}),e.languages.ts=e.languages.typescript})($),(function(e){var a=e.languages.javascript,r=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,s="(@(?:arg|argument|param|property)\\s+(?:"+r+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(s+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(s+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(//g,function(){return r})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+r),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)})($),(function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})})($),$.languages.n4js=$.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),$.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),$.languages.n4jsd=$.languages.n4js,(function(e){function a(u,m){return RegExp(u.replace(//g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),m)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:a(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:a(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:a(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var r=["function","function-variable","method","method-variable","property-access"],s=0;s*\.{3}(?:[^{}]|)*\})/.source;function d(h,g){return h=h.replace(//g,function(){return r}).replace(//g,function(){return s}).replace(//g,function(){return l}),RegExp(h,g)}l=d(l).source,e.languages.jsx=e.languages.extend("markup",a),e.languages.jsx.tag.pattern=d(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=a.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:d(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:d(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);function u(h){for(var g=[],y=0;y"&&g.push({tagName:m(b.content[0].content[1]),openedBraces:0}):0]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},$.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=$.languages.swift}),(function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var a={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:a},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:a},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin})($),$.languages.c=$.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),$.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),$.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},$.languages.c.string],char:$.languages.c.char,comment:$.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:$.languages.c}}}}),$.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete $.languages.c.boolean,$.languages.objectivec=$.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete $.languages.objectivec["class-name"],$.languages.objc=$.languages.objectivec,$.languages.reason=$.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),$.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete $.languages.reason.function,(function(e){for(var a=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,r=0;r<2;r++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return/[^\s\S]/.source}),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string})($),$.languages.go=$.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),$.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete $.languages.go["class-name"],(function(e){var a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return r})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])})($),$.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},$.languages.python["string-interpolation"].inside.interpolation.inside.rest=$.languages.python,$.languages.py=$.languages.python,$.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},$.languages.webmanifest=$.languages.json;var cm={};bM(cm,{dracula:()=>CM,duotoneDark:()=>TM,duotoneLight:()=>RM,github:()=>AM,gruvboxMaterialDark:()=>nD,gruvboxMaterialLight:()=>sD,jettwaveDark:()=>YM,jettwaveLight:()=>QM,nightOwl:()=>zM,nightOwlLight:()=>DM,oceanicNext:()=>OM,okaidia:()=>ZM,oneDark:()=>eD,oneLight:()=>oD,palenight:()=>BM,shadesOfPurple:()=>qM,synthwave84:()=>KM,ultramin:()=>HM,vsDark:()=>lS,vsLight:()=>WM});var SM={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},CM=SM,kM={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},TM=kM,EM={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},RM=EM,jM={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},AM=jM,NM={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},zM=NM,MM={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},DM=MM,Ut={char:"#D8DEE9",comment:"#999999",keyword:"#c5a5c5",primitive:"#5a9bcf",string:"#8dc891",variable:"#d7deea",boolean:"#ff8b50",tag:"#fc929e",function:"#79b6f2",className:"#FAC863"},_M={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:Ut.keyword}},{types:["attr-value"],style:{color:Ut.string}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:Ut.comment}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:Ut.primitive}},{types:["boolean"],style:{color:Ut.boolean}},{types:["tag"],style:{color:Ut.tag}},{types:["string"],style:{color:Ut.string}},{types:["punctuation"],style:{color:Ut.string}},{types:["selector","char","builtin","inserted"],style:{color:Ut.char}},{types:["function"],style:{color:Ut.function}},{types:["operator","entity","url","variable"],style:{color:Ut.variable}},{types:["keyword"],style:{color:Ut.keyword}},{types:["atrule","class-name"],style:{color:Ut.className}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},OM=_M,LM={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},ZM=LM,PM={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},BM=PM,IM={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},qM=IM,FM={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},KM=FM,UM={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},HM=UM,GM={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},lS=GM,VM={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},WM=VM,$M={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},YM=$M,XM={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},QM=XM,JM={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},eD=JM,tD={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},oD=tD,aD={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},nD=aD,rD={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},sD=rD,iD=e=>v.useCallback(a=>{var r=a,{className:s,style:l,line:d}=r,u=iS(r,["className","style","line"]);const m=Pc(Mo({},u),{className:yc("token-line",s)});return typeof e=="object"&&"plain"in e&&(m.style=e.plain),typeof l=="object"&&(m.style=Mo(Mo({},m.style||{}),l)),m},[e]),lD=e=>{const a=v.useCallback(({types:r,empty:s})=>{if(e!=null){{if(r.length===1&&r[0]==="plain")return s!=null?{display:"inline-block"}:void 0;if(r.length===1&&s!=null)return e[r[0]]}return Object.assign(s!=null?{display:"inline-block"}:{},...r.map(l=>e[l]))}},[e]);return v.useCallback(r=>{var s=r,{token:l,className:d,style:u}=s,m=iS(s,["token","className","style"]);const h=Pc(Mo({},m),{className:yc("token",...l.types,d),children:l.content,style:a(l)});return u!=null&&(h.style=Mo(Mo({},h.style||{}),u)),h},[a])},cD=/\r\n|\r|\n/,Rv=e=>{e.length===0?e.push({types:["plain"],content:` -`,empty:!0}):e.length===1&&e[0].content===""&&(e[0].content=` -`,e[0].empty=!0)},jv=(e,a)=>{const r=e.length;return r>0&&e[r-1]===a?e:e.concat(a)},dD=e=>{const a=[[]],r=[e],s=[0],l=[e.length];let d=0,u=0,m=[];const h=[m];for(;u>-1;){for(;(d=s[u]++)0?y:["plain"],g=S):(y=jv(y,S.type),S.alias&&(y=jv(y,S.alias)),g=S.content),typeof g!="string"){u++,a.push(y),r.push(g),s.push(0),l.push(g.length);continue}const T=g.split(cD),C=T.length;m.push({types:y,content:T[0]});for(let x=1;xv.useMemo(()=>{if(r==null)return Av([a]);const l={code:a,grammar:r,language:s,tokens:[]};return e.hooks.run("before-tokenize",l),l.tokens=e.tokenize(a,r),e.hooks.run("after-tokenize",l),Av(l.tokens)},[a,r,s,e]),pD=(e,a)=>{const{plain:r}=e,s=e.styles.reduce((l,d)=>{const{languages:u,style:m}=d;return u&&!u.includes(a)||d.types.forEach(h=>{const g=Mo(Mo({},l[h]),m);l[h]=g}),l},{});return s.root=r,s.plain=Pc(Mo({},r),{backgroundColor:void 0}),s},mD=pD,fD=({children:e,language:a,code:r,theme:s,prism:l})=>{const d=a.toLowerCase(),u=mD(s,d),m=iD(u),h=lD(u),g=l.languages[d],y=uD({prism:l,language:d,code:r,grammar:g});return e({tokens:y,className:`prism-code language-${d}`,style:u!=null?u.root:{},getLineProps:m,getTokenProps:h})},hD=e=>v.createElement(fD,Pc(Mo({},e),{prism:e.prism||$,theme:e.theme||lS,code:e.code,language:e.language}));/*! Bundled license information: - -prismjs/prism.js: - (** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT - * @author Lea Verou - * @namespace - * @public - *) -*/function Bc(e=1500){const[a,r]=v.useState(!1),[s,l]=v.useState(""),d=v.useRef(void 0),u=v.useCallback(()=>{d.current!==void 0&&(window.clearTimeout(d.current),d.current=void 0)},[]),m=v.useCallback(()=>{u(),r(!1),l("")},[u]),h=v.useCallback(async g=>{try{return await navigator.clipboard.writeText(g),r(!0),l(""),u(),d.current=window.setTimeout(()=>r(!1),e),!0}catch(y){return r(!1),l(y instanceof Error?y.message:"Clipboard write failed"),!1}},[u,e]);return v.useEffect(()=>u,[u]),{copied:a,error:s,copy:h,reset:m}}function De({code:e,language:a="tsx",showCopy:r=!0,actions:s,className:l,preClassName:d}){const{resolved:u}=Am(),{copied:m,copy:h}=Bc(),g=()=>{h(e)},y=u==="dark"?cm.vsDark:cm.vsLight;return c.jsxs("div",{className:ie("relative flex min-w-0 max-w-full flex-col overflow-hidden rounded-lg border border-border bg-muted/40",l),children:[(s||r)&&c.jsxs("div",{className:"absolute right-2 top-2 z-10 flex items-center gap-2",children:[s,r&&c.jsx(it,{size:"icon",variant:"ghost",onClick:g,className:"h-7 w-7 opacity-70 hover:opacity-100","aria-label":"Copy code",children:m?c.jsx(Ha,{className:"h-3.5 w-3.5"}):c.jsx(Ws,{className:"h-3.5 w-3.5"})})]}),c.jsx(hD,{code:e.trim(),language:a,theme:y,children:({className:b,style:S,tokens:T,getLineProps:C,getTokenProps:x})=>c.jsx("pre",{className:ie(b,"code-block-scroll m-0 min-w-0 max-w-full flex-1 overflow-auto p-4 font-mono text-sm leading-6",d),style:{...S,backgroundColor:"transparent",background:"transparent"},children:T.map((k,R)=>c.jsx("div",{...C({line:k}),children:k.map((j,A)=>c.jsx("span",{...x({token:j})},A))},R))})})]})}const cS=["tailwind-shrink","r19-imperative","wrapper-empty","vite-esm","wrapper-dynamic","lazy-src","cover-vs-set","controlled-mismatch","ssr","theme"];function gD(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"faq",children:e("docs.section.faq.title")}),c.jsxs("div",{className:"space-y-6",children:[c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-tailwind-shrink",level:3,children:e("docs.section.faq.tailwind-shrink.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.tailwind-shrink.a")}),c.jsx(De,{code:`/* The culprit, often shipped by Tailwind preflight / normalize.css */ -img { max-width: 100%; height: auto; }`,language:"css"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-r19-imperative",level:3,children:e("docs.section.faq.r19-imperative.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.r19-imperative.a")}),c.jsx(De,{code:`// 1.1.2+ — browsing() returns a stable destructor -const close = Zmage.browsing({ src: 'hero.jpg' }) -// later: -close?.()`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-wrapper-empty",level:3,children:e("docs.section.faq.wrapper-empty.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.wrapper-empty.a")})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-vite-esm",level:3,children:e("docs.section.faq.vite-esm.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.vite-esm.a")})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-wrapper-dynamic",level:3,children:e("docs.section.faq.wrapper-dynamic.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.wrapper-dynamic.a")}),c.jsx(De,{code:`// Bind imperatively from your own click handler instead of relying on Wrapper -function onImgClick (e: React.MouseEvent) { - const img = e.currentTarget - Zmage.browsing({ src: img.src, alt: img.alt }) -}`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-lazy-src",level:3,children:e("docs.section.faq.lazy-src.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.lazy-src.a")}),c.jsx(De,{code:`// Pass the real URL via set; the cover src can stay as the placeholder. - - -// Or imperatively, from your own click handler: -Zmage.browsing({ src: realUrl })`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-cover-vs-set",level:3,children:e("docs.section.faq.cover-vs-set.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.cover-vs-set.a")}),c.jsx(De,{code:`// Cover stays as the thumbnail; set carries the high-resolution viewer image. -`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-controlled-mismatch",level:3,children:e("docs.section.faq.controlled-mismatch.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.controlled-mismatch.a")}),c.jsx(De,{code:`const [open, setOpen] = React.useState(false) -// Always pair browsing with onBrowsing — internal state otherwise drifts. -`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-ssr",level:3,children:e("docs.section.faq.ssr.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.ssr.a")}),c.jsx(De,{code:`import Zmage from 'react-zmage/ssr' -import 'react-zmage/style.css' - -// If you need the imperative API in shared code: -if (typeof window !== 'undefined') { - Zmage.browsing({ src: 'hero.jpg' }) -}`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(Se,{id:"faq-theme",level:3,children:e("docs.section.faq.theme.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.theme.a")})]})]}),c.jsx("span",{className:"hidden",children:cS.join(",")})]})}const dS="auto",oa={preset:dS,hideOnScroll:!0,coverVisible:!1,backdrop:"#FFFFFF",zIndex:1e3,loop:!0,hideOnDblClick:!1,loadingDelay:200},uS={desktop:{radius:8,edge:16,controller:{pagination:!0,rotate:!0,zoom:!0,download:!1,close:!0,flip:!0,placement:"top-right",layout:{pagination:{inset:24},caption:{inset:60}}},hotKey:{close:!0,zoom:!0,flip:!0,rotate:!0,download:!1},animate:{browsing:!0,flip:"crossFade",cover:{objectFit:!0,clip:!0,radius:!0},slowMotion:!1},gesture:{swipe:!1,dragExit:!1,wheelZoom:{step:.12,smooth:!0,minScale:"fit",maxScale:4,center:"pointer",reverse:!1,exitGuardDuration:1e3},pinchZoom:!1,doubleTapZoom:!1,touchAction:"managed"}},mobile:{radius:0,edge:0,controller:{pagination:!0,rotate:!1,zoom:!1,download:!1,close:!0,flip:!1,placement:"top-right"},hotKey:{close:!1,zoom:!1,flip:!1,rotate:!1,download:!1},animate:{browsing:!0,flip:"swipe",cover:{objectFit:!0,clip:!0,radius:!0},slowMotion:!1},gesture:{swipe:{threshold:120,velocity:.35,axisLock:1.2,resistance:.35},dragExit:{threshold:80,velocity:.35,axisLock:1.2,opacity:!0},wheelZoom:!1,pinchZoom:{minScale:"fit",maxScale:4,resetBelowFit:!0,center:"gesture"},doubleTapZoom:{scale:1,minScale:"fit",maxScale:4,center:"tap",interval:300,distance:32},touchAction:"managed"}}},yD=e=>{const a=e||dS;return a==="mobile"?"mobile":a==="desktop"||typeof window>"u"||typeof window.matchMedia!="function"?"desktop":window.matchMedia("(pointer: coarse) and (hover: none)").matches?"mobile":"desktop"},cf=e=>uS[yD(e)],br=cf(oa.preset),da=[{name:"src",group:"data",default:"",required:!0,control:{kind:"text"},i18n:{labelKey:"param.src.label",descKey:"param.src.desc"}},{name:"alt",group:"data",default:"",control:{kind:"text"},i18n:{labelKey:"param.alt.label",descKey:"param.alt.desc"}},{name:"caption",group:"data",default:"",control:{kind:"text"},i18n:{labelKey:"param.caption.label",descKey:"param.caption.desc"}},{name:"set",group:"data",default:[],control:{kind:"object",component:"set"},i18n:{labelKey:"param.set.label",descKey:"param.set.desc"}},{name:"defaultPage",group:"data",default:0,control:{kind:"number"},i18n:{labelKey:"param.defaultPage.label",descKey:"param.defaultPage.desc"}},{name:"preset",group:"preset",default:oa.preset,control:{kind:"segmented",options:[{value:"auto",labelKey:"preset.auto"},{value:"desktop",labelKey:"preset.desktop"},{value:"mobile",labelKey:"preset.mobile"}]},i18n:{labelKey:"param.preset.label",descKey:"param.preset.desc"}},{name:"backdrop",group:"interface",default:oa.backdrop,control:{kind:"color"},i18n:{labelKey:"param.backdrop.label",descKey:"param.backdrop.desc"}},{name:"zIndex",group:"interface",default:oa.zIndex,control:{kind:"number"},i18n:{labelKey:"param.zIndex.label",descKey:"param.zIndex.desc"}},{name:"radius",group:"interface",default:br.radius,control:{kind:"slider",min:0,max:32,step:1},i18n:{labelKey:"param.radius.label",descKey:"param.radius.desc"}},{name:"edge",group:"interface",default:br.edge,control:{kind:"slider",min:0,max:64,step:1},i18n:{labelKey:"param.edge.label",descKey:"param.edge.desc"}},{name:"loop",group:"interface",default:oa.loop,control:{kind:"switch"},i18n:{labelKey:"param.loop.label",descKey:"param.loop.desc"}},{name:"hideOnScroll",group:"interface",default:oa.hideOnScroll,presetScope:"desktop",control:{kind:"switch"},i18n:{labelKey:"param.hideOnScroll.label",descKey:"param.hideOnScroll.desc"}},{name:"hideOnDblClick",group:"interface",default:oa.hideOnDblClick,control:{kind:"switch"},i18n:{labelKey:"param.hideOnDblClick.label",descKey:"param.hideOnDblClick.desc"}},{name:"coverVisible",group:"interface",default:oa.coverVisible,presetScope:"desktop",control:{kind:"switch"},i18n:{labelKey:"param.coverVisible.label",descKey:"param.coverVisible.desc"}},{name:"loadingDelay",group:"interface",default:oa.loadingDelay,control:{kind:"slider",min:0,max:1e3,step:50},i18n:{labelKey:"param.loadingDelay.label",descKey:"param.loadingDelay.desc"}},{name:"controller",group:"controller",default:br.controller,control:{kind:"object",component:"controller"},i18n:{labelKey:"param.controller.label",descKey:"param.controller.desc"}},{name:"hotKey",group:"hotkey",default:br.hotKey,control:{kind:"object",component:"hotkey"},i18n:{labelKey:"param.hotKey.label",descKey:"param.hotKey.desc"}},{name:"animate",group:"animate",default:br.animate,control:{kind:"object",component:"animate"},i18n:{labelKey:"param.animate.label",descKey:"param.animate.desc"}},{name:"gesture",group:"gesture",default:br.gesture,control:{kind:"object",component:"gesture"},i18n:{labelKey:"param.gesture.label",descKey:"param.gesture.desc"}},{name:"onBrowsing",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onBrowsing"]},i18n:{labelKey:"param.onBrowsing.label",descKey:"param.onBrowsing.desc"}},{name:"onZooming",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onZooming"]},i18n:{labelKey:"param.onZooming.label",descKey:"param.onZooming.desc"}},{name:"onSwitching",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onSwitching"]},i18n:{labelKey:"param.onSwitching.label",descKey:"param.onSwitching.desc"}},{name:"onRotating",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onRotating"]},i18n:{labelKey:"param.onRotating.label",descKey:"param.onRotating.desc"}},{name:"onError",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onError"]},i18n:{labelKey:"param.onError.label",descKey:"param.onError.desc"}},{name:"browsing",group:"controlled",default:void 0,control:{kind:"switch"},i18n:{labelKey:"param.browsing.label",descKey:"param.browsing.desc"}}],bD=typeof navigator<"u"&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent||""),vD=bD?"⌘K":"Ctrl+K",xD=[{parent:"controller",leaf:"pagination",labelKey:"controller.pagination",descKey:"controller.pagination.desc"},{parent:"controller",leaf:"rotate",labelKey:"controller.rotate",descKey:"controller.rotate.desc"},{parent:"controller",leaf:"rotateLeft",labelKey:"controller.rotateLeft",descKey:"controller.rotateLeft.desc"},{parent:"controller",leaf:"rotateRight",labelKey:"controller.rotateRight",descKey:"controller.rotateRight.desc"},{parent:"controller",leaf:"zoom",labelKey:"controller.zoom",descKey:"controller.zoom.desc"},{parent:"controller",leaf:"download",labelKey:"controller.download",descKey:"controller.download.desc"},{parent:"controller",leaf:"close",labelKey:"controller.close",descKey:"controller.close.desc"},{parent:"controller",leaf:"flip",labelKey:"controller.flip",descKey:"controller.flip.desc"},{parent:"controller",leaf:"flipLeft",labelKey:"controller.flipLeft",descKey:"controller.flipLeft.desc"},{parent:"controller",leaf:"flipRight",labelKey:"controller.flipRight",descKey:"controller.flipRight.desc"},{parent:"controller",leaf:"backdrop",labelKey:"controller.backdrop",descKey:"controller.backdrop.desc"},{parent:"controller",leaf:"color",labelKey:"controller.color",descKey:"controller.color.desc"},{parent:"controller",leaf:"placement",labelKey:"controller.placement",descKey:"controller.placement.desc"},{parent:"controller",leaf:"render",labelKey:"controller.render",descKey:"controller.render.desc"},{parent:"hotkey",leaf:"close",labelKey:"hotkey.close",descKey:"hotkey.close.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"zoom",labelKey:"hotkey.zoom",descKey:"hotkey.zoom.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"flip",labelKey:"hotkey.flip",descKey:"hotkey.flip.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"flipLeft",labelKey:"hotkey.flipLeft",descKey:"hotkey.flipLeft.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"flipRight",labelKey:"hotkey.flipRight",descKey:"hotkey.flipRight.desc",parentDisplay:"hotKey"},{parent:"animate",leaf:"browsing",labelKey:"animate.browsing.desc",descKey:"animate.browsing.desc"},{parent:"animate",leaf:"flip",labelKey:"animate.flip.desc",descKey:"animate.flip.desc"},{parent:"animate",leaf:"cover",labelKey:"animate.cover.desc",descKey:"animate.cover.desc"},{parent:"animate",leaf:"fade",labelKey:"animate.flip.fade",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"crossFade",labelKey:"animate.flip.crossFade",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"swipe",labelKey:"animate.flip.swipe",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"zoom",labelKey:"animate.flip.zoom",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"blur",labelKey:"animate.flip.blur",descKey:"animate.flip.desc",isValue:!0},{parent:"gesture",leaf:"swipe",labelKey:"gesture.swipe",descKey:"gesture.swipe.desc"},{parent:"gesture",leaf:"dragExit",labelKey:"gesture.dragExit",descKey:"gesture.dragExit.desc"},{parent:"gesture",leaf:"wheelZoom",labelKey:"gesture.wheelZoom",descKey:"gesture.wheelZoom.desc"},{parent:"gesture",leaf:"pinchZoom",labelKey:"gesture.pinchZoom",descKey:"gesture.pinchZoom.desc"},{parent:"gesture",leaf:"doubleTapZoom",labelKey:"gesture.doubleTapZoom",descKey:"gesture.doubleTapZoom.desc"},{parent:"gesture",leaf:"touchAction",labelKey:"gesture.touchAction",descKey:"gesture.touchAction.desc"},{parent:"gesture",leaf:"threshold",labelKey:"gesture.threshold",descKey:"gesture.threshold.desc"},{parent:"gesture",leaf:"velocity",labelKey:"gesture.velocity",descKey:"gesture.velocity.desc"},{parent:"gesture",leaf:"axisLock",labelKey:"gesture.axisLock",descKey:"gesture.axisLock.desc"},{parent:"gesture",leaf:"resistance",labelKey:"gesture.resistance",descKey:"gesture.resistance.desc"},{parent:"gesture",leaf:"opacity",labelKey:"gesture.opacity",descKey:"gesture.opacity.desc"},{parent:"gesture",leaf:"step",labelKey:"gesture.wheelZoom.step",descKey:"gesture.wheelZoom.step.desc"},{parent:"gesture",leaf:"smooth",labelKey:"gesture.wheelZoom.smooth",descKey:"gesture.wheelZoom.smooth.desc"},{parent:"gesture",leaf:"minScale",labelKey:"gesture.wheelZoom.minScale",descKey:"gesture.wheelZoom.minScale.desc"},{parent:"gesture",leaf:"maxScale",labelKey:"gesture.wheelZoom.maxScale",descKey:"gesture.wheelZoom.maxScale.desc"},{parent:"gesture",leaf:"center",labelKey:"gesture.wheelZoom.center",descKey:"gesture.wheelZoom.center.desc"},{parent:"gesture",leaf:"reverse",labelKey:"gesture.wheelZoom.reverse",descKey:"gesture.wheelZoom.reverse.desc"},{parent:"gesture",leaf:"exitGuardDuration",labelKey:"gesture.wheelZoom.exitGuardDuration",descKey:"gesture.wheelZoom.exitGuardDuration.desc"},{parent:"gesture",leaf:"resetBelowFit",labelKey:"gesture.pinchZoom.resetBelowFit",descKey:"gesture.pinchZoom.resetBelowFit.desc"},{parent:"gesture",leaf:"scale",labelKey:"gesture.doubleTapZoom.scale",descKey:"gesture.doubleTapZoom.scale.desc"},{parent:"gesture",leaf:"interval",labelKey:"gesture.doubleTapZoom.interval",descKey:"gesture.doubleTapZoom.interval.desc"},{parent:"gesture",leaf:"distance",labelKey:"gesture.doubleTapZoom.distance",descKey:"gesture.doubleTapZoom.distance.desc"}],wD={installation:"docs.search.desc.installation",ssr:"docs.search.desc.ssr",modes:"docs.search.desc.modes","modes-component":"modes.component.desc","modes-imperative":"modes.imperative.desc","modes-wrapper":"modes.wrapper.desc",theming:"docs.search.desc.theming","props-data":"docs.search.desc.propsData","props-preset":"docs.search.desc.propsPreset","props-preset-bundles":"docs.search.desc.propsPresetBundles","props-interface":"docs.search.desc.propsInterface","props-controller":"docs.search.desc.propsController","props-hotkey":"docs.search.desc.propsHotkey","props-animate":"docs.search.desc.propsAnimate","props-gesture":"docs.search.desc.propsGesture","props-lifecycle":"docs.search.desc.propsLifecycle","props-controlled":"docs.search.desc.propsControlled",examples:"docs.search.desc.examples",typescript:"docs.search.desc.typescript",migration:"docs.search.desc.migration",faq:"docs.search.desc.faq"};function SD(e){const a=[];for(const l of oS)pS(a,l.items,e,e(l.titleKey));const r=e("docs.sidebar.props");for(const l of da)a.push({id:`prop-${l.name}`,label:l.name,desc:e(l.i18n.descKey),href:`/docs#props-${l.group}`,group:r});for(const l of xD){const d=l.parentDisplay??l.parent,u=e(l.labelKey),m=l.descKey?e(l.descKey):"",h=l.isValue?`${d}.flip = "${l.leaf}"`:`${d}.${l.leaf}`,g=m&&m!==u?`${u} — ${m}`:u;a.push({id:`sub-${l.parent}-${l.leaf}${l.isValue?"-value":""}`,label:h,desc:g,href:`/docs#props-${l.parent}`,group:r})}const s=e("docs.sidebar.faq");for(const l of cS)a.push({id:`faq-${l}`,label:e(`docs.section.faq.${l}.q`),desc:e(`docs.section.faq.${l}.a`),href:`/docs#faq-${l}`,group:s});return a}function CD(e,a,r){const s=e.toLowerCase(),l=a.toLowerCase(),d=r.toLowerCase();if(l.includes(s))return 200-l.indexOf(s);if(d&&d.includes(s))return 100-Math.min(d.indexOf(s),99);let u=0,m=0;for(const h of l)if(h===s[m]&&(u+=1,m+=1,m>=s.length))break;return m===s.length?u:0}function pS(e,a,r,s){for(const l of a){const d=wD[l.id];e.push({id:l.id,label:r(l.labelKey),desc:d?r(d):"",href:`/docs#${l.id}`,group:s}),l.items&&pS(e,l.items,r,s)}}function kD(){const{t:e}=be(),[a,r]=v.useState(!1),[s,l]=v.useState(""),d=yx(),u=v.useMemo(()=>SD(e),[e]),m=v.useMemo(()=>s.trim()?u.map(h=>({it:h,s:CD(s,h.label,h.desc)})).filter(h=>h.s>0).sort((h,g)=>g.s-h.s).slice(0,12).map(h=>h.it):u.slice(0,12),[s,u]);return v.useEffect(()=>{const h=g=>{(g.metaKey||g.ctrlKey)&&g.key.toLowerCase()==="k"&&(g.preventDefault(),r(y=>!y))};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[]),c.jsxs(Q0,{open:a,onOpenChange:r,children:[c.jsx(J0,{asChild:!0,children:c.jsxs(it,{variant:"outline",size:"sm",className:"hidden gap-2 text-muted-foreground sm:inline-flex",children:[c.jsx($b,{className:"h-3.5 w-3.5"}),c.jsx("span",{children:e("docs.search.placeholder")}),c.jsx("span",{className:"ml-auto rounded border border-border bg-background px-1.5 font-mono text-[10px]",children:vD})]})}),c.jsxs(nf,{className:"max-w-xl gap-0 p-0",children:[c.jsx(rf,{className:"sr-only",children:e("docs.search.placeholder")}),c.jsx(sf,{className:"sr-only",children:e("docs.search.placeholder")}),c.jsxs("div",{className:"flex h-12 items-center gap-2 border-b border-border px-4 pr-12",children:[c.jsx($b,{className:"h-4 w-4 shrink-0 text-muted-foreground"}),c.jsx(uo,{autoFocus:!0,value:s,onChange:h=>l(h.target.value),placeholder:e("docs.search.placeholder"),className:"border-0 bg-transparent px-0 shadow-none focus-visible:outline-none focus-visible:ring-0"})]}),c.jsx("ul",{className:"max-h-96 overflow-y-auto p-2",children:m.length===0?c.jsx("li",{className:"p-3 text-sm text-muted-foreground",children:e("docs.search.empty")}):m.map(h=>c.jsx("li",{children:c.jsxs("button",{className:"group flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left transition-colors hover:bg-accent",onClick:()=>{r(!1),d(h.href)},children:[c.jsxs("div",{className:"min-w-0 flex-1",children:[c.jsx("div",{className:"text-sm font-medium text-foreground",children:h.label}),h.desc&&c.jsx("div",{className:"mt-0.5 truncate text-xs text-muted-foreground",children:h.desc})]}),c.jsx("span",{className:"shrink-0 self-center rounded border border-border bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground",children:h.group})]})},h.id))})]})]})}const Nv=[{to:"/playground",key:"nav.playground"},{to:"/docs",key:"nav.docs"},{to:"/ai",key:"nav.ai"}];function TD(){const{t:e}=be();return c.jsx("header",{className:"fixed inset-x-0 top-0 z-50 h-14 border-b border-border/60 bg-background/70 backdrop-blur-md",children:c.jsxs("div",{className:"mx-auto flex h-full max-w-7xl items-center gap-4 px-4 sm:px-6",children:[c.jsxs(st,{to:"/",className:"flex items-center gap-2.5",children:[c.jsx("img",{src:"/logo.png",alt:"",className:"h-7 w-7"}),c.jsx("span",{className:"text-lg font-bold tracking-tight font-sans",children:"react-zmage"})]}),c.jsx(jw,{orientation:"vertical",className:"hidden h-5 md:block ml-2 sm:ml-3"}),c.jsx("nav",{className:"hidden flex-1 items-center gap-1 md:flex",children:Nv.map(({to:a,key:r})=>c.jsx(Jp,{to:a,className:({isActive:s})=>ie("rounded-md px-3 py-1.5 text-sm transition-colors",s?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e(r)},a))}),c.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[c.jsx(kD,{}),c.jsx(cM,{}),c.jsx(SN,{}),c.jsx(it,{variant:"ghost",size:"icon",asChild:!0,"aria-label":e("nav.github"),children:c.jsx("a",{href:"https://github.com/Caldis/react-zmage",target:"_blank",rel:"noreferrer",children:c.jsx(Dx,{className:"h-4 w-4"})})}),c.jsxs(pN,{children:[c.jsx(mN,{asChild:!0,children:c.jsx(it,{variant:"ghost",size:"icon",className:"md:hidden","aria-label":"Menu",children:c.jsx(IR,{className:"h-4 w-4"})})}),c.jsx(kw,{side:"right",className:"w-72",children:c.jsx("nav",{className:"mt-8 flex flex-col gap-1",children:Nv.map(({to:a,key:r})=>c.jsx(Jp,{to:a,className:({isActive:s})=>ie("rounded-md px-3 py-2 text-base transition-colors",s?"bg-accent text-foreground":"text-muted-foreground hover:bg-accent/60"),children:e(r)},a))})})]})]})]})})}var ED=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),RD="VisuallyHidden",mS=v.forwardRef((e,a)=>c.jsx(Te.span,{...e,ref:a,style:{...ED,...e.style}}));mS.displayName=RD;var jD=mS,[Ic]=Vt("Tooltip",[Ir]),qc=Ir(),fS="TooltipProvider",AD=700,dm="tooltip.open",[ND,df]=Ic(fS),hS=e=>{const{__scopeTooltip:a,delayDuration:r=AD,skipDelayDuration:s=300,disableHoverableContent:l=!1,children:d}=e,u=v.useRef(!0),m=v.useRef(!1),h=v.useRef(0);return v.useEffect(()=>{const g=h.current;return()=>window.clearTimeout(g)},[]),c.jsx(ND,{scope:a,isOpenDelayedRef:u,delayDuration:r,onOpen:v.useCallback(()=>{window.clearTimeout(h.current),u.current=!1},[]),onClose:v.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>u.current=!0,s)},[s]),isPointerInTransitRef:m,onPointerInTransitChange:v.useCallback(g=>{m.current=g},[]),disableHoverableContent:l,children:d})};hS.displayName=fS;var Qs="Tooltip",[zD,ci]=Ic(Qs),gS=e=>{const{__scopeTooltip:a,children:r,open:s,defaultOpen:l,onOpenChange:d,disableHoverableContent:u,delayDuration:m}=e,h=df(Qs,e.__scopeTooltip),g=qc(a),[y,b]=v.useState(null),S=mo(),T=v.useRef(0),C=u??h.disableHoverableContent,x=m??h.delayDuration,k=v.useRef(!1),[R,j]=go({prop:s,defaultProp:l??!1,onChange:I=>{I?(h.onOpen(),document.dispatchEvent(new CustomEvent(dm))):h.onClose(),d==null||d(I)},caller:Qs}),A=v.useMemo(()=>R?k.current?"delayed-open":"instant-open":"closed",[R]),M=v.useCallback(()=>{window.clearTimeout(T.current),T.current=0,k.current=!1,j(!0)},[j]),q=v.useCallback(()=>{window.clearTimeout(T.current),T.current=0,j(!1)},[j]),P=v.useCallback(()=>{window.clearTimeout(T.current),T.current=window.setTimeout(()=>{k.current=!0,j(!0),T.current=0},x)},[x,j]);return v.useEffect(()=>()=>{T.current&&(window.clearTimeout(T.current),T.current=0)},[]),c.jsx(Gm,{...g,children:c.jsx(zD,{scope:a,contentId:S,open:R,stateAttribute:A,trigger:y,onTriggerChange:b,onTriggerEnter:v.useCallback(()=>{h.isOpenDelayedRef.current?P():M()},[h.isOpenDelayedRef,P,M]),onTriggerLeave:v.useCallback(()=>{C?q():(window.clearTimeout(T.current),T.current=0)},[q,C]),onOpen:M,onClose:q,disableHoverableContent:C,children:r})})};gS.displayName=Qs;var um="TooltipTrigger",yS=v.forwardRef((e,a)=>{const{__scopeTooltip:r,...s}=e,l=ci(um,r),d=df(um,r),u=qc(r),m=v.useRef(null),h=Ze(a,m,l.onTriggerChange),g=v.useRef(!1),y=v.useRef(!1),b=v.useCallback(()=>g.current=!1,[]);return v.useEffect(()=>()=>document.removeEventListener("pointerup",b),[b]),c.jsx(Mc,{asChild:!0,...u,children:c.jsx(Te.button,{"aria-describedby":l.open?l.contentId:void 0,"data-state":l.stateAttribute,...s,ref:h,onPointerMove:ce(e.onPointerMove,S=>{S.pointerType!=="touch"&&!y.current&&!d.isPointerInTransitRef.current&&(l.onTriggerEnter(),y.current=!0)}),onPointerLeave:ce(e.onPointerLeave,()=>{l.onTriggerLeave(),y.current=!1}),onPointerDown:ce(e.onPointerDown,()=>{l.open&&l.onClose(),g.current=!0,document.addEventListener("pointerup",b,{once:!0})}),onFocus:ce(e.onFocus,()=>{g.current||l.onOpen()}),onBlur:ce(e.onBlur,l.onClose),onClick:ce(e.onClick,l.onClose)})})});yS.displayName=um;var uf="TooltipPortal",[MD,DD]=Ic(uf,{forceMount:void 0}),bS=e=>{const{__scopeTooltip:a,forceMount:r,children:s,container:l}=e,d=ci(uf,a);return c.jsx(MD,{scope:a,forceMount:r,children:c.jsx(Mt,{present:r||d.open,children:c.jsx(ai,{asChild:!0,container:l,children:s})})})};bS.displayName=uf;var _r="TooltipContent",vS=v.forwardRef((e,a)=>{const r=DD(_r,e.__scopeTooltip),{forceMount:s=r.forceMount,side:l="top",...d}=e,u=ci(_r,e.__scopeTooltip);return c.jsx(Mt,{present:s||u.open,children:u.disableHoverableContent?c.jsx(xS,{side:l,...d,ref:a}):c.jsx(_D,{side:l,...d,ref:a})})}),_D=v.forwardRef((e,a)=>{const r=ci(_r,e.__scopeTooltip),s=df(_r,e.__scopeTooltip),l=v.useRef(null),d=Ze(a,l),[u,m]=v.useState(null),{trigger:h,onClose:g}=r,y=l.current,{onPointerInTransitChange:b}=s,S=v.useCallback(()=>{m(null),b(!1)},[b]),T=v.useCallback((C,x)=>{const k=C.currentTarget,R={x:C.clientX,y:C.clientY},j=BD(R,k.getBoundingClientRect()),A=ID(R,j),M=qD(x.getBoundingClientRect()),q=KD([...A,...M]);m(q),b(!0)},[b]);return v.useEffect(()=>()=>S(),[S]),v.useEffect(()=>{if(h&&y){const C=k=>T(k,y),x=k=>T(k,h);return h.addEventListener("pointerleave",C),y.addEventListener("pointerleave",x),()=>{h.removeEventListener("pointerleave",C),y.removeEventListener("pointerleave",x)}}},[h,y,T,S]),v.useEffect(()=>{if(u){const C=x=>{const k=x.target,R={x:x.clientX,y:x.clientY},j=(h==null?void 0:h.contains(k))||(y==null?void 0:y.contains(k)),A=!FD(R,u);j?S():A&&(S(),g())};return document.addEventListener("pointermove",C),()=>document.removeEventListener("pointermove",C)}},[h,y,u,g,S]),c.jsx(xS,{...e,ref:d})}),[OD,LD]=Ic(Qs,{isInside:!1}),ZD=Wj("TooltipContent"),xS=v.forwardRef((e,a)=>{const{__scopeTooltip:r,children:s,"aria-label":l,onEscapeKeyDown:d,onPointerDownOutside:u,...m}=e,h=ci(_r,r),g=qc(r),{onClose:y}=h;return v.useEffect(()=>(document.addEventListener(dm,y),()=>document.removeEventListener(dm,y)),[y]),v.useEffect(()=>{if(h.trigger){const b=S=>{const T=S.target;T!=null&&T.contains(h.trigger)&&y()};return window.addEventListener("scroll",b,{capture:!0}),()=>window.removeEventListener("scroll",b,{capture:!0})}},[h.trigger,y]),c.jsx(oi,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:b=>b.preventDefault(),onDismiss:y,children:c.jsxs(Vm,{"data-state":h.stateAttribute,...g,...m,ref:a,style:{...m.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[c.jsx(ZD,{children:s}),c.jsx(OD,{scope:r,isInside:!0,children:c.jsx(jD,{id:h.contentId,role:"tooltip",children:l||s})})]})})});vS.displayName=_r;var wS="TooltipArrow",PD=v.forwardRef((e,a)=>{const{__scopeTooltip:r,...s}=e,l=qc(r);return LD(wS,r).isInside?null:c.jsx(Wm,{...l,...s,ref:a})});PD.displayName=wS;function BD(e,a){const r=Math.abs(a.top-e.y),s=Math.abs(a.bottom-e.y),l=Math.abs(a.right-e.x),d=Math.abs(a.left-e.x);switch(Math.min(r,s,l,d)){case d:return"left";case l:return"right";case r:return"top";case s:return"bottom";default:throw new Error("unreachable")}}function ID(e,a,r=5){const s=[];switch(a){case"top":s.push({x:e.x-r,y:e.y+r},{x:e.x+r,y:e.y+r});break;case"bottom":s.push({x:e.x-r,y:e.y-r},{x:e.x+r,y:e.y-r});break;case"left":s.push({x:e.x+r,y:e.y-r},{x:e.x+r,y:e.y+r});break;case"right":s.push({x:e.x-r,y:e.y-r},{x:e.x-r,y:e.y+r});break}return s}function qD(e){const{top:a,right:r,bottom:s,left:l}=e;return[{x:l,y:a},{x:r,y:a},{x:r,y:s},{x:l,y:s}]}function FD(e,a){const{x:r,y:s}=e;let l=!1;for(let d=0,u=a.length-1;ds!=S>s&&r<(b-g)*(s-y)/(S-y)+g&&(l=!l)}return l}function KD(e){const a=e.slice();return a.sort((r,s)=>r.xs.x?1:r.ys.y?1:0),UD(a)}function UD(e){if(e.length<=1)return e.slice();const a=[];for(let s=0;s=2;){const d=a[a.length-1],u=a[a.length-2];if((d.x-u.x)*(l.y-u.y)>=(d.y-u.y)*(l.x-u.x))a.pop();else break}a.push(l)}a.pop();const r=[];for(let s=e.length-1;s>=0;s--){const l=e[s];for(;r.length>=2;){const d=r[r.length-1],u=r[r.length-2];if((d.x-u.x)*(l.y-u.y)>=(d.y-u.y)*(l.x-u.x))r.pop();else break}r.push(l)}return r.pop(),a.length===1&&r.length===1&&a[0].x===r[0].x&&a[0].y===r[0].y?a:a.concat(r)}var HD=hS,GD=gS,VD=yS,WD=bS,SS=vS;const CS=HD,Ao=GD,No=VD,po=v.forwardRef(({className:e,sideOffset:a=4,...r},s)=>c.jsx(WD,{children:c.jsx(SS,{ref:s,sideOffset:a,className:ie("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",e),...r})}));po.displayName=SS.displayName;function $D(){const{pathname:e,hash:a}=$a();v.useEffect(()=>{typeof window.gtag=="function"&&window.gtag("event","page_view",{page_path:e+a,page_location:window.location.href,page_title:document.title})},[e,a])}var zv={wrapperLayer:"wrapperLayer__Br2mJ",viewportLayer:"viewportLayer__c6flH"};function YD({id:e,target:a,zIndex:r,className:s,style:l,children:d}){if(typeof document>"u")return null;const u=a||document.body,m=v.useMemo(()=>document.createElement("figure"),[]),[h,g]=v.useState(!1),y=v.useRef([]);return v.useLayoutEffect(()=>{e?m.id=e:m.removeAttribute("id"),typeof s=="string"?m.className=s:m.removeAttribute("class"),typeof r=="number"?m.style.zIndex=String(r):m.style.removeProperty("z-index"),y.current.forEach(S=>m.style.removeProperty(S)),y.current=[];const b=l||{};Object.keys(b).forEach(S=>{const T=b[S];T!=null&&(m.style.setProperty(S,String(T)),y.current.push(S))})},[e,s,r,l,m]),v.useLayoutEffect(()=>(u.appendChild(m),g(!0),()=>{u.removeChild(m)}),[u,m]),h?Rm.createPortal(d,m):null}var ze={controls:"controls__9U729",topRight:"topRight__bDRMJ",topLeft:"topLeft__BodEu",bottomRight:"bottomRight__Hd0jy",bottomLeft:"bottomLeft__762V9",topCenter:"topCenter__jexvO",bottomCenter:"bottomCenter__DEEUV",leftCenter:"leftCenter__8PTu3",rightCenter:"rightCenter__mHTFQ",show:"show__GPCB-",rotateLeft:"rotateLeft__xjHZr",rotateRight:"rotateRight__Q71ZR",download:"download__z6NFZ",zoom:"zoom__VWyU-",disabled:"disabled__l7PPn",shake:"shake__ul2tL",close:"close__N7GMd",flipLeft:"flipLeft__OgnvQ",detachedSideButton:"detachedSideButton__SKxNE",flipRight:"flipRight__wywuu",pages:"pages__5GsnL",mobile:"mobile__6jMYl",blackDot:"blackDot__bhplt",whiteDot:"whiteDot__P7lUz"},XD=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"m15 18-6-6 6-6"})),QD=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"m9 18 6-6-6-6"})),JD=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M20 4 4 20"}),Q.createElement("path",{d:"m4 4 16 16"})),e_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),Q.createElement("path",{d:"M7 10l5 5 5-5"}),Q.createElement("path",{d:"M12 15V3"})),t_=({color:e})=>Q.createElement("svg",{fill:e,width:"24",height:"24",viewBox:"0 0 200 200"},Q.createElement("defs",null,Q.createElement("linearGradient",{id:"spinner-1552570621916",x1:"0%",y1:"0%",x2:"65%",y2:"0%"},Q.createElement("stop",{offset:"0%",className:"Spinner-blue-3_W"}),Q.createElement("stop",{offset:"100%",stopOpacity:"0"}))),Q.createElement("circle",{cx:"100",cy:"100",r:"90",fill:"transparent",stroke:"url(#spinner-1552570621916)",strokeWidth:"20"})),o_=({color:e})=>Q.createElement("svg",{fill:e,width:"24",height:"24",viewBox:"0 0 24 24"},Q.createElement("path",{d:"M12 6v1.79c0 .45.54.67.85.35l2.79-2.79c.2-.2.2-.51 0-.71l-2.79-2.79c-.31-.31-.85-.09-.85.36V4c-4.42 0-8 3.58-8 8 0 1.04.2 2.04.57 2.95.27.67 1.13.85 1.64.34.27-.27.38-.68.23-1.04C6.15 13.56 6 12.79 6 12c0-3.31 2.69-6 6-6zm5.79 2.71c-.27.27-.38.69-.23 1.04.28.7.44 1.46.44 2.25 0 3.31-2.69 6-6 6v-1.79c0-.45-.54-.67-.85-.35l-2.79 2.79c-.2.2-.2.51 0 .71l2.79 2.79c.31.31.85.09.85-.35V20c4.42 0 8-3.58 8-8 0-1.04-.2-2.04-.57-2.95-.27-.67-1.13-.85-1.64-.34z"})),a_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}),Q.createElement("path",{d:"M3 3v5h5"})),n_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"}),Q.createElement("path",{d:"M21 3v5h-5"})),r_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M8 3H5a2 2 0 0 0-2 2v3"}),Q.createElement("path",{d:"M21 8V5a2 2 0 0 0-2-2h-3"}),Q.createElement("path",{d:"M3 16v3a2 2 0 0 0 2 2h3"}),Q.createElement("path",{d:"M16 21h3a2 2 0 0 0 2-2v-3"})),qr=v.createContext({}),s_=1e-4,En=e=>Number.isFinite(e)&&(e??0)>0?e:0,pf=(e=0)=>En(e),i_=(e=0)=>{const a=(e%360+360)%360;return a===90||a===270},kS=(e,a,r=0)=>{const s=En(e),l=En(a);return i_(r)?{width:l,height:s}:{width:s,height:l}},TS=({naturalWidth:e,naturalHeight:a,edge:r=0,viewport:s,rotate:l=0})=>{const d=En(s.width),u=En(s.height),m=pf(r),{width:h,height:g}=kS(e,a,l);if(!d||!u||!h||!g)return{scale:1,canZoom:!1,visualWidth:h,visualHeight:g,fittedWidth:h,fittedHeight:g,marginX:Math.max(0,(d-h)/2),marginY:Math.max(0,(u-g)/2)};const y=Math.max(1,d-m*2),b=Math.max(1,u-m*2),S=h>y?y/h:1,T=g>b?b/g:1,C=Math.min(S,T),x=h*C,k=g*C;return{scale:C,canZoom:C<1-s_,visualWidth:h,visualHeight:g,fittedWidth:x,fittedHeight:k,marginX:(d-x)/2,marginY:(u-k)/2}},l_=(e,a,r=0,s,l=0)=>TS({naturalWidth:e,naturalHeight:a,edge:r,viewport:s,rotate:l}).scale,ES=({naturalWidth:e,naturalHeight:a,viewport:r,scale:s=1,edge:l=0,rotate:d=0})=>{const u=Number.isFinite(s)&&s>0?s:1,m=pf(l),h=En(r.width),g=En(r.height),{width:y,height:b}=kS(e,a,d),S=y*u,T=b*u,C=S>h?(S-h)/2+m:0,x=T>g?(T-g)/2+m:0;return{minX:-C,maxX:C,minY:-x,maxY:x}},Js=typeof window<"u",Fc=typeof document<"u",Kc=()=>Fc?document.documentElement:void 0,mf=()=>Fc?document.body:void 0,no=(...e)=>e.reduce((a,r)=>r?typeof r=="string"?r?a.concat(r):a:a.concat(Object.keys(r).filter(s=>!!r[s])):a,[]).join(" "),c_=()=>{const e=Kc();return e?e.clientWidth:0},d_=()=>{const e=Kc();return e?e.clientHeight:0},Ar={documentOverflow:"",bodyOverflow:"",bodyPosition:""},u_=()=>{const e=Kc(),a=mf();!e||!a||(Ar.documentOverflow=e.style.overflow,Ar.bodyOverflow=a.style.overflow,Ar.bodyPosition=a.style.position,e.style.overflow="hidden",a.style.overflow="hidden",a.style.position="relative")},p_=()=>{const e=Kc(),a=mf();!e||!a||(e.style.overflow=Ar.documentOverflow,a.style.overflow=Ar.bodyOverflow,a.style.position=Ar.bodyPosition)},m_=(e,a)=>{const r=setInterval(()=>{(!e||e.complete)&&(clearInterval(r),a())},500);return r},f_=(e,a={})=>{const r=Object.keys(a).reduce((s,l="")=>a[l]?s.concat(`${l}=${a[l]}`):s,[]).join("&");return r?`${e}${e.includes("?")?"&":"?"}${r}`:e},h_=(e,a={ref:100})=>e?e.includes("%")?a.ref*Number(e.substring(0,e.length-1))/100:Number(e.substring(0,e.length-2)):Number(e),pm=(e,a)=>{const r=mf();if(!Fc||!r)return;const s=document.createElement("a");s.href=e,s.download=e.split("/")[e.split("/").length-1],r.appendChild(s),s.click(),r.removeChild(s)},g_=e=>e.charAt(0).toUpperCase()+e.slice(1),Mv=e=>{const a=["Webkit","Moz","Ms","O"];return Object.keys(e).reduce((r,s)=>{const l=a.reduce((d,u)=>({...d,[`${u}${g_(s)}`]:e[s]}),{});return{...r,...l}},e)},mm=e=>typeof e=="number"&&(e^0)===e,fm=(e,a,r,s={loop:!0})=>{if(a===0)return 0;if(r===0)return e;if(!(e<0||e>a-1))return s.loop?Math.abs(a+r+e)%a:e+r<0||e+r>a-1?void 0:e+r},y_={0:[0],1:[-1,0,1],2:[-2,-1,0,1,2],3:[-3,-2,-1,0,1,2,3]},b_=e=>y_[e],RS=(e,a)=>{if(a<=1)return e;const r=(e%a+a)%a,s=r-a;return Math.abs(r)<=Math.abs(s)?r:s},v_=(e,a,r,s)=>{const l=a-e;return!s||r<=1?Math.abs(l):Math.abs(RS(l,r))},jS=(e,a)=>{let r;const s=((...l)=>{r!==void 0&&clearTimeout(r),r=setTimeout(()=>{r=void 0,e(...l)},a)});return s.cancel=()=>{r!==void 0&&(clearTimeout(r),r=void 0)},s},AS=class wn{constructor({position:a}={position:wn.CENTER_POSITION}){if(this.currentPosition=wn.CENTER_POSITION,this.debounceInterval=200,this.debounceResetPosition=jS(()=>{this.currentPosition=wn.CENTER_POSITION},this.debounceInterval),this.update=r=>{this.currentPosition={x:r.clientX,y:r.clientY},this.debounceResetPosition()},!Js)return wn.createFallback();if(window.__ZMAGE_GLOBAL_CLICK_MONITOR__)return window.__ZMAGE_GLOBAL_CLICK_MONITOR__;try{this.currentPosition=a,window.addEventListener("click",this.update),window.__ZMAGE_GLOBAL_CLICK_MONITOR__=this}catch{return wn.createFallback()}}static createFallback(){return{currentPosition:wn.CENTER_POSITION,destructor:()=>{}}}destructor(){if(Js)try{window.removeEventListener("click",this.update),window.__ZMAGE_GLOBAL_CLICK_MONITOR__=void 0}catch{}}};AS.CENTER_POSITION={x:0,y:0};var x_=AS,w_={38:!0,40:!0,33:!0,34:!0,35:!0,36:!0};function Cn(e){e.preventDefault()}function NS(e){if(e.keyCode in w_)return Cn(e),!1}var zS=!1;if(Js)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){zS=!0}}))}catch{}var Dv=zS?{passive:!1}:!1,MS=Fc?"onwheel"in document.createElement("div")?"wheel":"mousewheel":"wheel";function S_(){Js&&(window.addEventListener("DOMMouseScroll",Cn,!1),window.addEventListener(MS,Cn,Dv),window.addEventListener("touchmove",Cn,Dv),window.addEventListener("keydown",NS,!1))}function C_(){Js&&(window.removeEventListener("DOMMouseScroll",Cn,!1),window.removeEventListener(MS,Cn),window.removeEventListener("touchmove",Cn),window.removeEventListener("keydown",NS,!1))}var k_=(e,a)=>mm(e)&&e{var s,l;return((s=e==null?void 0:e.current)==null?void 0:s.getAttribute("src"))===((l=a[r])==null?void 0:l.src)},_v=(e,a,r)=>{const s=k_(a,r);return{page:s,pageIsCover:DS(e,r,s)}},T_=e=>{e!=null&&e.current&&(e.current.style.visibility="visible")},E_=(e,a)=>{if(e!=null&&e.current)return setTimeout(()=>{e!=null&&e.current&&(e.current.style.visibility="hidden"),a==null||a()},100)},_S=["top","right","bottom","left"],OS=["toolbar","pagination","caption","flip"],Ov=e=>{if(typeof e=="number"&&Number.isFinite(e))return`${e}px`;if(typeof e=="string"&&e.trim())return e.trim()},R_=(e,a)=>{if(typeof e=="number"||typeof e=="string"){const s=Ov(e);if(!s)return;const l={};return a.forEach(d=>{l[d]=s}),l}if(!e||typeof e!="object")return;const r={};return _S.forEach(s=>{const l=Ov(e[s]);l&&(r[s]=l)}),Object.keys(r).length>0?r:void 0},Lv=e=>!!e&&typeof e=="object",j_=(e,a)=>{const r={};return OS.forEach(s=>{const l=e==null?void 0:e[s],d=a==null?void 0:a[s];if(l||d){const u={...l,...d};Lv(l==null?void 0:l.inset)&&Lv(d==null?void 0:d.inset)&&(u.inset={...l.inset,...d.inset}),r[s]=u}}),r},LS=(e,a)=>e?j_(e,a?e.mobile:void 0):{},A_=e=>{switch(e){case"top-left":return["top","left"];case"top-center":return["top"];case"bottom-right":return["bottom","right"];case"bottom-left":return["bottom","left"];case"bottom-center":return["bottom"];case"left-center":return["left"];case"right-center":return["right"];case"top-right":default:return["top","right"]}},N_=(e,a)=>e==="toolbar"?A_(a):e==="flip"?["left","right"]:["bottom"],z_=(e,a,r,s)=>{const l=R_(r,s);l&&(_S.forEach(d=>{const u=l[d];u&&(e[`--zmage-${a}-${d}-offset`]=u)}),a!=="flip"&&(l.top&&!l.bottom&&(e[`--zmage-${a}-bottom-offset`]="auto"),l.bottom&&!l.top&&(e[`--zmage-${a}-top-offset`]="auto"),l.right&&!l.left&&(e[`--zmage-${a}-left-offset`]="auto",e[`--zmage-${a}-translate-x`]="0"),l.left&&!l.right&&(e[`--zmage-${a}-right-offset`]="auto",e[`--zmage-${a}-translate-x`]="0")))},M_=(e,a)=>{const r=e==null?void 0:e.layout;if(!r)return;const s=LS(r,a),l={};return OS.forEach(d=>{var u;z_(l,d,(u=s[d])==null?void 0:u.inset,N_(d,e.placement))}),Object.keys(l).length>0?l:void 0},ZS=[.6,0,.1,1],Eo=`cubic-bezier(${ZS.join(", ")})`,pt=350,Il="cubic-bezier(0, 0.1, 0.1, 1)",PS=(e,a=1)=>pt*a,BS=(e=1)=>`transform ${pt*e}ms ${Eo}, opacity ${pt*e}ms ${Eo}, filter ${pt*e}ms ${Eo}, clip-path ${pt*e}ms ${Eo}`,IS="auto",qS={threshold:120,velocity:.35,axisLock:1.2,resistance:.35},FS={threshold:80,velocity:.35,axisLock:1.2,opacity:!0},Uc={step:.12,smooth:!0,minScale:"fit",maxScale:4,center:"pointer",reverse:!1,exitGuardDuration:1e3},KS={minScale:"fit",maxScale:4,resetBelowFit:!0,center:"gesture"},US={scale:1,minScale:"fit",maxScale:4,center:"tap",interval:300,distance:32},dc={objectFit:!0,clip:!0,radius:!0},ff={src:"",alt:"",caption:"",set:[],defaultPage:0,preset:IS,controller:{},hotKey:{},animate:{},gesture:{},hideOnScroll:!0,hideOnDblClick:!1,coverVisible:!1,backdrop:"#FFFFFF",zIndex:1e3,radius:0,edge:0,loop:!0,loadingDelay:200,onBrowsing:()=>{},onZooming:()=>{},onSwitching:()=>{},onRotating:()=>{}},hf={...ff,radius:void 0,edge:void 0},HS={desktop:{radius:8,edge:16,controller:{pagination:!0,rotate:!0,zoom:!0,download:!1,close:!0,flip:!0,placement:"top-right",layout:{pagination:{inset:24},caption:{inset:60}}},hotKey:{close:!0,zoom:!0,flip:!0,rotate:!0,download:!1},animate:{browsing:!0,flip:"crossFade",cover:{...dc},slowMotion:!1},gesture:{swipe:!1,dragExit:!1,wheelZoom:{...Uc},pinchZoom:!1,doubleTapZoom:!1,touchAction:"managed"}},mobile:{radius:0,edge:0,controller:{pagination:!0,rotate:!1,zoom:!1,download:!1,close:!0,flip:!1,placement:"top-right"},hotKey:{close:!1,zoom:!1,flip:!1,rotate:!1,download:!1},animate:{browsing:!0,flip:"swipe",cover:{...dc},slowMotion:!1},gesture:{swipe:{...qS},dragExit:{...FS},wheelZoom:!1,pinchZoom:{...KS},doubleTapZoom:{...US},touchAction:"managed"}}},D_={...ff,...HS.desktop},__={...ff,...HS.mobile},GS=e=>{const a=e||IS;return a==="mobile"?"mobile":a==="desktop"?"desktop":a==="auto"?typeof window>"u"||typeof window.matchMedia!="function"?"desktop":window.matchMedia("(pointer: coarse) and (hover: none)").matches?"mobile":"desktop":"desktop"},O_=e=>GS(e)==="mobile"?__:D_,VS=e=>{const{className:a,style:r,onClick:s,forwardedRef:l,coverRef:d,destructor:u,src:m,alt:h,caption:g,set:y,defaultPage:b,preset:S,controller:T,hotKey:C,animate:x,gesture:k,hideOnScroll:R,coverVisible:j,backdrop:A,zIndex:M,radius:q,edge:P,loop:I,hideOnDblClick:X,loadingDelay:ae,onBrowsing:re,onZooming:te,onSwitching:J,onRotating:pe,onError:ne,browsing:ue,...O}=e;return{coverProps:{className:a,style:r,onClick:s,forwardedRef:l,src:m,alt:h,onError:ne},calleeProps:{coverRef:d,destructor:u},controlledProps:{browsing:ue},configProps:{defaultPage:b,set:Array.isArray(y)&&y.length>0?y:[{src:m,alt:h,caption:g,...O}],preset:S,controller:T,hotKey:C,animate:x,gesture:k,hideOnScroll:R,coverVisible:j,backdrop:A,zIndex:M,radius:q,edge:P,loop:I,hideOnDblClick:X,loadingDelay:ae,onBrowsing:re,onZooming:te,onSwitching:J,onRotating:pe,onError:ne},restProps:O}},L_=`transform ${pt}ms ${Il}, opacity ${pt}ms ${Il}, clip-path ${pt}ms ${Il}, border-radius ${pt}ms ${Il}`,Ct=e=>{var a,r;const s=(r=(a=e==null?void 0:e.viewportRef)==null?void 0:a.current)==null?void 0:r.getBoundingClientRect();return s&&s.width>0&&s.height>0?{left:s.left,top:s.top,width:s.width,height:s.height}:{left:0,top:0,width:c_(),height:d_()}},gf=(e,a,r=0,s=Ct(),l=0)=>l_(e,a,r,s,l),Zv={top:0,right:0,bottom:0,left:0},Z_=e=>{if(e===!1)return!1;const a=e&&typeof e=="object"?e.cover:void 0;return a===!1?!1:a&&typeof a=="object"?{...dc,...a}:{...dc}},P_=e=>e.top||e.right||e.bottom||e.left?e:void 0,Pv=(e,a,r)=>{const s=e||"50%";if(s==="center")return a*.5;if(r==="x"){if(s==="left")return 0;if(s==="right")return a}else{if(s==="top")return 0;if(s==="bottom")return a}if(s.endsWith("%")){const l=Number.parseFloat(s);return Number.isFinite(l)?a*(l/100):a*.5}if(s.endsWith("px")){const l=Number.parseFloat(s);return Number.isFinite(l)?l:a*.5}return a*.5},B_=(e,a,r)=>{const s=(e||"50% 50%").trim().split(/\s+/),[l,d="50%"]=s.length>0?s:["50%","50%"];return{x:Pv(l,a,"x"),y:Pv(d,r,"y")}},I_=(e,a,r,s,l)=>{if(!a||!r||!s||!l)return null;const d=e||"fill",u=s/a,m=l/r;return d==="cover"?Math.max(u,m):d==="contain"?Math.min(u,m):d==="none"?1:d==="scale-down"?Math.min(1,Math.min(u,m)):null},q_=e=>Math.max(0,Math.abs(e)<1e-4?0:e),ql=(e,a)=>q_(e/a),F_=({context:e,borderRadius:a,width:r,coverOptions:s})=>{var l;return s&&s.radius?h_(a,{ref:r}):(l=e.radius)!=null?l:0},hm=(e=0,a=1)=>{const r=Number.isFinite(a)&&a>0?a:1;return e/r},Bv=(e,a=0,r=1)=>{if(!e)return;const s=hm(a,r);return`inset(${e.top}px ${e.right}px ${e.bottom}px ${e.left}px round ${s}px)`},K_=e=>e==="zoom-enter"||e==="zoom-follow",U_=({role:e,motionPhase:a,touchTransition:r,flip:s,imageType:l})=>{if(r==="none"||a==="browsing-instant")return"none";if(e==="center"){if(l==="cover"||a==="browsing-follow")return"none";if(a==="zoom-enter")return L_;if(a==="zoom-follow"||a==="closing-follow")return"none"}return s===!1&&l!=="zooming"?"none":r},Iv=(e,a,r)=>{const{show:s,zoom:l}=e;return s?l?qa(e,a):WS(e,a):gm(e,a,r)},gm=(e,a,r)=>{const{coverRef:s,coverPos:l,rotate:d,pageIsCover:u}=e,m=Ct(e),h=Z_(e.animate);if(r&&r.state==="ended"&&r.lastResult.kind==="dragExit"&&r.lastResult.accepted)return{_type:"cover",_behavior:"merge",y:r.getOffset().y>0?m.height:-m.height};if(s.current){const{naturalWidth:g,naturalHeight:y}=s.current,{top:b,left:S,width:T,height:C}=s.current.getBoundingClientRect(),x=window.getComputedStyle(s.current),{opacity:k,borderRadius:R,objectFit:j,objectPosition:A}=x,M=F_({context:e,borderRadius:R,width:T,coverOptions:h}),q=u?{_type:"cover",x:S+T/2-(m.left+m.width/2),y:b+C/2-(m.top+m.height/2),opacity:Number(k)||1,scale:g?T/g:1,rotate:d-d%360,radius:M}:{_type:"cover",x:0,y:-m.height,opacity:0,scale:g?T/g:1,rotate:d-d%360,radius:M};if(!u||h===!1||!h.objectFit)return q;const P=I_(j,g,y,T,C);if(P==null)return q;const I=g*P,X=y*P,ae=T-I,re=C-X,te=B_(A,ae,re),J=S+te.x,pe=b+te.y,ne=h.clip?P_({top:ql(b-pe,P),right:ql(J+I-(S+T),P),bottom:ql(pe+X-(b+C),P),left:ql(S-J,P)}):void 0;return{_type:"cover",x:J+I/2-(m.left+m.width/2),y:pe+X/2-(m.top+m.height/2),opacity:Number(k)||1,scale:P,rotate:d-d%360,radius:M,clip:ne}}else return l?{_type:"cover",x:l.x?l.x-(m.left+m.width/2):0,y:l.y?l.y-(m.top+m.height/2):0,opacity:0,scale:0,rotate:0,radius:0}:{_type:"cover",x:0,y:0,opacity:0,scale:0,rotate:0,radius:0}},H_=(e,a,r)=>{var s,l,d,u,m,h,g,y,b,S,T,C;const x=(R,j)=>R+(j-R)*r,k=(R,j)=>{if(!R&&!j)return;const A=R||Zv,M=j||Zv;return{top:x(A.top,M.top),right:x(A.right,M.right),bottom:x(A.bottom,M.bottom),left:x(A.left,M.left)}};return{_type:"cover",x:x((s=e.x)!=null?s:0,(l=a.x)!=null?l:0),y:x((d=e.y)!=null?d:0,(u=a.y)!=null?u:0),scale:x((m=e.scale)!=null?m:0,(h=a.scale)!=null?h:0),rotate:x((g=e.rotate)!=null?g:0,(y=a.rotate)!=null?y:0),opacity:x((b=e.opacity)!=null?b:1,(S=a.opacity)!=null?S:1),radius:x((T=e.radius)!=null?T:0,(C=a.radius)!=null?C:0),clip:k(e.clip,a.clip)}},G_=(e,a,r,s)=>{const l=(u,m,h)=>3*(1-u)**2*u*m+3*(1-u)*u**2*h+u**3,d=(u,m,h)=>3*(1-u)**2*m+6*(1-u)*u*(h-m)+3*u**2*(1-h);return u=>{if(u<=0)return 0;if(u>=1)return 1;let m=u;for(let h=0;h<8;h++){const g=l(m,e,r)-u,y=d(m,e,r);if(Math.abs(y)<1e-6)break;m=Math.max(0,Math.min(1,m-g/y))}return l(m,a,s)}},V_=G_(...ZS),WS=(e,a)=>{var r,s,l,d,u;const{coverRef:m,edge:h,page:g,radius:y,rotate:b,set:S}=e,T=((r=a.current)==null?void 0:r.naturalWidth)||0,C=((s=a.current)==null?void 0:s.naturalHeight)||0,x=!!m.current&&m.current.getAttribute("src")===((l=S==null?void 0:S[g])==null?void 0:l.src),k=T||(x?(d=m.current)==null?void 0:d.naturalWidth:0)||0,R=C||(x?(u=m.current)==null?void 0:u.naturalHeight:0)||0;return{_type:"browsing",x:0,y:0,opacity:1,scale:gf(k,R,h,Ct(e),b),rotate:b,radius:y}},qa=(e,a,r={},s={})=>{var l,d,u;const{radius:m,rotate:h}=e,{naturalWidth:g=0,naturalHeight:y=0}=a.current||{},b=Number.isFinite(s.scale)&&((l=s.scale)!=null?l:0)>0?s.scale:1,S=Ct(e),T=S.width,C=S.height,x=(d=r.clientX)!=null?d:S.left+T/2,k=(u=r.clientY)!=null?u:S.top+C/2,R=x-S.left,j=k-S.top,A=ES({naturalWidth:g,naturalHeight:y,viewport:S,scale:b,edge:$S(e),rotate:h}),M=T>0?R/T:.5,q=C>0?j/C:.5,P=A.maxX>0?A.maxX-(A.maxX-A.minX)*M:0,I=A.maxY>0?A.maxY-(A.maxY-A.minY)*q:0;return{_type:"zooming",x:P,y:I,opacity:1,scale:b,rotate:h,radius:m}},W_=16,uc=(e,a,r)=>Math.min(Math.max(e,a),r),$S=e=>{var a;return pf((a=e.edge)!=null?a:0)},$_=.35,qv=(e,a,r,s=$_)=>er?r+(e-r)*s:e,YS=(e,a,r=1)=>{const{naturalWidth:s=0,naturalHeight:l=0}=a.current||{},d=Ct(e);return ES({naturalWidth:s,naturalHeight:l,viewport:d,scale:r,edge:$S(e),rotate:e.rotate})},Fv=(e,a,r)=>{var s,l;const d=Number.isFinite(r.scale)&&((s=r.scale)!=null?s:0)>0?r.scale:1,u=YS(e,a,d);return{...r,_type:"zooming",scale:d,x:uc((l=r.x)!=null?l:0,u.minX,u.maxX),y:uc(r.y,u.minY,u.maxY)}},Y_=(e,a,r)=>{var s,l;const d=Number.isFinite(r.scale)&&((s=r.scale)!=null?s:0)>0?r.scale:1,u=YS(e,a,d);return{...r,_type:"zooming",scale:d,x:qv((l=r.x)!=null?l:0,u.minX,u.maxX),y:qv(r.y,u.minY,u.maxY)}},ym=(e,a,r)=>{var s,l,d;const{naturalWidth:u=0,naturalHeight:m=0}=a.current||{},h=gf(u,m,(s=e.edge)!=null?s:0,Ct(e),(l=e.rotate)!=null?l:0),g=r.minScale==="fit"||r.minScale==null?h:r.minScale,y=Number.isFinite(g)&&g>0?g:h||1,b=Number.isFinite(r.maxScale)&&((d=r.maxScale)!=null?d:0)>=y?r.maxScale:y;return{minScale:y,maxScale:b,fitScale:h}},X_=(e,a=Ct())=>{const r=Number.isFinite(e.deltaY)?e.deltaY:0;return e.deltaMode===1?r*W_:e.deltaMode===2?r*a.height:r},Q_=({currentScale:e,pixelDeltaY:a,step:r,minScale:s,maxScale:l})=>{const d=Number.isFinite(s)&&s>0?s:.01,u=Number.isFinite(l)&&l>=d?l:d,m=Number.isFinite(e)&&e>0?e:d,h=Number.isFinite(r)&&r>0?r:Uc.step,g=Number.isFinite(a)?a:0,y=m*Math.exp(-g/100*h);return uc(y,d,u)},J_=(e,a,r)=>{const{minScale:s,maxScale:l}=ym(e,a,r);return{minScale:s,maxScale:l}},Kv=e=>{if(e.length<2)return 0;const a=e[0],r=e[1];return Math.hypot(r.clientX-a.clientX,r.clientY-a.clientY)},eO=e=>{if(e.length<2)return{clientX:0,clientY:0};const a=e[0],r=e[1];return{clientX:(a.clientX+r.clientX)/2,clientY:(a.clientY+r.clientY)/2}},tO=({baseScale:e,startDistance:a,currentDistance:r,minScale:s,maxScale:l})=>{const d=Number.isFinite(a)&&a>0?a:1,u=Number.isFinite(e)&&e>0?e:1,m=Number.isFinite(r)&&r>0?r:d,h=Number.isFinite(s)&&s>0?s:.01,g=Number.isFinite(l)&&l>=h?l:h;return uc(u*(m/d),h,g)},oO=30,XS=10,aO=.08,QS={fade:{offset:0,overflow:0,opacity:0},crossFade:{offset:oO,overflow:0,opacity:0},swipe:{offset:0,overflow:0,opacity:1},zoom:{offset:0,overflow:aO,opacity:0},blur:{offset:0,overflow:.018,opacity:0,blur:14},none:{offset:0,overflow:0,opacity:0}},nO={offset:0,overflow:0,opacity:0},rO=e=>Ct(e).width+XS,sO=({flipKind:e,baseOffset:a,ownScale:r,dims:s,viewport:l})=>{if(e!=="swipe"||r==null||!s)return a;const d=r+QS.swipe.overflow,u=s.w*d/2;return Math.max(a,l.width/2+u+XS)};function Uv(e,a){const r=typeof e=="object"&&e!==null?e:void 0,s=r?a:e;if(!s)return nO;const l=QS[s];return s==="swipe"?{...l,offset:rO(r)}:l}var Tr=5,qs=(e,a,r)=>a===!1?!1:a===!0?{...r}:a&&typeof a=="object"?{...r,...e&&typeof e=="object"?e:r,...a}:e===!1?!1:e===!0?{...r}:e&&typeof e=="object"?{...r,...e}:!1,iO=(e,a={})=>{if(e===!1)return{swipe:!1,dragExit:!1,wheelZoom:!1,pinchZoom:!1,doubleTapZoom:!1,touchAction:"auto"};const r=e&&typeof e=="object"?e:{},s=lO(r.touchAction,a.touchAction);return{swipe:qs(a.swipe,r.swipe,qS),dragExit:qs(a.dragExit,r.dragExit,FS),wheelZoom:qs(a.wheelZoom,r.wheelZoom,Uc),pinchZoom:qs(a.pinchZoom,r.pinchZoom,KS),doubleTapZoom:qs(a.doubleTapZoom,r.doubleTapZoom,US),touchAction:s}},Hv=e=>e==="managed"||e==="auto"||e==="manipulation"||e==="none",lO=(e,a)=>Hv(e)?e:Hv(a)?a:"managed",cO=e=>{const a=e==null?void 0:e.touchAction;return a==="auto"||a==="manipulation"||a==="none"?a:e!=null&&e.pinchZoom&&typeof e.pinchZoom=="object"?"none":e!=null&&e.doubleTapZoom&&typeof e.doubleTapZoom=="object"?"manipulation":"auto"},dO=class{constructor(e,a={}){this.options=e,this.tap=r=>{const s=this.now(),l=this.lastTap;if(l){const d=s-l.time,u=Math.hypot(r.x-l.point.x,r.y-l.point.y);if(d>=0&&d<=this.options.interval&&u<=this.options.distance)return this.lastTap=void 0,!0}return this.lastTap={point:r,time:s},!1},this.cancel=()=>{this.lastTap=void 0},this.now=a.now||(()=>Date.now())}},Gv=()=>({kind:"none",accepted:!1,offset:{x:0,y:0},distance:{x:0,y:0},velocity:{x:0,y:0}}),vr=class{constructor(e={},a={}){this.gesture=e,this.state="idle",this.lastResult=Gv(),this.startPoint={x:0,y:0},this.currentPoint={x:0,y:0},this.startTime=0,this.start=r=>(this.startPoint=r,this.currentPoint=r,this.startTime=this.now(),this.state="detecting",this.lastResult=Gv(),this),this.move=r=>this.state==="idle"||this.state==="ended"?this:(this.currentPoint=r,this.state==="detecting"&&this.lockGesture(),this),this.end=()=>{const r=this.getOffset(),s=this.getDistance(),l=Math.max(this.now()-this.startTime,1),d={x:s.x/l,y:s.y/l},u={kind:"none",accepted:!1,offset:r,distance:s,velocity:d};return this.state==="swiping"&&this.swipeOptions?(u.kind="swipe",u.accepted=s.x>=this.swipeOptions.threshold||d.x>=this.swipeOptions.velocity):this.state==="dragExiting"&&this.dragExitOptions&&(u.kind="dragExit",u.accepted=s.y>=this.dragExitOptions.threshold||d.y>=this.dragExitOptions.velocity),this.state="ended",this.lastResult=u,u},this.getOffset=()=>({x:this.currentPoint.x-this.startPoint.x,y:this.currentPoint.y-this.startPoint.y}),this.getDistance=()=>{const r=this.getOffset();return{x:Math.abs(r.x),y:Math.abs(r.y)}},this.getVisualOffset=()=>{const r=this.getOffset();return this.state==="swiping"?{x:r.x,y:0}:this.state==="dragExiting"?{x:0,y:r.y}:this.isAcceptedDragExitEnd()?{x:0,y:this.lastResult.offset.y}:{x:0,y:0}},this.getTouchConfig=(r={})=>{const s=this.getVisualOffset(),l=this.getVisualOpacity();this.state==="swiping"&&typeof r.resistance=="number"&&(s.x*=r.resistance);const d=this.state==="swiping"||this.state==="dragExiting";return{touch:s,opacity:l,transition:d||this.isAcceptedDragExitEnd()?"none":this.state==="ended"?BS():void 0}},this.ownsGesture=()=>this.state==="swiping"||this.state==="dragExiting",this.getVisualOpacity=()=>{const r=this.dragExitOptions;if(!(this.state==="dragExiting"||this.isAcceptedDragExitEnd())||!r||r.opacity===!1)return;const l=this.isAcceptedDragExitEnd()?this.lastResult.distance.y:this.getDistance().y,d=Math.min(l/(r.threshold*2),1);return Math.max(.35,1-d)},this.isAcceptedDragExitEnd=()=>this.state==="ended"&&this.lastResult.kind==="dragExit"&&this.lastResult.accepted,this.lockGesture=()=>{const r=this.getDistance();if(r.x=Tr&&r.x>=r.y*s.axisLock){this.state="swiping";return}l&&r.y>=Tr&&r.y>=r.x*l.axisLock&&(this.state="dragExiting")},this.now=a.now||(()=>Date.now())}get swipeOptions(){return this.gesture.swipe&&typeof this.gesture.swipe=="object"?this.gesture.swipe:null}get dragExitOptions(){return this.gesture.dragExit&&typeof this.gesture.dragExit=="object"?this.gesture.dragExit:null}},aa=e=>{if(e===!1)return!1;if(e&&typeof e=="object")return e.flip},uO=new Set(["top-right","top-left","bottom-right","bottom-left","top-center","bottom-center","left-center","right-center"]),pO=/^([+-]?(?:\d+|\d*\.\d+))(?:[a-z%]*)$/i;function mO(e){return typeof e=="string"&&uO.has(e)?e:"top-right"}var fO={"top-right":ze.topRight,"top-left":ze.topLeft,"bottom-right":ze.bottomRight,"bottom-left":ze.bottomLeft,"top-center":ze.topCenter,"bottom-center":ze.bottomCenter,"left-center":ze.leftCenter,"right-center":ze.rightCenter},hO=e=>!!e&&typeof e=="object",Vv=e=>{if(typeof e=="number")return Number.isFinite(e)&&e!==0;if(typeof e!="string")return!1;const a=e.trim();if(!a)return!1;const r=a.match(pO);return r?Number(r[1])!==0:!0},Wv=(e,a)=>hO(e)?Vv(e[a]):Vv(e);function bn(e,a,r,s,l,d,u,m,h,g,y,b){return typeof e=="boolean"||typeof e=="string"?!!e&&Q.createElement("div",{ref:y,id:r,className:s,style:h,onClick:g?void 0:l},Q.createElement(a,{color:typeof e=="string"?e:b||""})):Q.isValidElement(e)?Q.cloneElement(e,{show:d,zoom:u,onClick:l,disabled:g,color:b}):null}function gO(){var e;const{set:a,presetIsMobile:r,controller:s,animate:l,backdrop:d,loop:u,show:m,zoom:h,page:g,canZoom:y,zoomShakeKey:b,flipReadyPrev:S,flipReadyNext:T,motion:C,outBrowsing:x,toPage:k,toPrevPage:R,toNextPage:j,toggleZoom:A,toggleRotate:M}=v.useContext(qr),q=!r&&!y,P=s||{},I=(e=P.backdrop)!=null?e:d,X=P.color,ae=v.useRef(null);v.useEffect(()=>{if(b===0)return;const xt=ae.current;xt&&(xt.classList.remove(ze.shake),xt.offsetWidth,xt.classList.add(ze.shake))},[b]);const re=(l==null?void 0:l.browsing)===!1?{transition:"none"}:C.controlTransition?{transition:C.controlTransition}:void 0,te=(l==null?void 0:l.browsing)===!1?{transition:"none"}:C.controlItemTransition?{transition:C.controlItemTransition}:void 0,J={backgroundColor:I,color:X,...re},pe={backgroundColor:I,color:X,...te},ne=mO(P.placement),ue=LS(P.layout,r).flip,O=Wv(ue==null?void 0:ue.inset,"left"),V=Wv(ue==null?void 0:ue.inset,"right"),H=()=>{const xt=Array.isArray(a)?a[g]:void 0;xt&&(typeof window<"u"&&typeof window.open=="function"?window.open(xt.src):A())},Y=P.rotateLeft||P.rotate,se=P.rotateRight||P.rotate,K=!!(Y||se||P.download||P.zoom||P.close)?Q.createElement("div",{id:"zmageControl","data-placement":ne,className:no(ze.controls,fO[ne],{[ze.show]:!h&&m}),style:J},bn(Y,a_,"zmageControlRotateLeft",no(ze.rotateLeft,{[ze.show]:!h&&m}),M("left"),m,h,void 0,te,void 0,void 0,X),bn(se,n_,"zmageControlRotateRight",no(ze.rotateRight,{[ze.show]:!h&&m}),M("right"),m,h,void 0,te,void 0,void 0,X),bn(P.download,e_,"zmageControlDownload",no(ze.download,{[ze.show]:!h&&m}),()=>{var xt;return((xt=a[g])==null?void 0:xt.src)&&pm(a[g].src)},m,h,void 0,te,void 0,void 0,X),bn(P.zoom,r_,"zmageControlZoom",no(ze.zoom,{[ze.show]:!h&&m,[ze.disabled]:q}),r?H:()=>A(),m,h,void 0,te,q,ae,X),bn(P.close,JD,"zmageControlClose",no(ze.close,{[ze.show]:!h&&m}),h?()=>A():x,m,h,void 0,te,void 0,void 0,X)):null,ee=a.length,oe=a[g],fe=aa(l),he=ee>1&&fe!=="none"&&fe!==!1,ye=ee>1&&(u||g>0),Ke=ee>1&&(u||g1?Q.isValidElement(P.pagination)?Q.cloneElement(P.pagination,{show:m,zoom:h,onClick:k}):!!P.pagination&&Q.createElement("div",{id:"zmageControlPagination",className:no(ze.pages,{[ze.show]:!h&&m,[ze.mobile]:r}),style:J},a.map((xt,pa)=>pa===g?Q.createElement("span",{key:pa,id:"zmageControlPaginationActive",className:ze.blackDot}):Q.createElement("span",{key:pa,className:ze.whiteDot,onClick:()=>k(pa)}))):null,Xa=typeof(oe==null?void 0:oe.src)=="string"&&oe.src.length>0,Ur={close:x,zoom:()=>{!h&&!y||A()},rotateLeft:M("left"),rotateRight:M("right"),prev:()=>{xe&&R()},next:()=>{vt&&j()},toPage:k,download:()=>{oe!=null&&oe.src&&pm(oe.src)}},Nn={show:m,zoom:h,page:g,total:ee,canZoom:y,canPrev:xe,canNext:vt,canDownload:Xa,preset:r?"mobile":"desktop",placement:ne,current:oe},xo={Toolbar:K,Pagination:ua,FlipLeft:so,FlipRight:Dt};return typeof P.render=="function"?Q.createElement(v.Fragment,null,P.render({state:Nn,actions:Ur,slots:xo})):Q.createElement(v.Fragment,null,K,so,Dt,ua)}var Fl={caption:"caption__JgbQx",show:"show__tlkZ3",mobile:"mobile__5qSC9",switchFade:"switchFade__T69y8",capFade:"capFade__x70-f",switchCrossFade:"switchCrossFade__X9cH8",capCrossFade:"capCrossFade__7nIUY",switchSwipe:"switchSwipe__1UDK0",capSwipe:"capSwipe__4eDDl",switchZoom:"switchZoom__27vZs",capZoom:"capZoom__-hpdF",switchBlur:"switchBlur__DwX02",capBlur:"capBlur__6kymE"},yO={fade:"switchFade",crossFade:"switchCrossFade",swipe:"switchSwipe",zoom:"switchZoom",blur:"switchBlur"},Pp=e=>!!e&&typeof e=="object"&&typeof e.text=="string";function bO(){var e;const{set:a,page:r,show:s,zoom:l,presetIsMobile:d,animate:u,motion:m}=v.useContext(qr),h=Array.isArray(a)?(e=a[r])==null?void 0:e.caption:void 0,g=Pp(h)?h.text:typeof h=="string"?h:"",y=`${r}:${g}`,b=v.useRef(y),S=v.useRef(void 0),[T,C]=v.useState(!1),x=aa(u),k=x!==!1?x:void 0;if(v.useEffect(()=>{b.current!==y&&(b.current=y,s&&!l&&k&&k!=="none"&&(C(!0),S.current!==void 0&&clearTimeout(S.current),S.current=setTimeout(()=>{S.current=void 0,C(!1)},pt)))},[k,y,s,l]),v.useEffect(()=>()=>{S.current!==void 0&&clearTimeout(S.current)},[]),!g)return null;const R=Pp(h)?h.style:void 0,j=Pp(h)?h.className:void 0,A=T?void 0:(u==null?void 0:u.browsing)===!1?{transition:"none"}:m.captionTransition?{transition:m.captionTransition}:void 0,M=T&&k&&k!=="none"?Fl[yO[k]]:void 0;return Q.createElement("div",{id:"zmageCaption",className:no(Fl.caption,{[Fl.show]:!l&&s,[Fl.mobile]:d},M,j),style:{...R,...A}},g)}var Kl={imageLayer:"imageLayer__yjPf3",zooming:"zooming__3mMU7",invalidate:"invalidate__MJYkk",jumpFadeIn:"jumpFadeIn__4wa75"},Ul={loadingContainer:"loadingContainer__-joiS",show:"show__-FZiR",reload:"reload__bc5Ze",loading:"loading__I-J4i"};function vO({show:e,load:a,invalidate:r,onReload:s,backdrop:l}){return Q.createElement(v.Fragment,null,(a||r)&&Q.createElement("div",{id:"zmageLoading",className:no(Ul.loadingContainer,{[Ul.show]:e})},a&&Q.createElement("div",{className:Ul.loading},Q.createElement(t_,null)),r&&Q.createElement("button",{className:Ul.reload,onClick:s,style:{background:l}},Q.createElement(o_,null))))}var Do=1,xO=10,Hc=e=>e!==!1&&typeof e=="object"&&e.slowMotion===!0,JS=e=>e&&e>Do?e:Do,Gc=(e,a=!1)=>e!=null&&e.shiftKey&&a?xO:Do,Bp=e=>{const a=JS(e),r=PS(!0,a);return a===Do?{durationMultiplier:a,browsingDuration:r,backgroundShowDelay:".15s"}:{durationMultiplier:a,browsingDuration:r,browsingTransition:BS(a),controlTransition:`transform ${pt*a}ms ${Eo}, opacity ${pt*a}ms ${Eo}`,controlItemTransition:`transform ${pt/2*a}ms ${Eo}, opacity ${pt*a}ms ${Eo}`,backgroundTransition:`opacity ${200*a}ms`,backgroundShowDelay:`${150*a}ms`,captionTransition:`transform ${pt*a}ms ${Eo}, opacity ${pt*a}ms ${Eo}`}},wO=(e,a)=>e??a.browsingTransition,Hl=.05,$v=.35,Ip={passive:!0},SO={passive:!1},CO={passive:!1},Yv=.001,kO=450,eC=class extends Q.Component{constructor(){super(...arguments),this.imageRef=Q.createRef(),this.sideImageAbortCleanups=new Map,this.initialPageOffset=typeof window<"u"?window.pageYOffset:0,this.pendingRafHandles=[],this.motionPhase="idle",this.pinchSequenceLocked=!1,this.suppressSyntheticClickUntil=0,this.wheelZoomExitGuardUntil=0,this.pendingDimCalibration=null,this.touchGesture=new vr,this.state={isFetching:!0,invalidate:!1,currentStyle:gm(this.context),animateConfig:Uv(this.context,aa(this.context.animate)),touchGesture:this.touchGesture,timestamp:{},imageDimensions:{}},this.updateZoomEventListenerWithState=()=>{const{show:e,zoom:a}=this.context;e&&a&&!this.listeningMouseMove?(window.addEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!0):(window.removeEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!1);const r=e&&!!this.getWheelZoomOptions()&&(a||this.isWheelZoomExitGuardActive());r&&!this.listeningWheelZoom?(window.addEventListener("wheel",this.handleWheel,CO),this.listeningWheelZoom=!0):!r&&this.listeningWheelZoom&&(window.removeEventListener("wheel",this.handleWheel),this.listeningWheelZoom=!1)},this.updateCurrentImageStyle=()=>{const{touchGesture:e}=this.state,a=this.context.zoom&&(this.context.zoomTrigger==="keyboard"||this.context.zoomTrigger==="doubleTap")?this.getZoomingStyleFromStoredPosition():Iv(this.context,this.imageRef,e);this.setCurrentStyle(a,()=>{a._type==="zooming"&&(this.motionPhase==="zoom-enter"?this.scheduleZoomEnterComplete():this.consumePendingZoomMousePosition())})},this.updateCurrentImageStyleWithoutBrowsingTransition=()=>{const{touchGesture:e}=this.state,a=Iv(this.context,this.imageRef,e);this.motionPhase="browsing-instant",this.setCurrentStyle(a,this.scheduleBrowsingInstantReset)},this.startBrowsingInTransition=()=>{this.debounceUpdateCurrentImageStyle.cancel();const e=this.getCoverTargetStyle(this.getCurrentVisualStyle());this.startCoverFollow({phase:"browsing-follow",from:e,getTarget:()=>WS(this.context,this.imageRef),fallback:this.debounceUpdateCurrentImageStyle})},this.scheduleBrowsingInstantReset=({refreshStyle:e=!1}={})=>{this.cancelBrowsingTransitionFrame(),this.browsingTransitionRaf=window.requestAnimationFrame(()=>{this.browsingTransitionRaf=void 0,this.motionPhase==="browsing-instant"&&(this.motionPhase="idle",e&&this.setCurrentStyle(this.state.currentStyle),this.maybeStartFlipPreload())})},this.cancelBrowsingTransitionFrame=()=>{this.browsingTransitionRaf!==void 0&&(window.cancelAnimationFrame(this.browsingTransitionRaf),this.browsingTransitionRaf=void 0)},this.updateCurrentImageStyleForKeyboardZoom=()=>{const e=this.getZoomingStyleFromStoredPosition();this.setCurrentStyle(e,this.scheduleZoomEnterComplete)},this.updateCurrentImageStyleForStoredZoom=()=>{const e=this.getZoomingStyleFromStoredPosition();this.setCurrentStyle(e,this.scheduleZoomEnterComplete)},this.debounceUpdateCurrentImageStyle=jS(this.updateCurrentImageStyle,50),this.handleResize=()=>{const{show:e,zoom:a}=this.context;e&&!a?(this.debounceUpdateCurrentImageStyle.cancel(),this.motionPhase==="browsing-follow"?this.syncBrowsingFollowTarget():this.updateCurrentImageStyleWithoutBrowsingTransition()):this.debounceUpdateCurrentImageStyle(),this.reportCanZoom()},this.handleScroll=()=>{if(this.imageRef.current){const{show:e}=this.context;if(this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")return;this.imageRef.current.style.top=`calc(50% + ${e?0:this.initialPageOffset-window.pageYOffset}px)`}},this.handleClick=e=>{if(this.shouldSuppressSyntheticClick()){this.suppressSyntheticClickUntil=0,e.preventDefault(),e.stopPropagation();return}const{zoom:a,toggleZoom:r}=this.context;a&&r()},this.handleRecordImageDimensions=(e,a)=>{const r=a.currentTarget,s=r.naturalWidth,l=r.naturalHeight;!s||!l||this.setState(d=>{const u=d.imageDimensions[e];return u&&u.w===s&&u.h===l?null:{imageDimensions:{...d.imageDimensions,[e]:{w:s,h:l}}}})},this.markFlipReadyFromStep=e=>{Math.abs(e)===1&&this.context.setFlipReady(e<0?-1:1)},this.handleSideImageLoad=(e,a,r)=>{this.handleRecordImageDimensions(a,r),this.markFlipReadyFromStep(e)},this.handleSideImageTerminal=e=>{this.markFlipReadyFromStep(e)},this.setCenterImageRef=e=>{var a;(a=this.detachCenterImageAbort)==null||a.call(this),this.detachCenterImageAbort=void 0,this.imageRef.current=e,e&&(e.addEventListener("abort",this.handleImageAbort),this.detachCenterImageAbort=()=>e.removeEventListener("abort",this.handleImageAbort))},this.setSideImageAbortRef=(e,a)=>r=>{const s=this.sideImageAbortCleanups.get(e);if(s&&(s(),this.sideImageAbortCleanups.delete(e)),!r)return;const l=()=>this.handleSideImageTerminal(a);r.addEventListener("abort",l),this.sideImageAbortCleanups.set(e,()=>r.removeEventListener("abort",l))},this.shouldDeferFlipPreload=()=>{const{set:e,animate:a}=this.context,r=aa(a);return Array.isArray(e)&&e.length>1&&r!=="none"&&r!==!1},this.syncFlipReadyFromLoadedDimensions=()=>{const{flipPreloadStarted:e,loop:a=!1,page:r,set:s,setFlipReady:l}=this.context;!e||!this.shouldDeferFlipPreload()||[-1,1].forEach(d=>{const u=fm(r,s.length,d,{loop:a});mm(u)&&this.state.imageDimensions[u]&&l(d)})},this.maybeStartFlipPreload=()=>{const{show:e,zoom:a,flipPreloadStarted:r,startFlipPreload:s}=this.context;if(!(!e||a||!this.shouldDeferFlipPreload())&&!(this.motionPhase==="browsing-follow"||this.motionPhase==="closing-follow")&&this.state.currentStyle._type==="browsing"){if(!r){s();return}this.syncFlipReadyFromLoadedDimensions()}},this.handleDoubleClick=()=>{const{hideOnDblClick:e,outBrowsing:a}=this.context;e&&a()},this.handleTouchStart=e=>{if(this.completeBrowsingFollow({startFlipPreload:!1}),this.tryStartPinchGesture(e)||e.touches.length>1||this.pinchSequenceLocked)return;const a=this.getTouchPoint(e);a&&(this.tryStartZoomTouchPan(a)||(this.touchGesture=new vr(this.getActiveGesture()).start(a),this.setTouchGesture(this.touchGesture)))},this.handleTouchMove=e=>{if(this.pinchGestureSession){this.updatePinchGesture(e);return}if(this.tryStartPinchGesture(e)||e.touches.length>1||this.pinchSequenceLocked||this.updateZoomTouchPan(e))return;const a=this.getTouchPoint(e);if(!a)return;const r=this.touchGesture.move(a);r.ownsGesture()&&e.preventDefault(),this.setTouchGesture(r)},this.handleTouchEnd=e=>{if(this.pinchGestureSession||this.pinchSequenceLocked){this.endPinchGesture(e);return}if(this.endZoomTouchPan()||this.tryHandleDoubleTapGesture(e))return;const a=this.touchGesture.end();this.setTouchGesture(this.touchGesture,()=>this.commitTouchGestureResult(a))},this.handleTouchCancel=()=>{this.clearPinchGesture(),this.clearZoomTouchPan(),this.touchGesture=new vr,this.setTouchGesture(this.touchGesture)},this.handleMouseMove=e=>{const{zoom:a}=this.context;if(!a)return;const r={x:e.clientX,y:e.clientY};if(this.zoomPointerPosition=r,this.motionPhase==="zoom-enter"||this.state.currentStyle._type!=="zooming"){this.pendingZoomMousePosition=r;return}const s=qa(this.context,this.imageRef,e,{scale:this.getCurrentZoomTargetScale()});this.startZoomFollow(s)},this.handleWheel=e=>{const a=this.getWheelZoomOptions();if(!this.context.show||!a)return;if(!this.context.zoom){this.isWheelZoomExitGuardActive()&&e.preventDefault();return}e.preventDefault();const r=Ct(this.context),s=X_(e,r),l=a.reverse?-s:s;if(l===0)return;const{minScale:d,maxScale:u}=J_(this.context,this.imageRef,a),m=Q_({currentScale:this.getCurrentZoomTargetScale(),pixelDeltaY:l,step:a.step,minScale:d,maxScale:u});this.zoomTargetScale=m;const h=this.getWheelZoomFocus(e,a,r);this.zoomPointerPosition={x:h.clientX,y:h.clientY};const g=qa(this.context,this.imageRef,h,{scale:m});if(l>0&&m<=d+Yv){this.startWheelZoomExitGuard(a.exitGuardDuration),this.context.toggleZoom("wheel");return}if(a.smooth===!1){this.applyZoomStyleImmediately(g);return}this.startZoomFollow(g)},this.handleImageLoadStart=()=>{var e;this.setState({invalidate:!1}),this.handleDetectImageLoadComplete(),this.loadingShowDelayTimer!==void 0&&clearTimeout(this.loadingShowDelayTimer);const a=(e=this.context.loadingDelay)!=null?e:200;this.loadingShowDelayTimer=setTimeout(()=>{this.loadingShowDelayTimer=void 0,this.setState({isFetching:!0})},a)},this.handleDetectImageLoadComplete=()=>{clearInterval(this.imageLoadingTimer),this.imageLoadingTimer=m_(this.imageRef.current,this.handleImageLoadEnd)},this.handleImageLoadEnd=({invalidate:e}={invalidate:!1})=>{this.loadingShowDelayTimer!==void 0&&(clearTimeout(this.loadingShowDelayTimer),this.loadingShowDelayTimer=void 0),clearInterval(this.imageLoadingTimer),this.setState({isFetching:!1,invalidate:e===void 0?this.state.invalidate:e})},this.handleImageLoad=()=>{const{animate:e,show:a,zoom:r}=this.context;this.motionPhase==="browsing-follow"?this.syncBrowsingFollowTarget():(e==null?void 0:e.browsing)===!1&&a&&!r?this.updateCurrentImageStyleWithoutBrowsingTransition():this.debounceUpdateCurrentImageStyle(),this.reportCanZoom(),this.handleImageLoadEnd()},this.reportCanZoom=()=>{var e,a;const{setCanZoom:r}=this.context;if(typeof r!="function")return;const s=this.imageRef.current;if(!s)return;const{naturalWidth:l,naturalHeight:d}=s;if(!l||!d)return;const u=Ct(this.context);if(!u.width||!u.height)return;const m=TS({naturalWidth:l,naturalHeight:d,edge:(e=this.context.edge)!=null?e:0,viewport:u,rotate:(a=this.context.rotate)!=null?a:0});r(m.canZoom)},this.handleImageError=e=>{this.handleImageLoadEnd({invalidate:!0});const{onError:a}=this.context;typeof a=="function"&&a(e)},this.handleImageAbort=()=>{this.handleImageLoadEnd({invalidate:!0})},this.handleImageReload=()=>{const{page:e}=this.context;this.handleSetTimestamp(e)},this.handleSetTimestamp=e=>{const{set:a}=this.context,{timestamp:r}=this.state;this.setState({timestamp:{...r,[a[e].src]:new Date().getTime()}})},this.handleGetTimestamp=e=>{const{set:a}=this.context,{timestamp:r}=this.state;return r[a[e].src]},this.setCurrentStyle=(e,a)=>{const{animate:r}=this.context,{currentStyle:s}=this.state;this.setState({currentStyle:e._behavior==="merge"?{...s,...e}:e,animateConfig:Uv(this.context,aa(r))},a)},this.startZoomEnter=()=>{this.debounceUpdateCurrentImageStyle.cancel(),this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.zoomPointerPosition=void 0,this.zoomTargetScale=1,this.clearWheelZoomExitGuard(),this.motionPhase="zoom-enter"},this.startStoredZoomEnter=()=>{this.debounceUpdateCurrentImageStyle.cancel(),this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.clearWheelZoomExitGuard(),this.motionPhase="zoom-enter"},this.startKeyboardZoomEnter=()=>{this.debounceUpdateCurrentImageStyle.cancel(),this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.zoomPointerPosition=this.context.zoomPosition,this.zoomTargetScale=1,this.clearWheelZoomExitGuard(),this.motionPhase="zoom-enter"},this.resetZoomMotionState=()=>{this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.zoomPointerPosition=void 0,this.zoomTargetScale=void 0,this.clearPinchGesture(),this.clearZoomTouchPan(),K_(this.motionPhase)&&(this.motionPhase="idle")},this.cancelZoomEnterTimer=()=>{this.zoomEnterTimer!==void 0&&(clearTimeout(this.zoomEnterTimer),this.zoomEnterTimer=void 0)},this.cancelZoomFollowFrame=()=>{this.zoomFollowRaf!==void 0&&(window.cancelAnimationFrame(this.zoomFollowRaf),this.zoomFollowRaf=void 0)},this.getCenterImageTransform=e=>{const a=e.x||0,r=e.y||0,s=e.scale||0,l=e.rotate||0;return`translate3d(-50%, -50%, 0) translate3d(${a}px, ${r}px, 0px) scale3d(${s}, ${s}, 1) rotate3d(0, 0, 1, ${l}deg)`},this.setNodeTransform=(e,a)=>{e.style.transform=a,e.style.setProperty("-webkit-transform",a)},this.setNodeTransitionNone=e=>{e.style.transition="none",e.style.setProperty("-webkit-transition","none")},this.writeImageStyleToNode=(e,a)=>{var r;this.setNodeTransitionNone(e),this.setNodeTransform(e,this.getCenterImageTransform(a)),e.style.opacity=String((r=a.opacity)!=null?r:1),this.setNodeClipAndRadius(e,a)},this.setNodeClipAndRadius=(e,a)=>{var r,s;const l=(r=a.scale)!=null?r:1,d=Bv(a.clip,(s=a.radius)!=null?s:0,l);d?(e.style.clipPath=d,e.style.setProperty("-webkit-clip-path",d)):(e.style.clipPath="",e.style.removeProperty("-webkit-clip-path")),typeof a.radius=="number"?e.style.borderRadius=`${hm(a.radius,l)}px`:e.style.borderRadius=""},this.getWheelZoomOptions=()=>{var e;const a=(e=this.context.gesture)==null?void 0:e.wheelZoom;return a&&typeof a=="object"?a:null},this.getWheelZoomExitGuardDuration=e=>Number.isFinite(e)&&e>=0?e:Uc.exitGuardDuration,this.startWheelZoomExitGuard=e=>{this.clearWheelZoomExitGuard();const a=this.getWheelZoomExitGuardDuration(e);a<=0||(this.wheelZoomExitGuardUntil=Date.now()+a,this.wheelZoomExitGuardTimer=setTimeout(()=>{this.wheelZoomExitGuardTimer=void 0,this.wheelZoomExitGuardUntil=0,this.updateZoomEventListenerWithState()},a))},this.clearWheelZoomExitGuard=()=>{this.wheelZoomExitGuardTimer!==void 0&&(clearTimeout(this.wheelZoomExitGuardTimer),this.wheelZoomExitGuardTimer=void 0),this.wheelZoomExitGuardUntil=0},this.isWheelZoomExitGuardActive=()=>Date.now(){var e,a;const s=[(e=this.zoomFollowTargetStyle)==null?void 0:e.scale,this.zoomTargetScale,(a=this.zoomFollowCurrentStyle)==null?void 0:a.scale,this.state.currentStyle._type==="zooming"?this.state.currentStyle.scale:void 0,1].find(l=>Number.isFinite(l)&&(l??0)>0);return s??1},this.getWheelZoomFocus=(e,a,r=Ct(this.context))=>a.center==="viewport"?{clientX:r.left+r.width/2,clientY:r.top+r.height/2}:{clientX:e.clientX,clientY:e.clientY},this.writeZoomStyleToNode=e=>{const a=this.imageRef.current;this.cancelZoomFollowFrame(),this.motionPhase="zoom-follow",this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.zoomTargetScale=e.scale,a&&this.writeImageStyleToNode(a,e)},this.applyZoomStyleImmediately=e=>{this.writeZoomStyleToNode(e),this.setCurrentStyle(e)},this.getPinchZoomOptions=()=>{var e;const a=(e=this.context.gesture)==null?void 0:e.pinchZoom;return a&&typeof a=="object"?a:null},this.canStartPinchZoom=()=>{const{canZoom:e,zoom:a}=this.context;return a||e},this.getPinchFocus=(e,a,r=Ct(this.context))=>a.center==="viewport"?{clientX:r.left+r.width/2,clientY:r.top+r.height/2}:eO(e),this.tryStartPinchGesture=e=>{if(e.touches.length<2||this.pinchGestureSession)return!1;const a=this.getPinchZoomOptions();if(!a||!this.canStartPinchZoom())return!1;const r=Kv(e.touches);if(r<=0)return!1;const{minScale:s,maxScale:l,fitScale:d}=ym(this.context,this.imageRef,a),u=this.context.zoom?this.getCurrentZoomTargetScale():this.state.currentStyle.scale,m=Number.isFinite(u)&&(u??0)>0?u:d,h=this.getPinchFocus(e.touches,a),g=qa(this.context,this.imageRef,h,{scale:m});return this.pinchGestureSession={startDistance:r,baseScale:m,minScale:s,maxScale:l,fitScale:d,options:a},this.pinchTargetStyle=g,this.pinchSequenceLocked=!0,this.zoomPointerPosition={x:h.clientX,y:h.clientY},this.zoomTargetScale=m,this.clearZoomTouchPan(),this.touchGesture=new vr,this.setTouchGesture(this.touchGesture),this.context.zoom?this.writeZoomStyleToNode(g):this.context.toggleZoom("pinch"),!0},this.updatePinchGesture=e=>{const a=this.pinchGestureSession;if(!a||e.touches.length<2)return;e.preventDefault();const r=Kv(e.touches),s=tO({baseScale:a.baseScale,startDistance:a.startDistance,currentDistance:r,minScale:a.minScale,maxScale:a.maxScale}),l=this.getPinchFocus(e.touches,a.options),d=qa(this.context,this.imageRef,l,{scale:s});this.pinchTargetStyle=d,this.zoomPointerPosition={x:l.clientX,y:l.clientY},this.zoomTargetScale=s,this.writeZoomStyleToNode(d)},this.endPinchGesture=e=>{var a;const r=this.pinchGestureSession,s=this.pinchTargetStyle,l=e.touches.length>0,d=!!r&&!!s&&r.options.resetBelowFit!==!1&&((a=s.scale)!=null?a:r.fitScale)<=r.minScale+Yv;s&&this.setCurrentStyle(s),this.pinchGestureSession=void 0,this.pinchTargetStyle=s,this.pinchSequenceLocked=l,d&&this.context.zoom&&this.context.toggleZoom("pinch"),l||(this.pinchSequenceLocked=!1,this.pinchTargetStyle=void 0)},this.clearPinchGesture=()=>{this.pinchGestureSession=void 0,this.pinchTargetStyle=void 0,this.pinchSequenceLocked=!1},this.getZoomTouchPanStartStyle=()=>{const e=this.zoomFollowCurrentStyle||this.zoomFollowTargetStyle||(this.state.currentStyle._type==="zooming"?this.state.currentStyle:void 0)||this.getZoomingStyleFromStoredPosition();return Fv(this.context,this.imageRef,e)},this.tryStartZoomTouchPan=e=>!this.context.zoom||this.state.currentStyle._type!=="zooming"?!1:(this.zoomTouchPanSession={startPoint:e,startStyle:this.getZoomTouchPanStartStyle(),active:!1},this.touchGesture=new vr().start(e),this.setTouchGesture(this.touchGesture),!0),this.updateZoomTouchPan=e=>{var a,r;const s=this.zoomTouchPanSession;if(!s)return!1;const l=this.getTouchPoint(e);if(!l)return!0;this.touchGesture=this.touchGesture.move(l);const d=l.x-s.startPoint.x,u=l.y-s.startPoint.y;if(!s.active&&Math.abs(d){const e=this.zoomTouchPanSession;if(!e||(this.zoomTouchPanSession=void 0,!e.active))return!1;const a=Fv(this.context,this.imageRef,e.targetStyle||e.startStyle);return this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.motionPhase="idle",this.zoomTargetScale=a.scale,this.setCurrentStyle(a),!0},this.clearZoomTouchPan=()=>{this.zoomTouchPanSession=void 0},this.getZoomingStyleFromStoredPosition=()=>{const e=this.zoomPointerPosition||this.context.zoomPosition,a=this.getCurrentZoomTargetScale();return e?qa(this.context,this.imageRef,{clientX:e.x,clientY:e.y},{scale:a}):qa(this.context,this.imageRef,{},{scale:a})},this.getDoubleTapZoomOptions=()=>{var e;const a=(e=this.context.gesture)==null?void 0:e.doubleTapZoom;return a&&typeof a=="object"?a:null},this.getDoubleTapGesture=e=>{const a=`${e.interval}:${e.distance}`;return(!this.doubleTapGesture||this.doubleTapGestureKey!==a)&&(this.doubleTapGesture=new dO(e),this.doubleTapGestureKey=a),this.doubleTapGesture},this.getDoubleTapFocus=(e,a,r=Ct(this.context))=>a.center==="viewport"?{clientX:r.left+r.width/2,clientY:r.top+r.height/2}:{clientX:e.x,clientY:e.y},this.getDoubleTapTargetScale=e=>{const{minScale:a,maxScale:r}=ym(this.context,this.imageRef,e),s=Number.isFinite(e.scale)&&e.scale>0?e.scale:r;return Math.min(Math.max(s,a),r)},this.suppressNextSyntheticClick=()=>{this.suppressSyntheticClickUntil=Date.now()+kO},this.shouldSuppressSyntheticClick=()=>this.suppressSyntheticClickUntil>0&&Date.now()<=this.suppressSyntheticClickUntil,this.tryHandleDoubleTapGesture=e=>{var a;const r=this.getDoubleTapZoomOptions();if(!r||e.touches.length>0||e.changedTouches.length!==1)return!1;const s=this.getChangedTouchPoint(e);if(!s)return!1;const l=this.touchGesture.getDistance();if(l.x>r.distance||l.y>r.distance)return(a=this.doubleTapGesture)==null||a.cancel(),!1;if(!this.getDoubleTapGesture(r).tap(s))return!1;if(this.touchGesture=new vr,this.setTouchGesture(this.touchGesture),this.suppressNextSyntheticClick(),this.context.zoom)return this.context.toggleZoom("doubleTap"),!0;if(!this.canStartPinchZoom())return!0;const d=this.getDoubleTapFocus(s,r),u=this.getDoubleTapTargetScale(r);return this.zoomPointerPosition={x:d.clientX,y:d.clientY},this.zoomTargetScale=u,this.context.toggleZoom("doubleTap"),!0},this.scheduleZoomEnterComplete=()=>{this.cancelZoomEnterTimer(),this.zoomEnterTimer=setTimeout(()=>{this.zoomEnterTimer=void 0,!(!this.context.zoom||this.motionPhase!=="zoom-enter")&&(this.motionPhase="zoom-follow",this.consumePendingZoomMousePosition())},pt)},this.getNextZoomFollowStyle=(e,a)=>({...a,x:(e.x||0)+((a.x||0)-(e.x||0))*Hl,y:(e.y||0)+((a.y||0)-(e.y||0))*Hl,scale:(e.scale||0)+((a.scale||0)-(e.scale||0))*Hl,rotate:(e.rotate||0)+((a.rotate||0)-(e.rotate||0))*Hl}),this.zoomFollowHasSettled=(e,a)=>Math.abs((e.x||0)-(a.x||0))<$v&&Math.abs((e.y||0)-(a.y||0))<$v&&Math.abs((e.scale||0)-(a.scale||0))<.001&&Math.abs((e.rotate||0)-(a.rotate||0))<.001,this.startZoomFollow=e=>{const a=this.imageRef.current;this.motionPhase="zoom-follow",this.zoomFollowTargetStyle=e,this.zoomTargetScale=e.scale,this.zoomFollowCurrentStyle=this.zoomFollowCurrentStyle||(this.state.currentStyle._type==="zooming"?this.state.currentStyle:e),a&&this.setNodeTransitionNone(a),this.zoomFollowRaf===void 0&&(this.zoomFollowRaf=window.requestAnimationFrame(this.stepZoomFollow))},this.stepZoomFollow=()=>{var e;this.zoomFollowRaf=void 0;const a=this.imageRef.current,r=this.zoomFollowTargetStyle,s=this.zoomFollowCurrentStyle;if(!a||!r||!s||!this.context.zoom){this.resetZoomMotionState();return}const l=this.getNextZoomFollowStyle(s,r),d=this.zoomFollowHasSettled(l,r),u=d?r:l;if(this.zoomFollowCurrentStyle=u,this.setNodeTransitionNone(a),this.setNodeTransform(a,this.getCenterImageTransform(u)),a.style.opacity=String((e=u.opacity)!=null?e:1),this.setNodeClipAndRadius(a,u),d){this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.setCurrentStyle(r);return}this.zoomFollowRaf=window.requestAnimationFrame(this.stepZoomFollow)},this.startClosingFollow=()=>{this.startCoverFollow({phase:"closing-follow",from:this.getCurrentVisualStyle(),getTarget:this.getCoverTargetStyle,fallback:this.debounceUpdateCurrentImageStyle})},this.startCoverFollow=({phase:e,from:a,getTarget:r,fallback:s})=>{this.cancelCoverFollow(),this.debounceUpdateCurrentImageStyle.cancel();const l=this.imageRef.current;if(!l){s();return}this.coverFollowStartTime=performance.now(),this.coverFollowDuration=this.context.motion.browsingDuration,this.coverFollowFromStyle=a,this.coverFollowCurrentStyle=a,this.coverFollowTargetGetter=r,this.motionPhase=e,l.style.top="50%",this.writeImageStyleToNode(l,a);const d=()=>{const u=this.imageRef.current;!u||this.motionPhase!==e||this.coverFollowFromStyle!==a||(u.style.top="50%",this.writeImageStyleToNode(u,this.coverFollowCurrentStyle||a),this.coverFollowRaf===void 0&&(this.coverFollowRaf=window.requestAnimationFrame(this.stepCoverFollow)))};if(e==="browsing-follow"){this.setCurrentStyle(r(a),d);return}this.setCurrentStyle(a),d()},this.stepCoverFollow=()=>{this.coverFollowRaf=void 0;const e=this.imageRef.current,a=this.coverFollowFromStyle,r=this.coverFollowStartTime,s=this.coverFollowDuration,l=this.coverFollowTargetGetter;if(!e||!a||r===void 0||s===void 0||!l){this.cancelCoverFollow();return}const d=Math.min(1,(performance.now()-r)/s),u=V_(d),m=l(a),h=H_(a,m,u);if(this.coverFollowCurrentStyle=h,this.writeImageStyleToNode(e,h),d>=1){this.coverFollowFromStyle=void 0,this.coverFollowCurrentStyle=void 0,this.coverFollowStartTime=void 0,this.coverFollowDuration=void 0,this.coverFollowTargetGetter=void 0,this.motionPhase="idle",this.writeImageStyleToNode(e,m),this.setCurrentStyle(m,this.maybeStartFlipPreload);return}this.coverFollowRaf=window.requestAnimationFrame(this.stepCoverFollow)},this.syncBrowsingFollowTarget=()=>{if(this.motionPhase!=="browsing-follow")return;const e=this.coverFollowFromStyle,a=this.coverFollowTargetGetter;if(!e||!a)return;const r=this.coverFollowCurrentStyle||e;this.setCurrentStyle(a(e),()=>{const s=this.imageRef.current;!s||this.motionPhase!=="browsing-follow"||this.writeImageStyleToNode(s,this.coverFollowCurrentStyle||r)})},this.completeBrowsingFollow=({startFlipPreload:e=!0}={})=>{if(this.motionPhase!=="browsing-follow")return;const a=this.coverFollowFromStyle,r=this.coverFollowTargetGetter;if(!a||!r){this.cancelCoverFollow();return}const s=r(a);this.cancelCoverFollow();const l=this.imageRef.current;l&&(l.style.top="50%",this.writeImageStyleToNode(l,s)),this.setCurrentStyle(s,e?this.maybeStartFlipPreload:void 0)},this.cancelCoverFollow=()=>{this.coverFollowRaf!==void 0&&(window.cancelAnimationFrame(this.coverFollowRaf),this.coverFollowRaf=void 0),this.coverFollowFromStyle=void 0,this.coverFollowCurrentStyle=void 0,this.coverFollowStartTime=void 0,this.coverFollowDuration=void 0,this.coverFollowTargetGetter=void 0,(this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")&&(this.motionPhase="idle")},this.cancelClosingFollow=()=>{this.cancelCoverFollow()},this.getCurrentVisualStyle=()=>{var e,a;const{touchGesture:r}=this.state,{touch:s,opacity:l}=r.getTouchConfig();if((this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")&&this.coverFollowCurrentStyle)return{...this.coverFollowCurrentStyle,x:((e=this.coverFollowCurrentStyle.x)!=null?e:0)+s.x,y:this.coverFollowCurrentStyle.y+s.y,opacity:l??this.coverFollowCurrentStyle.opacity};const{currentStyle:d}=this.state;return{...d,x:((a=d.x)!=null?a:0)+s.x,y:d.y+s.y,opacity:l??d.opacity}},this.getRenderCurrentStyle=()=>(this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")&&this.coverFollowCurrentStyle?this.coverFollowCurrentStyle:this.state.currentStyle,this.getCoverTargetStyle=e=>{const a=gm(this.context,this.imageRef,this.state.touchGesture);return a._behavior==="merge"?{...e,...a}:a},this.cancelScaleCalibrationAnimation=()=>{const e=this.imageRef.current;e&&(this.debounceUpdateCurrentImageStyle.cancel(),this.setNodeTransitionNone(e),this.calibrationRestoreRaf!==void 0&&window.cancelAnimationFrame(this.calibrationRestoreRaf),this.calibrationRestoreRaf=window.requestAnimationFrame(()=>{this.calibrationRestoreRaf=void 0,e&&(e.style.transition="",e.style.removeProperty("-webkit-transition"))}))},this.applyJumpFadeIn=()=>{const e=this.imageRef.current;if(!e)return;const a=Kl.jumpFadeIn;e.classList.remove(a),e.offsetWidth,e.classList.add(a),this.jumpFadeTimer!==void 0&&clearTimeout(this.jumpFadeTimer),this.jumpFadeTimer=setTimeout(()=>{this.jumpFadeTimer=void 0,e&&e.classList.remove(a)},pt+10)},this.consumePendingZoomMousePosition=()=>{const e=this.pendingZoomMousePosition;if(!e||!this.context.zoom||this.state.currentStyle._type!=="zooming")return;this.pendingZoomMousePosition=void 0;const a=qa(this.context,this.imageRef,{clientX:e.x,clientY:e.y},{scale:this.getCurrentZoomTargetScale()});this.startZoomFollow(a)},this.getTouchPoint=e=>{const a=e.touches[0]||e.changedTouches[0];return a?{x:a.clientX,y:a.clientY}:null},this.getChangedTouchPoint=e=>{const a=e.changedTouches[0];return a?{x:a.clientX,y:a.clientY}:null},this.getActiveGesture=()=>{const{gesture:e,set:a,zoom:r}=this.context;if(r)return{swipe:!1,dragExit:!1};const s=e==null?void 0:e.swipe,l=e==null?void 0:e.dragExit;return{swipe:Array.isArray(a)&&a.length>1&&s&&typeof s=="object"?s:!1,dragExit:l&&typeof l=="object"?l:!1}},this.getSwipeBoundaryResistance=e=>{const{gesture:a,loop:r,page:s,set:l}=this.context;if(r||e.state!=="swiping"||!Array.isArray(l)||l.length<=1)return;const d=a==null?void 0:a.swipe;if(!d||typeof d!="object")return;const u=e.getOffset(),m=s===0&&u.x>0,h=s===l.length-1&&u.x<0;return m||h?d.resistance:void 0},this.commitTouchGestureResult=e=>{if(!e.accepted)return;const{outBrowsing:a,toPrevPage:r,toNextPage:s}=this.context;e.kind==="swipe"?e.offset.x<0?s():r():e.kind==="dragExit"&&a()},this.setTouchGesture=(e,a)=>{e&&(this.touchGesture=e,this.setState({touchGesture:e},a))},this.getOwnFitScale=(e,a=0)=>{const r=this.state.imageDimensions[e];if(!r)return null;const{edge:s}=this.context;return gf(r.w,r.h,s??0,Ct(this.context),a)},this.getStyle=(e,a,r,s)=>{var l,d,u,m,h;const{animate:g,set:y,zoom:b,page:S}=this.context,{invalidate:T,currentStyle:C,touchGesture:x,animateConfig:k}=this.state,R=r?C:this.getRenderCurrentStyle(),j=aa(g);let A,M,q,P,{offset:I,overflow:X,opacity:ae,blur:re}=k;const{touch:te,opacity:J,transition:pe}=x.getTouchConfig({resistance:this.getSwipeBoundaryResistance(x)});if(r){const Y=C._type==="browsing"?this.getOwnFitScale(s):null,se=(Y??(C.scale||0))+X;P=se;const N=sO({flipKind:j,baseOffset:I,ownScale:Y,dims:this.state.imageDimensions[s],viewport:Ct(this.context)}),K=a===1?(C.x||0)+te.x+N*e:(C.x||0)+N*e,ee=C.y;A=`translate3d(-50%, -50%, 0) translate3d(${K}px, ${ee}px, 0px) scale3d(${se}, ${se}, 1) rotate3d(0, 0, 1, 0deg)`,M=10*a,q="none"}else{const Y=R._type==="browsing"?this.getOwnFitScale(S,(d=(l=R.rotate)!=null?l:this.context.rotate)!=null?d:0):null,se=Y??((u=R.scale)!=null?u:0);P=se;const N=(R.x||0)+te.x,K=R.y+te.y;A=`translate3d(-50%, -50%, 0) translate3d(${N}px, ${K}px, 0px) scale3d(${se}, ${se}, 1) rotate3d(0, 0, 1, ${R.rotate}deg)`,M=10,ae=(m=J??R.opacity)!=null?m:1}const ne=r?C:R,ue=(h=ne.radius)!=null?h:0,O=hm(ue,P||1),V=Bv(ne.clip,ue,P||1),H=typeof re=="number"?r?`blur(${re}px)`:"blur(0px)":void 0;return{...Mv({transform:A}),...V?Mv({clipPath:V}):{},...H?{filter:H}:{},...typeof ne.radius=="number"?{borderRadius:`${O}px`}:{},cursor:b?"zoom-out":"initial",zIndex:M,opacity:T?0:ae,transition:wO(U_({role:r?"side":"center",motionPhase:this.motionPhase,touchTransition:pe,flip:j,imageType:ne._type}),this.context.motion),pointerEvents:q,...y[S].style}},this.buildImageSeries=e=>{const{flipPreloadStarted:a,loop:r=!1,set:s,page:l,animate:d}=this.context,u=aa(d);if(s.length>1&&u!=="none"&&u!==!1&&a)return b_(e).reduce((g,y)=>{const b=fm(l,s.length,y,{loop:r});if(mm(b)){const S=this.buildImage({step:y,imageIndex:b});S&&g.push(S)}return g},[]);const m=this.buildImage({step:0,imageIndex:l});return m?[m]:[]},this.buildImage=({step:e=0,imageIndex:a=0}={})=>{const{set:r,show:s,zoom:l,page:d,pageWithStep:u}=this.context,{invalidate:m,currentStyle:h}=this.state,g=Math.abs(e),y=g>0,b=u+e,S=this.getStyle(e,g,y,a),T=no(Kl.imageLayer,r[a].className,{[Kl.zooming]:l,[Kl.invalidate]:m}),C=`${b}-${r[a].src}`,x=A=>this.handleSideImageLoad(e,a,A),k=A=>{this.handleRecordImageDimensions(a,A),this.handleImageLoad()},R={style:S,className:T,src:f_(r[a].src,{t:this.handleGetTimestamp(d)}),alt:r[a].alt,onLoad:x},j={id:"zmageImage",ref:this.setCenterImageRef,onLoad:k,onError:this.handleImageError,onClick:this.handleClick,onDoubleClick:this.handleDoubleClick};return y?s&&!l&&h._type!=="zooming"&&Q.createElement("img",{key:C,...R,ref:this.setSideImageAbortRef(C,e),onError:()=>this.handleSideImageTerminal(e)}):Q.createElement("img",{key:C,...R,...j})}}componentDidMount(){const{presetIsMobile:e,presetIsDesktop:a,hideOnScroll:r}=this.context;window.addEventListener("resize",this.handleResize),e&&this.pendingRafHandles.push(window.requestAnimationFrame(()=>{window.addEventListener("touchstart",this.handleTouchStart,Ip),window.addEventListener("touchmove",this.handleTouchMove,SO),window.addEventListener("touchend",this.handleTouchEnd,Ip),window.addEventListener("touchcancel",this.handleTouchCancel,Ip)})),a&&r&&this.pendingRafHandles.push(window.requestAnimationFrame(()=>{window.addEventListener("scroll",this.handleScroll)}))}componentDidUpdate(e,a){var r;const{show:s,zoom:l,rotate:d,page:u}=e,{show:m,zoom:h,rotate:g,page:y}=this.props,{animate:b,presetIsMobile:S}=this.context,T=!l&&h&&this.context.zoomTrigger==="keyboard",C=!l&&h&&this.context.zoomTrigger==="pinch",x=!l&&h&&this.context.zoomTrigger==="doubleTap";if((s!==m||u!==y||l&&!h)&&this.resetZoomMotionState(),!s&&m&&this.cancelClosingFollow(),d!==g&&m&&(this.completeBrowsingFollow(),this.reportCanZoom()),!l&&h&&(this.cancelCoverFollow(),T?this.startKeyboardZoomEnter():C&&this.pinchTargetStyle?this.applyZoomStyleImmediately(this.pinchTargetStyle):x?this.startStoredZoomEnter():this.startZoomEnter()),s!==m||l!==h||d!==g){const k=()=>{T?this.updateCurrentImageStyleForKeyboardZoom():C&&this.pinchTargetStyle?this.setCurrentStyle(this.pinchTargetStyle):x?this.updateCurrentImageStyleForStoredZoom():s!==m&&(b==null?void 0:b.browsing)===!1?this.updateCurrentImageStyleWithoutBrowsingTransition():!s&&m?this.startBrowsingInTransition():s&&!m?this.startClosingFollow():l&&!h?this.updateCurrentImageStyle():this.debounceUpdateCurrentImageStyle()};s?k():(k(),this.handleDetectImageLoadComplete(),S&&u_()),this.updateZoomEventListenerWithState()}if(u!==y){this.cancelCoverFollow();const k=this.imageRef.current;k&&k.complete&&k.naturalWidth>0?(this.handleImageLoadEnd(),this.debounceUpdateCurrentImageStyle(),this.reportCanZoom()):this.handleImageLoadStart(),this.pendingDimCalibration=this.state.imageDimensions[y]==null?y:null}if(this.pendingDimCalibration===y&&a.imageDimensions[y]==null&&this.state.imageDimensions[y]!=null&&this.props.show&&(this.pendingDimCalibration=null,this.cancelScaleCalibrationAnimation()),this.motionPhase==="browsing-follow"&&a.imageDimensions[y]!==this.state.imageDimensions[y]&&this.syncBrowsingFollowTarget(),u!==y&&this.props.show){const k=aa(this.context.animate),R=this.context.set,j=(r=this.context.loop)!=null?r:!1;v_(u,y,R.length,j)>2&&k!=="none"&&this.applyJumpFadeIn()}this.maybeStartFlipPreload()}componentWillUnmount(){var e;const{presetIsMobile:a,presetIsDesktop:r}=this.context;this.pendingRafHandles.forEach(s=>window.cancelAnimationFrame(s)),this.pendingRafHandles=[],this.cancelBrowsingTransitionFrame(),this.calibrationRestoreRaf!==void 0&&(window.cancelAnimationFrame(this.calibrationRestoreRaf),this.calibrationRestoreRaf=void 0),this.jumpFadeTimer!==void 0&&(clearTimeout(this.jumpFadeTimer),this.jumpFadeTimer=void 0),this.loadingShowDelayTimer!==void 0&&(clearTimeout(this.loadingShowDelayTimer),this.loadingShowDelayTimer=void 0),this.clearWheelZoomExitGuard(),this.cancelClosingFollow(),this.resetZoomMotionState(),this.debounceUpdateCurrentImageStyle.cancel(),a&&(window.removeEventListener("touchstart",this.handleTouchStart),window.removeEventListener("touchmove",this.handleTouchMove),window.removeEventListener("touchend",this.handleTouchEnd),window.removeEventListener("touchcancel",this.handleTouchCancel)),r&&window.removeEventListener("scroll",this.handleScroll),window.removeEventListener("resize",this.handleResize),window.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("wheel",this.handleWheel),(e=this.detachCenterImageAbort)==null||e.call(this),this.detachCenterImageAbort=void 0,this.sideImageAbortCleanups.forEach(s=>s()),this.sideImageAbortCleanups.clear(),clearInterval(this.imageLoadingTimer)}render(){const{show:e,pageIsCover:a}=this.context,{isFetching:r,invalidate:s}=this.state;return Q.createElement(v.Fragment,null,Q.createElement(vO,{show:e&&(!a||s),load:r,invalidate:s,onReload:this.handleImageReload}),this.buildImageSeries(2))}};eC.contextType=qr;var TO={backgroundLayer:"backgroundLayer__CGbNW"};function EO({show:e,zoom:a}){const{animate:r,backdrop:s,outBrowsing:l,toggleZoom:d,presetIsDesktop:u,motion:m}=v.useContext(qr),h=(r==null?void 0:r.browsing)===!1,g=h?"0s":e&&u?m.backgroundShowDelay:"0s";return Q.createElement("div",{id:"zmageBackground",className:TO.backgroundLayer,onClick:a?()=>d():l,style:{opacity:e?1:0,background:s||"",transition:h?"none":m.backgroundTransition,transitionDelay:g}})}var RO=e=>{if(e.length===1){if(/[A-Za-z]/.test(e))return`Key${e.toUpperCase()}`;if(/[0-9]/.test(e))return`Digit${e}`}return e},Yl=e=>{var a;const r=e.split("+").map(d=>d.trim()).filter(Boolean),s=(a=r.pop())!=null?a:"",l=new Set(r.map(d=>d.toLowerCase()));return{code:RO(s),needsMod:l.has("mod"),needsCmd:l.has("cmd")||l.has("meta"),needsCtrl:l.has("ctrl")||l.has("control"),needsShift:l.has("shift"),needsAlt:l.has("alt")||l.has("option")}},Xl=(e,a)=>e==null||e===!1?[]:e===!0?[Yl(a)]:typeof e=="string"?[Yl(e)]:Array.isArray(e)?e.map(Yl):[],Gl=(e,a,r)=>typeof e=="string"||Array.isArray(e)?Xl(e,r):!!e||!!a?[Yl(r)]:[],jO=(e,a)=>{if(e.code!==a.code)return!1;if(a.needsMod){if(!(e.metaKey||e.ctrlKey))return!1}else if(a.needsCmd!==e.metaKey||a.needsCtrl!==e.ctrlKey)return!1;return!(a.needsShift!==e.shiftKey||a.needsAlt!==e.altKey)},vn=(e,a)=>{for(let r=0;r!!e&&typeof e=="object",NO=(e,a)=>{if(!e&&!a)return;const r={...e,...a};return Xv(e==null?void 0:e.inset)&&Xv(a==null?void 0:a.inset)&&(r.inset={...e.inset,...a.inset}),r},Qv=(e,a)=>{const r={};return AO.forEach(s=>{const l=NO(e==null?void 0:e[s],a==null?void 0:a[s]);l&&(r[s]=l)}),Object.keys(r).length>0?r:void 0},zO=(e,a)=>{const r=Qv(e,a),s=Qv(e==null?void 0:e.mobile,a==null?void 0:a.mobile);if(!(!r&&!s))return{...r,...s?{mobile:s}:{}}},Vc=class extends Q.Component{constructor(){super(...arguments),this.listeningMouseMove=!1,this.shiftKeyActive=!1,this.viewportRef=Q.createRef(),this.getControllerConfig=(e,a)=>{if(e===!1)return{};const r=typeof e=="object"?e:{},s={...a,...r},l=zO(a.layout,r.layout);return l?s.layout=l:delete s.layout,s},this.getHotKeyConfig=(e,a)=>e===!1?{}:{...a,...typeof e=="object"?e:{}},this.getAnimateCoverConfig=(e,a)=>{const r=a.cover;if(e===!1)return!1;const s=e&&typeof e=="object"?e.cover:void 0;return s===!1?!1:s===!0||s===void 0?r:{...r&&typeof r=="object"?r:{},...s}},this.getAnimateConfig=(e,a)=>e===!1?{browsing:!1,flip:!1,cover:!1}:{...a,...typeof e=="object"?e:{},cover:this.getAnimateCoverConfig(e,a)},this.getGestureConfig=(e,a)=>iO(e,a),this.getClosingRotate=()=>{const{rotate:e}=this.state;return Math.round(e/360)*360},this.state=(()=>{const{coverRef:e,defaultPage:a,set:r}=this.props,{page:s,pageIsCover:l}=_v(e,a,r);return{mounted:!1,viewportReady:!1,show:!1,zoom:!1,canZoom:!0,zoomShakeKey:0,rotate:0,motionDurationMultiplier:Do,page:s,pageIsCover:l,pageWithStep:s,flipPreloadStarted:!1,flipReadyPrev:!1,flipReadyNext:!1}})(),this.getPropsWithEnv=()=>{const{preset:e,controller:a,hotKey:r,animate:s,gesture:l,radius:d,edge:u}=this.props,m=O_(e),h=GS(e);return{...this.props,presetIsMobile:h==="mobile",presetIsDesktop:h==="desktop",radius:d??m.radius,edge:u??m.edge,controller:this.getControllerConfig(a,m.controller),hotKey:this.getHotKeyConfig(r,m.hotKey),animate:this.getAnimateConfig(s,m.animate),gesture:this.getGestureConfig(l,m.gesture)}},this.cancelInitRaf=()=>{this.initRaf!==void 0&&(cancelAnimationFrame(this.initRaf),this.initRaf=void 0)},this.cancelUnInitTimer=()=>{this.unInitTimer!==void 0&&(clearTimeout(this.unInitTimer),this.unInitTimer=void 0)},this.clearCoverHideTimer=()=>{this.coverHideTimer!==void 0&&(clearTimeout(this.coverHideTimer),this.coverHideTimer=void 0)},this.clearFlipPreloadTimer=()=>{this.flipPreloadTimer!==void 0&&(clearTimeout(this.flipPreloadTimer),this.flipPreloadTimer=void 0)},this.showCoverNow=e=>{this.clearCoverHideTimer(),T_(e)},this.hideCoverAfterDelay=e=>{this.clearCoverHideTimer(),this.coverHideTimer=E_(e,()=>{this.coverHideTimer=void 0})},this.init=()=>{this.cancelInitRaf(),this.cancelUnInitTimer(),this.clearFlipPreloadTimer();const{isBrowsingControlled:e,coverRef:a,coverPos:r,onBrowsing:s,hideOnScroll:l,coverVisible:d,presetIsDesktop:u}=this.getPropsWithEnv(),{show:m,pageIsCover:h}=this.state;if(!m){u&&(window.addEventListener("keydown",this.handleKeyDown,!0),window.addEventListener("keyup",this.handleKeyUp,!0),this.startMouseMoveListener(),l?window.addEventListener("scroll",this.handleScroll):S_()),this.lastPointerPosition=r||this.lastPointerPosition;const g=JS(this.props.motionDurationMultiplier);this.initRaf=window.requestAnimationFrame(()=>{this.initRaf=void 0,this.setState({show:!0,zoom:!1,rotate:0,motionDurationMultiplier:g,zoomTrigger:void 0,zoomPosition:void 0,canZoom:!0,flipPreloadStarted:!1,flipReadyPrev:!1,flipReadyNext:!1},()=>{u&&h&&!d&&this.hideCoverAfterDelay(a),this.scheduleFlipPreloadAfterBrowsing(),!e&&typeof s=="function"&&s(!0)})})}},this.unInit=({force:e}={force:!1})=>{this.cancelInitRaf(),this.cancelUnInitTimer(),this.clearFlipPreloadTimer();const{isBrowsingControlled:a,coverRef:r,onBrowsing:s,hideOnScroll:l,coverVisible:d,presetIsMobile:u,presetIsDesktop:m,animate:h}=this.getPropsWithEnv(),{show:g,pageIsCover:y}=this.state;if(g||e){m&&(window.removeEventListener("keydown",this.handleKeyDown,!0),window.removeEventListener("keyup",this.handleKeyUp,!0),this.stopMouseMoveListener(),l?window.removeEventListener("scroll",this.handleScroll):C_()),!y&&!d&&this.showCoverNow(r),this.shiftKeyActive=!1;const b=()=>{u&&p_(),m&&y&&!d&&this.showCoverNow(r),!a&&typeof s=="function"&&s(!1)};if(e)b();else{const S=this.getClosingRotate(),T=Bp(this.state.motionDurationMultiplier),C=h.browsing===!1?0:T.browsingDuration-10;this.setState({show:!1,zoom:!1,rotate:S,zoomTrigger:void 0,zoomPosition:void 0,flipPreloadStarted:!1,flipReadyPrev:!1,flipReadyNext:!1},()=>{const x=()=>{this.unInitTimer=void 0,this.setState({mounted:!1,viewportReady:!1,rotate:0,motionDurationMultiplier:Do},b)};C===0?x():this.unInitTimer=setTimeout(x,C)})}}},this.handleViewportRef=e=>{this.viewportRef.current=e,e&&this.state.mounted&&!this.state.viewportReady&&this.setState({viewportReady:!0})},this.handleOutBrowsing=e=>{const{animate:a}=this.getPropsWithEnv(),r={shiftKey:!!(e!=null&&e.shiftKey||this.shiftKeyActive)},s=Gc(r,Hc(a)),l=()=>this.props.outBrowsing(r);s!==this.state.motionDurationMultiplier?this.setState({motionDurationMultiplier:s},l):l()},this.handleKeyDown=e=>{this.shiftKeyActive=e.shiftKey;const{set:a,hotKey:r}=this.getPropsWithEnv(),{zoom:s,page:l,canZoom:d}=this.state,u=()=>{e.preventDefault(),e.stopImmediatePropagation()};if(vn(e,Xl(r.close,"Escape"))){u(),s?this.handleToggleZoom():this.handleOutBrowsing(e);return}if(vn(e,Xl(r.zoom,"Space"))){if(u(),!s&&!d){this.handleTriggerZoomShake();return}this.handleToggleZoom("keyboard");return}if(vn(e,Gl(r.flipLeft,r.flip,"ArrowLeft"))){if(u(),s||!this.canFlipToDirection(-1))return;this.handleToPrevPage();return}if(vn(e,Gl(r.flipRight,r.flip,"ArrowRight"))){if(u(),s||!this.canFlipToDirection(1))return;this.handleToNextPage();return}if(vn(e,Gl(r.rotateLeft,r.rotate,"BracketLeft"))){if(u(),s)return;this.handleToggleRotate("left")();return}if(vn(e,Gl(r.rotateRight,r.rotate,"BracketRight"))){if(u(),s)return;this.handleToggleRotate("right")();return}if(vn(e,Xl(r.download,"Mod+S"))){u();const m=a[l];m!=null&&m.src&&pm(m.src);return}},this.handleKeyUp=e=>{this.shiftKeyActive=e.shiftKey},this.handleScroll=()=>{const{show:e}=this.state;e&&this.handleOutBrowsing()},this.handleMouseMove=e=>{this.lastPointerPosition={x:e.clientX,y:e.clientY}},this.startMouseMoveListener=()=>{this.listeningMouseMove||(window.addEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!0)},this.stopMouseMoveListener=()=>{this.listeningMouseMove&&(window.removeEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!1)},this.requiresFlipPreload=()=>{const{set:e,animate:a}=this.getPropsWithEnv(),r=aa(a);return Array.isArray(e)&&e.length>1&&r!=="none"&&r!==!1},this.canFlipToDirection=e=>{const{set:a,loop:r=!1}=this.getPropsWithEnv(),{page:s,flipReadyPrev:l,flipReadyNext:d}=this.state;return!Array.isArray(a)||a.length<=1||!r&&e<0&&s===0||!r&&e>0&&s===a.length-1?!1:this.requiresFlipPreload()?e<0?l:d:!0},this.handleStartFlipPreload=()=>{!this.requiresFlipPreload()||this.state.flipPreloadStarted||this.setState({flipPreloadStarted:!0})},this.scheduleFlipPreloadAfterBrowsing=()=>{if(this.clearFlipPreloadTimer(),!this.requiresFlipPreload())return;const{animate:e}=this.getPropsWithEnv(),a=Bp(this.state.motionDurationMultiplier),r=e.browsing===!1?0:a.browsingDuration;this.flipPreloadTimer=setTimeout(()=>{this.flipPreloadTimer=void 0,!(!this.state.show||this.state.zoom)&&this.handleStartFlipPreload()},r)},this.handleSetFlipReady=(e,a=!0)=>{const r=e<0?"flipReadyPrev":"flipReadyNext";this.state[r]!==a&&this.setState({[r]:a})},this.handleToPage=e=>{const{page:a}=this.state,{set:r,loop:s=!1}=this.props,l=e-a,d=s&&r.length>1?RS(l,r.length):l;this.handleSwitchPages(d)()},this.handleSwitchPages=e=>{const{coverRef:a,onSwitching:r,loop:s=!1}=this.props;return()=>{const{set:l}=this.props;if(l.length>1){const{page:d,pageWithStep:u}=this.state;if(Math.abs(e)===1&&!this.canFlipToDirection(e<0?-1:1))return;const m=fm(d,l.length,e,{loop:s});if(typeof m=="number"){const h=Math.abs(e)>2?Math.sign(e):e;this.setState({page:m,pageIsCover:DS(a,l,m),pageWithStep:u+h,zoom:!1,zoomTrigger:void 0,zoomPosition:void 0,canZoom:!0,flipReadyPrev:!1,flipReadyNext:!1,rotate:0},()=>{typeof r=="function"&&r(m)})}}}},this.handleToPrevPage=this.handleSwitchPages(-1),this.handleToNextPage=this.handleSwitchPages(1),this.handleToggleZoom=(e="control")=>{const{onZooming:a}=this.props,r=!this.state.zoom;this.setState({zoom:r,zoomTrigger:r?e:void 0,zoomPosition:r&&e==="keyboard"?this.lastPointerPosition:void 0},()=>{typeof a=="function"&&a(this.state.zoom)})},this.handleSetCanZoom=e=>{this.state.canZoom!==e&&this.setState({canZoom:e})},this.handleTriggerZoomShake=()=>{this.setState(({zoomShakeKey:e})=>({zoomShakeKey:e+1}))},this.handleViewportClick=e=>{e.target===e.currentTarget&&(this.state.zoom?this.handleToggleZoom():this.handleOutBrowsing(e))},this.handleToggleRotate=e=>{const{onRotating:a}=this.props;switch(e){case"left":return()=>this.setState(({rotate:r})=>({rotate:r-90}),()=>{typeof a=="function"&&a(this.state.rotate)});case"right":return()=>this.setState(({rotate:r})=>({rotate:r+90}),()=>{typeof a=="function"&&a(this.state.rotate)});default:return()=>this.setState({rotate:0},()=>{typeof a=="function"&&a(0)})}}}componentDidMount(){this.props.browsing&&this.init()}static getDerivedStateFromProps(e,a){return e.browsing?{mounted:!0,...a.show?{}:_v(e.coverRef,e.defaultPage,e.set)}:null}componentDidUpdate(e){e.browsing!==this.props.browsing&&(this.props.browsing?this.init():this.unInit())}componentWillUnmount(){this.cancelInitRaf(),this.cancelUnInitTimer(),this.clearCoverHideTimer(),this.clearFlipPreloadTimer(),this.stopMouseMoveListener(),this.unInit({force:!0})}render(){const{coverRef:e,coverPos:a,set:r,preset:s,presetIsMobile:l,presetIsDesktop:d,controller:u,hotKey:m,animate:h,gesture:g,hideOnScroll:y,coverVisible:b,backdrop:S,zIndex:T,radius:C,edge:x,loop:k,hideOnDblClick:R,loadingDelay:j,onError:A}=this.getPropsWithEnv(),{mounted:M,viewportReady:q}=this.state,P={...this.state},I=Bp(this.state.motionDurationMultiplier),X=M_(u,l),ae={coverRef:e,coverPos:a,outBrowsing:this.handleOutBrowsing,viewportRef:this.viewportRef,motion:I,set:r,preset:s,presetIsMobile:l,presetIsDesktop:d,controller:u,hotKey:m,animate:h,gesture:g,hideOnScroll:y,coverVisible:b,backdrop:S,radius:C,edge:x,loop:k,hideOnDblClick:R,loadingDelay:j,onError:A,...P,toPage:this.handleToPage,toPrevPage:this.handleToPrevPage,toNextPage:this.handleToNextPage,toggleZoom:this.handleToggleZoom,toggleRotate:this.handleToggleRotate,setCanZoom:this.handleSetCanZoom,startFlipPreload:this.handleStartFlipPreload,setFlipReady:this.handleSetFlipReady};return Q.createElement(qr.Provider,{value:ae},M&&Q.createElement(YD,{id:"zmage",zIndex:T,className:zv.wrapperLayer,style:X},Q.createElement(EO,{...P}),Q.createElement("div",{id:"zmageViewport",ref:this.handleViewportRef,className:zv.viewportLayer,style:{touchAction:cO(g)},onClick:this.handleViewportClick},Q.createElement(gO,null),Q.createElement(bO,null),q&&Q.createElement(eC,{...P}))))}};Vc.defaultProps={isBrowsingControlled:!1,browsing:!1,coverRef:Q.createRef(),outBrowsing:()=>{},motionDurationMultiplier:Do,defaultPage:0,set:[]};Vc.contextType=qr;var Jv=new x_,xr,MO=()=>{var e;if(xr)return xr;const a=lx.createRoot;if(typeof a=="function")return xr={mount:(s,l)=>{const d=a(l);return d.render(s),()=>d.unmount()}},xr;const r=Rm;if(typeof r.render!="function")throw new Error(`react-zmage: no compatible mount API found (react-dom version ${(e=r.version)!=null?e:"unknown"}). Ensure react-dom@16.8+ is installed.`);return xr={mount:(s,l)=>(r.render(s,l),()=>{r.unmountComponentAtNode(l)})},xr},tC=class extends Q.Component{constructor(){super(...arguments),this.showPosition=Jv.currentPosition,this.state={browsing:!1},this.inBrowsing=()=>{this.inBrowsingRaf=requestAnimationFrame(()=>{this.inBrowsingRaf=void 0,this.setState({browsing:!0})})},this.outBrowsing=e=>{const{destructor:a}=this.props,r=Gc(e,Hc(this.props.animate));this.setState({browsing:!1},()=>{a&&(this.outBrowsingTimer=setTimeout(()=>{this.outBrowsingTimer=void 0,a()},PS(!0,r)))})}}componentDidMount(){this.inBrowsing()}componentWillUnmount(){this.inBrowsingRaf!==void 0&&(cancelAnimationFrame(this.inBrowsingRaf),this.inBrowsingRaf=void 0),this.outBrowsingTimer!==void 0&&(clearTimeout(this.outBrowsingTimer),this.outBrowsingTimer=void 0)}render(){const{calleeProps:e,configProps:a}=VS(this.props),{browsing:r}=this.state;return r&&(this.showPosition=Jv.currentPosition),Q.createElement(Vc,{browsing:r,coverRef:e.coverRef,coverPos:this.showPosition,outBrowsing:this.outBrowsing,motionDurationMultiplier:this.props.motionDurationMultiplier,...a})}};tC.defaultProps=hf;var DO=(({coverRef:e,...a})=>{const r=MO(),s=document.createElement("div");s.id="zmagePortal";const l=document.body;l.appendChild(s);const d=Q.createRef();let u,m=!1;const h=()=>{if(!m){if(m=!0,u){const g=u;u=void 0,g()}s.parentNode===l&&l.removeChild(s)}};return u=r.mount(Q.createElement(tC,{ref:d,coverRef:e,destructor:h,...a}),s),h}),di=DO,_O=e=>{var a,r,s;const l=(a=e.getAttribute("data-zmage-caption"))==null?void 0:a.trim();if(l)return l;const d=e.closest("figure");return((s=(r=d==null?void 0:d.querySelector("figcaption"))==null?void 0:r.textContent)==null?void 0:s.trim())||void 0},OO=(e,a)=>!Array.isArray(e)||e.length===0?-1:e.findIndex(r=>r.src===a),ui=class extends Q.Component{constructor(){super(...arguments),this.wrapperRef=Q.createRef(),this.tryAttachBrowserToImage=()=>{const{children:e,...a}=this.props;this.wrapperRef.current&&this.wrapperRef.current.querySelectorAll("img").forEach(r=>{if(!r.getAttribute("zmage")&&r.getAttribute("src")){r.setAttribute("zmage",String(Date.now())),r.style.cursor="zoom-in";const s=r.getAttribute("src")||"",l=r.getAttribute("alt")||void 0,d=_O(r),u=OO(a.set,s);r.addEventListener("click",m=>di({...a,coverRef:{current:r},src:s,alt:l,caption:d??a.caption,defaultPage:u>=0?u:a.defaultPage,motionDurationMultiplier:Gc(m,Hc(a.animate))}))}})}}componentDidMount(){this.tryAttachBrowserToImage()}componentDidUpdate(){this.tryAttachBrowserToImage()}render(){const{children:e}=this.props;return Q.createElement("div",{ref:this.wrapperRef},e)}};ui.defaultProps=hf;var Fr=class extends Q.Component{constructor(){super(...arguments),this.coverRef={current:null},this.motionDurationMultiplier=Do,this.isBrowsingControlled="browsing"in this.props,this.state={browsing:!1},this.inBrowsing=()=>{var e,a;this.isBrowsingControlled?(a=(e=this.props).onBrowsing)==null||a.call(e,!0):this.setState({browsing:!0})},this.outBrowsing=()=>{var e,a;this.browsingPosition=void 0,this.motionDurationMultiplier=Do,this.isBrowsingControlled?(a=(e=this.props).onBrowsing)==null||a.call(e,!1):this.setState({browsing:!1})}}componentDidUpdate(e){this.isBrowsingControlled&&e.browsing&&!this.props.browsing&&(this.browsingPosition=void 0,this.motionDurationMultiplier=Do)}render(){const{coverProps:e,controlledProps:a,configProps:r,restProps:s}=VS(this.props),{browsing:l}=this.state;return Q.createElement(v.Fragment,null,Q.createElement("img",{className:e.className,style:{cursor:"zoom-in",...e.style},src:e.src,alt:e.alt,onClick:d=>{this.browsingPosition={x:d.clientX,y:d.clientY},this.motionDurationMultiplier=Gc(d,Hc(r.animate)),this.inBrowsing(),typeof e.onClick=="function"&&e.onClick(d)},onError:e.onError,ref:d=>{typeof e.forwardedRef=="function"?e.forwardedRef(d):e.forwardedRef&&typeof e.forwardedRef=="object"&&(e.forwardedRef.current=d),this.coverRef&&(this.coverRef.current=d)},...s}),Q.createElement(Vc,{isBrowsingControlled:this.isBrowsingControlled,browsing:this.isBrowsingControlled?a.browsing:l,coverRef:this.coverRef,coverPos:this.browsingPosition,outBrowsing:this.outBrowsing,motionDurationMultiplier:this.motionDurationMultiplier,...r}))}};Fr.defaultProps=hf;Fr.browsing=di;Fr.Browsing=di;Fr.wrapper=ui;Fr.Wrapper=ui;var pi=Q.forwardRef((e,a)=>Q.createElement(Fr,{...e,forwardedRef:a}));pi.browsing=di;pi.Browsing=di;pi.wrapper=ui;pi.Wrapper=ui;var na=pi;const LO="1.8.4",oC={version:LO},ZO=bc("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function Wc({className:e,variant:a,...r}){return c.jsx("div",{className:ie(ZO({variant:a}),e),...r})}const Ua=v.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("rounded-xl border bg-card text-card-foreground shadow",e),...a}));Ua.displayName="Card";const PO=v.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("flex flex-col space-y-1.5 p-6",e),...a}));PO.displayName="CardHeader";const BO=v.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("font-semibold leading-none tracking-tight",e),...a}));BO.displayName="CardTitle";const IO=v.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("text-sm text-muted-foreground",e),...a}));IO.displayName="CardDescription";const qO=v.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("p-6 pt-0",e),...a}));qO.displayName="CardContent";const FO=v.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("flex items-center p-6 pt-0",e),...a}));FO.displayName="CardFooter";function mi(){const{t:e}=be();return c.jsxs("footer",{className:"mt-32 border-t border-border/60 bg-muted/20",children:[c.jsxs("div",{className:"mx-auto grid max-w-7xl gap-10 px-4 py-12 sm:px-6 md:grid-cols-2",children:[c.jsxs("div",{children:[c.jsx("h4",{className:"text-sm font-medium",children:e("footer.project")}),c.jsxs("ul",{className:"mt-3 space-y-2 text-sm text-muted-foreground",children:[c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis/react-zmage",children:e("footer.repo")})}),c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis/react-zmage/issues",children:e("footer.issues")})}),c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis/react-zmage/releases",children:e("footer.changelog")})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/use-cases",children:e("footer.useCases")})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/compare",children:"Compare"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/status",children:"Status"})})]})]}),c.jsxs("div",{children:[c.jsx("h4",{className:"text-sm font-medium",children:e("footer.madeby")}),c.jsxs("ul",{className:"mt-3 space-y-2 text-sm text-muted-foreground",children:[c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis",children:"Caldis"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/about",children:"About"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/contact",children:"Contact"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/privacy",children:"Privacy"})}),c.jsxs("li",{children:[c.jsxs("span",{children:[e("footer.illustrator"),": "]}),c.jsx("a",{className:"hover:text-foreground",href:"https://www.behance.net/gallery/56119387/_",children:"sslololss Guihuahuzi"})]})]})]})]}),c.jsx("div",{className:"border-t border-border/60",children:c.jsxs("div",{className:"mx-auto flex max-w-7xl items-center justify-between gap-4 px-4 py-4 text-xs text-muted-foreground sm:px-6",children:[c.jsx("span",{children:e("footer.license")}),c.jsxs("span",{className:"font-mono",children:["react-zmage v",oC.version," · React ",v.version]}),c.jsx("a",{href:"https://github.com/Caldis/react-zmage","aria-label":"GitHub",className:"hover:text-foreground",children:c.jsx(Dx,{className:"h-4 w-4"})})]})})]})}function fi(){const{resolved:e}=Am();return e==="dark"?"#0a0a0a":"#fafafa"}const Hs={slowMotion:!0},KO={layout:{pagination:{inset:"1.35rem"},caption:{inset:"4rem"},mobile:{pagination:{inset:"2.75rem"},caption:{inset:"5.25rem"}}}};function aC(e){return e===!1?!1:{...typeof e=="object"&&e?e:{},slowMotion:!0}}const UO="https://www.behance.net/gallery/56119387/_";function HO(){const e="npm install react-zmage",{copied:a,copy:r}=Bc();return c.jsxs("button",{onClick:()=>void r(e),className:"group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md border border-border bg-muted/40 px-3 py-1.5 font-mono text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",children:[c.jsxs("span",{className:"min-w-0 truncate",children:["$ ",e]}),a?c.jsx(Ha,{className:"h-3.5 w-3.5 text-foreground"}):c.jsx(Ws,{className:"h-3.5 w-3.5 opacity-50 group-hover:opacity-100"})]})}function GO(){const{t:e}=be();return c.jsxs("section",{className:"relative isolate flex h-screen flex-col items-center justify-center overflow-hidden pb-28",children:[c.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 -z-20",style:{backgroundImage:"linear-gradient(to right, hsl(var(--foreground) / 0.06) 1px, transparent 1px), linear-gradient(to bottom, hsl(var(--foreground) / 0.06) 1px, transparent 1px)",backgroundSize:"48px 48px",maskImage:"linear-gradient(to bottom, black 50%, transparent 100%)",WebkitMaskImage:"linear-gradient(to bottom, black 50%, transparent 100%)"}}),c.jsx("div",{className:"pointer-events-none absolute left-1/2 top-1/2 -z-10 h-[min(600px,150vw)] w-[min(900px,190vw)] -translate-x-1/2 -translate-y-1/2 rounded-full bg-[radial-gradient(closest-side,hsl(var(--foreground)/0.08),transparent)]","aria-hidden":!0}),c.jsx(Ks,{"aria-hidden":!0,className:"absolute top-3 left-3 h-3.5 w-3.5 text-foreground/40"}),c.jsx(Ks,{"aria-hidden":!0,className:"absolute top-3 right-3 h-3.5 w-3.5 text-foreground/40"}),c.jsx(Ks,{"aria-hidden":!0,className:"absolute bottom-3 left-3 h-3.5 w-3.5 text-foreground/40"}),c.jsx(Ks,{"aria-hidden":!0,className:"absolute bottom-3 right-3 h-3.5 w-3.5 text-foreground/40"}),c.jsxs("div",{className:"relative flex w-full max-w-5xl min-w-0 flex-col items-center gap-8 px-4 text-center sm:px-6",children:[c.jsx("img",{src:"/logo.png",alt:"react-zmage",className:"h-20 w-20 opacity-90 drop-shadow-[0_0_30px_hsl(var(--foreground)/0.18)]"}),c.jsxs(Wc,{variant:"secondary",className:"font-mono",children:["v",oC.version," · ",e("hero.pill")]}),c.jsx("div",{children:c.jsxs("h1",{className:"font-sans font-semibold tracking-tight",children:[c.jsx("span",{className:ie("block","text-[clamp(2.5rem,7vw,5.5rem)] leading-[1.15]"),children:e("hero.title.line1")}),c.jsx("span",{className:ie("mt-2 block bg-clip-text pb-2","text-[clamp(2rem,5.5vw,4rem)] leading-[1.2]","bg-gradient-to-br from-foreground to-foreground/40 text-transparent"),children:e("hero.title.line2")})]})}),c.jsx("p",{className:"max-w-2xl text-base text-muted-foreground sm:text-lg",children:e("hero.subtitle")}),c.jsxs("div",{className:"flex max-w-full flex-wrap items-center justify-center gap-3",children:[c.jsx(it,{size:"lg",asChild:!0,children:c.jsxs(st,{to:"/docs",className:"group",children:[e("hero.cta.start"),c.jsx(Ax,{className:"ml-1.5 h-4 w-4 transition-transform duration-200 group-hover:translate-x-1"})]})}),c.jsx(it,{size:"lg",variant:"outline",asChild:!0,children:c.jsx(st,{to:"/playground",children:e("hero.cta.playground")})}),c.jsx(HO,{})]}),c.jsx(VO,{})]})]})}function VO(){const{t:e}=be(),a=e("hero.ai.directive"),{copied:r,copy:s}=Bc();return c.jsxs("div",{className:"mt-4 flex flex-col items-center gap-1.5",children:[c.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs font-medium tracking-wide text-muted-foreground/80",children:[c.jsx(Nm,{"aria-hidden":!0,className:"h-3.5 w-3.5"}),e("hero.ai.label")]}),c.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2 text-[11px]",children:[c.jsxs("button",{onClick:()=>void s(a),"aria-label":e("hero.ai.copyLabel"),className:"group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md border border-border/60 bg-muted/30 px-3 py-1.5 font-mono text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",children:[c.jsx(jR,{"aria-hidden":!0,className:"h-3.5 w-3.5 opacity-70"}),c.jsx("span",{className:"min-w-0 break-words text-left",children:a}),r?c.jsx(Ha,{className:"h-3.5 w-3.5 text-foreground"}):c.jsx(Ws,{className:"h-3.5 w-3.5 opacity-50 group-hover:opacity-100"})]}),c.jsx("a",{href:"/llms.txt",target:"_blank",rel:"noreferrer",className:"text-muted-foreground/70 underline-offset-4 hover:text-foreground hover:underline",children:e("hero.ai.viewLlms")})]})]})}function WO(){const{t:e}=be(),a=fi(),r=[{src:"/imgSet/childsDream/demo.jpg",alt:e("demo.scene.portal.alt"),caption:e("demo.scene.portal.caption")},{src:"/imgSet/childsDream/2.jpg",alt:e("demo.scene.forest.alt"),caption:e("demo.scene.forest.caption")},{src:"/imgSet/childsDream/3.jpg",alt:e("demo.scene.tide.alt"),caption:e("demo.scene.tide.caption")},{src:"/imgSet/childsDream/4.jpg",alt:e("demo.scene.canopy.alt"),caption:e("demo.scene.canopy.caption")},{src:"/imgSet/childsDream/5.jpg",alt:e("demo.scene.flamingo.alt"),caption:e("demo.scene.flamingo.caption")},{src:"/imgSet/childsDream/6.jpg",alt:e("demo.scene.lamp.alt"),caption:e("demo.scene.lamp.caption")},{src:"/imgSet/childsDream/7.jpg",alt:e("demo.scene.crystal.alt"),caption:e("demo.scene.crystal.caption")},{src:"/imgSet/childsDream/8.jpg",alt:e("demo.scene.rescue.alt"),caption:e("demo.scene.rescue.caption")}],s=[{icon:KR,label:e("demo.feature.cover")},{icon:FR,label:e("demo.feature.space")},{icon:UR,label:e("demo.feature.wheel")}],l=({page:d,labelKey:u,className:m,imageClassName:h,labelClassName:g,objectPosition:y="center"})=>{const b=r[d];return c.jsxs("figure",{className:ie("group relative min-w-0 overflow-hidden rounded-lg bg-muted/30",m),children:[c.jsx(na,{className:ie("block h-full w-full rounded-lg object-cover transition duration-300 group-hover:scale-[1.012]",h),style:{objectPosition:y},src:b.src,alt:b.alt,caption:b.caption,backdrop:a,set:r,defaultPage:d,radius:10,edge:12,animate:Hs,controller:KO}),c.jsxs("figcaption",{className:ie("pointer-events-none absolute inset-x-0 bottom-0 flex items-end justify-between gap-3 bg-gradient-to-t from-black/70 via-black/15 to-transparent p-3 text-xs text-white",g),children:[c.jsx("span",{className:"font-medium",children:e(u)}),c.jsx("span",{className:"font-mono opacity-75",children:String(d+1).padStart(2,"0")})]})]})};return c.jsxs("section",{className:"mx-auto max-w-7xl px-4 py-24 sm:px-6",children:[c.jsxs("div",{className:"mb-8 flex flex-col gap-5 md:flex-row md:items-end md:justify-between",children:[c.jsxs("div",{className:"max-w-2xl",children:[c.jsxs("p",{className:"mb-3 inline-flex items-center gap-2 rounded-md border border-border bg-muted/40 px-2.5 py-1 text-xs font-medium text-muted-foreground",children:[c.jsx(Nm,{"aria-hidden":!0,className:"h-3.5 w-3.5"}),e("demo.eyebrow")]}),c.jsx("h2",{className:"text-3xl font-semibold tracking-tight sm:text-4xl",children:e("demo.title")}),c.jsx("p",{className:"mt-3 text-sm leading-6 text-muted-foreground sm:text-base",children:e("demo.body")})]}),c.jsx("div",{className:"hidden w-fit max-w-full flex-col gap-2 text-sm md:flex",children:c.jsxs("div",{className:"inline-flex items-center gap-2 rounded-md border border-amber-400/30 bg-amber-400/10 px-3 py-2 text-amber-950 shadow-sm dark:text-amber-100",children:[c.jsx(ZR,{"aria-hidden":!0,className:"h-4 w-4 shrink-0"}),c.jsx("span",{children:e("demo.shiftHint")})]})})]}),c.jsxs("article",{className:"grid gap-4 lg:grid-cols-[minmax(0,1.05fr)_minmax(260px,0.58fr)_minmax(260px,0.72fr)] lg:grid-rows-[13rem_14rem_12rem]",children:[c.jsx(l,{page:0,labelKey:"demo.tile.cover",className:"aspect-[5/4] border border-border lg:col-span-2 lg:row-span-2 lg:aspect-auto",imageClassName:"",objectPosition:"52% 48%"}),c.jsxs("div",{className:"flex min-w-0 flex-col justify-between gap-6 border-y border-border py-5 lg:row-span-1",children:[c.jsxs("div",{children:[c.jsxs("p",{className:"text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground",children:[c.jsx("a",{href:UO,target:"_blank",rel:"noreferrer",className:"underline-offset-4 transition-colors hover:text-foreground hover:underline",children:e("demo.story.project")}),c.jsxs("span",{children:[" · ",e("demo.story.author")]})]}),c.jsx("p",{className:"mt-3 text-xl font-medium leading-8 tracking-normal",children:e("demo.story.title")})]}),c.jsx("p",{className:"text-sm leading-7 text-muted-foreground",children:e("demo.story.lead")})]}),c.jsx(l,{page:1,labelKey:"demo.tile.gallery",className:"aspect-[4/3] border border-border lg:row-span-1 lg:aspect-auto",imageClassName:"",objectPosition:"50% 42%"}),c.jsx("div",{className:"flex min-w-0 flex-col justify-end border-y border-border py-5 text-sm leading-7 text-muted-foreground lg:col-start-2 lg:row-start-3",children:c.jsx("p",{children:e("demo.story.middle")})}),c.jsx(l,{page:6,labelKey:"demo.tile.controller",className:"aspect-[16/10] border border-border lg:col-start-1 lg:row-start-3 lg:aspect-auto",imageClassName:"",objectPosition:"50% 45%"}),c.jsx(l,{page:4,labelKey:"demo.tile.zoom",className:"aspect-[16/10] border border-border lg:col-start-3 lg:row-start-3 lg:aspect-auto",imageClassName:"",objectPosition:"50% 42%"})]}),c.jsxs("div",{className:"mt-4 grid gap-4 md:grid-cols-[minmax(0,1fr)_minmax(0,0.82fr)_minmax(0,1.18fr)]",children:[c.jsx(l,{page:2,labelKey:"demo.tile.ratio",className:"aspect-[16/10] border border-border",imageClassName:"",objectPosition:"50% 46%"}),c.jsx(l,{page:5,labelKey:"demo.tile.lamp",className:"aspect-[4/3] border border-border md:aspect-[5/4]",imageClassName:"",objectPosition:"50% 48%"}),c.jsx(l,{page:7,labelKey:"demo.tile.rescue",className:"aspect-[16/9] border border-border",imageClassName:"",objectPosition:"52% 45%"})]}),c.jsx("div",{className:"mt-5 grid gap-2 lg:grid-cols-3",children:s.map(({icon:d,label:u})=>c.jsxs("div",{className:"flex min-h-11 min-w-0 items-center gap-2 rounded-md border border-border bg-background px-3 py-2 text-sm leading-5 text-muted-foreground",children:[c.jsx(d,{"aria-hidden":!0,className:"h-4 w-4 shrink-0 text-foreground"}),c.jsx("span",{className:"min-w-0",children:u})]},u))}),c.jsx("p",{className:"mt-5 text-sm text-muted-foreground",children:e("demo.caption")})]})}const $O=[{icon:LR,titleKey:"feature.dropin.title",hintKey:"feature.dropin.hint",code:''},{icon:YR,titleKey:"feature.mobile.title",hintKey:"feature.mobile.hint",code:''},{icon:_R,titleKey:"feature.set.title",hintKey:"feature.set.hint",code:''},{icon:_x,titleKey:"feature.ssr.title",hintKey:"feature.ssr.hint",code:"import Zmage from 'react-zmage/ssr'"}];function YO(){const{t:e}=be();return c.jsx("section",{className:"mx-auto max-w-6xl px-4 py-24 sm:px-6",children:c.jsx("div",{className:"grid gap-4 md:grid-cols-2",children:$O.map(({icon:a,titleKey:r,hintKey:s,code:l})=>c.jsxs(Ua,{className:"group relative min-w-0 overflow-hidden border-border/60 bg-card/40 p-6 transition-colors hover:bg-card/70",children:[c.jsx(a,{className:"h-5 w-5 text-muted-foreground"}),c.jsx("h3",{className:"mt-4 text-lg font-medium",children:e(r)}),c.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e(s)}),c.jsx("div",{className:"mt-5",children:c.jsx(De,{code:l,language:"tsx",showCopy:!1})})]},r))})})}function XO(){return c.jsxs("section",{"aria-hidden":"true","data-agent-facts":!0,className:"sr-only",children:[c.jsxs("div",{className:"max-w-3xl",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:"Agent facts"}),c.jsx("h2",{className:"mt-3 text-3xl font-semibold tracking-tight",children:"Install, cost, and alternatives"}),c.jsx("p",{className:"mt-3 text-sm leading-6 text-muted-foreground sm:text-base",children:"react-zmage is a free MIT-licensed open-source package on npm. It is a client-side React component library, not a hosted API service, so there is no OAuth flow, API key, webhook endpoint, MCP server, account, or product rate limit."})]}),c.jsxs("div",{className:"mt-8 grid gap-4 lg:grid-cols-3",children:[c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h3",{className:"text-base font-medium",children:"Quick start"}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:"Install the package, import the stylesheet once, then choose Component, Wrapper, or Imperative mode for the image surface."}),c.jsx("div",{className:"mt-4",children:c.jsx(De,{code:"npm install react-zmage",language:"bash",showCopy:!1})})]}),c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h3",{className:"text-base font-medium",children:"react-zmage vs alternatives"}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:"react-zmage is an alternative to react-medium-image-zoom, Lightbox.js, and react-photoswipe when a React page needs fullscreen image preview from existing img elements. Unlike gallery-first tools, it can start as a drop-in image replacement."}),c.jsx(st,{to:"/compare",className:"mt-4 inline-flex text-sm text-foreground underline-offset-4 hover:underline",children:"Compare packages"})]}),c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h3",{className:"text-base font-medium",children:"Trust and recovery"}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:"Agents can use the status, about, contact, and privacy pages to avoid guessing about unsupported hosted APIs or private access paths."}),c.jsxs("div",{className:"mt-4 flex flex-wrap gap-x-4 gap-y-2 text-sm",children:[c.jsx(st,{to:"/status",className:"text-foreground underline-offset-4 hover:underline",children:"Status"}),c.jsx(st,{to:"/about",className:"text-foreground underline-offset-4 hover:underline",children:"About"}),c.jsx(st,{to:"/contact",className:"text-foreground underline-offset-4 hover:underline",children:"Contact"}),c.jsx(st,{to:"/privacy",className:"text-foreground underline-offset-4 hover:underline",children:"Privacy"})]})]})]})]})}const qp={component:'',imperative:`import Zmage from 'react-zmage' - -button.onclick = () => Zmage.browsing({ - src: 'hero.jpg' -})`,wrapper:` -
-`};function QO(){const{t:e}=be(),a=[{code:qp.component,labelKey:"modes.component.label",descKey:"modes.component.desc",link:"/playground"},{code:qp.imperative,labelKey:"modes.imperative.label",descKey:"modes.imperative.desc",link:"/playground/imperative"},{code:qp.wrapper,labelKey:"modes.wrapper.label",descKey:"modes.wrapper.desc",link:"/playground/wrapper"}];return c.jsxs("section",{className:"mx-auto max-w-6xl px-4 py-24 sm:px-6",children:[c.jsx("h2",{className:"text-3xl font-semibold tracking-tight",children:e("modes.title")}),c.jsx("div",{className:"mt-10 grid min-w-0 gap-6 md:grid-cols-3",children:a.map(r=>c.jsxs("div",{className:"flex min-w-0 flex-col",children:[c.jsx("span",{className:"text-xs font-mono text-muted-foreground",children:e(r.labelKey)}),c.jsx(De,{code:r.code,className:"mt-2 flex-1"}),c.jsx("p",{className:"mt-4 text-sm text-muted-foreground",children:e(r.descKey)}),c.jsx(st,{to:r.link,className:"mt-3 text-sm text-foreground hover:opacity-70",children:e("modes.try")})]},r.labelKey))})]})}function ex(){return c.jsxs(c.Fragment,{children:[c.jsx(GO,{}),c.jsx(WO,{}),c.jsx(YO,{}),c.jsx(XO,{}),c.jsx(QO,{}),c.jsx(mi,{})]})}var $c="Collapsible",[JO,nC]=Vt($c),[eL,yf]=JO($c),rC=v.forwardRef((e,a)=>{const{__scopeCollapsible:r,open:s,defaultOpen:l,disabled:d,onOpenChange:u,...m}=e,[h,g]=go({prop:s,defaultProp:l??!1,onChange:u,caller:$c});return c.jsx(eL,{scope:r,disabled:d,contentId:mo(),open:h,onOpenToggle:v.useCallback(()=>g(y=>!y),[g]),children:c.jsx(Te.div,{"data-state":vf(h),"data-disabled":d?"":void 0,...m,ref:a})})});rC.displayName=$c;var sC="CollapsibleTrigger",iC=v.forwardRef((e,a)=>{const{__scopeCollapsible:r,...s}=e,l=yf(sC,r);return c.jsx(Te.button,{type:"button","aria-controls":l.contentId,"aria-expanded":l.open||!1,"data-state":vf(l.open),"data-disabled":l.disabled?"":void 0,disabled:l.disabled,...s,ref:a,onClick:ce(e.onClick,l.onOpenToggle)})});iC.displayName=sC;var bf="CollapsibleContent",lC=v.forwardRef((e,a)=>{const{forceMount:r,...s}=e,l=yf(bf,e.__scopeCollapsible);return c.jsx(Mt,{present:r||l.open,children:({present:d})=>c.jsx(tL,{...s,ref:a,present:d})})});lC.displayName=bf;var tL=v.forwardRef((e,a)=>{const{__scopeCollapsible:r,present:s,children:l,...d}=e,u=yf(bf,r),[m,h]=v.useState(s),g=v.useRef(null),y=Ze(a,g),b=v.useRef(0),S=b.current,T=v.useRef(0),C=T.current,x=u.open||m,k=v.useRef(x),R=v.useRef(void 0);return v.useEffect(()=>{const j=requestAnimationFrame(()=>k.current=!1);return()=>cancelAnimationFrame(j)},[]),ra(()=>{const j=g.current;if(j){R.current=R.current||{transitionDuration:j.style.transitionDuration,animationName:j.style.animationName},j.style.transitionDuration="0s",j.style.animationName="none";const A=j.getBoundingClientRect();b.current=A.height,T.current=A.width,k.current||(j.style.transitionDuration=R.current.transitionDuration,j.style.animationName=R.current.animationName),h(s)}},[u.open,s]),c.jsx(Te.div,{"data-state":vf(u.open),"data-disabled":u.disabled?"":void 0,id:u.contentId,hidden:!x,...d,ref:y,style:{"--radix-collapsible-content-height":S?`${S}px`:void 0,"--radix-collapsible-content-width":C?`${C}px`:void 0,...e.style},children:x&&l})});function vf(e){return e?"open":"closed"}var oL=rC,aL=iC,nL=lC,bo="Accordion",rL=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[xf,sL,iL]=Rc(bo),[Yc]=Vt(bo,[iL,nC]),wf=nC(),cC=Q.forwardRef((e,a)=>{const{type:r,...s}=e,l=s,d=s;return c.jsx(xf.Provider,{scope:e.__scopeAccordion,children:r==="multiple"?c.jsx(uL,{...d,ref:a}):c.jsx(dL,{...l,ref:a})})});cC.displayName=bo;var[dC,lL]=Yc(bo),[uC,cL]=Yc(bo,{collapsible:!1}),dL=Q.forwardRef((e,a)=>{const{value:r,defaultValue:s,onValueChange:l=()=>{},collapsible:d=!1,...u}=e,[m,h]=go({prop:r,defaultProp:s??"",onChange:l,caller:bo});return c.jsx(dC,{scope:e.__scopeAccordion,value:Q.useMemo(()=>m?[m]:[],[m]),onItemOpen:h,onItemClose:Q.useCallback(()=>d&&h(""),[d,h]),children:c.jsx(uC,{scope:e.__scopeAccordion,collapsible:d,children:c.jsx(pC,{...u,ref:a})})})}),uL=Q.forwardRef((e,a)=>{const{value:r,defaultValue:s,onValueChange:l=()=>{},...d}=e,[u,m]=go({prop:r,defaultProp:s??[],onChange:l,caller:bo}),h=Q.useCallback(y=>m((b=[])=>[...b,y]),[m]),g=Q.useCallback(y=>m((b=[])=>b.filter(S=>S!==y)),[m]);return c.jsx(dC,{scope:e.__scopeAccordion,value:u,onItemOpen:h,onItemClose:g,children:c.jsx(uC,{scope:e.__scopeAccordion,collapsible:!0,children:c.jsx(pC,{...d,ref:a})})})}),[pL,Xc]=Yc(bo),pC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,disabled:s,dir:l,orientation:d="vertical",...u}=e,m=Q.useRef(null),h=Ze(m,a),g=sL(r),b=ni(l)==="ltr",S=ce(e.onKeyDown,T=>{var X;if(!rL.includes(T.key))return;const C=T.target,x=g().filter(ae=>{var re;return!((re=ae.ref.current)!=null&&re.disabled)}),k=x.findIndex(ae=>ae.ref.current===C),R=x.length;if(k===-1)return;T.preventDefault();let j=k;const A=0,M=R-1,q=()=>{j=k+1,j>M&&(j=A)},P=()=>{j=k-1,j{const{__scopeAccordion:r,value:s,...l}=e,d=Xc(pc,r),u=lL(pc,r),m=wf(r),h=mo(),g=s&&u.value.includes(s)||!1,y=d.disabled||e.disabled;return c.jsx(mL,{scope:r,open:g,disabled:y,triggerId:h,children:c.jsx(oL,{"data-orientation":d.orientation,"data-state":vC(g),...m,...l,ref:a,disabled:y,open:g,onOpenChange:b=>{b?u.onItemOpen(s):u.onItemClose(s)}})})});mC.displayName=pc;var fC="AccordionHeader",hC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,...s}=e,l=Xc(bo,r),d=Sf(fC,r);return c.jsx(Te.h3,{"data-orientation":l.orientation,"data-state":vC(d.open),"data-disabled":d.disabled?"":void 0,...s,ref:a})});hC.displayName=fC;var bm="AccordionTrigger",gC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,...s}=e,l=Xc(bo,r),d=Sf(bm,r),u=cL(bm,r),m=wf(r);return c.jsx(xf.ItemSlot,{scope:r,children:c.jsx(aL,{"aria-disabled":d.open&&!u.collapsible||void 0,"data-orientation":l.orientation,id:d.triggerId,...m,...s,ref:a})})});gC.displayName=bm;var yC="AccordionContent",bC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,...s}=e,l=Xc(bo,r),d=Sf(yC,r),u=wf(r);return c.jsx(nL,{role:"region","aria-labelledby":d.triggerId,"data-orientation":l.orientation,...u,...s,ref:a,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});bC.displayName=yC;function vC(e){return e?"open":"closed"}var fL=cC,hL=mC,gL=hC,xC=gC,wC=bC;const yL=fL,SC=v.forwardRef(({className:e,...a},r)=>c.jsx(hL,{ref:r,className:ie("border-b",e),...a}));SC.displayName="AccordionItem";const CC=v.forwardRef(({className:e,children:a,...r},s)=>c.jsx(gL,{className:"flex",children:c.jsxs(xC,{ref:s,className:ie("flex flex-1 cursor-pointer items-center justify-between py-4 text-sm font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180",e),...r,children:[a,c.jsx(zx,{className:"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"})]})}));CC.displayName=xC.displayName;const kC=v.forwardRef(({className:e,children:a,...r},s)=>c.jsx(wC,{ref:s,className:"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...r,children:c.jsx("div",{className:ie("pb-4 pt-0",e),children:a})}));kC.displayName=wC.displayName;const bL={desktop:{short:"common.presetScope.desktop.short",title:"common.presetScope.desktop.title",desc:"common.presetScope.desktop.desc"},mobile:{short:"common.presetScope.mobile.short",title:"common.presetScope.mobile.title",desc:"common.presetScope.mobile.desc"}},vL={desktop:"border-sky-500/30 bg-sky-500/10 text-sky-700 dark:text-sky-300",mobile:"border-emerald-500/30 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300"};function Qc({scope:e,className:a}){const{t:r}=be(),s=bL[e];return c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"inline-flex cursor-help",children:c.jsx(Wc,{variant:"outline","aria-label":r(s.title),className:ie("h-4 rounded px-1 text-[9px] leading-none",vL[e],a),children:r(s.short)})})}),c.jsxs(po,{side:"right",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r(s.title)}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r(s.desc)})]})]})}function TC(e){const a=v.useRef({value:e,previous:e});return v.useMemo(()=>(a.current.value!==e&&(a.current.previous=a.current.value,a.current.value=e),a.current.previous),[e])}var Jc="Switch",[xL]=Vt(Jc),[wL,SL]=xL(Jc),EC=v.forwardRef((e,a)=>{const{__scopeSwitch:r,name:s,checked:l,defaultChecked:d,required:u,disabled:m,value:h="on",onCheckedChange:g,form:y,...b}=e,[S,T]=v.useState(null),C=Ze(a,A=>T(A)),x=v.useRef(!1),k=S?y||!!S.closest("form"):!0,[R,j]=go({prop:l,defaultProp:d??!1,onChange:g,caller:Jc});return c.jsxs(wL,{scope:r,checked:R,disabled:m,children:[c.jsx(Te.button,{type:"button",role:"switch","aria-checked":R,"aria-required":u,"data-state":NC(R),"data-disabled":m?"":void 0,disabled:m,value:h,...b,ref:C,onClick:ce(e.onClick,A=>{j(M=>!M),k&&(x.current=A.isPropagationStopped(),x.current||A.stopPropagation())})}),k&&c.jsx(AC,{control:S,bubbles:!x.current,name:s,value:h,checked:R,required:u,disabled:m,form:y,style:{transform:"translateX(-100%)"}})]})});EC.displayName=Jc;var RC="SwitchThumb",jC=v.forwardRef((e,a)=>{const{__scopeSwitch:r,...s}=e,l=SL(RC,r);return c.jsx(Te.span,{"data-state":NC(l.checked),"data-disabled":l.disabled?"":void 0,...s,ref:a})});jC.displayName=RC;var CL="SwitchBubbleInput",AC=v.forwardRef(({__scopeSwitch:e,control:a,checked:r,bubbles:s=!0,...l},d)=>{const u=v.useRef(null),m=Ze(u,d),h=TC(r),g=Km(a);return v.useEffect(()=>{const y=u.current;if(!y)return;const b=window.HTMLInputElement.prototype,T=Object.getOwnPropertyDescriptor(b,"checked").set;if(h!==r&&T){const C=new Event("click",{bubbles:s});T.call(y,r),y.dispatchEvent(C)}},[h,r,s]),c.jsx("input",{type:"checkbox","aria-hidden":!0,defaultChecked:r,...l,tabIndex:-1,ref:m,style:{...l.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});AC.displayName=CL;function NC(e){return e?"checked":"unchecked"}var zC=EC,kL=jC;const Xe=v.forwardRef(({className:e,...a},r)=>c.jsx(zC,{className:ie("peer group inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input hover:data-[state=checked]:bg-primary/85 hover:data-[state=unchecked]:bg-input/70 hover:ring-2 hover:ring-foreground/15",e),...a,ref:r,children:c.jsx(kL,{className:ie("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0")})}));Xe.displayName=zC.displayName;function MC(e,[a,r]){return Math.min(r,Math.max(a,e))}var DC=["PageUp","PageDown"],_C=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],OC={"from-left":["Home","PageDown","ArrowDown","ArrowLeft"],"from-right":["Home","PageDown","ArrowDown","ArrowRight"],"from-bottom":["Home","PageDown","ArrowDown","ArrowLeft"],"from-top":["Home","PageDown","ArrowUp","ArrowLeft"]},Kr="Slider",[vm,TL,EL]=Rc(Kr),[LC]=Vt(Kr,[EL]),[RL,ed]=LC(Kr),ZC=v.forwardRef((e,a)=>{const{name:r,min:s=0,max:l=100,step:d=1,orientation:u="horizontal",disabled:m=!1,minStepsBetweenThumbs:h=0,defaultValue:g=[s],value:y,onValueChange:b=()=>{},onValueCommit:S=()=>{},inverted:T=!1,form:C,...x}=e,k=v.useRef(new Set),R=v.useRef(0),A=u==="horizontal"?jL:AL,[M=[],q]=go({prop:y,defaultProp:g,onChange:te=>{var pe;(pe=[...k.current][R.current])==null||pe.focus(),b(te)}}),P=v.useRef(M);function I(te){const J=_L(M,te);re(te,J)}function X(te){re(te,R.current)}function ae(){const te=P.current[R.current];M[R.current]!==te&&S(M)}function re(te,J,{commit:pe}={commit:!1}){const ne=PL(d),ue=BL(Math.round((te-s)/d)*d+s,ne),O=MC(ue,[s,l]);q((V=[])=>{const H=ML(V,O,J);if(ZL(H,h*d)){R.current=H.indexOf(O);const Y=String(H)!==String(V);return Y&&pe&&S(H),Y?H:V}else return V})}return c.jsx(RL,{scope:e.__scopeSlider,name:r,disabled:m,min:s,max:l,valueIndexToChangeRef:R,thumbs:k.current,values:M,orientation:u,form:C,children:c.jsx(vm.Provider,{scope:e.__scopeSlider,children:c.jsx(vm.Slot,{scope:e.__scopeSlider,children:c.jsx(A,{"aria-disabled":m,"data-disabled":m?"":void 0,...x,ref:a,onPointerDown:ce(x.onPointerDown,()=>{m||(P.current=M)}),min:s,max:l,inverted:T,onSlideStart:m?void 0:I,onSlideMove:m?void 0:X,onSlideEnd:m?void 0:ae,onHomeKeyDown:()=>!m&&re(s,0,{commit:!0}),onEndKeyDown:()=>!m&&re(l,M.length-1,{commit:!0}),onStepKeyDown:({event:te,direction:J})=>{if(!m){const ue=DC.includes(te.key)||te.shiftKey&&_C.includes(te.key)?10:1,O=R.current,V=M[O],H=d*ue*J;re(V+H,O,{commit:!0})}}})})})})});ZC.displayName=Kr;var[PC,BC]=LC(Kr,{startEdge:"left",endEdge:"right",size:"width",direction:1}),jL=v.forwardRef((e,a)=>{const{min:r,max:s,dir:l,inverted:d,onSlideStart:u,onSlideMove:m,onSlideEnd:h,onStepKeyDown:g,...y}=e,[b,S]=v.useState(null),T=Ze(a,A=>S(A)),C=v.useRef(void 0),x=ni(l),k=x==="ltr",R=k&&!d||!k&&d;function j(A){const M=C.current||b.getBoundingClientRect(),q=[0,M.width],I=Cf(q,R?[r,s]:[s,r]);return C.current=M,I(A-M.left)}return c.jsx(PC,{scope:e.__scopeSlider,startEdge:R?"left":"right",endEdge:R?"right":"left",direction:R?1:-1,size:"width",children:c.jsx(IC,{dir:x,"data-orientation":"horizontal",...y,ref:T,style:{...y.style,"--radix-slider-thumb-transform":"translateX(-50%)"},onSlideStart:A=>{const M=j(A.clientX);u==null||u(M)},onSlideMove:A=>{const M=j(A.clientX);m==null||m(M)},onSlideEnd:()=>{C.current=void 0,h==null||h()},onStepKeyDown:A=>{const q=OC[R?"from-left":"from-right"].includes(A.key);g==null||g({event:A,direction:q?-1:1})}})})}),AL=v.forwardRef((e,a)=>{const{min:r,max:s,inverted:l,onSlideStart:d,onSlideMove:u,onSlideEnd:m,onStepKeyDown:h,...g}=e,y=v.useRef(null),b=Ze(a,y),S=v.useRef(void 0),T=!l;function C(x){const k=S.current||y.current.getBoundingClientRect(),R=[0,k.height],A=Cf(R,T?[s,r]:[r,s]);return S.current=k,A(x-k.top)}return c.jsx(PC,{scope:e.__scopeSlider,startEdge:T?"bottom":"top",endEdge:T?"top":"bottom",size:"height",direction:T?1:-1,children:c.jsx(IC,{"data-orientation":"vertical",...g,ref:b,style:{...g.style,"--radix-slider-thumb-transform":"translateY(50%)"},onSlideStart:x=>{const k=C(x.clientY);d==null||d(k)},onSlideMove:x=>{const k=C(x.clientY);u==null||u(k)},onSlideEnd:()=>{S.current=void 0,m==null||m()},onStepKeyDown:x=>{const R=OC[T?"from-bottom":"from-top"].includes(x.key);h==null||h({event:x,direction:R?-1:1})}})})}),IC=v.forwardRef((e,a)=>{const{__scopeSlider:r,onSlideStart:s,onSlideMove:l,onSlideEnd:d,onHomeKeyDown:u,onEndKeyDown:m,onStepKeyDown:h,...g}=e,y=ed(Kr,r);return c.jsx(Te.span,{...g,ref:a,onKeyDown:ce(e.onKeyDown,b=>{b.key==="Home"?(u(b),b.preventDefault()):b.key==="End"?(m(b),b.preventDefault()):DC.concat(_C).includes(b.key)&&(h(b),b.preventDefault())}),onPointerDown:ce(e.onPointerDown,b=>{const S=b.target;S.setPointerCapture(b.pointerId),b.preventDefault(),y.thumbs.has(S)?S.focus():s(b)}),onPointerMove:ce(e.onPointerMove,b=>{b.target.hasPointerCapture(b.pointerId)&&l(b)}),onPointerUp:ce(e.onPointerUp,b=>{const S=b.target;S.hasPointerCapture(b.pointerId)&&(S.releasePointerCapture(b.pointerId),d(b))})})}),qC="SliderTrack",FC=v.forwardRef((e,a)=>{const{__scopeSlider:r,...s}=e,l=ed(qC,r);return c.jsx(Te.span,{"data-disabled":l.disabled?"":void 0,"data-orientation":l.orientation,...s,ref:a})});FC.displayName=qC;var xm="SliderRange",KC=v.forwardRef((e,a)=>{const{__scopeSlider:r,...s}=e,l=ed(xm,r),d=BC(xm,r),u=v.useRef(null),m=Ze(a,u),h=l.values.length,g=l.values.map(S=>GC(S,l.min,l.max)),y=h>1?Math.min(...g):0,b=100-Math.max(...g);return c.jsx(Te.span,{"data-orientation":l.orientation,"data-disabled":l.disabled?"":void 0,...s,ref:m,style:{...e.style,[d.startEdge]:y+"%",[d.endEdge]:b+"%"}})});KC.displayName=xm;var wm="SliderThumb",UC=v.forwardRef((e,a)=>{const r=TL(e.__scopeSlider),[s,l]=v.useState(null),d=Ze(a,m=>l(m)),u=v.useMemo(()=>s?r().findIndex(m=>m.ref.current===s):-1,[r,s]);return c.jsx(NL,{...e,ref:d,index:u})}),NL=v.forwardRef((e,a)=>{const{__scopeSlider:r,index:s,name:l,...d}=e,u=ed(wm,r),m=BC(wm,r),[h,g]=v.useState(null),y=Ze(a,j=>g(j)),b=h?u.form||!!h.closest("form"):!0,S=Km(h),T=u.values[s],C=T===void 0?0:GC(T,u.min,u.max),x=DL(s,u.values.length),k=S==null?void 0:S[m.size],R=k?OL(k,C,m.direction):0;return v.useEffect(()=>{if(h)return u.thumbs.add(h),()=>{u.thumbs.delete(h)}},[h,u.thumbs]),c.jsxs("span",{style:{transform:"var(--radix-slider-thumb-transform)",position:"absolute",[m.startEdge]:`calc(${C}% + ${R}px)`},children:[c.jsx(vm.ItemSlot,{scope:e.__scopeSlider,children:c.jsx(Te.span,{role:"slider","aria-label":e["aria-label"]||x,"aria-valuemin":u.min,"aria-valuenow":T,"aria-valuemax":u.max,"aria-orientation":u.orientation,"data-orientation":u.orientation,"data-disabled":u.disabled?"":void 0,tabIndex:u.disabled?void 0:0,...d,ref:y,style:T===void 0?{display:"none"}:e.style,onFocus:ce(e.onFocus,()=>{u.valueIndexToChangeRef.current=s})})}),b&&c.jsx(HC,{name:l??(u.name?u.name+(u.values.length>1?"[]":""):void 0),form:u.form,value:T},s)]})});UC.displayName=wm;var zL="RadioBubbleInput",HC=v.forwardRef(({__scopeSlider:e,value:a,...r},s)=>{const l=v.useRef(null),d=Ze(l,s),u=TC(a);return v.useEffect(()=>{const m=l.current;if(!m)return;const h=window.HTMLInputElement.prototype,y=Object.getOwnPropertyDescriptor(h,"value").set;if(u!==a&&y){const b=new Event("input",{bubbles:!0});y.call(m,a),m.dispatchEvent(b)}},[u,a]),c.jsx(Te.input,{style:{display:"none"},...r,ref:d,defaultValue:a})});HC.displayName=zL;function ML(e=[],a,r){const s=[...e];return s[r]=a,s.sort((l,d)=>l-d)}function GC(e,a,r){const d=100/(r-a)*(e-a);return MC(d,[0,100])}function DL(e,a){return a>2?`Value ${e+1} of ${a}`:a===2?["Minimum","Maximum"][e]:void 0}function _L(e,a){if(e.length===1)return 0;const r=e.map(l=>Math.abs(l-a)),s=Math.min(...r);return r.indexOf(s)}function OL(e,a,r){const s=e/2,d=Cf([0,50],[0,s]);return(s-d(a)*r)*r}function LL(e){return e.slice(0,-1).map((a,r)=>e[r+1]-a)}function ZL(e,a){if(a>0){const r=LL(e);return Math.min(...r)>=a}return!0}function Cf(e,a){return r=>{if(e[0]===e[1]||a[0]===a[1])return a[0];const s=(a[1]-a[0])/(e[1]-e[0]);return a[0]+s*(r-e[0])}}function PL(e){return(String(e).split(".")[1]||"").length}function BL(e,a){const r=Math.pow(10,a);return Math.round(e*r)/r}var VC=ZC,IL=FC,qL=KC,FL=UC;const td=v.forwardRef(({className:e,...a},r)=>c.jsxs(VC,{ref:r,className:ie("relative flex w-full touch-none select-none items-center",e),...a,children:[c.jsx(IL,{className:"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20",children:c.jsx(qL,{className:"absolute h-full bg-primary"})}),c.jsx(FL,{className:"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"})]}));td.displayName=VC.displayName;function KL({openDelay:e=60,closeDelay:a=140}={}){const[r,s]=v.useState(!1),l=v.useRef(void 0),d=()=>{l.current!==void 0&&(window.clearTimeout(l.current),l.current=void 0)},u=v.useCallback((g,y)=>{d(),l.current=window.setTimeout(()=>s(g),y)},[]);v.useEffect(()=>()=>d(),[]);const m=v.useCallback(()=>u(!0,e),[u,e]),h=v.useCallback(()=>u(!1,a),[u,a]);return{open:r,setOpen:s,hoverProps:{onMouseEnter:m,onMouseLeave:h}}}function To({value:e,onValueChange:a,options:r,placeholder:s,triggerClassName:l,contentClassName:d}){const{open:u,setOpen:m,hoverProps:h}=KL(),g=r.find(y=>y.value===e);return c.jsxs(Y0,{open:u,onOpenChange:m,children:[c.jsx(X0,{asChild:!0,...h,children:c.jsxs("button",{type:"button",className:ie("flex h-9 w-full cursor-pointer items-center justify-between gap-2 whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background hover:bg-accent/40 focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",l),children:[c.jsx("span",{className:ie("truncate",!g&&"text-muted-foreground"),children:g?g.label:s}),c.jsx(zx,{className:"h-4 w-4 shrink-0 opacity-50 transition-transform data-[state=open]:rotate-180"})]})}),c.jsx(of,{align:"start",sideOffset:4,className:ie("nav-menu-anim min-w-[var(--radix-dropdown-menu-trigger-width)]",d),...h,children:r.map(y=>{const b=y.value===e;return c.jsxs(af,{onSelect:()=>a(y.value),className:ie("flex items-center justify-between gap-2 pr-2",b&&"font-medium"),children:[c.jsx("span",{className:"truncate",children:y.label}),b&&c.jsx(Ha,{className:"h-3.5 w-3.5 shrink-0 opacity-80"})]},y.value)})})]})}var od="Tabs",[UL]=Vt(od,[Dc]),WC=Dc(),[HL,kf]=UL(od),$C=v.forwardRef((e,a)=>{const{__scopeTabs:r,value:s,onValueChange:l,defaultValue:d,orientation:u="horizontal",dir:m,activationMode:h="automatic",...g}=e,y=ni(m),[b,S]=go({prop:s,onChange:l,defaultProp:d??"",caller:od});return c.jsx(HL,{scope:r,baseId:mo(),value:b,onValueChange:S,orientation:u,dir:y,activationMode:h,children:c.jsx(Te.div,{dir:y,"data-orientation":u,...g,ref:a})})});$C.displayName=od;var YC="TabsList",XC=v.forwardRef((e,a)=>{const{__scopeTabs:r,loop:s=!0,...l}=e,d=kf(YC,r),u=WC(r);return c.jsx(t0,{asChild:!0,...u,orientation:d.orientation,dir:d.dir,loop:s,children:c.jsx(Te.div,{role:"tablist","aria-orientation":d.orientation,...l,ref:a})})});XC.displayName=YC;var QC="TabsTrigger",JC=v.forwardRef((e,a)=>{const{__scopeTabs:r,value:s,disabled:l=!1,...d}=e,u=kf(QC,r),m=WC(r),h=o1(u.baseId,s),g=a1(u.baseId,s),y=s===u.value;return c.jsx(o0,{asChild:!0,...m,focusable:!l,active:y,children:c.jsx(Te.button,{type:"button",role:"tab","aria-selected":y,"aria-controls":g,"data-state":y?"active":"inactive","data-disabled":l?"":void 0,disabled:l,id:h,...d,ref:a,onMouseDown:ce(e.onMouseDown,b=>{!l&&b.button===0&&b.ctrlKey===!1?u.onValueChange(s):b.preventDefault()}),onKeyDown:ce(e.onKeyDown,b=>{[" ","Enter"].includes(b.key)&&u.onValueChange(s)}),onFocus:ce(e.onFocus,()=>{const b=u.activationMode!=="manual";!y&&!l&&b&&u.onValueChange(s)})})})});JC.displayName=QC;var e1="TabsContent",t1=v.forwardRef((e,a)=>{const{__scopeTabs:r,value:s,forceMount:l,children:d,...u}=e,m=kf(e1,r),h=o1(m.baseId,s),g=a1(m.baseId,s),y=s===m.value,b=v.useRef(y);return v.useEffect(()=>{const S=requestAnimationFrame(()=>b.current=!1);return()=>cancelAnimationFrame(S)},[]),c.jsx(Mt,{present:l||y,children:({present:S})=>c.jsx(Te.div,{"data-state":y?"active":"inactive","data-orientation":m.orientation,role:"tabpanel","aria-labelledby":h,hidden:!S,id:g,tabIndex:0,...u,ref:a,style:{...e.style,animationDuration:b.current?"0s":void 0},children:S&&d})})});t1.displayName=e1;function o1(e,a){return`${e}-trigger-${a}`}function a1(e,a){return`${e}-content-${a}`}var GL=$C,n1=XC,r1=JC,s1=t1;function i1({activeSelector:e='[data-state="active"], [aria-current="page"]',className:a}){const r=v.useRef(null),[s,l]=v.useState(null),[d,u]=v.useState(!1);return v.useLayoutEffect(()=>{const m=r.current;if(!m)return;const h=m.parentElement;if(!h)return;const g=()=>{const T=h.querySelector(e);if(!T){l(null);return}l({left:T.offsetLeft,top:T.offsetTop,width:T.offsetWidth,height:T.offsetHeight})};g();const y=requestAnimationFrame(()=>u(!0)),b=new MutationObserver(g);b.observe(h,{attributes:!0,subtree:!0,attributeFilter:["data-state","aria-current","class"]});const S=new ResizeObserver(g);return S.observe(h),h.querySelectorAll('[data-state], [role="tab"], a').forEach(T=>S.observe(T)),()=>{cancelAnimationFrame(y),b.disconnect(),S.disconnect()}},[e]),c.jsx("span",{ref:r,"aria-hidden":!0,className:ie("pointer-events-none absolute rounded-md bg-background shadow",d?"opacity-100":"opacity-0",d&&"transition-[transform,width,height,opacity] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)]",a),style:s?{top:0,left:0,transform:`translate(${s.left}px, ${s.top}px)`,width:s.width,height:s.height}:void 0})}const Tf=GL,ad=v.forwardRef(({className:e,children:a,...r},s)=>c.jsxs(n1,{ref:s,className:ie("relative inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",e),...r,children:[c.jsx(i1,{}),a]}));ad.displayName=n1.displayName;const nd=v.forwardRef(({className:e,...a},r)=>c.jsx(r1,{ref:r,className:ie("relative z-10 inline-flex cursor-pointer items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-foreground",e),...a}));nd.displayName=r1.displayName;const VL=v.forwardRef(({className:e,...a},r)=>c.jsx(s1,{ref:r,className:ie("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",e),...a}));VL.displayName=s1.displayName;var rd="Popover",[l1]=Vt(rd,[Ir]),hi=Ir(),[WL,Ya]=l1(rd),c1=e=>{const{__scopePopover:a,children:r,open:s,defaultOpen:l,onOpenChange:d,modal:u=!1}=e,m=hi(a),h=v.useRef(null),[g,y]=v.useState(!1),[b,S]=go({prop:s,defaultProp:l??!1,onChange:d,caller:rd});return c.jsx(Gm,{...m,children:c.jsx(WL,{scope:a,contentId:mo(),triggerRef:h,open:b,onOpenChange:S,onOpenToggle:v.useCallback(()=>S(T=>!T),[S]),hasCustomAnchor:g,onCustomAnchorAdd:v.useCallback(()=>y(!0),[]),onCustomAnchorRemove:v.useCallback(()=>y(!1),[]),modal:u,children:r})})};c1.displayName=rd;var d1="PopoverAnchor",$L=v.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=Ya(d1,r),d=hi(r),{onCustomAnchorAdd:u,onCustomAnchorRemove:m}=l;return v.useEffect(()=>(u(),()=>m()),[u,m]),c.jsx(Mc,{...d,...s,ref:a})});$L.displayName=d1;var u1="PopoverTrigger",p1=v.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=Ya(u1,r),d=hi(r),u=Ze(a,l.triggerRef),m=c.jsx(Te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":l.open,"aria-controls":l.contentId,"data-state":y1(l.open),...s,ref:u,onClick:ce(e.onClick,l.onOpenToggle)});return l.hasCustomAnchor?m:c.jsx(Mc,{asChild:!0,...d,children:m})});p1.displayName=u1;var Ef="PopoverPortal",[YL,XL]=l1(Ef,{forceMount:void 0}),m1=e=>{const{__scopePopover:a,forceMount:r,children:s,container:l}=e,d=Ya(Ef,a);return c.jsx(YL,{scope:a,forceMount:r,children:c.jsx(Mt,{present:r||d.open,children:c.jsx(ai,{asChild:!0,container:l,children:s})})})};m1.displayName=Ef;var Or="PopoverContent",f1=v.forwardRef((e,a)=>{const r=XL(Or,e.__scopePopover),{forceMount:s=r.forceMount,...l}=e,d=Ya(Or,e.__scopePopover);return c.jsx(Mt,{present:s||d.open,children:d.modal?c.jsx(JL,{...l,ref:a}):c.jsx(e3,{...l,ref:a})})});f1.displayName=Or;var QL=Mr("PopoverContent.RemoveScroll"),JL=v.forwardRef((e,a)=>{const r=Ya(Or,e.__scopePopover),s=v.useRef(null),l=Ze(a,s),d=v.useRef(!1);return v.useEffect(()=>{const u=s.current;if(u)return Dm(u)},[]),c.jsx(wc,{as:QL,allowPinchZoom:!0,children:c.jsx(h1,{...e,ref:l,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ce(e.onCloseAutoFocus,u=>{var m;u.preventDefault(),d.current||(m=r.triggerRef.current)==null||m.focus()}),onPointerDownOutside:ce(e.onPointerDownOutside,u=>{const m=u.detail.originalEvent,h=m.button===0&&m.ctrlKey===!0,g=m.button===2||h;d.current=g},{checkForDefaultPrevented:!1}),onFocusOutside:ce(e.onFocusOutside,u=>u.preventDefault(),{checkForDefaultPrevented:!1})})})}),e3=v.forwardRef((e,a)=>{const r=Ya(Or,e.__scopePopover),s=v.useRef(!1),l=v.useRef(!1);return c.jsx(h1,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{var u,m;(u=e.onCloseAutoFocus)==null||u.call(e,d),d.defaultPrevented||(s.current||(m=r.triggerRef.current)==null||m.focus(),d.preventDefault()),s.current=!1,l.current=!1},onInteractOutside:d=>{var h,g;(h=e.onInteractOutside)==null||h.call(e,d),d.defaultPrevented||(s.current=!0,d.detail.originalEvent.type==="pointerdown"&&(l.current=!0));const u=d.target;((g=r.triggerRef.current)==null?void 0:g.contains(u))&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&l.current&&d.preventDefault()}})}),h1=v.forwardRef((e,a)=>{const{__scopePopover:r,trapFocus:s,onOpenAutoFocus:l,onCloseAutoFocus:d,disableOutsidePointerEvents:u,onEscapeKeyDown:m,onPointerDownOutside:h,onFocusOutside:g,onInteractOutside:y,...b}=e,S=Ya(Or,r),T=hi(r);return Mm(),c.jsx(vc,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:l,onUnmountAutoFocus:d,children:c.jsx(oi,{asChild:!0,disableOutsidePointerEvents:u,onInteractOutside:y,onEscapeKeyDown:m,onPointerDownOutside:h,onFocusOutside:g,onDismiss:()=>S.onOpenChange(!1),children:c.jsx(Vm,{"data-state":y1(S.open),role:"dialog",id:S.contentId,...T,...b,ref:a,style:{...b.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),g1="PopoverClose",t3=v.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=Ya(g1,r);return c.jsx(Te.button,{type:"button",...s,ref:a,onClick:ce(e.onClick,()=>l.onOpenChange(!1))})});t3.displayName=g1;var o3="PopoverArrow",a3=v.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=hi(r);return c.jsx(Wm,{...l,...s,ref:a})});a3.displayName=o3;function y1(e){return e?"open":"closed"}var n3=c1,r3=p1,s3=m1,b1=f1;const i3=n3,l3=r3,v1=v.forwardRef(({className:e,align:a="center",sideOffset:r=4,...s},l)=>c.jsx(s3,{children:c.jsx(b1,{ref:l,align:a,sideOffset:r,className:ie("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",e),...s})}));v1.displayName=b1.displayName;function c3({def:e,value:a,onChange:r}){const{t:s}=be(),l=e.control;if(l.kind==="switch")return c.jsx(Xe,{checked:!!a,onCheckedChange:r});if(l.kind==="number")return c.jsx(uo,{type:"number",value:a??"",onChange:d=>r(d.target.value===""?void 0:Number(d.target.value)),className:"h-7 w-24 px-2 text-xs md:text-xs"});if(l.kind==="text")return c.jsx(uo,{value:a??"",onChange:d=>r(d.target.value),className:"h-7 px-2 text-xs md:text-xs"});if(l.kind==="slider")return c.jsxs("div",{className:"flex items-center gap-3",children:[c.jsx(td,{min:l.min,max:l.max,step:l.step??1,value:[Number(a??0)],onValueChange:d=>r(d[0]),className:"flex-1"}),c.jsx(uo,{type:"number",value:a??0,onChange:d=>r(Number(d.target.value)),className:"h-7 w-14 px-2 text-xs md:text-xs"})]});if(l.kind==="select")return c.jsx(To,{value:String(a??""),onValueChange:r,triggerClassName:"h-7 text-xs",options:l.options.map(d=>({value:d.value,label:s(d.labelKey)}))});if(l.kind==="segmented")return c.jsx("div",{className:"flex justify-start overflow-x-auto",children:c.jsx(Tf,{value:String(a??""),onValueChange:r,children:c.jsx(ad,{className:"h-7 w-fit p-0.5",children:l.options.map(d=>c.jsx(nd,{value:d.value,className:"h-6 px-2 text-[11px]",children:s(d.labelKey)},d.value))})})});if(l.kind==="color"){const d=["#0a0a0a","#fafafa","rgba(0,0,0,0.85)","rgba(255,255,255,0.9)"];return c.jsxs(i3,{children:[c.jsx(l3,{asChild:!0,children:c.jsxs("button",{className:"flex h-7 items-center gap-2 rounded-md border border-input px-2 text-xs",children:[c.jsx("span",{className:"h-3.5 w-3.5 rounded border",style:{backgroundColor:a||"#fff"}}),c.jsx("span",{className:"font-mono",children:a||""})]})}),c.jsxs(v1,{className:"w-56 space-y-2 p-3",children:[c.jsx(uo,{value:a??"",onChange:u=>r(u.target.value),className:"h-7 px-2 text-xs md:text-xs"}),c.jsx("div",{className:"flex gap-1.5",children:d.map(u=>c.jsx("button",{onClick:()=>r(u),className:"h-6 w-6 rounded border",style:{backgroundColor:u},"aria-label":u},u))})]})]})}return null}const d3=[{key:"pagination",labelKey:"controller.pagination",descKey:"controller.pagination.desc"},{key:"rotate",labelKey:"controller.rotate",descKey:"controller.rotate.desc"},{key:"rotateLeft",labelKey:"controller.rotateLeft",descKey:"controller.rotateLeft.desc"},{key:"rotateRight",labelKey:"controller.rotateRight",descKey:"controller.rotateRight.desc"},{key:"zoom",labelKey:"controller.zoom",descKey:"controller.zoom.desc"},{key:"download",labelKey:"controller.download",descKey:"controller.download.desc"},{key:"close",labelKey:"controller.close",descKey:"controller.close.desc"},{key:"flip",labelKey:"controller.flip",descKey:"controller.flip.desc"},{key:"flipLeft",labelKey:"controller.flipLeft",descKey:"controller.flipLeft.desc"},{key:"flipRight",labelKey:"controller.flipRight",descKey:"controller.flipRight.desc"}],u3=["top-right","top-left","bottom-right","bottom-left","top-center","bottom-center","left-center","right-center"],p3=u3.map(e=>({value:e,label:e})),x1={toolbar:{inset:12},flip:{inset:0},pagination:{inset:24},caption:{inset:60}},m3={toolbar:12,flip:0,pagination:24,caption:60},f3=[{target:"toolbar",label:"toolbar.inset",descKey:"controller.layout.toolbarInset.desc",max:80},{target:"flip",label:"flip.inset",descKey:"controller.layout.flipInset.desc",max:80},{target:"pagination",label:"pagination.inset",descKey:"controller.layout.paginationInset.desc",max:120},{target:"caption",label:"caption.inset",descKey:"controller.layout.captionInset.desc",max:180}],h3={rotateLeft:"rotate",rotateRight:"rotate",flipLeft:"flip",flipRight:"flip"};function g3(e,a,r){var d;const s=(d=e==null?void 0:e[a])==null?void 0:d.inset;if(typeof s=="number")return s;if(typeof s=="string")return Number.parseFloat(s)||r;const l=a==="flip"?["left","right"]:a==="pagination"||a==="caption"?["bottom","top","left","right"]:["top","right","bottom","left"];for(const u of l){const m=s==null?void 0:s[u];if(typeof m=="number")return m;if(typeof m=="string")return Number.parseFloat(m)||r}return r}function y3(e,a,r){const s=e||x1,l=s[a]||{};return{...s,[a]:{...l,inset:r}}}function b3(e){const{layout:a,...r}=e;return r}function v3({value:e,min:a,max:r,step:s,onChange:l}){return c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx(td,{min:a,max:r,step:s,value:[e],onValueChange:d=>l(d[0]),className:"flex-1"}),c.jsx(uo,{type:"number",value:e,min:a,max:r,step:s,onChange:d=>{const u=Number(d.target.value);Number.isFinite(u)&&l(u)},className:"h-7 w-16 px-2 text-xs md:text-xs"})]})}function x3({value:e,onChange:a}){const{t:r}=be(),s=typeof e=="object"&&e?e:{},l=!!s.layout,d=(u,m)=>{a({...s,layout:y3(s.layout,u,m)})};return c.jsxs("div",{className:"grid gap-1.5",children:[c.jsxs("label",{className:"mb-1 grid grid-cols-[72px_1fr] items-center gap-2 rounded-md border border-border/70 p-2",children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-[11px] text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:"placement"})}),c.jsxs(po,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r("controller.placement")}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r("controller.placement.desc")})]})]}),c.jsx(To,{value:typeof s.placement=="string"?s.placement:"top-right",onValueChange:u=>a({...s,placement:u}),options:p3,triggerClassName:"h-7 px-2 text-[11px]",contentClassName:"text-xs"})]}),c.jsxs("div",{className:"mb-1 rounded-md border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3 text-[11px] leading-tight",children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:"layout"})}),c.jsxs(po,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r("controller.layout")}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r("controller.layout.desc")})]})]}),c.jsx(Xe,{checked:l,onCheckedChange:u=>a(u?{...s,layout:x1}:b3(s))})]}),l&&c.jsx("div",{className:"mt-2 grid gap-2 border-t border-border/70 pt-2",children:f3.map(({target:u,label:m,descKey:h,max:g})=>c.jsxs("div",{className:"grid gap-1",children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-[11px] text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:m})}),c.jsx(po,{side:"left",className:"max-w-[260px] text-xs",children:r(h)})]}),c.jsx(v3,{value:g3(s.layout,u,m3[u]),min:0,max:g,step:1,onChange:y=>d(u,y)})]},u))})]}),d3.map(({key:u,labelKey:m,descKey:h})=>{const g=h3[u],y=!!g&&!!s[g];return c.jsxs("label",{className:`flex items-center justify-between gap-3 text-[11px] leading-tight ${y?"opacity-50":""}`,children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:String(u)})}),c.jsxs(po,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r(m)}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r(h)}),y&&c.jsxs("div",{className:"mt-1 border-t border-primary-foreground/15 pt-1 text-primary-foreground/70",children:[r("controller.overriddenBy")," ",c.jsx("code",{className:"font-mono",children:g})]})]})]}),c.jsx(Xe,{checked:!!s[u],disabled:y,onCheckedChange:b=>a({...s,[u]:b})})]},String(u))})]})}const w3=[{key:"close",labelKey:"hotkey.close",descKey:"hotkey.close.desc"},{key:"zoom",labelKey:"hotkey.zoom",descKey:"hotkey.zoom.desc"},{key:"flip",labelKey:"hotkey.flip",descKey:"hotkey.flip.desc"},{key:"flipLeft",labelKey:"hotkey.flipLeft",descKey:"hotkey.flipLeft.desc"},{key:"flipRight",labelKey:"hotkey.flipRight",descKey:"hotkey.flipRight.desc"},{key:"rotate",labelKey:"hotkey.rotate",descKey:"hotkey.rotate.desc"},{key:"rotateLeft",labelKey:"hotkey.rotateLeft",descKey:"hotkey.rotateLeft.desc"},{key:"rotateRight",labelKey:"hotkey.rotateRight",descKey:"hotkey.rotateRight.desc"},{key:"download",labelKey:"hotkey.download",descKey:"hotkey.download.desc"}],S3={flipLeft:"flip",flipRight:"flip",rotateLeft:"rotate",rotateRight:"rotate"};function C3({value:e,onChange:a}){const{t:r}=be(),s=typeof e=="object"&&e?e:{};return c.jsx("div",{className:"grid gap-1.5",children:w3.map(({key:l,labelKey:d,descKey:u})=>{const m=S3[String(l)],h=!!m&&!!s[m];return c.jsxs("label",{className:`flex items-center justify-between gap-3 text-[11px] leading-tight ${h?"opacity-50":""}`,children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:String(l)})}),c.jsxs(po,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r(d)}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r(u)}),h&&c.jsxs("div",{className:"mt-1 border-t border-primary-foreground/15 pt-1 text-primary-foreground/70",children:[r("controller.overriddenBy")," ",c.jsx("code",{className:"font-mono",children:m})]})]})]}),c.jsx(Xe,{checked:!!s[l],disabled:h,onCheckedChange:g=>a({...s,[l]:g})})]},String(l))})})}const k3=[{value:"fade",labelKey:"animate.flip.fade"},{value:"crossFade",labelKey:"animate.flip.crossFade"},{value:"swipe",labelKey:"animate.flip.swipe"},{value:"zoom",labelKey:"animate.flip.zoom"},{value:"blur",labelKey:"animate.flip.blur"},{value:"none",labelKey:"animate.flip.none"}];function wr({children:e,descKey:a}){const{t:r}=be();return c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:e})}),c.jsx(po,{side:"left",className:"max-w-[260px] text-xs",children:r(a)})]})}function T3({value:e,onChange:a}){const{t:r}=be(),s=typeof e=="object"&&e?e:{},l=s.cover&&typeof s.cover=="object"?s.cover:{},d=u=>{a({...s,cover:{objectFit:l.objectFit??!0,clip:l.clip??!0,radius:l.radius??!0,...u}})};return c.jsxs("div",{className:"grid gap-1.5 text-[11px] leading-tight",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(wr,{descKey:"animate.browsing.desc",children:"browsing"}),c.jsx(Xe,{checked:!!s.browsing,onCheckedChange:u=>a({...s,browsing:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(wr,{descKey:"animate.flip.desc",children:"flip"}),c.jsx(To,{value:s.flip??"fade",onValueChange:u=>a({...s,flip:u}),triggerClassName:"h-7 w-32 text-[11px]",options:k3.map(u=>({value:u.value,label:r(u.labelKey)}))})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(wr,{descKey:"animate.slowMotion.desc",children:"slowMotion"}),c.jsx(Xe,{checked:!!s.slowMotion,onCheckedChange:u=>a({...s,slowMotion:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(wr,{descKey:"animate.cover.objectFit.desc",children:"cover.objectFit"}),c.jsx(Xe,{checked:s.cover!==!1&&l.objectFit!==!1,onCheckedChange:u=>d({objectFit:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(wr,{descKey:"animate.cover.clip.desc",children:"cover.clip"}),c.jsx(Xe,{checked:s.cover!==!1&&l.clip!==!1,onCheckedChange:u=>d({clip:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(wr,{descKey:"animate.cover.radius.desc",children:"cover.radius"}),c.jsx(Xe,{checked:s.cover!==!1&&l.radius!==!1,onCheckedChange:u=>d({radius:u})})]})]})}const Fp={threshold:120,velocity:.35,axisLock:1.2,resistance:.35},Kp={threshold:80,velocity:.35,axisLock:1.2,opacity:!0},Up={step:.12,smooth:!0,minScale:"fit",maxScale:4,center:"pointer",reverse:!1,exitGuardDuration:1e3},Hp={minScale:"fit",maxScale:4,resetBelowFit:!0,center:"gesture"},Gp={scale:1,minScale:"fit",maxScale:4,center:"tap",interval:300,distance:32};function dt({name:e,descKey:a,scope:r}){const{t:s}=be();return c.jsxs("span",{className:"inline-flex min-w-0 items-center gap-1",children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:e})}),c.jsx(po,{side:"left",className:"max-w-[260px] text-xs",children:s(a)})]}),r&&c.jsx(Qc,{scope:r})]})}function E3({value:e,min:a,max:r,step:s,onChange:l}){return c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx(td,{min:a,max:r,step:s,value:[e],onValueChange:d=>l(d[0]),className:"flex-1"}),c.jsx(uo,{type:"number",value:e,step:s,onChange:d=>l(Number(d.target.value)),className:"h-7 w-16 px-2 text-xs md:text-xs"})]})}function R3({value:e,onChange:a}){const r=e===!1,s=typeof e=="object"&&e?e:{},l=s.swipe&&typeof s.swipe=="object"?{...Fp,...s.swipe}:Fp,d=s.dragExit&&typeof s.dragExit=="object"?{...Kp,...s.dragExit}:Kp,u=s.wheelZoom&&typeof s.wheelZoom=="object"?{...Up,...s.wheelZoom}:Up,m=s.pinchZoom&&typeof s.pinchZoom=="object"?{...Hp,...s.pinchZoom}:Hp,h=s.doubleTapZoom&&typeof s.doubleTapZoom=="object"?{...Gp,...s.doubleTapZoom}:Gp,g=s.touchAction||"managed",y=x=>a({...s,swipe:x}),b=x=>a({...s,dragExit:x}),S=x=>a({...s,wheelZoom:x}),T=x=>a({...s,pinchZoom:x}),C=x=>a({...s,doubleTapZoom:x});return c.jsxs("div",{className:"grid gap-2 text-[11px] leading-tight",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"gesture",descKey:"gesture.desc"}),c.jsx(Xe,{checked:!r,onCheckedChange:x=>a(x?{swipe:Fp,dragExit:Kp,wheelZoom:Up,pinchZoom:Hp,doubleTapZoom:Gp,touchAction:"managed"}:!1)})]}),!r&&c.jsxs(c.Fragment,{children:[c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2 rounded border border-border/70 p-2",children:[c.jsx(dt,{name:"touchAction",descKey:"gesture.touchAction.desc",scope:"mobile"}),c.jsx(To,{value:g,onValueChange:x=>a({...s,touchAction:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"managed",label:"managed"},{value:"auto",label:"auto"},{value:"manipulation",label:"manipulation"},{value:"none",label:"none"}]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"swipe",descKey:"gesture.swipe.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.swipe!==!1,onCheckedChange:x=>y(x?l:!1)})]}),s.swipe!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"threshold",descKey:"gesture.threshold.desc",value:l.threshold,min:40,max:240,step:5,onChange:x=>y({...l,threshold:x})}),c.jsx(St,{name:"velocity",descKey:"gesture.velocity.desc",value:l.velocity,min:.1,max:1,step:.05,onChange:x=>y({...l,velocity:x})}),c.jsx(St,{name:"axisLock",descKey:"gesture.axisLock.desc",value:l.axisLock,min:1,max:2,step:.05,onChange:x=>y({...l,axisLock:x})}),c.jsx(St,{name:"resistance",descKey:"gesture.resistance.desc",value:l.resistance,min:.1,max:1,step:.05,onChange:x=>y({...l,resistance:x})})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"dragExit",descKey:"gesture.dragExit.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.dragExit!==!1,onCheckedChange:x=>b(x?d:!1)})]}),s.dragExit!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"threshold",descKey:"gesture.threshold.desc",value:d.threshold,min:40,max:240,step:5,onChange:x=>b({...d,threshold:x})}),c.jsx(St,{name:"velocity",descKey:"gesture.velocity.desc",value:d.velocity,min:.1,max:1,step:.05,onChange:x=>b({...d,velocity:x})}),c.jsx(St,{name:"axisLock",descKey:"gesture.axisLock.desc",value:d.axisLock,min:1,max:2,step:.05,onChange:x=>b({...d,axisLock:x})}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"opacity",descKey:"gesture.opacity.desc"}),c.jsx(Xe,{checked:d.opacity!==!1,onCheckedChange:x=>b({...d,opacity:x})})]})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"pinchZoom",descKey:"gesture.pinchZoom.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.pinchZoom!==!1,onCheckedChange:x=>T(x?m:!1)})]}),s.pinchZoom!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"maxScale",descKey:"gesture.pinchZoom.maxScale.desc",value:m.maxScale,min:1,max:8,step:.25,onChange:x=>T({...m,maxScale:x})}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"minScale",descKey:"gesture.pinchZoom.minScale.desc"}),c.jsx(To,{value:m.minScale==="fit"?"fit":String(m.minScale),onValueChange:x=>T({...m,minScale:x==="fit"?"fit":Number(x)}),triggerClassName:"h-7 text-[11px]",options:[{value:"fit",label:"fit"},{value:"0.5",label:"0.5"},{value:"1",label:"1"}]})]}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"center",descKey:"gesture.pinchZoom.center.desc"}),c.jsx(To,{value:m.center,onValueChange:x=>T({...m,center:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"gesture",label:"gesture"},{value:"viewport",label:"viewport"}]})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"resetBelowFit",descKey:"gesture.pinchZoom.resetBelowFit.desc"}),c.jsx(Xe,{checked:m.resetBelowFit!==!1,onCheckedChange:x=>T({...m,resetBelowFit:x})})]})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"doubleTapZoom",descKey:"gesture.doubleTapZoom.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.doubleTapZoom!==!1,onCheckedChange:x=>C(x?h:!1)})]}),s.doubleTapZoom!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"scale",descKey:"gesture.doubleTapZoom.scale.desc",value:h.scale,min:.5,max:4,step:.25,onChange:x=>C({...h,scale:x})}),c.jsx(St,{name:"maxScale",descKey:"gesture.doubleTapZoom.maxScale.desc",value:h.maxScale,min:1,max:8,step:.25,onChange:x=>C({...h,maxScale:x})}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"minScale",descKey:"gesture.doubleTapZoom.minScale.desc"}),c.jsx(To,{value:h.minScale==="fit"?"fit":String(h.minScale),onValueChange:x=>C({...h,minScale:x==="fit"?"fit":Number(x)}),triggerClassName:"h-7 text-[11px]",options:[{value:"fit",label:"fit"},{value:"0.5",label:"0.5"},{value:"1",label:"1"}]})]}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"center",descKey:"gesture.doubleTapZoom.center.desc"}),c.jsx(To,{value:h.center,onValueChange:x=>C({...h,center:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"tap",label:"tap"},{value:"viewport",label:"viewport"}]})]}),c.jsx(St,{name:"interval",descKey:"gesture.doubleTapZoom.interval.desc",value:h.interval,min:120,max:600,step:10,onChange:x=>C({...h,interval:x})}),c.jsx(St,{name:"distance",descKey:"gesture.doubleTapZoom.distance.desc",value:h.distance,min:8,max:80,step:2,onChange:x=>C({...h,distance:x})})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"wheelZoom",descKey:"gesture.wheelZoom.desc",scope:"desktop"}),c.jsx(Xe,{checked:s.wheelZoom!==!1,onCheckedChange:x=>S(x?u:!1)})]}),s.wheelZoom!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"step",descKey:"gesture.wheelZoom.step.desc",value:u.step,min:.02,max:.5,step:.01,onChange:x=>S({...u,step:x})}),c.jsx(St,{name:"maxScale",descKey:"gesture.wheelZoom.maxScale.desc",value:u.maxScale,min:1,max:8,step:.25,onChange:x=>S({...u,maxScale:x})}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"minScale",descKey:"gesture.wheelZoom.minScale.desc"}),c.jsx(To,{value:u.minScale==="fit"?"fit":String(u.minScale),onValueChange:x=>S({...u,minScale:x==="fit"?"fit":Number(x)}),triggerClassName:"h-7 text-[11px]",options:[{value:"fit",label:"fit"},{value:"0.5",label:"0.5"},{value:"1",label:"1"}]})]}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"center",descKey:"gesture.wheelZoom.center.desc"}),c.jsx(To,{value:u.center,onValueChange:x=>S({...u,center:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"pointer",label:"pointer"},{value:"viewport",label:"viewport"}]})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"reverse",descKey:"gesture.wheelZoom.reverse.desc"}),c.jsx(Xe,{checked:u.reverse===!0,onCheckedChange:x=>S({...u,reverse:x})})]}),c.jsx(St,{name:"exitGuardDuration",descKey:"gesture.wheelZoom.exitGuardDuration.desc",value:u.exitGuardDuration,min:0,max:1e3,step:50,onChange:x=>S({...u,exitGuardDuration:x})}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"smooth",descKey:"gesture.wheelZoom.smooth.desc"}),c.jsx(Xe,{checked:u.smooth!==!1,onCheckedChange:x=>S({...u,smooth:x})})]})]})]})]})]})}function St({name:e,descKey:a,value:r,min:s,max:l,step:d,onChange:u}){return c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:e,descKey:a}),c.jsx(E3,{value:r,min:s,max:l,step:d,onChange:u})]})}function j3({value:e,onChange:a}){const{t:r}=be(),s=Array.isArray(e)?e:[],l=(m,h)=>{const g=s.slice();g[m]={...g[m],...h},a(g)},d=m=>a(s.filter((h,g)=>g!==m)),u=()=>a([...s,{src:"",alt:"",caption:""}]);return c.jsxs("div",{className:"space-y-3",children:[s.map((m,h)=>{const g=String(h+1).padStart(2,"0");return c.jsxs("div",{className:"group flex items-start gap-2",children:[c.jsxs("div",{className:"relative h-10 w-10 shrink-0 overflow-hidden rounded border border-border/60 bg-muted",children:[m.src&&c.jsx("img",{src:m.src,alt:"",className:"h-full w-full object-cover"}),c.jsx("span",{className:"pointer-events-none absolute bottom-0 right-0 bg-background/80 px-0.5 font-mono text-[9px] leading-tight text-foreground/60",children:g})]}),c.jsxs("div",{className:"grid min-w-0 flex-1 gap-1",children:[c.jsx(uo,{value:m.src,onChange:y=>l(h,{src:y.target.value}),placeholder:"src",className:"h-7 px-2 text-xs md:text-xs"}),c.jsx(uo,{value:m.alt??"",onChange:y=>l(h,{alt:y.target.value}),placeholder:"alt",className:"h-7 px-2 text-xs md:text-xs"}),c.jsx(uo,{value:m.caption??"",onChange:y=>l(h,{caption:y.target.value}),placeholder:"caption",className:"h-7 px-2 text-xs md:text-xs"})]}),c.jsx(it,{size:"icon",variant:"ghost",onClick:()=>d(h),className:"h-7 w-7 shrink-0 text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive","aria-label":r("common.remove"),children:c.jsx(QR,{className:"h-3.5 w-3.5"})})]},h)}),c.jsxs("button",{type:"button",onClick:u,className:"flex w-full items-center justify-center gap-1.5 rounded border border-dashed border-border/60 bg-transparent px-3 py-1.5 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-muted/40 hover:text-foreground",children:[c.jsx(Ks,{className:"h-3 w-3"})," ",r("common.add")]})]})}function A3({events:e,value:a,onChange:r}){const s=typeof a=="function"&&a.__zmageLog===!0;return c.jsx(Xe,{checked:s,onCheckedChange:l=>{if(l){const d=e[0],u=(...m)=>{window.dispatchEvent(new CustomEvent("zmage-pg-event",{detail:{name:d,args:m}}))};u.__zmageLog=!0,u.__name=d,r(u)}else r(void 0)}})}const Nr=[{id:"default",src:"/imgSet/childsDream/1.jpg",alt:"童夢 · ONE",set:[{src:"/imgSet/childsDream/1.jpg",alt:"童夢 · ONE",ratio:"3/2"},{src:"/imgSet/childsDream/2.jpg",alt:"童夢 · TWO",ratio:"3/2"}]},{id:"testset",src:"https://picsum.photos/seed/zmage-wide/2000/1000",alt:"横屏 2:1 · JPEG",set:[{src:"https://picsum.photos/seed/zmage-wide/2000/1000",alt:"横屏 2:1 · JPEG",ratio:"2/1"},{src:"https://picsum.photos/seed/zmage-tall/1000/2000",alt:"竖屏 1:2 · JPEG",ratio:"1/2"},{src:"https://picsum.photos/seed/zmage-sq/1500/1500.webp",alt:"方图 1:1 · WebP",ratio:"1/1"},{src:"https://picsum.photos/seed/zmage-pano/3000/500",alt:"全景 6:1 · JPEG",ratio:"6/1"},{src:"https://picsum.photos/seed/zmage-tower/500/3000",alt:"高塔 1:6 · JPEG",ratio:"1/6"},{src:"https://picsum.photos/seed/zmage-small/240/180",alt:"小图 4:3 · 不放大",ratio:"4/3"}]}],N3={src:Nr[0].src,alt:Nr[0].alt,set:Nr[0].set.map(({ratio:e,...a})=>a)},w1=["controller","hotKey","animate","gesture"];function Sm(e,a){const r=cf(e.preset);for(const s of w1)a!=null&&a.has(s)||(e[s]=r[s]);return e}function Cm(e,a){return a!=null&&a.has("animate")||(e.animate=aC(e.animate)),e}function z3(e){for(const a of Nr){if(e.src!==a.src)continue;const r=Array.isArray(e.set)?e.set:[];if(r.length!==a.set.length)continue;if(a.set.every((l,d)=>{var u,m;return((u=r[d])==null?void 0:u.src)===l.src&&(((m=r[d])==null?void 0:m.alt)??"")===(l.alt??"")}))return a.id}return null}function km(){const e={};for(const a of da)e[a.name]=a.default;return Sm(e),Object.assign(e,N3),Cm(e),e}function M3(e,a){const r=da.find(s=>s.name===e);if(r)return w1.includes(e)?cf(a==null?void 0:a.preset)[e]:r.default}function D3(e,a,r){if(!da.find(d=>d.name===e)||a===void 0)return!0;const l=M3(e,r);if(typeof a=="object"&&a!==null)try{return JSON.stringify(a)===JSON.stringify(l)}catch{return!1}return a===l}function _3(e,a){if(e===a)return!0;if(typeof e=="function"||typeof a=="function")return!1;try{return JSON.stringify(e)===JSON.stringify(a)}catch{return!1}}function sd(e,a){const r={};for(const s of da){const l=e[s.name];if(s.required){r[s.name]=l??"";continue}l!==void 0&&(D3(s.name,l,e)&&!(a!=null&&a.has(s.name))||(r[s.name]=l))}return r}function O3(e){const a=km(),r={};for(const s of da){const l=s.name,d=e[l];d!==void 0&&(_3(d,a[l])||(r[l]=d))}return r}const Fs=14,L3=3,tx=3;function Z3({preset:e,active:a}){return c.jsx("span",{className:"flex shrink-0 items-end overflow-hidden",style:{height:Fs,gap:L3},"aria-hidden":!0,children:e.set.map((r,s)=>{const[l,d]=r.ratio.split("/").map(Number),u=l/d,m=u>=1?Fs:Fs*u,h=u>=1?Fs/u:Fs;return c.jsx("span",{className:ie("shrink-0 rounded-[1.5px] ring-1 ring-inset transition-colors",a?"bg-foreground/55 ring-foreground/40":"bg-foreground/25 ring-foreground/15"),style:{width:m,height:h,minWidth:tx,minHeight:tx}},s)})})}function P3({values:e,onChange:a}){const{t:r}=be(),s=z3(e),l=u=>{const m=Nr.find(h=>h.id===u);m&&(a("src",m.src),a("alt",m.alt),a("set",m.set.map(({ratio:h,...g})=>g)),a("defaultPage",0))},d={default:r("playground.preset.default.label"),testset:r("playground.preset.testset.label")};return c.jsx(Tf,{value:s??"",onValueChange:u=>l(u),children:c.jsx(ad,{"aria-label":r("playground.preset.aria"),className:"grid w-full grid-cols-2 h-auto p-0.5",children:Nr.map(u=>c.jsxs(nd,{value:u.id,title:d[u.id],className:"min-w-0 gap-2 px-2.5 py-1.5",children:[c.jsx(Z3,{preset:u,active:s===u.id}),c.jsx("span",{className:"min-w-0 truncate",children:d[u.id]})]},u.id))})})}const B3={data:"/docs#props-data",preset:"/docs#props-preset",interface:"/docs#props-interface",controller:"/docs#props-controller",hotkey:"/docs#props-hotkey",animate:"/docs#props-animate",gesture:"/docs#props-gesture",lifecycle:"/docs#props-lifecycle",controlled:"/docs#props-controlled"},Vp=["data","preset","interface","controller","hotkey","animate","gesture","lifecycle","controlled"],I3={data:"group.data",preset:"group.preset",interface:"group.interface",controller:"group.controller",hotkey:"group.hotkey",animate:"group.animate",gesture:"group.gesture",lifecycle:"group.lifecycle",controlled:"group.controlled"};function q3(e,a,r){const s=e.control;if(s.kind==="object"){if(s.component==="controller")return c.jsx(x3,{value:a,onChange:r});if(s.component==="hotkey")return c.jsx(C3,{value:a,onChange:r});if(s.component==="animate")return c.jsx(T3,{value:a,onChange:r});if(s.component==="gesture")return c.jsx(R3,{value:a,onChange:r});if(s.component==="set")return c.jsx(j3,{value:a,onChange:r})}return s.kind==="callback"?c.jsx(A3,{events:s.events,value:a,onChange:r}):c.jsx(c3,{def:e,value:a,onChange:r})}function F3({values:e,onChange:a}){const{t:r}=be(),s=v.useMemo(()=>{const l=new Map;for(const d of Vp)l.set(d,[]);for(const d of da){const u=l.get(d.group)??[];l.has(d.group)||l.set(d.group,u),u.push(d)}return l},[]);return c.jsx(CS,{delayDuration:300,children:c.jsx(yL,{type:"multiple",defaultValue:Vp,className:"w-full",children:Vp.map(l=>{const d=s.get(l);return!d||d.length===0?null:c.jsxs(SC,{value:l,className:"border-border/60",children:[c.jsx(CC,{className:"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:r(I3[l])}),c.jsxs(kC,{className:"space-y-3 px-3 pb-3 pt-1",children:[l==="data"&&c.jsx(P3,{values:e,onChange:a}),d.map(u=>c.jsxs("div",{className:"grid grid-cols-[120px_1fr] items-center gap-3",children:[c.jsxs("div",{className:"flex items-center gap-1.5",children:[c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx("span",{className:"font-mono text-xs underline-offset-4 decoration-dotted hover:underline cursor-help",children:u.name})}),c.jsx(po,{side:"right",className:"max-w-[280px] text-xs",children:r(u.i18n.descKey)})]}),u.required&&c.jsx("span",{"aria-label":"required",className:"text-destructive font-bold text-sm leading-none",children:"*"}),c.jsxs(Ao,{children:[c.jsx(No,{asChild:!0,children:c.jsx(st,{to:B3[u.group]??"/docs","aria-label":r("param.viewInDocs"),className:"inline-flex items-center text-muted-foreground/60 hover:text-foreground transition-colors",children:c.jsx(Nx,{className:"h-3 w-3"})})}),c.jsx(po,{side:"right",className:"text-xs",children:r("param.viewInDocs")})]}),u.presetScope&&c.jsx(Qc,{scope:u.presetScope})]}),c.jsx("div",{children:q3(u,e[u.name],m=>a(u.name,m))})]},u.name))]})]},l)})})})}function Rf({title:e,description:a,expandLabel:r,preview:s,expanded:l,footer:d,className:u,previewClassName:m,dialogContentClassName:h,dialogBodyClassName:g}){return c.jsxs("section",{className:ie("min-w-0 rounded-lg border border-border bg-card/30",u),children:[c.jsxs("div",{className:"flex items-start justify-between gap-3 border-b border-border px-3 py-2.5",children:[c.jsxs("div",{className:"min-w-0",children:[c.jsx("h2",{className:"text-sm font-medium leading-5",children:e}),a&&c.jsx("p",{className:"mt-0.5 text-xs text-muted-foreground",children:a})]}),c.jsxs(Q0,{children:[c.jsx(J0,{asChild:!0,children:c.jsxs(it,{variant:"outline",size:"sm",className:"h-8 shrink-0 gap-1.5 px-2.5 text-xs",children:[c.jsx(BR,{className:"h-3.5 w-3.5"}),r]})}),c.jsxs(nf,{className:ie("max-h-[88dvh] max-w-5xl gap-0 overflow-hidden p-0",h),children:[c.jsxs(tS,{className:"border-b border-border px-5 py-4 pr-12",children:[c.jsx(rf,{children:e}),a&&c.jsx(sf,{children:a})]}),c.jsxs("div",{className:ie("space-y-3 p-5",g),children:[l,d]})]})]})]}),c.jsx("div",{className:ie("p-3",m),children:s})]})}var K3="Label",S1=v.forwardRef((e,a)=>c.jsx(Tw.label,{...e,ref:a,onMouseDown:r=>{var l;r.target.closest("button, input, select, textarea")||((l=e.onMouseDown)==null||l.call(e,r),!r.defaultPrevented&&r.detail>1&&r.preventDefault())}}));S1.displayName=K3;var C1=S1;const U3=bc("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),jf=v.forwardRef(({className:e,...a},r)=>c.jsx(C1,{ref:r,className:ie(U3(),e),...a}));jf.displayName=C1.displayName;function H3(e){return typeof e=="function"&&(e==null?void 0:e.__zmageLog)===!0}function Af(e){return typeof e=="string"?JSON.stringify(e):typeof e=="function"?"(...args) => console.info(args)":JSON.stringify(e,null,2)}function Nf(e,a){return e.includes(` -`)?e.split(` -`).map((s,l)=>l===0?s:a+s).join(` -`):e}const G3={rotateLeft:"rotate",rotateRight:"rotate",flipLeft:"flip",flipRight:"flip"};function k1(e,a){const r=["{"];for(const[s,l]of Object.entries(e)){const d=G3[s],u=!!d&&!!e[d],m=`"${s}": ${Nf(Af(l)," ")}`;u?r.push(` // ${m} | ${a(d)}`):r.push(` ${m},`)}return r.push("}"),r.join(` -`)}function V3(e,a){const r=["{"];for(const[s,l]of Object.entries(e)){const d=s==="controller"&&l&&typeof l=="object"&&!Array.isArray(l)?k1(l,a):Af(l);r.push(` "${s}": ${Nf(d," ")},`)}return r.push("}"),r.join(` -`)}function W3(e,a,r){return e==="controller"&&a&&typeof a=="object"&&!Array.isArray(a)?k1(a,r):Af(a)}function T1(e,a,r){return typeof a=="string"&&!a.includes(` -`)?` ${e}=${JSON.stringify(a)}`:H3(a)?` ${e}={(...args) => console.info('${e}', args)}`:` ${e}={${Nf(W3(e,a,r)," ")}}`}function $3(e,a){const r=[""),r.join(` -`)}function Y3(e,a){return["import Zmage from 'react-zmage'","",`Zmage.browsing(${V3(e,a)})`].join(` -`)}function X3(e,a){return typeof e=="string"&&e.trim()?e.trim():e&&typeof e=="object"&&typeof e.text=="string"&&e.text.trim()?e.text.trim():a||""}function Wp(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">").replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function Q3(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function J3(e){const a=Q3(e).slice(0,4);return a.length===0?"const html = `\n

CMS or markdown content with image tags.

\n`":["const html = `","

Rich text from a CMS, markdown renderer, or MDX pipeline.

",...a.map((s,l)=>{const d=X3(s.caption,s.alt||`Image ${l+1}`);return["
",` ${Wp(s.alt||`,d?`
${Wp(d)}
`:"","
"].filter(Boolean).join(` -`)}),"`"].join(` -`)}function eZ(e){const{src:a,alt:r,caption:s,browsing:l,...d}=e;return d}function tZ(e,a,r){const s=Object.entries(a),l=[J3(e),""];if(s.length===0)l.push("");else{l.push("")}return l.push("
"),l.push(""),l.join(` -`)}function oZ({values:e,touched:a,hideDefaults:r,onHideDefaultsChange:s,mode:l,compact:d=!1}){const{t:u}=be(),m=x=>u("snippet.overriddenByProp").replace("{umbrella}",x),h=sd(e,r?void 0:a),g=l==="wrapper"?eZ(h):h,y=l==="component"?$3(g,m):l==="imperative"?Y3(g,m):tZ(e,g,m),b=v.useId(),S=v.useId(),T=x=>c.jsxs("div",{className:"flex items-center gap-1.5 whitespace-nowrap",children:[c.jsx(jf,{htmlFor:x,className:"cursor-pointer text-[11px] text-muted-foreground",children:u("pg.code.hideDefaults")}),c.jsx(Xe,{id:x,checked:r,onCheckedChange:s,className:"scale-75 origin-right"})]}),C=T(b);return d?c.jsx(Rf,{title:u("pg.code.title"),description:u("pg.code.subtitle"),expandLabel:u("common.expand"),preview:c.jsx(De,{code:y,language:"tsx",actions:C,className:"h-36",preClassName:"p-3 pr-44 text-xs leading-5"}),expanded:c.jsx(De,{code:y,language:"tsx",actions:T(S),className:"h-[62dvh]"}),previewClassName:"p-2"}):c.jsx(De,{code:y,language:"tsx",actions:C})}function $p({entries:e,emptyLabel:a,compact:r=!1}){return e.length===0?c.jsx("div",{className:"text-muted-foreground",children:a}):c.jsx(c.Fragment,{children:e.map((s,l)=>c.jsxs("div",{className:ie("grid gap-2",r?"grid-cols-[5.5rem_7rem_minmax(0,1fr)]":"grid-cols-[6rem_8rem_minmax(0,1fr)]"),children:[c.jsx("span",{className:"text-muted-foreground",children:s.ts}),c.jsx("span",{children:s.name}),c.jsx("span",{className:"truncate text-muted-foreground",children:JSON.stringify(s.args)})]},l))})}function aZ({compact:e=!1}){const{t:a}=be(),[r,s]=v.useState([]);return v.useEffect(()=>{const l=d=>{const u=d.detail;s(m=>[{ts:new Date().toLocaleTimeString(),name:u.name,args:u.args},...m].slice(0,50))};return window.addEventListener("zmage-pg-event",l),()=>window.removeEventListener("zmage-pg-event",l)},[]),e?c.jsx(Rf,{title:a("pg.events.title"),description:a("pg.events.subtitle"),expandLabel:a("common.expand"),preview:c.jsx("div",{className:"code-block-scroll max-h-36 overflow-auto font-mono text-xs leading-5",children:c.jsx($p,{entries:r.slice(0,8),emptyLabel:a("pg.events.empty"),compact:!0})}),expanded:c.jsx("div",{className:"code-block-scroll h-[62dvh] overflow-auto rounded-lg border border-border bg-muted/25 p-3 font-mono text-xs leading-5",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})}):c.jsxs("div",{className:"rounded-lg border border-border bg-card/30",children:[c.jsx("div",{className:"border-b border-border px-3 py-2 text-xs font-medium text-muted-foreground",children:a("pg.events.title")}),c.jsx("div",{className:"max-h-48 overflow-y-auto p-3 font-mono text-xs",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})]})}function nZ(e){return typeof e=="function"&&(e==null?void 0:e.__zmageLog)===!0}function rZ(e){const a=new URLSearchParams,r=O3(e);for(const[s,l]of Object.entries(r)){if(nZ(l)){a.set(s,"__log__");continue}typeof l=="string"?a.set(s,l):a.set(s,JSON.stringify(l))}return"#?"+a.toString()}function ox(e){const a={},r=e.startsWith("#?")?e.slice(2):e.startsWith("#")?e.slice(1):e;if(!r)return a;const s=new URLSearchParams(r);for(const[l,d]of s){if(d==="__log__"){const u=da.find(m=>m.name===l);if((u==null?void 0:u.control.kind)==="callback"){const m=(...h)=>{window.dispatchEvent(new CustomEvent("zmage-pg-event",{detail:{name:l,args:h}}))};m.__zmageLog=!0,m.__name=l,a[l]=m}continue}try{a[l]=JSON.parse(d)}catch{a[l]=d}}return a}function sZ({values:e}){var h;const{t:a}=be(),r=fi(),s=sd(e),l=!!s.src,d=Array.isArray(s.set)&&s.set.length>0,u=l?s.src:d?(h=s.set[0])==null?void 0:h.src:"",m={backdrop:r,...s,src:u};return c.jsxs("div",{className:"flex h-full min-h-[360px] flex-col items-center justify-center rounded-lg border border-border bg-card/30 p-6 lg:min-h-0",children:[c.jsx("div",{className:"flex min-h-0 w-full flex-1 items-center justify-center",children:c.jsx(na,{...m,className:"max-h-full max-w-full rounded-md object-contain"})}),c.jsx("p",{className:"mt-4 shrink-0 text-center text-xs text-muted-foreground",children:a("pg.preview.tip")})]})}function iZ({values:e}){const{t:a}=be(),r=fi(),s=v.useRef(null),l=()=>{var g,y;(g=s.current)==null||g.call(s);const d=sd(e),u=!!d.src,m=Array.isArray(d.set)&&d.set.length>0,h=u?d.src:m?(y=d.set[0])==null?void 0:y.src:"";d.src=h,d.backdrop||(d.backdrop=r),s.current=na.browsing(d)};return v.useEffect(()=>()=>{var d;(d=s.current)==null||d.call(s)},[]),c.jsx("div",{className:"flex h-full min-h-[360px] items-center justify-center rounded-lg border border-border bg-card/30 p-12 lg:min-h-0",children:c.jsxs(it,{size:"lg",onClick:l,children:[c.jsx(VR,{className:"mr-2 h-4 w-4"})," ",a("pg.preview.trigger")]})})}function ax(e,a){const{caption:r}=e;return typeof r=="string"&&r.trim()?r.trim():r&&typeof r=="object"&&typeof r.text=="string"&&r.text.trim()?r.text.trim():e.alt||a}function lZ(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function Sr(e,a){return e[a%e.length]}function cZ({items:e}){if(e.length===0)return c.jsx("article",{className:"mx-auto max-w-2xl rounded-md border border-dashed border-border p-8 text-sm text-muted-foreground",children:"The wrapped subtree has no image nodes yet."});const a=Sr(e,0),r=Sr(e,1),s=Sr(e,2),l=Sr(e,3),d=Sr(e,4),u=Sr(e,5),m=({item:h,className:g="",imageClassName:y="",label:b})=>c.jsxs("figure",{className:g,children:[c.jsx("img",{src:h.src,alt:h.alt??"","data-zmage-caption":ax(h,b),className:y}),c.jsx("figcaption",{className:"mt-2 text-[11px] leading-5 text-muted-foreground",children:ax(h,b)})]});return c.jsxs("article",{className:"overflow-hidden bg-background text-foreground",children:[c.jsxs("header",{className:"grid gap-6 border-b border-border bg-muted/20 p-5 md:p-7 lg:grid-cols-[minmax(0,1.05fr)_minmax(280px,0.95fr)]",children:[c.jsxs("div",{className:"flex min-w-0 flex-col justify-between gap-8",children:[c.jsxs("div",{className:"space-y-4",children:[c.jsxs("div",{className:"flex flex-wrap gap-2 text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:[c.jsx("span",{className:"rounded-full border border-border bg-background px-2.5 py-1",children:"Field report"}),c.jsx("span",{className:"rounded-full border border-emerald-500/25 bg-emerald-500/10 px-2.5 py-1 text-emerald-700 dark:text-emerald-300",children:"Wrapped HTML"}),c.jsx("span",{className:"rounded-full border border-amber-500/25 bg-amber-500/10 px-2.5 py-1 text-amber-700 dark:text-amber-300",children:"Mixed media"})]}),c.jsx("h2",{className:"max-w-2xl text-3xl font-semibold leading-tight tracking-normal md:text-4xl",children:"An annotated image essay inside one Wrapper"}),c.jsx("p",{className:"max-w-[68ch] text-sm leading-7 text-muted-foreground md:text-[15px]",children:"Long-form CMS pages rarely render as a neat gallery. They mix hero images, floated figures, side notes, dense captions, and repeated thumbnails. This composition keeps that structure intact while every nested image remains part of the same viewer configuration."})]}),c.jsxs("dl",{className:"grid max-w-xl grid-cols-3 gap-3 text-xs",children:[c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Images"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:e.length})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Source"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"HTML"})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Flow"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"Auto"})]})]})]}),c.jsx(m,{item:a,label:"Lead image",className:"min-w-0",imageClassName:"aspect-[5/4] w-full rounded-md object-cover shadow-sm"})]}),c.jsxs("section",{className:"grid gap-7 p-5 md:p-7 lg:grid-cols-[minmax(0,1.15fr)_minmax(260px,0.85fr)]",children:[c.jsxs("div",{className:"min-w-0 space-y-5 text-sm leading-7 text-foreground/85",children:[c.jsx("p",{children:"The route cuts through a quiet shoreline, a workshop archive, and a narrow set of rooms where every surface is used for notes. Image sizes change with the material: field photos need width, object studies need height, and repeated details sit beside the text that refers to them."}),c.jsx(m,{item:r,label:"Inline figure",className:"my-1 rounded-md border border-border bg-muted/25 p-2 md:float-right md:ml-5 md:w-64",imageClassName:"aspect-[4/3] w-full rounded object-cover"}),c.jsx("p",{children:"In the middle section the reading column narrows and the captions become closer to the images. The floated figure interrupts the paragraph without becoming a separate gallery block, so the page keeps the uneven rhythm of an edited article."}),c.jsx("blockquote",{className:"border-y border-border py-4 text-lg font-medium leading-8 text-foreground",children:"The strongest sequence is not the cleanest grid. It is the one where each image keeps its place in the argument."}),c.jsx("p",{children:"The final pass brings small crops back into view. Repeated images are intentional: they let the same material behave as a lead image, a supporting figure, and a tight detail without changing the source data."})]}),c.jsxs("aside",{className:"grid content-start gap-4",children:[c.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[c.jsx(m,{item:s,label:"Side image A",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[3/4] w-full rounded object-cover"}),c.jsx(m,{item:l,label:"Side image B",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-square w-full rounded object-cover"})]}),c.jsx("div",{className:"rounded-md border border-border bg-muted/25 p-4 text-xs leading-6 text-muted-foreground",children:"Field notes, measured captions, and repeated crops share the same reading surface. The layout is deliberately uneven so dense editorial pages stay close to their real shape."}),c.jsx(m,{item:d,label:"Wide supporting image",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[16/9] w-full rounded object-cover"})]})]}),c.jsxs("section",{className:"grid gap-3 border-t border-border bg-muted/20 p-5 md:grid-cols-6 md:p-7",children:[c.jsx(m,{item:u,label:"Panorama strip",className:"md:col-span-3",imageClassName:"aspect-[16/7] w-full rounded-md object-cover"}),c.jsx(m,{item:a,label:"Repeated lead detail",className:"md:col-span-2",imageClassName:"aspect-[4/3] w-full rounded-md object-cover"}),c.jsx(m,{item:r,label:"Tall crop",className:"md:col-span-1",imageClassName:"aspect-[3/5] w-full rounded-md object-cover"})]})]})}function dZ({values:e}){const a=fi(),r=sd(e),{src:s,alt:l,caption:d,browsing:u,...m}=r,h={backdrop:a,...m},g=lZ(e),y=na.Wrapper;return c.jsx("div",{className:"code-block-scroll h-full min-h-[420px] overflow-auto rounded-lg border border-border bg-background lg:min-h-0",children:c.jsx(y,{...h,children:c.jsx(cZ,{items:g})})})}const uZ=[{to:"",labelKey:"pg.tab.component",end:!0},{to:"imperative",labelKey:"pg.tab.imperative",end:!1},{to:"wrapper",labelKey:"pg.tab.wrapper",end:!1}];function pZ(){const{t:e}=be(),a=$a(),r=a.pathname.endsWith("/imperative")?"imperative":a.pathname.endsWith("/wrapper")?"wrapper":"component",s=r==="imperative"?"modes.imperative.when":r==="wrapper"?"modes.wrapper.when":"modes.component.when",[l,d]=v.useState(()=>{const x=km();if(typeof window<"u"){const k=ox(window.location.hash),R=new Set(Object.keys(k));Object.assign(x,k),Sm(x,R),Cm(x,R)}return x}),[u,m]=v.useState(()=>typeof window>"u"?new Set:new Set(Object.keys(ox(window.location.hash)))),[h,g]=v.useState(!1),[y,b]=v.useState(!1),S=v.useCallback((x,k)=>{d(R=>{const j={...R,[x]:k};return x==="preset"&&(Sm(j,u),Cm(j,u)),j}),m(R=>R.has(x)?R:new Set(R).add(x))},[u]),T=v.useCallback(()=>{d(km()),m(new Set)},[]),C=v.useCallback(async()=>{const x=window.location.origin+window.location.pathname+rZ(l);window.history.replaceState(null,"",x),await navigator.clipboard.writeText(x),b(!0),setTimeout(()=>b(!1),1500)},[l]);return c.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4 px-4 py-6 sm:px-6 lg:h-[calc(100dvh-3.5rem)] lg:overflow-hidden",children:[c.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[c.jsxs("div",{children:[c.jsx("h1",{className:"text-2xl font-semibold tracking-tight",children:e("pg.title")}),c.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e("pg.subtitle")})]}),c.jsxs("div",{className:"flex gap-2",children:[c.jsxs(it,{variant:"outline",size:"sm",onClick:T,children:[c.jsx(WR,{className:"mr-1.5 h-3.5 w-3.5"})," ",e("pg.reset")]}),c.jsxs(it,{variant:"outline",size:"sm",onClick:C,children:[y?c.jsx(Ha,{className:"mr-1.5 h-3.5 w-3.5"}):c.jsx($R,{className:"mr-1.5 h-3.5 w-3.5"}),e(y?"pg.shared":"pg.share")]})]})]}),c.jsxs("div",{children:[c.jsxs("div",{className:"relative inline-flex rounded-lg border border-border bg-muted/30 p-1",children:[c.jsx(i1,{}),uZ.map(x=>c.jsx(Jp,{to:x.to,end:x.end,className:({isActive:k})=>ie("relative z-10 cursor-pointer rounded-md px-3 py-1.5 text-sm transition-colors",k?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e(x.labelKey)},x.to))]}),c.jsx("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:e(s)})]}),c.jsxs("div",{className:"grid min-h-0 flex-1 gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[c.jsxs("aside",{className:"flex min-h-0 flex-col overflow-hidden rounded-lg border border-border bg-card/30",children:[c.jsxs("div",{className:"shrink-0 border-b border-border px-4 py-3",children:[c.jsx("h2",{className:"text-sm font-medium",children:e("pg.params.title")}),c.jsx("p",{className:"mt-0.5 text-[11px] leading-4 text-muted-foreground/65",children:e("pg.params.subtitle")})]}),c.jsx("div",{className:"h-[min(70dvh,720px)] overflow-y-auto py-2 lg:h-auto lg:min-h-0 lg:flex-1",children:c.jsx(F3,{values:l,onChange:S})})]}),c.jsxs("section",{className:"grid min-h-0 gap-4 lg:grid-rows-[minmax(0,1fr)_auto]",children:[c.jsx("div",{className:"min-h-0",children:c.jsxs(wx,{children:[c.jsx(ut,{index:!0,element:c.jsx(sZ,{values:l})}),c.jsx(ut,{path:"imperative",element:c.jsx(iZ,{values:l})}),c.jsx(ut,{path:"wrapper",element:c.jsx(dZ,{values:l})})]})}),c.jsxs("div",{className:"grid min-h-0 gap-4 lg:grid-cols-[minmax(0,1.2fr)_minmax(280px,0.8fr)]",children:[c.jsx(oZ,{values:l,touched:u,hideDefaults:h,onHideDefaultsChange:g,mode:r,compact:!0}),c.jsx(aZ,{compact:!0})]})]})]})]})}function mZ(e){const[a,r]=v.useState("");return v.useEffect(()=>{const s=Array.from(document.querySelectorAll(e)),l=new IntersectionObserver(d=>{const u=d.filter(m=>m.isIntersecting).sort((m,h)=>m.boundingClientRect.top-h.boundingClientRect.top);u.length>0&&r(u[0].target.id)},{rootMargin:"-80px 0px -70% 0px",threshold:[0,1]});return s.forEach(d=>l.observe(d)),()=>l.disconnect()},[e]),a}function fZ(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"installation",children:e("docs.section.installation.title")}),c.jsx("p",{children:e("docs.section.installation.intro")}),c.jsx("p",{children:e("docs.section.installation.agent")}),c.jsx(De,{code:`npm install react-zmage -# or -pnpm add react-zmage`,language:"bash"}),c.jsx("p",{children:e("docs.section.installation.then")}),c.jsx(De,{code:`import Zmage from 'react-zmage' -import 'react-zmage/style.css'`,language:"tsx"}),c.jsx(Se,{id:"ssr",level:3,children:e("docs.section.installation.ssrTitle")}),c.jsx("p",{children:e("docs.section.installation.ssrBody")}),c.jsx(De,{code:"import Zmage from 'react-zmage/ssr'",language:"tsx"})]})}function hZ(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"modes",children:e("docs.section.modes.title")}),c.jsx("p",{children:e("docs.section.modes.intro")}),c.jsx(Se,{id:"modes-component",level:3,children:e("docs.section.modes.componentTitle")}),c.jsx("p",{children:e("docs.section.modes.componentBody")}),c.jsx(De,{code:'',language:"tsx"}),c.jsx(Se,{id:"modes-imperative",level:3,children:e("docs.section.modes.imperativeTitle")}),c.jsx("p",{children:e("docs.section.modes.imperativeBody")}),c.jsx(De,{code:`Zmage.browsing({ src: 'hero.jpg' }) -// returns a destructor: () => void`,language:"tsx"}),c.jsx(Se,{id:"modes-wrapper",level:3,children:e("docs.section.modes.wrapperTitle")}),c.jsx("p",{children:e("docs.section.modes.wrapperBody")}),c.jsx(De,{code:`const gallery = [ - { src: '/photo-1.jpg', alt: 'one', caption: 'First image' }, - { src: '/photo-2.jpg', alt: 'two', caption: 'Second image' }, -] - - -
-`,language:"tsx"}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.modes.wrapperNote")})]})}function gZ(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"theming",children:e("docs.section.theming.title")}),c.jsx("p",{children:e("docs.section.theming.intro")}),c.jsxs("ul",{className:"list-disc space-y-2 pl-6 text-sm text-muted-foreground",children:[c.jsx("li",{children:e("docs.section.theming.bullet.backdrop")}),c.jsx("li",{children:e("docs.section.theming.bullet.icons")}),c.jsx("li",{children:e("docs.section.theming.bullet.scoped")})]}),c.jsx(Se,{id:"theming-default",level:3,children:e("docs.section.theming.defaultTitle")}),c.jsx("p",{children:e("docs.section.theming.defaultBody")}),c.jsx(De,{code:` -// equivalent to -`,language:"tsx"}),c.jsx(Se,{id:"theming-pattern",level:3,children:e("docs.section.theming.patternTitle")}),c.jsx("p",{children:e("docs.section.theming.patternBody")}),c.jsx(De,{code:`import { useTheme } from 'next-themes' // or your own hook -import Zmage from 'react-zmage' - -function Photo (props) { - const { resolvedTheme } = useTheme() - const backdrop = resolvedTheme === 'dark' ? '#0a0a0a' : '#fafafa' - return -}`,language:"tsx"}),c.jsx(Se,{id:"theming-imperative",level:3,children:e("docs.section.theming.imperativeTitle")}),c.jsx("p",{children:e("docs.section.theming.imperativeBody")}),c.jsx(De,{code:`const themedBackdrop = document.documentElement.classList.contains('dark') - ? '#0a0a0a' - : '#fafafa' - -Zmage.browsing({ src: 'hero.jpg', backdrop: themedBackdrop })`,language:"tsx"}),c.jsx(Se,{id:"theming-icons",level:3,children:e("docs.section.theming.iconsTitle")}),c.jsx("p",{children:e("docs.section.theming.iconsBody")}),c.jsx(De,{code:`/* In your global CSS, after react-zmage/style.css */ -#zmage svg { - color: hsl(var(--foreground)); /* match your design system */ -}`,language:"css"}),c.jsx(Se,{id:"theming-toolbar",level:3,children:e("docs.section.theming.toolbarTitle")}),c.jsx("p",{children:e("docs.section.theming.toolbarBody")}),c.jsx(De,{code:``,language:"tsx"})]})}const yZ={controller:"ControllerSet",hotkey:"HotKey",animate:"Animate",gesture:"GestureSet",set:"Set"};function bZ(e){switch(e.control.kind){case"switch":return"boolean";case"slider":case"number":return"number";case"text":case"color":return"string";case"select":case"segmented":return e.control.options.map(a=>`'${a.value}'`).join(" | ");case"object":{const a=yZ[e.control.component];return e.control.component==="set"?`${a}[]`:`${a} | boolean`}case"callback":return"(arg) => void"}}function vZ(e){return e===void 0?"—":typeof e=="string"?e===""?"''":`'${e}'`:Array.isArray(e)?e.length===0?"[]":"[…]":typeof e=="object"&&e!==null?Object.keys(e).length===0?"{}":"{…}":String(e)}function ta({group:e}){const{t:a}=be(),r=da.filter(s=>s.group===e);return r.length===0?null:c.jsx("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Prop"}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Type"}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Default"}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Description"})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:r.map(s=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5 align-top",children:[c.jsx("span",{className:"font-mono",children:s.name}),s.required&&c.jsx(Wc,{variant:"destructive",className:"ml-1.5 h-4 px-1 text-[9px]",children:a("common.required")}),s.presetScope&&c.jsx(Qc,{scope:s.presetScope,className:"ml-1.5"})]}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:bZ(s)}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs",children:vZ(s.default)}),c.jsx("td",{className:"px-4 py-2.5 align-top text-muted-foreground",children:a(s.i18n.descKey)})]},s.name))})]})})}const xZ=[{k:"pagination",descKey:"controller.pagination.desc"},{k:"rotate",descKey:"controller.rotate.desc"},{k:"rotateLeft",descKey:"controller.rotateLeft.desc"},{k:"rotateRight",descKey:"controller.rotateRight.desc"},{k:"zoom",descKey:"controller.zoom.desc"},{k:"download",descKey:"controller.download.desc"},{k:"close",descKey:"controller.close.desc"},{k:"flip",descKey:"controller.flip.desc"},{k:"flipLeft",descKey:"controller.flipLeft.desc"},{k:"flipRight",descKey:"controller.flipRight.desc"},{k:"backdrop",descKey:"controller.backdrop.desc"},{k:"color",descKey:"controller.color.desc"},{k:"placement",descKey:"controller.placement.desc"},{k:"layout",descKey:"controller.layout.desc"},{k:"render",descKey:"controller.render.desc"}],wZ=[{k:"state",type:"ControllerRenderState"},{k:"state.show",type:"boolean"},{k:"state.zoom",type:"boolean"},{k:"state.page",type:"number"},{k:"state.total",type:"number"},{k:"state.canZoom",type:"boolean"},{k:"state.canPrev",type:"boolean"},{k:"state.canNext",type:"boolean"},{k:"state.canDownload",type:"boolean"},{k:"state.preset",type:"'desktop' | 'mobile'"},{k:"state.placement",type:"ControllerPlacement"},{k:"state.current",type:"Set | undefined"},{k:"actions",type:"ControllerRenderActions"},{k:"actions.close",type:"() => void"},{k:"actions.zoom",type:"() => void"},{k:"actions.rotateLeft",type:"() => void"},{k:"actions.rotateRight",type:"() => void"},{k:"actions.prev",type:"() => void"},{k:"actions.next",type:"() => void"},{k:"actions.toPage",type:"(page: number) => void"},{k:"actions.download",type:"() => void"},{k:"slots",type:"ControllerRenderSlots"},{k:"slots.Toolbar",type:"ReactNode"},{k:"slots.Pagination",type:"ReactNode"},{k:"slots.FlipLeft",type:"ReactNode"},{k:"slots.FlipRight",type:"ReactNode"},{k:"return",type:"ReactNode"}],SZ=[{k:"close",descKey:"hotkey.close.desc"},{k:"zoom",descKey:"hotkey.zoom.desc"},{k:"flip",descKey:"hotkey.flip.desc"},{k:"flipLeft",descKey:"hotkey.flipLeft.desc"},{k:"flipRight",descKey:"hotkey.flipRight.desc"},{k:"rotate",descKey:"hotkey.rotate.desc"},{k:"rotateLeft",descKey:"hotkey.rotateLeft.desc"},{k:"rotateRight",descKey:"hotkey.rotateRight.desc"},{k:"download",descKey:"hotkey.download.desc"}],CZ=[{k:"browsing",type:"boolean",descKey:"animate.browsing.desc"},{k:"flip",type:"'fade' | 'crossFade' | 'swipe' | 'zoom' | 'blur' | 'none'",descKey:"animate.flip.desc"},{k:"slowMotion",type:"boolean",descKey:"animate.slowMotion.desc"},{k:"cover",type:"boolean | AnimateCoverOptions",descKey:"animate.cover.desc"},{k:"cover.objectFit",type:"boolean",descKey:"animate.cover.objectFit.desc"},{k:"cover.clip",type:"boolean",descKey:"animate.cover.clip.desc"},{k:"cover.radius",type:"boolean",descKey:"animate.cover.radius.desc"}],kZ=[{k:"swipe",type:"boolean | GestureSwipeOptions",descKey:"gesture.swipe.desc",scope:"mobile"},{k:"dragExit",type:"boolean | GestureDragExitOptions",descKey:"gesture.dragExit.desc",scope:"mobile"},{k:"wheelZoom",type:"boolean | GestureWheelZoomOptions",descKey:"gesture.wheelZoom.desc",scope:"desktop"},{k:"pinchZoom",type:"boolean | GesturePinchZoomOptions",descKey:"gesture.pinchZoom.desc",scope:"mobile"},{k:"doubleTapZoom",type:"boolean | GestureDoubleTapZoomOptions",descKey:"gesture.doubleTapZoom.desc",scope:"mobile"},{k:"touchAction",type:"'managed' | 'auto' | 'manipulation' | 'none'",descKey:"gesture.touchAction.desc",scope:"mobile"},{k:"swipe.threshold",type:"number",descKey:"gesture.threshold.desc",scope:"mobile"},{k:"swipe.velocity",type:"number",descKey:"gesture.velocity.desc",scope:"mobile"},{k:"swipe.axisLock",type:"number",descKey:"gesture.axisLock.desc",scope:"mobile"},{k:"swipe.resistance",type:"number",descKey:"gesture.resistance.desc",scope:"mobile"},{k:"dragExit.threshold",type:"number",descKey:"gesture.threshold.desc",scope:"mobile"},{k:"dragExit.velocity",type:"number",descKey:"gesture.velocity.desc",scope:"mobile"},{k:"dragExit.axisLock",type:"number",descKey:"gesture.axisLock.desc",scope:"mobile"},{k:"dragExit.opacity",type:"boolean",descKey:"gesture.opacity.desc",scope:"mobile"},{k:"wheelZoom.step",type:"number",descKey:"gesture.wheelZoom.step.desc",scope:"desktop"},{k:"wheelZoom.smooth",type:"boolean",descKey:"gesture.wheelZoom.smooth.desc",scope:"desktop"},{k:"wheelZoom.minScale",type:"'fit' | number",descKey:"gesture.wheelZoom.minScale.desc",scope:"desktop"},{k:"wheelZoom.maxScale",type:"number",descKey:"gesture.wheelZoom.maxScale.desc",scope:"desktop"},{k:"wheelZoom.center",type:"'pointer' | 'viewport'",descKey:"gesture.wheelZoom.center.desc",scope:"desktop"},{k:"wheelZoom.reverse",type:"boolean",descKey:"gesture.wheelZoom.reverse.desc",scope:"desktop"},{k:"wheelZoom.exitGuardDuration",type:"number",descKey:"gesture.wheelZoom.exitGuardDuration.desc",scope:"desktop"},{k:"pinchZoom.minScale",type:"'fit' | number",descKey:"gesture.pinchZoom.minScale.desc",scope:"mobile"},{k:"pinchZoom.maxScale",type:"number",descKey:"gesture.pinchZoom.maxScale.desc",scope:"mobile"},{k:"pinchZoom.resetBelowFit",type:"boolean",descKey:"gesture.pinchZoom.resetBelowFit.desc",scope:"mobile"},{k:"pinchZoom.center",type:"'gesture' | 'viewport'",descKey:"gesture.pinchZoom.center.desc",scope:"mobile"},{k:"doubleTapZoom.scale",type:"number",descKey:"gesture.doubleTapZoom.scale.desc",scope:"mobile"},{k:"doubleTapZoom.minScale",type:"'fit' | number",descKey:"gesture.doubleTapZoom.minScale.desc",scope:"mobile"},{k:"doubleTapZoom.maxScale",type:"number",descKey:"gesture.doubleTapZoom.maxScale.desc",scope:"mobile"},{k:"doubleTapZoom.center",type:"'tap' | 'viewport'",descKey:"gesture.doubleTapZoom.center.desc",scope:"mobile"},{k:"doubleTapZoom.interval",type:"number",descKey:"gesture.doubleTapZoom.interval.desc",scope:"mobile"},{k:"doubleTapZoom.distance",type:"number",descKey:"gesture.doubleTapZoom.distance.desc",scope:"mobile"}],TZ=[{k:"src",type:"string",required:!0,descKey:"set.src.desc"},{k:"alt",type:"string",descKey:"set.alt.desc"},{k:"caption",type:"string | { text, style?, className? }",descKey:"set.caption.desc"},{k:"className",type:"string",descKey:"set.className.desc"},{k:"style",type:"CSSStyleDeclaration",descKey:"set.style.desc"}],EZ=[{path:"radius",label:"param.radius.label"},{path:"edge",label:"param.edge.label"},{path:"controller.pagination",label:"controller.pagination"},{path:"controller.rotate",label:"controller.rotate"},{path:"controller.zoom",label:"controller.zoom"},{path:"controller.download",label:"controller.download"},{path:"controller.close",label:"controller.close"},{path:"controller.flip",label:"controller.flip"},{path:"controller.placement",label:"controller.placement"},{path:"controller.layout",label:"controller.layout"},{path:"hotKey.close",label:"hotkey.close"},{path:"hotKey.zoom",label:"hotkey.zoom"},{path:"hotKey.flip",label:"hotkey.flip"},{path:"hotKey.rotate",label:"hotkey.rotate"},{path:"hotKey.download",label:"hotkey.download"},{path:"animate.browsing",label:"animate.browsing.desc"},{path:"animate.flip",label:"animate.flip.desc"},{path:"animate.slowMotion",label:"animate.slowMotion.desc"},{path:"animate.cover",label:"animate.cover.desc"},{path:"gesture.swipe",label:"gesture.swipe"},{path:"gesture.dragExit",label:"gesture.dragExit"},{path:"gesture.wheelZoom",label:"gesture.wheelZoom"},{path:"gesture.pinchZoom",label:"gesture.pinchZoom"},{path:"gesture.doubleTapZoom",label:"gesture.doubleTapZoom"},{path:"gesture.touchAction",label:"gesture.touchAction"}];function nx(e,a){return a.split(".").reduce((r,s)=>r&&typeof r=="object"?r[s]:void 0,uS[e])}function rx({value:e}){const a=typeof e=="string"?`'${e}'`:typeof e=="object"&&e!==null?"{…}":String(e);return c.jsx("code",{className:"font-mono text-xs",children:a})}function RZ(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.props.preset.intro")}),c.jsx("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.preset.subParamHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.preset.desktopHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.preset.mobileHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:EZ.map(({path:a,label:r})=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5",children:[c.jsx("span",{className:"font-mono text-xs",children:a}),c.jsx("span",{className:"ml-2 text-muted-foreground",children:e(r)})]}),c.jsx("td",{className:"px-4 py-2.5",children:c.jsx(rx,{value:nx("desktop",a)})}),c.jsx("td",{className:"px-4 py-2.5",children:c.jsx(rx,{value:nx("mobile",a)})})]},a))})]})})]})}function jZ(){const{t:e}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:"Set"}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.animate.typeHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:TZ.map(({k:a,type:r,required:s,descKey:l})=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5 font-mono align-top",children:[a,s&&c.jsx("span",{className:"ml-1.5 text-[9px] text-destructive",children:e("common.required")})]}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:r}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:e(l)})]},a))})]})]})}function AZ(){const{t:e}=be();return c.jsxs("div",{className:"my-6 rounded-lg border border-border bg-muted/25 p-4 text-sm",children:[c.jsx("p",{className:"font-medium",children:e("docs.section.props.wrapperScope.title")}),c.jsx("p",{className:"mt-2 text-muted-foreground",children:e("docs.section.props.wrapperScope.intro")}),c.jsxs("ul",{className:"mt-3 list-disc space-y-1.5 pl-5 text-muted-foreground",children:[c.jsx("li",{children:e("docs.section.props.wrapperScope.data")}),c.jsx("li",{children:e("docs.section.props.wrapperScope.config")}),c.jsx("li",{children:e("docs.section.props.wrapperScope.lifecycle")}),c.jsx("li",{children:e("docs.section.props.wrapperScope.controlled")})]})]})}function gi({name:e}){return c.jsx("div",{className:"border-b border-border px-4 py-2 font-mono text-xs text-muted-foreground",children:e})}function E1({typeName:e,rows:a}){const{t:r}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:e}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:a.map(({k:s,descKey:l})=>c.jsxs("tr",{children:[c.jsx("td",{className:"px-4 py-2.5 font-mono align-top",children:s}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:r(l)})]},s))})]})]})}function NZ({typeName:e,rows:a}){const{t:r}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:e}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.animate.typeHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:a.map(({k:s,type:l})=>c.jsxs("tr",{children:[c.jsx("td",{className:"px-4 py-2.5 font-mono align-top",children:s}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:l})]},s))})]})]})}function zZ(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsx(E1,{typeName:"ControllerSet",rows:xZ}),c.jsx("p",{className:"-mt-4 mb-6 text-xs text-muted-foreground",children:e("docs.section.props.controller.umbrella")}),c.jsx("h4",{className:"mt-4 mb-2 text-sm font-semibold",children:e("docs.section.props.controller.layoutTitle")}),c.jsx("p",{className:"mb-2 text-xs text-muted-foreground",children:e("docs.section.props.controller.layoutIntro")}),c.jsx(De,{code:``,language:"tsx"}),c.jsx("h4",{className:"mt-4 mb-2 text-sm font-semibold",children:e("docs.section.props.controller.renderTitle")}),c.jsx("p",{className:"mb-2 text-xs text-muted-foreground",children:e("docs.section.props.controller.renderIntro")}),c.jsx(NZ,{typeName:"ControllerRender",rows:wZ}),c.jsx(De,{code:` { - if (!state.show) return null - - return ( -
- - - {state.page + 1} / {state.total} - - - - {state.canDownload && ( - - )} - - - {/* Reuse built-in pieces only where you want them. */} - {slots.Pagination} -
- ) - }, - }} -/>`,language:"tsx"})]})}function MZ(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsx(E1,{typeName:"HotKey",rows:SZ}),c.jsx("p",{className:"-mt-4 mb-3 text-xs text-muted-foreground",children:e("docs.section.props.hotkey.umbrella")}),c.jsx("h4",{className:"mt-4 mb-2 text-sm font-semibold",children:e("docs.section.props.hotkey.customTitle")}),c.jsx("p",{className:"mb-2 text-xs text-muted-foreground",children:e("docs.section.props.hotkey.customIntro")}),c.jsx(De,{code:`// Enable Cmd/Ctrl+S to download (off by default — opt in) - - -// Rebind rotate to A / D, keep download default - - -// Add Q as a second close key alongside the default Escape - - -// Custom download shortcut (Mod = ⌘ on macOS, Ctrl on Windows/Linux) -`,language:"tsx"}),c.jsx("p",{className:"mt-3 mb-1 text-xs font-medium text-muted-foreground",children:e("docs.section.props.hotkey.cheatsheetTitle")}),c.jsxs("ul",{className:"mb-6 list-disc space-y-1 pl-5 text-xs text-muted-foreground",children:[c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'S'"})," → ",c.jsx("span",{className:"font-mono",children:"'KeyS'"}),","," ",c.jsx("span",{className:"font-mono",children:"'1'"})," → ",c.jsx("span",{className:"font-mono",children:"'Digit1'"})," ","(",e("docs.section.props.hotkey.cheatsheet.shorthand"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'ArrowLeft' / 'ArrowRight' / 'ArrowUp' / 'ArrowDown'"})," ","(",e("docs.section.props.hotkey.cheatsheet.arrows"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'BracketLeft' ([) / 'BracketRight' (]) / 'Comma' / 'Period' / 'Slash'"})," ","(",e("docs.section.props.hotkey.cheatsheet.punct"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'Space' / 'Enter' / 'Tab' / 'Backspace' / 'Escape'"})," ","(",e("docs.section.props.hotkey.cheatsheet.whitespace"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'Mod+' / 'Cmd+' / 'Ctrl+' / 'Shift+' / 'Alt+'"})," ","(",e("docs.section.props.hotkey.cheatsheet.modifier"),")"]})]})]})}function DZ(){const{t:e}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:"Animate"}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.animate.typeHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:CZ.map(({k:a,type:r,descKey:s})=>c.jsxs("tr",{children:[c.jsx("td",{className:"px-4 py-2.5 font-mono align-top",children:a}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:r}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:e(s)})]},a))})]})]})}function _Z(){const{t:e}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:"GestureSet"}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.animate.typeHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:kZ.map(({k:a,type:r,descKey:s,scope:l})=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5 align-top",children:[c.jsx("span",{className:"font-mono",children:a}),l&&c.jsx(Qc,{scope:l,className:"ml-1.5"})]}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:r}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:e(s)})]},a))})]})]})}function OZ(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"props",children:e("docs.section.props.title")}),c.jsx("p",{children:e("docs.section.props.intro")}),c.jsx(AZ,{}),c.jsx(Se,{id:"props-data",level:3,children:e("group.data")}),c.jsx(ta,{group:"data"}),c.jsx(jZ,{}),c.jsx(Se,{id:"props-preset",level:3,children:e("group.preset")}),c.jsx(ta,{group:"preset"}),c.jsx(Se,{id:"props-preset-bundles",level:3,children:e("docs.section.props.preset.title")}),c.jsx(RZ,{}),c.jsx(Se,{id:"props-interface",level:3,children:e("docs.section.props.interface")}),c.jsx(ta,{group:"interface"}),c.jsx(Se,{id:"props-controller",level:3,children:e("group.controller")}),c.jsx(ta,{group:"controller"}),c.jsx(zZ,{}),c.jsx(Se,{id:"props-hotkey",level:3,children:e("group.hotkey")}),c.jsx(ta,{group:"hotkey"}),c.jsx(MZ,{}),c.jsx(Se,{id:"props-animate",level:3,children:e("group.animate")}),c.jsx(ta,{group:"animate"}),c.jsx(DZ,{}),c.jsx(Se,{id:"props-gesture",level:3,children:e("group.gesture")}),c.jsx(ta,{group:"gesture"}),c.jsx(_Z,{}),c.jsx(Se,{id:"props-lifecycle",level:3,children:e("group.lifecycle")}),c.jsx(ta,{group:"lifecycle"}),c.jsx(Se,{id:"props-controlled",level:3,children:e("group.controlled")}),c.jsx(ta,{group:"controlled"})]})}const LZ=``,ZZ=``,PZ=``,BZ=` { - if (!state.show || state.zoom) return null - - return ( -
- - {state.page + 1} / {state.total} - - - -
- ) - }, - }} -/>`,IZ=``;function qZ(){const{t:e}=be(),a=fi();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"examples",children:e("docs.section.examples.title")}),c.jsx(Se,{id:"examples-single",level:3,children:e("docs.section.examples.singleTitle")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(na,{src:"/imgSet/childsDream/1.jpg",alt:"童夢 · ONE",backdrop:a,animate:Hs,className:"w-full rounded-md"}),c.jsx(De,{code:LZ,language:"tsx"})]}),c.jsx(Se,{id:"examples-gallery",level:3,children:e("docs.section.examples.galleryTitle")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(na,{src:"/imgSet/childsDream/3.jpg",alt:"童夢 · THREE",backdrop:a,animate:Hs,className:"w-full rounded-md",set:[{src:"/imgSet/childsDream/3.jpg",alt:"童夢 · THREE"},{src:"/imgSet/childsDream/4.jpg",alt:"童夢 · FOUR"},{src:"/imgSet/childsDream/5.jpg",alt:"童夢 · FIVE"}]}),c.jsx(De,{code:ZZ,language:"tsx"})]}),c.jsx(Se,{id:"examples-mobile",level:3,children:e("docs.section.examples.mobileTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.mobileBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(na,{src:"/imgSet/childsDream/6.jpg",alt:"童夢 · SIX",backdrop:a,animate:Hs,preset:"mobile",className:"h-64 w-full rounded-md object-cover",gesture:{swipe:!0,dragExit:!0,pinchZoom:{resetBelowFit:!0},doubleTapZoom:{scale:2.5}}}),c.jsx(De,{code:PZ,language:"tsx"})]}),c.jsx(Se,{id:"examples-controller",level:3,children:e("docs.section.examples.controllerTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.controllerBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(na,{src:"/imgSet/childsDream/7.jpg",alt:"童夢 · SEVEN",backdrop:a,animate:Hs,className:"h-64 w-full rounded-md object-cover",set:[{src:"/imgSet/childsDream/7.jpg",alt:"童夢 · SEVEN"},{src:"/imgSet/childsDream/8.jpg",alt:"童夢 · EIGHT"}],controller:{placement:"bottom-center",render:({state:r,actions:s})=>!r.show||r.zoom?null:c.jsxs("div",{className:"pointer-events-auto flex items-center gap-2 rounded-md border border-white/15 bg-black/70 px-3 py-2 text-xs text-white shadow-lg","data-placement":r.placement,style:{position:"absolute",left:"50%",bottom:"1rem",transform:"translateX(-50%)",zIndex:1e3},children:[c.jsx("button",{type:"button",disabled:!r.canPrev,onClick:s.prev,className:"disabled:opacity-40",children:"Prev"}),c.jsxs("span",{className:"font-mono",children:[r.page+1," / ",r.total]}),c.jsx("button",{type:"button",disabled:!r.canNext,onClick:s.next,className:"disabled:opacity-40",children:"Next"}),c.jsx("button",{type:"button",disabled:!r.canZoom,onClick:s.zoom,className:"disabled:opacity-40",children:"Zoom"}),c.jsx("button",{type:"button",onClick:s.close,children:"Close"})]})}}),c.jsx(De,{code:BZ,language:"tsx"})]}),c.jsx(Se,{id:"examples-cover",level:3,children:e("docs.section.examples.coverTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.coverBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(na,{src:"/imgSet/childsDream/demo.jpg",alt:"童夢 · DEMO",backdrop:a,className:"h-64 w-full rounded-2xl object-cover",style:{objectPosition:"35% 50%"},animate:aC({cover:{objectFit:!0,clip:!0,radius:!0}})}),c.jsx(De,{code:IZ,language:"tsx"})]})]})}function FZ(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"typescript",children:e("docs.section.typescript.title")}),c.jsx("p",{children:e("docs.section.typescript.intro")}),c.jsx(De,{code:`import type { - BaseType, - Set, - Preset, - ControllerSet, - HotKey, - Animate, - AnimateCoverOptions, - GestureSet, - GestureWheelZoomOptions, -} from 'react-zmage' - -const props: BaseType = { - src: 'hero.jpg', - set: [{ src: 'hero.jpg', alt: 'hero' }], - preset: 'desktop', -}`,language:"tsx"}),c.jsx("p",{children:e("docs.section.typescript.refIntro")}),c.jsx(De,{code:`const ref = useRef(null) -`,language:"tsx"})]})}function KZ(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(Se,{id:"migration",children:e("docs.section.migration.title")}),c.jsx("p",{children:e("docs.section.migration.from")}),c.jsxs("ul",{className:"list-disc space-y-2 pl-6 text-muted-foreground",children:[c.jsx("li",{children:e("docs.section.migration.bullet1")}),c.jsx("li",{children:e("docs.section.migration.bullet2")})]})]})}function UZ(){const e=mZ("main h2[id], main h3[id]"),{t:a}=be(),{pathname:r,hash:s}=$a();return v.useEffect(()=>{if(!s)return;const l=s.slice(1);let d=!1;return requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(d)return;const u=document.getElementById(l);u==null||u.scrollIntoView({behavior:"smooth",block:"start"})})}),()=>{d=!0}},[r,s]),c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:"mx-auto grid max-w-6xl gap-10 px-4 py-10 sm:px-6 lg:grid-cols-[260px_minmax(0,1fr)]",children:[c.jsx("aside",{className:"hidden lg:block",children:c.jsx("div",{className:"sticky top-20 max-h-[calc(100vh-6rem)] overflow-y-auto pr-2",children:c.jsx(uM,{activeId:e})})}),c.jsxs("main",{className:"max-w-none space-y-2 min-w-0",children:[c.jsx("h1",{className:"text-3xl font-semibold tracking-tight",children:a("docs.title")}),c.jsx(fZ,{}),c.jsx(hZ,{}),c.jsx(gZ,{}),c.jsx(OZ,{}),c.jsx(qZ,{}),c.jsx(FZ,{}),c.jsx(KZ,{}),c.jsx(gD,{})]})]}),c.jsx(mi,{})]})}const HZ=[{icon:Nx,titleKey:"useCases.card.blog.title",bodyKey:"useCases.card.blog.body"},{icon:DR,titleKey:"useCases.card.cms.title",bodyKey:"useCases.card.cms.body"},{icon:HR,titleKey:"useCases.card.news.title",bodyKey:"useCases.card.news.body"},{icon:GR,titleKey:"useCases.card.mdx.title",bodyKey:"useCases.card.mdx.body"},{icon:MR,titleKey:"useCases.card.lightbox.title",bodyKey:"useCases.card.lightbox.body"},{icon:_x,titleKey:"useCases.card.ssr.title",bodyKey:"useCases.card.ssr.body"}],GZ=["useCases.fact.react","useCases.fact.modes","useCases.fact.input","useCases.fact.ssr","useCases.fact.gallery","useCases.fact.origin"],VZ=[{questionKey:"useCases.faq.what.q",answerKey:"useCases.faq.what.a"},{questionKey:"useCases.faq.lightbox.q",answerKey:"useCases.faq.lightbox.a"},{questionKey:"useCases.faq.richText.q",answerKey:"useCases.faq.richText.a"},{questionKey:"useCases.faq.ssr.q",answerKey:"useCases.faq.ssr.a"}],WZ=[["Component","useCases.mode.component"],["Imperative","useCases.mode.imperative"],["Wrapper","useCases.mode.wrapper"]];function $Z(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsxs("section",{className:"mx-auto max-w-6xl px-4 py-20 sm:px-6",children:[c.jsxs("div",{className:"max-w-3xl",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.eyebrow")}),c.jsx("h1",{className:"mt-4 text-4xl font-semibold tracking-tight sm:text-5xl",children:e("useCases.title")}),c.jsx("p",{className:"mt-5 text-base leading-7 text-muted-foreground sm:text-lg",children:e("useCases.body")}),c.jsxs("div",{className:"mt-8 flex flex-wrap gap-3",children:[c.jsx(it,{asChild:!0,children:c.jsxs(st,{to:"/docs",children:[e("useCases.cta.docs"),c.jsx(Ax,{className:"ml-1.5 h-4 w-4"})]})}),c.jsx(it,{variant:"outline",asChild:!0,children:c.jsx(st,{to:"/playground/wrapper",children:e("useCases.cta.wrapper")})})]})]}),c.jsx("div",{className:"mt-14 grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:HZ.map(({icon:a,titleKey:r,bodyKey:s})=>c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx(a,{className:"h-5 w-5 text-muted-foreground"}),c.jsx("h2",{className:"mt-4 text-lg font-medium",children:e(r)}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:e(s)})]},r))}),c.jsxs("section",{className:"mt-20 grid gap-8 lg:grid-cols-[minmax(0,0.75fr)_minmax(0,1fr)]",children:[c.jsxs("div",{children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.mode.eyebrow")}),c.jsx("h2",{className:"mt-3 text-2xl font-semibold tracking-tight",children:e("useCases.mode.title")})]}),c.jsx("div",{className:"grid gap-3",children:WZ.map(([a,r])=>c.jsxs("div",{className:"grid gap-2 border-b border-border pb-4 sm:grid-cols-[9rem_1fr]",children:[c.jsx("span",{className:"font-mono text-sm text-foreground",children:a}),c.jsx("span",{className:"text-sm leading-6 text-muted-foreground",children:e(r)})]},a))})]}),c.jsxs("section",{className:"mt-20",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.facts.eyebrow")}),c.jsx("h2",{className:"mt-3 text-2xl font-semibold tracking-tight",children:e("useCases.facts.title")}),c.jsx("div",{className:"mt-6 grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:GZ.map(a=>c.jsxs("div",{className:"flex min-w-0 items-start gap-3 rounded-md border border-border bg-muted/20 p-3 text-sm text-muted-foreground",children:[c.jsx(NR,{className:"mt-0.5 h-4 w-4 shrink-0 text-foreground"}),c.jsx("span",{children:e(a)})]},a))})]}),c.jsxs("section",{className:"mt-20",id:"faq",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.faq.eyebrow")}),c.jsx("h2",{className:"mt-3 text-2xl font-semibold tracking-tight",children:e("useCases.faq.title")}),c.jsx("div",{className:"mt-8 divide-y divide-border border-y border-border",children:VZ.map(a=>c.jsxs("article",{className:"py-6",children:[c.jsx("h3",{className:"text-base font-medium",children:e(a.questionKey)}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:e(a.answerKey)})]},a.questionKey))})]})]}),c.jsx(mi,{})]})}function Cr({label:e,description:a,value:r,options:s,onValueChange:l,className:d,listClassName:u,compact:m=!1}){const h=v.useId();return c.jsxs("div",{className:ie("min-w-0",d),children:[c.jsxs("div",{className:"mb-2",children:[c.jsx("div",{id:h,className:"text-sm font-medium text-foreground",children:e}),a&&c.jsx("p",{className:"mt-1 text-xs leading-5 text-muted-foreground",children:a})]}),c.jsx(Tf,{value:r,onValueChange:g=>l(g),children:c.jsx(ad,{"aria-labelledby":h,className:ie("h-auto max-w-full flex-wrap justify-start gap-1 bg-muted/40 p-1",m?"text-xs":"text-sm",u),children:s.map(g=>c.jsx(nd,{value:g.value,disabled:g.disabled,title:g.description??g.label,className:ie("min-w-0 max-w-full whitespace-normal text-left",m?"px-2 py-1 text-xs":"px-3 py-1.5"),children:c.jsx("span",{className:"break-words leading-5",children:g.label})},g.value))})})]})}const Ql=v.forwardRef(({className:e,...a},r)=>c.jsx("textarea",{ref:r,className:ie("flex min-h-24 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),...a}));Ql.displayName="Textarea";const R1=[{value:"auto",labelKey:"ai.option.auto",descriptionKey:"ai.option.agent.auto.desc"},{value:"codex",labelKey:"ai.option.agent.codex"},{value:"claude",labelKey:"ai.option.agent.claude"},{value:"cursor",labelKey:"ai.option.agent.cursor"},{value:"devin",labelKey:"ai.option.agent.devin"},{value:"other",labelKey:"ai.option.other"}],j1=[{value:"auto",labelKey:"ai.option.depth.auto",descriptionKey:"ai.option.depth.auto.desc"},{value:"fine",labelKey:"ai.option.depth.fine",descriptionKey:"ai.option.depth.fine.desc"}],A1=[{value:"auto",labelKey:"ai.option.auto"},{value:"vite",labelKey:"ai.option.env.vite"},{value:"next-rsc",labelKey:"ai.option.env.nextRsc"},{value:"ssr",labelKey:"ai.option.env.ssr"},{value:"cms-mdx",labelKey:"ai.option.env.cmsMdx"},{value:"event",labelKey:"ai.option.env.event"}],N1=[{value:"auto",labelKey:"ai.option.auto"},{value:"component",labelKey:"ai.option.mode.component"},{value:"imperative",labelKey:"ai.option.mode.imperative"},{value:"wrapper",labelKey:"ai.option.mode.wrapper"}],z1=[{value:"auto",labelKey:"ai.option.auto"},{value:"single",labelKey:"ai.option.image.single"},{value:"set",labelKey:"ai.option.image.set"},{value:"caption",labelKey:"ai.option.image.caption"},{value:"wrapper-caption",labelKey:"ai.option.image.wrapperCaption"}],M1=[{value:"auto",labelKey:"ai.option.auto"},{value:"preset-auto",labelKey:"ai.option.interaction.presetAuto"},{value:"desktop-tools",labelKey:"ai.option.interaction.desktopTools"},{value:"mobile-gestures",labelKey:"ai.option.interaction.mobileGestures"},{value:"no-browsing-animation",labelKey:"ai.option.interaction.noBrowsingAnimation"},{value:"custom-controller",labelKey:"ai.option.interaction.customController"}],YZ="https://zmage.caldis.me/llms.txt",XZ=e=>e.trim()||"(Not provided)";function Sn(e,a){return a[e]??e}function QZ(e){return e.depth!=="auto"?e:{...e,environment:"auto",mode:"auto",imageSource:"auto",interaction:"auto"}}function JZ(e,a){return e.agent==="auto"?["Use the workflow that fits your coding agent, but keep the integration strategy Auto. Prefer project inspection, short user questions, and small, reviewable edits.","If the agent has tool limits, read `llms.txt` first, then inspect package files, routing files, and the image-rendering components before proposing code changes."].join(` -`):`Optimize the workflow for ${Sn(e.agent,a.agent)}. Keep the same technical checks and source-of-truth rules below.`}function e5(e){return e.depth==="auto"||e.environment==="auto"?["- Detect the framework from package files and routing structure before choosing imports.","- In CSR-only React, import from `react-zmage`.","- In SSR, React Server Components, or code that may run during server render, import from `react-zmage/ssr` and keep viewer opening inside a client boundary or event handler."].join(` -`):e.environment==="next-rsc"?['- Use the SSR-safe entry: `import Zmage from "react-zmage/ssr"`.','- Add `"use client"` only to the smallest component that renders or opens the viewer.',"- Import `react-zmage/style.css` from the app-level style entry allowed by the project."].join(` -`):e.environment==="ssr"?["- Use `react-zmage/ssr` for code that can be evaluated server-side.","- Call `Zmage.browsing()` only after `window` and `document` exist.","- Keep the stylesheet imported once by the client bundle."].join(` -`):e.environment==="cms-mdx"?["- Expect image markup to be partially uncontrolled.","- Prefer Wrapper mode unless the project already maps MDX or CMS images into React components."].join(` -`):e.environment==="event"?["- Prefer Imperative mode when the viewer opens from a button, command menu, custom thumbnail, or callback.","- Store and call the destructor when the host lifecycle can outlive the viewer."].join(` -`):["- Use the standard client import from `react-zmage`.","- Import `react-zmage/style.css` once from the app entry or root layout used by this Vite app."].join(` -`)}function t5(e){return e.depth==="auto"||e.mode==="auto"?["Use Auto mode selection. Inspect the codebase first, then choose the integration path from real project evidence.","","- Component: use this when the app owns the image markup.","- Imperative: use this when the viewer opens from a button, callback, or non-image event.","- Wrapper: use this when images come from CMS, MDX, markdown, or uncontrolled HTML.","","Ask concise questions until the implementation scope is clear. Do not ask the user to choose low-level props before reading the project."].join(` -`):e.mode==="component"?["Use Component mode.","","Replace owned `` elements with `` and preserve native image attributes such as `alt`, `className`, `loading`, `width`, and `height`.","","Use `set` when the host image belongs to a gallery."].join(` -`):e.mode==="imperative"?["Use Imperative mode.","","Call `Zmage.browsing(props)` from an event handler or client effect. Store the returned destructor when the host lifecycle needs cleanup.","","Do not call `Zmage.browsing()` during server render."].join(` -`):["Use Wrapper mode.","","Wrap the uncontrolled image subtree with ``. Keep `src`, `alt`, and native image attributes on descendant `` nodes. Put viewer config on ``.","","If using a shared `set`, the clicked image `src` should match `set[i].src`. Without explicit `set`, `data-zmage-caption` or nearest `figcaption` can supply caption text."].join(` -`)}function o5(e){const a=['- Prefer omitted `preset` or `preset="auto"` unless project evidence requires a fixed desktop or mobile setup.',"- Keep optional behavior and UI props at their defaults unless the user asks for them or testing exposes a concrete issue.","- You may set the top-level `backdrop` to match the host page background color when the default white viewer would clash.","- Do not set `controller`, `controller.layout`, `edge`, `zIndex`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install unless the selected setup or user request specifically requires them.","- Only configure `controller.color` or `controller.backdrop` when the user asks for controller styling or when controls are visibly illegible after testing."];return(e.environment==="next-rsc"||e.environment==="ssr")&&a.push("- For SSR or RSC-sensitive code, import from `react-zmage/ssr` and keep interactive usage inside a client boundary."),e.imageSource==="set"&&a.push("- Use `set` plus `defaultPage` for multi-image galleries."),e.imageSource==="caption"&&a.push("- Use `caption` on the top-level image or `set[i].caption` for per-image captions."),e.imageSource==="wrapper-caption"&&a.push("- In Wrapper mode without explicit `set`, use `data-zmage-caption` or the nearest `figcaption` for viewer captions."),e.interaction==="desktop-tools"?a.push("- Keep desktop controller and hotKey defaults unless the host UI has a reason to hide tools. Wheel zoom applies while already zoomed."):e.interaction==="mobile-gestures"?a.push("- Use mobile gesture defaults when the host deliberately wants touch-first behavior: swipe, drag exit, pinch zoom, and double tap zoom."):e.interaction==="no-browsing-animation"?a.push("- Use `animate={{ browsing: false }}` when open and close transitions should be disabled."):e.interaction==="custom-controller"&&a.push("- Use `controller.render` only when the host needs a fully custom controller; otherwise prefer partial `controller` options."),a.join(` -`)}function a5(e,a){const r=QZ(e);return`> **Canonical reference:** ${YZ} -> -> If anything below looks outdated or contradicts real package behavior, fetch that URL first. It is the source of truth for react-zmage usage modes, props, defaults, SSR entry, and common pitfalls. Report staleness back to the user. - ---- - -# react-zmage Setup Guide - -## Your Configuration - -| Setting | Value | -|---------|-------| -| Coding Tool | ${Sn(e.agent,a.agent)} | -| Project Environment | ${Sn(r.environment,a.environment)} | -| Setup Depth | ${Sn(e.depth,a.depth)} | -| Usage Mode | ${Sn(r.mode,a.mode)} | -| Image Source | ${Sn(r.imageSource,a.imageSource)} | -| Interaction Detail | ${Sn(r.interaction,a.interaction)} | - -**Project Description:** ${XZ(e.projectDescription)} - ---- - -## Agent Workflow - -${JZ(e,a)} - -Before editing code: - -0. Explain what react-zmage is for: turning existing images into a fullscreen, zoomable, keyboard-navigable viewer. State that your goal is to integrate it into the user's real image surfaces without changing unrelated UI. -1. Read this canonical reference first, then inspect package files, routing, render mode, CSS entry, and any existing image/viewer conventions in the user's project. -2. Find the actual image surfaces: owned React images, galleries, generated HTML, CMS/MDX/markdown content, rich text, and buttons or commands that open media. -3. Classify each target as Component, Imperative, or Wrapper. Explain the classification from project evidence. -4. Ask the user short follow-up questions until the scope is concrete: which pages/sections, single-image vs gallery behavior, captions, SSR/RSC boundary, theme/backdrop, mobile gestures, rollout priority, and acceptance criteria. -5. Implement one pilot change on a representative image path. Keep the diff small and ask the user to verify the real visual result. -6. Incorporate user feedback, adjust the pilot, then apply the confirmed pattern to the remaining agreed scope. - -If this setup is Auto, make technical choices from project evidence and user answers. Do not force the user to decide every prop up front. - ---- - -## Installation - -Use the package manager already used by the project. - -\`\`\`bash -npm install react-zmage -\`\`\` - -Use pnpm, yarn, or bun instead if the project uses one of those. - ---- - -## Required Imports - -For normal client-side React: - -\`\`\`tsx -import Zmage from 'react-zmage' -import 'react-zmage/style.css' -\`\`\` - -For SSR or RSC-sensitive code: - -\`\`\`tsx -import Zmage from 'react-zmage/ssr' -import 'react-zmage/style.css' -\`\`\` - -Do not call \`Zmage.browsing()\` during server render. Call it from event handlers or client effects only. - ---- - -## Environment Guidance - -${e5(r)} - ---- - -## Recommended Integration - -${t5(r)} - ---- - -## Configuration Guidance - -${o5(r)} - ---- - -## Common Mistakes To Avoid - -- Do not forget \`import 'react-zmage/style.css'\`. -- Do not use \`new Zmage()\`. -- Do not confuse the static method \`Zmage.browsing()\` with the controlled \`browsing\` prop. -- In Wrapper mode, put \`src\`, \`alt\`, and native image attributes on child \`\` elements, not on \`\`. -- In Wrapper mode, remember that newly injected images are bound after the wrapper re-renders. -- For non-light UIs, set the top-level \`backdrop\` to match the host page background; do not preemptively customize controller styling. -- For Next.js App Router or RSC, keep interactive viewer usage inside a client boundary. - ---- - -## Deliverables - -Return: - -1. Install command. -2. Files changed. -3. Final React code. -4. Where \`react-zmage/style.css\` is imported. -5. Any SSR/RSC notes. -6. Minimal verification steps. -`}const n5={agent:"auto",depth:"auto",environment:"auto",mode:"auto",imageSource:"auto",interaction:"auto",projectDescription:""};function kr(e,a){return e.map(r=>({value:r.value,label:a(r.labelKey),description:r.descriptionKey?a(r.descriptionKey):void 0}))}function r5(e){const a=r=>Object.fromEntries(r.map(s=>[s.value,e(s.labelKey)]));return{agent:a(R1),depth:a(j1),environment:a(A1),mode:a(N1),imageSource:a(z1),interaction:a(M1)}}function s5(){const{t:e}=be(),[a,r]=v.useState(n5),[s,l]=v.useState(!1),{copied:d,error:u,copy:m}=Bc(),h=v.useMemo(()=>r5(e),[e]),g=v.useMemo(()=>a5(a,h),[a,h]),y=a.depth==="fine",b=v.useCallback((T,C)=>{r(x=>({...x,[T]:C}))},[]),S=v.useCallback(()=>{m(g)},[m,g]);return c.jsxs("div",{className:"grid min-h-[calc(100dvh-3.5rem)] lg:grid-cols-[minmax(0,1fr)_minmax(420px,0.94fr)]",children:[c.jsx("section",{className:"min-w-0 px-4 py-8 sm:px-8 lg:px-12 lg:py-10 xl:px-16",children:c.jsxs("div",{className:"mx-auto flex h-full max-w-3xl min-w-0 flex-col",children:[c.jsxs("div",{children:[c.jsxs(Wc,{variant:"secondary",className:"mb-5 gap-1.5 font-mono",children:[c.jsx(Nm,{className:"h-3.5 w-3.5"}),e("ai.badge")]}),c.jsx("h1",{className:"max-w-3xl text-3xl font-semibold tracking-tight sm:text-4xl",children:e("ai.title")}),c.jsx("p",{className:"mt-3 max-w-2xl text-sm leading-6 text-muted-foreground sm:text-base",children:e("ai.subtitle")})]}),c.jsxs("div",{className:"mt-8 space-y-6",children:[c.jsx(Cr,{label:e("ai.field.agent"),value:a.agent,options:kr(R1,e),onValueChange:T=>b("agent",T)}),c.jsxs("div",{children:[c.jsx(Cr,{label:e("ai.field.depth"),value:a.depth,options:kr(j1,e),onValueChange:T=>b("depth",T)}),c.jsx("div",{className:ie("grid transition-[grid-template-rows,opacity,transform] duration-[220ms] ease-out motion-reduce:transition-none",a.depth==="auto"?"grid-rows-[1fr] opacity-100 translate-y-0":"pointer-events-none grid-rows-[0fr] opacity-0 -translate-y-1"),"aria-hidden":a.depth!=="auto",children:c.jsx("div",{className:"min-h-0 overflow-hidden",children:c.jsx("p",{className:"mt-2 rounded-md border border-border bg-muted/30 px-3 py-2 text-xs leading-5 text-muted-foreground",children:e("ai.autoTip")})})})]}),c.jsx("div",{className:ie("grid transition-[grid-template-rows,opacity,transform] duration-[220ms] ease-out motion-reduce:transition-none",y?"grid-rows-[1fr] opacity-100 translate-y-0":"pointer-events-none grid-rows-[0fr] opacity-0 translate-y-2"),"aria-hidden":!y,children:c.jsx("div",{className:"min-h-0 overflow-hidden",children:c.jsxs("div",{className:"grid gap-5 pt-1",children:[c.jsx(Cr,{label:e("ai.field.environment"),value:a.environment,options:kr(A1,e),onValueChange:T=>b("environment",T)}),c.jsx(Cr,{label:e("ai.field.mode"),value:a.mode,options:kr(N1,e),onValueChange:T=>b("mode",T)}),c.jsx(Cr,{label:e("ai.field.imageSource"),value:a.imageSource,options:kr(z1,e),onValueChange:T=>b("imageSource",T)}),c.jsx(Cr,{label:e("ai.field.interaction"),value:a.interaction,options:kr(M1,e),onValueChange:T=>b("interaction",T)})]})})}),c.jsxs("div",{children:[c.jsx(jf,{htmlFor:"ai-project-description",children:e("ai.field.project")}),c.jsx(Ql,{id:"ai-project-description",value:a.projectDescription,onChange:T=>b("projectDescription",T.target.value),placeholder:e("ai.project.placeholder"),className:"mt-2 min-h-24 resize-y"})]})]}),c.jsxs("div",{className:"mt-8",children:[c.jsx(Rf,{title:e("ai.preview.title"),description:e("ai.preview.subtitle"),expandLabel:e("ai.preview.expand"),preview:c.jsx(Ql,{readOnly:!0,value:g,"aria-label":e("ai.preview.title"),className:"h-28 resize-none bg-muted/25 font-mono text-xs leading-5 text-muted-foreground"}),expanded:c.jsx(Ql,{readOnly:!0,value:g,className:"h-[62dvh] resize-none border-0 bg-muted/30 font-mono text-xs leading-5 shadow-none focus-visible:ring-0 sm:text-sm"}),footer:c.jsxs(it,{onClick:S,children:[d?c.jsx(Ha,{className:"h-4 w-4"}):c.jsx(Ws,{className:"h-4 w-4"}),e(d?"ai.action.copied":"ai.preview.copy")]}),className:"border-0 bg-transparent",previewClassName:"p-0"}),c.jsxs("div",{className:"mt-4 flex flex-wrap gap-3",children:[c.jsxs(it,{onClick:S,className:"min-w-40",children:[d?c.jsx(Ha,{className:"h-4 w-4"}):c.jsx(Ws,{className:"h-4 w-4"}),e(d?"ai.action.copied":"ai.action.copy")]}),c.jsx(it,{variant:"outline",asChild:!0,children:c.jsxs("a",{href:"/llms.txt",target:"_blank",rel:"noreferrer",children:[e("ai.action.openLlms"),c.jsx(Mx,{className:"h-4 w-4"})]})})]}),u&&c.jsx("p",{className:"mt-3 text-sm text-destructive",children:e("ai.copy.error")})]})]})}),c.jsxs("aside",{className:"relative hidden overflow-hidden border-l border-border bg-muted/30 lg:sticky lg:top-14 lg:block lg:h-[calc(100dvh-3.5rem)]",children:[!s&&c.jsx("img",{src:"/ai-onboarding/prompt-setup.png",alt:"",className:"absolute inset-0 h-full w-full object-cover object-center brightness-[1.02] saturate-[0.95] transition-[filter] duration-300 dark:brightness-[0.68] dark:contrast-[0.95] dark:saturate-[0.72]",onError:()=>l(!0)}),c.jsx("div",{className:"pointer-events-none absolute inset-0 bg-background/0 dark:bg-background/10"}),c.jsx("div",{className:"pointer-events-none absolute inset-y-0 left-0 hidden w-[calc(var(--spacing)*100)] bg-gradient-to-r from-background/20 to-transparent lg:block"}),c.jsx("div",{className:"pointer-events-none absolute inset-y-0 right-0 w-[calc(var(--spacing)*100)] bg-gradient-to-r from-transparent via-background/45 to-background dark:via-background/65 dark:to-background"})]})]})}const i5=[["llms.txt","/llms.txt","Compact agent instructions for choosing the right react-zmage integration mode."],["llms-full.txt","/llms-full.txt","Single-file agent context that includes the compact guide, README, and repository agent notes."],["index.md","/index.md","Markdown version of the homepage for agents that prefer prose over HTML."],["OpenAPI metadata","/api/openapi.json","Read-only description of static documentation endpoints. This is not a runtime product API."],["Auth notes","/developers/auth.md","The package and docs require no OAuth, API key, login, or rate-limit budget."],["Error recovery","/developers/errors.md","How agents should recover from GitHub Pages HTML 404 responses and missing static endpoints."],["Rate limits","/developers/rate-limits.md","Clarifies that no product API quota applies because react-zmage is a client-side package."],["Status","/status.md","Static site and package status notes for agents."],["Status page","/status","Human-readable status page for the static docs site and npm package surfaces."],["About","/about","Project identity, repository, npm package, license, and package boundaries."],["Contact","/contact","GitHub issue path for support, bugs, feature requests, and documentation problems."],["Privacy","/privacy","Plain-language privacy notes for the package and documentation site."],["MCP notes","/developers/mcp.md","Current MCP status and the recommended fallback for coding agents."],["Webhook notes","/developers/webhooks.md","Why a client-side React component has no webhook events or registration API."],["AGENTS.md","/AGENTS.md","Repository instructions for coding agents working in react-zmage."],[".cursorrules","/.cursorrules","Cursor-compatible pointer to the repository agent instructions."],["Agent discovery","/.well-known/agent.json","Machine-readable identity, package, and integration resource links."],["A2A card","/.well-known/agent-card.json","A discovery card that describes the documentation surface without claiming an A2A task endpoint."],["Agent skill","/.well-known/agent-skills/react-zmage-integration/SKILL.md","A portable skill for adding react-zmage to existing React image surfaces."]];function l5(){return c.jsxs(c.Fragment,{children:[c.jsxs("section",{className:"mx-auto max-w-6xl px-4 py-20 sm:px-6",children:[c.jsxs("div",{className:"max-w-3xl",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:"Developer resources"}),c.jsx("h1",{className:"mt-4 text-4xl font-semibold tracking-tight sm:text-5xl",children:"react-zmage machine-readable docs"}),c.jsx("p",{className:"mt-5 text-base leading-7 text-muted-foreground sm:text-lg",children:"These endpoints are for coding agents, search crawlers, and developers who need the package contract without running the React UI. react-zmage is a free MIT-licensed npm package, not a hosted API service."})]}),c.jsx("div",{className:"mt-12 grid gap-4 md:grid-cols-2",children:i5.map(([e,a,r])=>c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsxs("a",{href:a,className:"inline-flex items-center gap-2 text-base font-medium underline-offset-4 hover:underline",children:[e,c.jsx(Mx,{className:"h-4 w-4 text-muted-foreground"})]}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:r})]},a))})]}),c.jsx(mi,{})]})}const c5={compare:{eyebrow:"Comparison",title:"react-zmage vs alternatives",body:"react-zmage is an alternative to react-medium-image-zoom, Lightbox.js, and react-photoswipe when a React page needs fullscreen image preview from existing img elements.",sections:[{title:"When react-zmage fits",body:"Use react-zmage for documentation screenshots, editorial articles, CMS content, MDX docs, product galleries, and Next.js pages that need SSR/RSC-safe imports."},{title:"How it differs",body:"Unlike gallery-first tools, react-zmage can start as a drop-in img replacement and later expand to Wrapper or imperative mode without replacing the page architecture."}]},about:{eyebrow:"Project",title:"About react-zmage",body:"react-zmage is a free MIT-licensed open-source React image viewer maintained in the Caldis/react-zmage GitHub repository and published to npm as react-zmage.",sections:[{title:"What it provides",body:"The package turns ordinary img elements into a fullscreen image viewer with origin-expand animation, gallery browsing, keyboard navigation, mobile gestures, Wrapper mode, and an SSR/RSC-safe import path."},{title:"Boundaries",body:"There is no hosted runtime API, account system, payment plan, OAuth flow, API key, webhook delivery service, MCP transport, or service-side rate limit."}]},contact:{eyebrow:"Support",title:"Contact react-zmage",body:"react-zmage support happens through the public GitHub repository.",sections:[{title:"Public support",body:"Open issues at https://github.com/Caldis/react-zmage/issues for bugs, documentation problems, feature requests, and integration questions."},{title:"Private data",body:"Do not post secrets, private images, access tokens, or customer data in public issues. Most reproductions should use placeholder images or public sample assets."}]},privacy:{eyebrow:"Privacy",title:"react-zmage privacy notes",body:"react-zmage is a client-side React package and the documentation site is static.",sections:[{title:"Package behavior",body:"The npm package runs inside the user's React app. It displays images already available to that app and does not upload images to a react-zmage server."},{title:"Documentation site",body:"zmage.caldis.me is hosted as static GitHub Pages content and includes Google Analytics page view measurement. External links to GitHub and npm follow those services' policies."}]},status:{eyebrow:"Status",title:"react-zmage status",body:"react-zmage has no hosted runtime service. The public surfaces are the static documentation site, the npm package, and the GitHub source repository.",sections:[{title:"Available surfaces",body:"Documentation is static GitHub Pages content. The installable package is react-zmage on npm. The source repository is Caldis/react-zmage on GitHub."},{title:"Unavailable hosted surfaces",body:"There is no hosted product API, background job system, status dashboard, OAuth application, API key, webhook delivery service, MCP transport, or service-side rate limit."}]},errors:{eyebrow:"Recovery",title:"react-zmage error recovery",body:"Non-existent zmage.caldis.me paths may return a GitHub Pages HTML 404. That is a static documentation miss, not a failed product API call.",sections:[{title:"Recovery order",body:"Fetch /llms.txt, /llms-full.txt, /index.md, npm package metadata, or the GitHub repository instead of retrying a missing static endpoint."},{title:"Future API shape",body:"If react-zmage ever adds a hosted API, error responses should use JSON with error, code, message, and retry_after fields."}]},rateLimits:{eyebrow:"Access",title:"react-zmage rate limits",body:"No API rate limits apply to react-zmage because it is a client-side React package and static documentation site, not a hosted network API.",sections:[{title:"Package use",body:"Installing and using react-zmage does not require API keys, OAuth tokens, Retry-After scheduling, or quota handling."},{title:"External services",body:"Agents should still follow npm and GitHub public service policies when fetching package metadata, source files, issues, or release history."}]}};function xn({page:e}){const a=c5[e];return c.jsxs(c.Fragment,{children:[c.jsxs("section",{className:"mx-auto max-w-4xl px-4 py-20 sm:px-6",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:a.eyebrow}),c.jsx("h1",{className:"mt-4 text-4xl font-semibold tracking-tight sm:text-5xl",children:a.title}),c.jsx("p",{className:"mt-5 text-base leading-7 text-muted-foreground sm:text-lg",children:a.body}),c.jsx("div",{className:"mt-12 grid gap-4",children:a.sections.map(r=>c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h2",{className:"text-lg font-medium",children:r.title}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:r.body})]},r.title))})]}),c.jsx(mi,{})]})}function d5(){return $D(),c.jsxs(CS,{delayDuration:300,children:[c.jsx(TD,{}),c.jsx("main",{className:"pt-14",children:c.jsxs(wx,{children:[c.jsx(ut,{path:"/",element:c.jsx(ex,{})}),c.jsx(ut,{path:"/playground/*",element:c.jsx(pZ,{})}),c.jsx(ut,{path:"/docs",element:c.jsx(UZ,{})}),c.jsx(ut,{path:"/use-cases",element:c.jsx($Z,{})}),c.jsx(ut,{path:"/ai",element:c.jsx(s5,{})}),c.jsx(ut,{path:"/developers",element:c.jsx(l5,{})}),c.jsx(ut,{path:"/compare",element:c.jsx(xn,{page:"compare"})}),c.jsx(ut,{path:"/about",element:c.jsx(xn,{page:"about"})}),c.jsx(ut,{path:"/contact",element:c.jsx(xn,{page:"contact"})}),c.jsx(ut,{path:"/privacy",element:c.jsx(xn,{page:"privacy"})}),c.jsx(ut,{path:"/status",element:c.jsx(xn,{page:"status"})}),c.jsx(ut,{path:"/errors",element:c.jsx(xn,{page:"errors"})}),c.jsx(ut,{path:"/rate-limits",element:c.jsx(xn,{page:"rateLimits"})}),c.jsx(ut,{path:"*",element:c.jsx(ex,{})})]})})]})}const D1=document.getElementById("app");if(!D1)throw new Error("Missing #app root element");const _1=D1;function u5(){_1.innerHTML=` -
-

react-zmage agent view

-

react-zmage is a free MIT-licensed npm package for turning React img elements, galleries, CMS HTML, MDX, markdown, and rich text images into a fullscreen image viewer. This site is documentation-only; it has no hosted product API, OAuth flow, API key, rate-limit budget, webhook system, or hosted MCP server.

-

Install

-
npm install react-zmage
-

Package entry points

-
    -
  • react-zmage - browser and bundler entry.
  • -
  • react-zmage/ssr - SSR and React Server Components-safe import path.
  • -
  • react-zmage/style.css - required visual stylesheet.
  • -
-

Machine-readable resources

- -

Use this when

- - - - - - - -
ModeUse case
ComponentOwned React image markup.
WrapperCMS, MDX, markdown, rich text, or generated HTML images.
ImperativeButtons, commands, callbacks, and non-image triggers.
-
- `}new URLSearchParams(window.location.search).get("mode")==="agent"?u5():lx.createRoot(_1).render(c.jsx(Q.StrictMode,{children:c.jsx(hR,{children:c.jsx(kR,{children:c.jsx(lR,{children:c.jsx(d5,{})})})})})); diff --git a/docs/assets/index-yZwjA0O9.js b/docs/assets/index-yZwjA0O9.js new file mode 100644 index 0000000..7148d4c --- /dev/null +++ b/docs/assets/index-yZwjA0O9.js @@ -0,0 +1,738 @@ +function nE(e,a){for(var r=0;rs[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))s(l);new MutationObserver(l=>{for(const d of l)if(d.type==="childList")for(const u of d.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&s(u)}).observe(document,{childList:!0,subtree:!0});function r(l){const d={};return l.integrity&&(d.integrity=l.integrity),l.referrerPolicy&&(d.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?d.credentials="include":l.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function s(l){if(l.ep)return;l.ep=!0;const d=r(l);fetch(l.href,d)}})();function ix(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var vp={exports:{}},Bs={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Nb;function rE(){if(Nb)return Bs;Nb=1;var e=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function r(s,l,d){var u=null;if(d!==void 0&&(u=""+d),l.key!==void 0&&(u=""+l.key),"key"in l){d={};for(var m in l)m!=="key"&&(d[m]=l[m])}else d=l;return l=d.ref,{$$typeof:e,type:s,key:u,ref:l!==void 0?l:null,props:d}}return Bs.Fragment=a,Bs.jsx=r,Bs.jsxs=r,Bs}var zb;function sE(){return zb||(zb=1,vp.exports=rE()),vp.exports}var c=sE(),xp={exports:{}},ve={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Mb;function iE(){if(Mb)return ve;Mb=1;var e=Symbol.for("react.transitional.element"),a=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),u=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),b=Symbol.for("react.lazy"),v=Symbol.for("react.activity"),S=Symbol.iterator;function T(N){return N===null||typeof N!="object"?null:(N=S&&N[S]||N["@@iterator"],typeof N=="function"?N:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},x=Object.assign,k={};function R(N,K,ee){this.props=N,this.context=K,this.refs=k,this.updater=ee||C}R.prototype.isReactComponent={},R.prototype.setState=function(N,K){if(typeof N!="object"&&typeof N!="function"&&N!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,N,K,"setState")},R.prototype.forceUpdate=function(N){this.updater.enqueueForceUpdate(this,N,"forceUpdate")};function j(){}j.prototype=R.prototype;function A(N,K,ee){this.props=N,this.context=K,this.refs=k,this.updater=ee||C}var M=A.prototype=new j;M.constructor=A,x(M,R.prototype),M.isPureReactComponent=!0;var q=Array.isArray;function Z(){}var B={H:null,A:null,T:null,S:null},X=Object.prototype.hasOwnProperty;function ae(N,K,ee){var oe=ee.ref;return{$$typeof:e,type:N,key:K,ref:oe!==void 0?oe:null,props:ee}}function ne(N,K){return ae(N.type,K,N.props)}function te(N){return typeof N=="object"&&N!==null&&N.$$typeof===e}function J(N){var K={"=":"=0",":":"=2"};return"$"+N.replace(/[=:]/g,function(ee){return K[ee]})}var pe=/\/+/g;function re(N,K){return typeof N=="object"&&N!==null&&N.key!=null?J(""+N.key):K.toString(36)}function ue(N){switch(N.status){case"fulfilled":return N.value;case"rejected":throw N.reason;default:switch(typeof N.status=="string"?N.then(Z,Z):(N.status="pending",N.then(function(K){N.status==="pending"&&(N.status="fulfilled",N.value=K)},function(K){N.status==="pending"&&(N.status="rejected",N.reason=K)})),N.status){case"fulfilled":return N.value;case"rejected":throw N.reason}}throw N}function O(N,K,ee,oe,fe){var he=typeof N;(he==="undefined"||he==="boolean")&&(N=null);var ye=!1;if(N===null)ye=!0;else switch(he){case"bigint":case"string":case"number":ye=!0;break;case"object":switch(N.$$typeof){case e:case a:ye=!0;break;case b:return ye=N._init,O(ye(N._payload),K,ee,oe,fe)}}if(ye)return fe=fe(N),ye=oe===""?"."+re(N,0):oe,q(fe)?(ee="",ye!=null&&(ee=ye.replace(pe,"$&/")+"/"),O(fe,K,ee,"",function(vt){return vt})):fe!=null&&(te(fe)&&(fe=ne(fe,ee+(fe.key==null||N&&N.key===fe.key?"":(""+fe.key).replace(pe,"$&/")+"/")+ye)),K.push(fe)),1;ye=0;var Ke=oe===""?".":oe+":";if(q(N))for(var we=0;we>>1,se=O[Y];if(0>>1;Yl(ee,G))oel(fe,ee)?(O[Y]=fe,O[oe]=G,Y=oe):(O[Y]=ee,O[K]=G,Y=K);else if(oel(fe,G))O[Y]=fe,O[oe]=G,Y=oe;else break e}}return H}function l(O,H){var G=O.sortIndex-H.sortIndex;return G!==0?G:O.id-H.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;e.unstable_now=function(){return d.now()}}else{var u=Date,m=u.now();e.unstable_now=function(){return u.now()-m}}var h=[],g=[],b=1,v=null,S=3,T=!1,C=!1,x=!1,k=!1,R=typeof setTimeout=="function"?setTimeout:null,j=typeof clearTimeout=="function"?clearTimeout:null,A=typeof setImmediate<"u"?setImmediate:null;function M(O){for(var H=r(g);H!==null;){if(H.callback===null)s(g);else if(H.startTime<=O)s(g),H.sortIndex=H.expirationTime,a(h,H);else break;H=r(g)}}function q(O){if(x=!1,M(O),!C)if(r(h)!==null)C=!0,Z||(Z=!0,J());else{var H=r(g);H!==null&&ue(q,H.startTime-O)}}var Z=!1,B=-1,X=5,ae=-1;function ne(){return k?!0:!(e.unstable_now()-aeO&&ne());){var Y=v.callback;if(typeof Y=="function"){v.callback=null,S=v.priorityLevel;var se=Y(v.expirationTime<=O);if(O=e.unstable_now(),typeof se=="function"){v.callback=se,M(O),H=!0;break t}v===r(h)&&s(h),M(O)}else s(h);v=r(h)}if(v!==null)H=!0;else{var N=r(g);N!==null&&ue(q,N.startTime-O),H=!1}}break e}finally{v=null,S=G,T=!1}H=void 0}}finally{H?J():Z=!1}}}var J;if(typeof A=="function")J=function(){A(te)};else if(typeof MessageChannel<"u"){var pe=new MessageChannel,re=pe.port2;pe.port1.onmessage=te,J=function(){re.postMessage(null)}}else J=function(){R(te,0)};function ue(O,H){B=R(function(){O(e.unstable_now())},H)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(O){O.callback=null},e.unstable_forceFrameRate=function(O){0>O||125Y?(O.sortIndex=G,a(g,O),r(h)===null&&O===r(g)&&(x?(j(B),B=-1):x=!0,ue(q,G-Y))):(O.sortIndex=se,a(h,O),C||T||(C=!0,Z||(Z=!0,J()))),O},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(O){var H=S;return function(){var G=S;S=H;try{return O.apply(this,arguments)}finally{S=G}}}})(Cp)),Cp}var Ob;function cE(){return Ob||(Ob=1,Sp.exports=lE()),Sp.exports}var kp={exports:{}},bt={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Lb;function dE(){if(Lb)return bt;Lb=1;var e=Tm();function a(h){var g="https://react.dev/errors/"+h;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(a){console.error(a)}}return e(),kp.exports=dE(),kp.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Zb;function uE(){if(Zb)return Is;Zb=1;var e=cE(),a=Tm(),r=lx();function s(t){var o="https://react.dev/errors/"+t;if(1se||(t.current=Y[se],Y[se]=null,se--)}function ee(t,o){se++,Y[se]=t.current,t.current=o}var oe=N(null),fe=N(null),he=N(null),ye=N(null);function Ke(t,o){switch(ee(he,o),ee(fe,t),ee(oe,null),o.nodeType){case 9:case 11:t=(t=o.documentElement)&&(t=t.namespaceURI)?Jy(t):0;break;default:if(t=o.tagName,o=o.namespaceURI)o=Jy(o),t=eb(o,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}K(oe),ee(oe,t)}function we(){K(oe),K(fe),K(he)}function vt(t){t.memoizedState!==null&&ee(ye,t);var o=oe.current,n=eb(o,t.type);o!==n&&(ee(fe,t),ee(oe,n))}function xo(t){fe.current===t&&(K(oe),K(fe)),ye.current===t&&(K(ye),Os._currentValue=G)}var Lo,so;function Dt(t){if(Lo===void 0)try{throw Error()}catch(n){var o=n.stack.trim().match(/\n( *(at )?)/);Lo=o&&o[1]||"",so=-1)":-1p||z[i]!==P[p]){var U=` +`+z[i].replace(" at new "," at ");return t.displayName&&U.includes("")&&(U=U.replace("",t.displayName)),U}while(1<=i&&0<=p);break}}}finally{ua=!1,Error.prepareStackTrace=n}return(n=t?t.displayName||t.name:"")?Dt(n):""}function Gr(t,o){switch(t.tag){case 26:case 27:case 5:return Dt(t.type);case 16:return Dt("Lazy");case 13:return t.child!==o&&o!==null?Dt("Suspense Fallback"):Dt("Suspense");case 19:return Dt("SuspenseList");case 0:case 15:return Xa(t.type,!1);case 11:return Xa(t.type.render,!1);case 1:return Xa(t.type,!0);case 31:return Dt("Activity");default:return""}}function zn(t){try{var o="",n=null;do o+=Gr(t,n),n=t,t=t.return;while(t);return o}catch(i){return` +Error generating stack: `+i.message+` +`+i.stack}}var wo=Object.prototype.hasOwnProperty,xt=e.unstable_scheduleCallback,pa=e.unstable_cancelCallback,L1=e.unstable_shouldYield,P1=e.unstable_requestPaint,_t=e.unstable_now,Z1=e.unstable_getCurrentPriorityLevel,zf=e.unstable_ImmediatePriority,Mf=e.unstable_UserBlockingPriority,yi=e.unstable_NormalPriority,B1=e.unstable_LowPriority,Df=e.unstable_IdlePriority,I1=e.log,q1=e.unstable_setDisableYieldValue,Vr=null,Ot=null;function ma(t){if(typeof I1=="function"&&q1(t),Ot&&typeof Ot.setStrictMode=="function")try{Ot.setStrictMode(Vr,t)}catch{}}var Lt=Math.clz32?Math.clz32:U1,F1=Math.log,K1=Math.LN2;function U1(t){return t>>>=0,t===0?32:31-(F1(t)/K1|0)|0}var bi=256,vi=262144,xi=4194304;function Qa(t){var o=t&42;if(o!==0)return o;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&261888;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function wi(t,o,n){var i=t.pendingLanes;if(i===0)return 0;var p=0,f=t.suspendedLanes,w=t.pingedLanes;t=t.warmLanes;var E=i&134217727;return E!==0?(i=E&~f,i!==0?p=Qa(i):(w&=E,w!==0?p=Qa(w):n||(n=E&~t,n!==0&&(p=Qa(n))))):(E=i&~f,E!==0?p=Qa(E):w!==0?p=Qa(w):n||(n=i&~t,n!==0&&(p=Qa(n)))),p===0?0:o!==0&&o!==p&&(o&f)===0&&(f=p&-p,n=o&-o,f>=n||f===32&&(n&4194048)!==0)?o:p}function Wr(t,o){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&o)===0}function H1(t,o){switch(t){case 1:case 2:case 4:case 8:case 64:return o+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function _f(){var t=xi;return xi<<=1,(xi&62914560)===0&&(xi=4194304),t}function id(t){for(var o=[],n=0;31>n;n++)o.push(t);return o}function $r(t,o){t.pendingLanes|=o,o!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function G1(t,o,n,i,p,f){var w=t.pendingLanes;t.pendingLanes=n,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=n,t.entangledLanes&=n,t.errorRecoveryDisabledLanes&=n,t.shellSuspendCounter=0;var E=t.entanglements,z=t.expirationTimes,P=t.hiddenUpdates;for(n=w&~n;0"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var Q1=/[\n"\\]/g;function $t(t){return t.replace(Q1,function(o){return"\\"+o.charCodeAt(0).toString(16)+" "})}function md(t,o,n,i,p,f,w,E){t.name="",w!=null&&typeof w!="function"&&typeof w!="symbol"&&typeof w!="boolean"?t.type=w:t.removeAttribute("type"),o!=null?w==="number"?(o===0&&t.value===""||t.value!=o)&&(t.value=""+Wt(o)):t.value!==""+Wt(o)&&(t.value=""+Wt(o)):w!=="submit"&&w!=="reset"||t.removeAttribute("value"),o!=null?fd(t,w,Wt(o)):n!=null?fd(t,w,Wt(n)):i!=null&&t.removeAttribute("value"),p==null&&f!=null&&(t.defaultChecked=!!f),p!=null&&(t.checked=p&&typeof p!="function"&&typeof p!="symbol"),E!=null&&typeof E!="function"&&typeof E!="symbol"&&typeof E!="boolean"?t.name=""+Wt(E):t.removeAttribute("name")}function Vf(t,o,n,i,p,f,w,E){if(f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"&&(t.type=f),o!=null||n!=null){if(!(f!=="submit"&&f!=="reset"||o!=null)){pd(t);return}n=n!=null?""+Wt(n):"",o=o!=null?""+Wt(o):n,E||o===t.value||(t.value=o),t.defaultValue=o}i=i??p,i=typeof i!="function"&&typeof i!="symbol"&&!!i,t.checked=E?t.checked:!!i,t.defaultChecked=!!i,w!=null&&typeof w!="function"&&typeof w!="symbol"&&typeof w!="boolean"&&(t.name=w),pd(t)}function fd(t,o,n){o==="number"&&ki(t.ownerDocument)===t||t.defaultValue===""+n||(t.defaultValue=""+n)}function Pn(t,o,n,i){if(t=t.options,o){o={};for(var p=0;p"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vd=!1;if(Bo)try{var Jr={};Object.defineProperty(Jr,"passive",{get:function(){vd=!0}}),window.addEventListener("test",Jr,Jr),window.removeEventListener("test",Jr,Jr)}catch{vd=!1}var ha=null,xd=null,Ei=null;function eh(){if(Ei)return Ei;var t,o=xd,n=o.length,i,p="value"in ha?ha.value:ha.textContent,f=p.length;for(t=0;t=os),sh=" ",ih=!1;function lh(t,o){switch(t){case"keyup":return Ek.indexOf(o.keyCode)!==-1;case"keydown":return o.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ch(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var qn=!1;function jk(t,o){switch(t){case"compositionend":return ch(o);case"keypress":return o.which!==32?null:(ih=!0,sh);case"textInput":return t=o.data,t===sh&&ih?null:t;default:return null}}function Ak(t,o){if(qn)return t==="compositionend"||!Td&&lh(t,o)?(t=eh(),Ei=xd=ha=null,qn=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(o.ctrlKey||o.altKey||o.metaKey)||o.ctrlKey&&o.altKey){if(o.char&&1=o)return{node:n,offset:o-t};t=i}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=yh(n)}}function vh(t,o){return t&&o?t===o?!0:t&&t.nodeType===3?!1:o&&o.nodeType===3?vh(t,o.parentNode):"contains"in t?t.contains(o):t.compareDocumentPosition?!!(t.compareDocumentPosition(o)&16):!1:!1}function xh(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var o=ki(t.document);o instanceof t.HTMLIFrameElement;){try{var n=typeof o.contentWindow.location.href=="string"}catch{n=!1}if(n)t=o.contentWindow;else break;o=ki(t.document)}return o}function jd(t){var o=t&&t.nodeName&&t.nodeName.toLowerCase();return o&&(o==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||o==="textarea"||t.contentEditable==="true")}var Pk=Bo&&"documentMode"in document&&11>=document.documentMode,Fn=null,Ad=null,ss=null,Nd=!1;function wh(t,o,n){var i=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nd||Fn==null||Fn!==ki(i)||(i=Fn,"selectionStart"in i&&jd(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),ss&&rs(ss,i)||(ss=i,i=vl(Ad,"onSelect"),0>=w,p-=w,So=1<<32-Lt(o)+p|n<Ce?(Ne=de,de=null):Ne=de.sibling;var Oe=I(_,de,L[Ce],V);if(Oe===null){de===null&&(de=Ne);break}t&&de&&Oe.alternate===null&&o(_,de),D=f(Oe,D,Ce),_e===null?me=Oe:_e.sibling=Oe,_e=Oe,de=Ne}if(Ce===L.length)return n(_,de),De&&qo(_,Ce),me;if(de===null){for(;CeCe?(Ne=de,de=null):Ne=de.sibling;var Pa=I(_,de,Oe.value,V);if(Pa===null){de===null&&(de=Ne);break}t&&de&&Pa.alternate===null&&o(_,de),D=f(Pa,D,Ce),_e===null?me=Pa:_e.sibling=Pa,_e=Pa,de=Ne}if(Oe.done)return n(_,de),De&&qo(_,Ce),me;if(de===null){for(;!Oe.done;Ce++,Oe=L.next())Oe=W(_,Oe.value,V),Oe!==null&&(D=f(Oe,D,Ce),_e===null?me=Oe:_e.sibling=Oe,_e=Oe);return De&&qo(_,Ce),me}for(de=i(de);!Oe.done;Ce++,Oe=L.next())Oe=F(de,_,Ce,Oe.value,V),Oe!==null&&(t&&Oe.alternate!==null&&de.delete(Oe.key===null?Ce:Oe.key),D=f(Oe,D,Ce),_e===null?me=Oe:_e.sibling=Oe,_e=Oe);return t&&de.forEach(function(aE){return o(_,aE)}),De&&qo(_,Ce),me}function Fe(_,D,L,V){if(typeof L=="object"&&L!==null&&L.type===x&&L.key===null&&(L=L.props.children),typeof L=="object"&&L!==null){switch(L.$$typeof){case T:e:{for(var me=L.key;D!==null;){if(D.key===me){if(me=L.type,me===x){if(D.tag===7){n(_,D.sibling),V=p(D,L.props.children),V.return=_,_=V;break e}}else if(D.elementType===me||typeof me=="object"&&me!==null&&me.$$typeof===X&&dn(me)===D.type){n(_,D.sibling),V=p(D,L.props),ps(V,L),V.return=_,_=V;break e}n(_,D);break}else o(_,D);D=D.sibling}L.type===x?(V=nn(L.props.children,_.mode,V,L.key),V.return=_,_=V):(V=Li(L.type,L.key,L.props,null,_.mode,V),ps(V,L),V.return=_,_=V)}return w(_);case C:e:{for(me=L.key;D!==null;){if(D.key===me)if(D.tag===4&&D.stateNode.containerInfo===L.containerInfo&&D.stateNode.implementation===L.implementation){n(_,D.sibling),V=p(D,L.children||[]),V.return=_,_=V;break e}else{n(_,D);break}else o(_,D);D=D.sibling}V=Pd(L,_.mode,V),V.return=_,_=V}return w(_);case X:return L=dn(L),Fe(_,D,L,V)}if(ue(L))return le(_,D,L,V);if(J(L)){if(me=J(L),typeof me!="function")throw Error(s(150));return L=me.call(L),ge(_,D,L,V)}if(typeof L.then=="function")return Fe(_,D,Ki(L),V);if(L.$$typeof===A)return Fe(_,D,Bi(_,L),V);Ui(_,L)}return typeof L=="string"&&L!==""||typeof L=="number"||typeof L=="bigint"?(L=""+L,D!==null&&D.tag===6?(n(_,D.sibling),V=p(D,L),V.return=_,_=V):(n(_,D),V=Ld(L,_.mode,V),V.return=_,_=V),w(_)):n(_,D)}return function(_,D,L,V){try{us=0;var me=Fe(_,D,L,V);return Jn=null,me}catch(de){if(de===Qn||de===qi)throw de;var _e=Zt(29,de,null,_.mode);return _e.lanes=V,_e.return=_,_e}finally{}}}var pn=Uh(!0),Hh=Uh(!1),xa=!1;function $d(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Yd(t,o){t=t.updateQueue,o.updateQueue===t&&(o.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function wa(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function Sa(t,o,n){var i=t.updateQueue;if(i===null)return null;if(i=i.shared,(Le&2)!==0){var p=i.pending;return p===null?o.next=o:(o.next=p.next,p.next=o),i.pending=o,o=Oi(t),jh(t,null,n),o}return _i(t,i,o,n),Oi(t)}function ms(t,o,n){if(o=o.updateQueue,o!==null&&(o=o.shared,(n&4194048)!==0)){var i=o.lanes;i&=t.pendingLanes,n|=i,o.lanes=n,Lf(t,n)}}function Xd(t,o){var n=t.updateQueue,i=t.alternate;if(i!==null&&(i=i.updateQueue,n===i)){var p=null,f=null;if(n=n.firstBaseUpdate,n!==null){do{var w={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};f===null?p=f=w:f=f.next=w,n=n.next}while(n!==null);f===null?p=f=o:f=f.next=o}else p=f=o;n={baseState:i.baseState,firstBaseUpdate:p,lastBaseUpdate:f,shared:i.shared,callbacks:i.callbacks},t.updateQueue=n;return}t=n.lastBaseUpdate,t===null?n.firstBaseUpdate=o:t.next=o,n.lastBaseUpdate=o}var Qd=!1;function fs(){if(Qd){var t=Xn;if(t!==null)throw t}}function hs(t,o,n,i){Qd=!1;var p=t.updateQueue;xa=!1;var f=p.firstBaseUpdate,w=p.lastBaseUpdate,E=p.shared.pending;if(E!==null){p.shared.pending=null;var z=E,P=z.next;z.next=null,w===null?f=P:w.next=P,w=z;var U=t.alternate;U!==null&&(U=U.updateQueue,E=U.lastBaseUpdate,E!==w&&(E===null?U.firstBaseUpdate=P:E.next=P,U.lastBaseUpdate=z))}if(f!==null){var W=p.baseState;w=0,U=P=z=null,E=f;do{var I=E.lane&-536870913,F=I!==E.lane;if(F?(Ae&I)===I:(i&I)===I){I!==0&&I===Yn&&(Qd=!0),U!==null&&(U=U.next={lane:0,tag:E.tag,payload:E.payload,callback:null,next:null});e:{var le=t,ge=E;I=o;var Fe=n;switch(ge.tag){case 1:if(le=ge.payload,typeof le=="function"){W=le.call(Fe,W,I);break e}W=le;break e;case 3:le.flags=le.flags&-65537|128;case 0:if(le=ge.payload,I=typeof le=="function"?le.call(Fe,W,I):le,I==null)break e;W=v({},W,I);break e;case 2:xa=!0}}I=E.callback,I!==null&&(t.flags|=64,F&&(t.flags|=8192),F=p.callbacks,F===null?p.callbacks=[I]:F.push(I))}else F={lane:I,tag:E.tag,payload:E.payload,callback:E.callback,next:null},U===null?(P=U=F,z=W):U=U.next=F,w|=I;if(E=E.next,E===null){if(E=p.shared.pending,E===null)break;F=E,E=F.next,F.next=null,p.lastBaseUpdate=F,p.shared.pending=null}}while(!0);U===null&&(z=W),p.baseState=z,p.firstBaseUpdate=P,p.lastBaseUpdate=U,f===null&&(p.shared.lanes=0),Ra|=w,t.lanes=w,t.memoizedState=W}}function Gh(t,o){if(typeof t!="function")throw Error(s(191,t));t.call(o)}function Vh(t,o){var n=t.callbacks;if(n!==null)for(t.callbacks=null,t=0;tf?f:8;var w=O.T,E={};O.T=E,yu(t,!1,o,n);try{var z=p(),P=O.S;if(P!==null&&P(E,z),z!==null&&typeof z=="object"&&typeof z.then=="function"){var U=Gk(z,i);bs(t,o,U,Kt(t))}else bs(t,o,i,Kt(t))}catch(W){bs(t,o,{then:function(){},status:"rejected",reason:W},Kt())}finally{H.p=f,w!==null&&E.types!==null&&(w.types=E.types),O.T=w}}function Qk(){}function hu(t,o,n,i){if(t.tag!==5)throw Error(s(476));var p=Tg(t).queue;kg(t,p,o,G,n===null?Qk:function(){return Eg(t),n(i)})}function Tg(t){var o=t.memoizedState;if(o!==null)return o;o={memoizedState:G,baseState:G,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ho,lastRenderedState:G},next:null};var n={};return o.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ho,lastRenderedState:n},next:null},t.memoizedState=o,t=t.alternate,t!==null&&(t.memoizedState=o),o}function Eg(t){var o=Tg(t);o.next===null&&(o=t.alternate.memoizedState),bs(t,o.next.queue,{},Kt())}function gu(){return ht(Os)}function Rg(){return et().memoizedState}function jg(){return et().memoizedState}function Jk(t){for(var o=t.return;o!==null;){switch(o.tag){case 24:case 3:var n=Kt();t=wa(n);var i=Sa(o,t,n);i!==null&&(zt(i,o,n),ms(i,o,n)),o={cache:Hd()},t.payload=o;return}o=o.return}}function eT(t,o,n){var i=Kt();n={lane:i,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},el(t)?Ng(o,n):(n=_d(t,o,n,i),n!==null&&(zt(n,t,i),zg(n,o,i)))}function Ag(t,o,n){var i=Kt();bs(t,o,n,i)}function bs(t,o,n,i){var p={lane:i,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(el(t))Ng(o,p);else{var f=t.alternate;if(t.lanes===0&&(f===null||f.lanes===0)&&(f=o.lastRenderedReducer,f!==null))try{var w=o.lastRenderedState,E=f(w,n);if(p.hasEagerState=!0,p.eagerState=E,Pt(E,w))return _i(t,o,p,0),Ue===null&&Di(),!1}catch{}finally{}if(n=_d(t,o,p,i),n!==null)return zt(n,t,i),zg(n,o,i),!0}return!1}function yu(t,o,n,i){if(i={lane:2,revertLane:$u(),gesture:null,action:i,hasEagerState:!1,eagerState:null,next:null},el(t)){if(o)throw Error(s(479))}else o=_d(t,n,i,2),o!==null&&zt(o,t,2)}function el(t){var o=t.alternate;return t===Se||o!==null&&o===Se}function Ng(t,o){tr=Vi=!0;var n=t.pending;n===null?o.next=o:(o.next=n.next,n.next=o),t.pending=o}function zg(t,o,n){if((n&4194048)!==0){var i=o.lanes;i&=t.pendingLanes,n|=i,o.lanes=n,Lf(t,n)}}var vs={readContext:ht,use:Yi,useCallback:$e,useContext:$e,useEffect:$e,useImperativeHandle:$e,useLayoutEffect:$e,useInsertionEffect:$e,useMemo:$e,useReducer:$e,useRef:$e,useState:$e,useDebugValue:$e,useDeferredValue:$e,useTransition:$e,useSyncExternalStore:$e,useId:$e,useHostTransitionStatus:$e,useFormState:$e,useActionState:$e,useOptimistic:$e,useMemoCache:$e,useCacheRefresh:$e};vs.useEffectEvent=$e;var Mg={readContext:ht,use:Yi,useCallback:function(t,o){return wt().memoizedState=[t,o===void 0?null:o],t},useContext:ht,useEffect:hg,useImperativeHandle:function(t,o,n){n=n!=null?n.concat([t]):null,Qi(4194308,4,vg.bind(null,o,t),n)},useLayoutEffect:function(t,o){return Qi(4194308,4,t,o)},useInsertionEffect:function(t,o){Qi(4,2,t,o)},useMemo:function(t,o){var n=wt();o=o===void 0?null:o;var i=t();if(mn){ma(!0);try{t()}finally{ma(!1)}}return n.memoizedState=[i,o],i},useReducer:function(t,o,n){var i=wt();if(n!==void 0){var p=n(o);if(mn){ma(!0);try{n(o)}finally{ma(!1)}}}else p=o;return i.memoizedState=i.baseState=p,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:p},i.queue=t,t=t.dispatch=eT.bind(null,Se,t),[i.memoizedState,t]},useRef:function(t){var o=wt();return t={current:t},o.memoizedState=t},useState:function(t){t=du(t);var o=t.queue,n=Ag.bind(null,Se,o);return o.dispatch=n,[t.memoizedState,n]},useDebugValue:mu,useDeferredValue:function(t,o){var n=wt();return fu(n,t,o)},useTransition:function(){var t=du(!1);return t=kg.bind(null,Se,t.queue,!0,!1),wt().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,o,n){var i=Se,p=wt();if(De){if(n===void 0)throw Error(s(407));n=n()}else{if(n=o(),Ue===null)throw Error(s(349));(Ae&127)!==0||Jh(i,o,n)}p.memoizedState=n;var f={value:n,getSnapshot:o};return p.queue=f,hg(tg.bind(null,i,f,t),[t]),i.flags|=2048,ar(9,{destroy:void 0},eg.bind(null,i,f,n,o),null),n},useId:function(){var t=wt(),o=Ue.identifierPrefix;if(De){var n=Co,i=So;n=(i&~(1<<32-Lt(i)-1)).toString(32)+n,o="_"+o+"R_"+n,n=Wi++,0<\/script>",f=f.removeChild(f.firstChild);break;case"select":f=typeof i.is=="string"?w.createElement("select",{is:i.is}):w.createElement("select"),i.multiple?f.multiple=!0:i.size&&(f.size=i.size);break;default:f=typeof i.is=="string"?w.createElement(p,{is:i.is}):w.createElement(p)}}f[mt]=o,f[Tt]=i;e:for(w=o.child;w!==null;){if(w.tag===5||w.tag===6)f.appendChild(w.stateNode);else if(w.tag!==4&&w.tag!==27&&w.child!==null){w.child.return=w,w=w.child;continue}if(w===o)break e;for(;w.sibling===null;){if(w.return===null||w.return===o)break e;w=w.return}w.sibling.return=w.return,w=w.sibling}o.stateNode=f;e:switch(yt(f,p,i),p){case"button":case"input":case"select":case"textarea":i=!!i.autoFocus;break e;case"img":i=!0;break e;default:i=!1}i&&Vo(o)}}return Ge(o),zu(o,o.type,t===null?null:t.memoizedProps,o.pendingProps,n),null;case 6:if(t&&o.stateNode!=null)t.memoizedProps!==i&&Vo(o);else{if(typeof i!="string"&&o.stateNode===null)throw Error(s(166));if(t=he.current,Wn(o)){if(t=o.stateNode,n=o.memoizedProps,i=null,p=ft,p!==null)switch(p.tag){case 27:case 5:i=p.memoizedProps}t[mt]=o,t=!!(t.nodeValue===n||i!==null&&i.suppressHydrationWarning===!0||Xy(t.nodeValue,n)),t||ba(o,!0)}else t=xl(t).createTextNode(i),t[mt]=o,o.stateNode=t}return Ge(o),null;case 31:if(n=o.memoizedState,t===null||t.memoizedState!==null){if(i=Wn(o),n!==null){if(t===null){if(!i)throw Error(s(318));if(t=o.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(s(557));t[mt]=o}else rn(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;Ge(o),t=!1}else n=qd(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),t=!0;if(!t)return o.flags&256?(It(o),o):(It(o),null);if((o.flags&128)!==0)throw Error(s(558))}return Ge(o),null;case 13:if(i=o.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(p=Wn(o),i!==null&&i.dehydrated!==null){if(t===null){if(!p)throw Error(s(318));if(p=o.memoizedState,p=p!==null?p.dehydrated:null,!p)throw Error(s(317));p[mt]=o}else rn(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;Ge(o),p=!1}else p=qd(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=p),p=!0;if(!p)return o.flags&256?(It(o),o):(It(o),null)}return It(o),(o.flags&128)!==0?(o.lanes=n,o):(n=i!==null,t=t!==null&&t.memoizedState!==null,n&&(i=o.child,p=null,i.alternate!==null&&i.alternate.memoizedState!==null&&i.alternate.memoizedState.cachePool!==null&&(p=i.alternate.memoizedState.cachePool.pool),f=null,i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(f=i.memoizedState.cachePool.pool),f!==p&&(i.flags|=2048)),n!==t&&n&&(o.child.flags|=8192),rl(o,o.updateQueue),Ge(o),null);case 4:return we(),t===null&&Ju(o.stateNode.containerInfo),Ge(o),null;case 10:return Ko(o.type),Ge(o),null;case 19:if(K(Je),i=o.memoizedState,i===null)return Ge(o),null;if(p=(o.flags&128)!==0,f=i.rendering,f===null)if(p)ws(i,!1);else{if(Ye!==0||t!==null&&(t.flags&128)!==0)for(t=o.child;t!==null;){if(f=Gi(t),f!==null){for(o.flags|=128,ws(i,!1),t=f.updateQueue,o.updateQueue=t,rl(o,t),o.subtreeFlags=0,t=n,n=o.child;n!==null;)Ah(n,t),n=n.sibling;return ee(Je,Je.current&1|2),De&&qo(o,i.treeForkCount),o.child}t=t.sibling}i.tail!==null&&_t()>dl&&(o.flags|=128,p=!0,ws(i,!1),o.lanes=4194304)}else{if(!p)if(t=Gi(f),t!==null){if(o.flags|=128,p=!0,t=t.updateQueue,o.updateQueue=t,rl(o,t),ws(i,!0),i.tail===null&&i.tailMode==="hidden"&&!f.alternate&&!De)return Ge(o),null}else 2*_t()-i.renderingStartTime>dl&&n!==536870912&&(o.flags|=128,p=!0,ws(i,!1),o.lanes=4194304);i.isBackwards?(f.sibling=o.child,o.child=f):(t=i.last,t!==null?t.sibling=f:o.child=f,i.last=f)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=_t(),t.sibling=null,n=Je.current,ee(Je,p?n&1|2:n&1),De&&qo(o,i.treeForkCount),t):(Ge(o),null);case 22:case 23:return It(o),eu(),i=o.memoizedState!==null,t!==null?t.memoizedState!==null!==i&&(o.flags|=8192):i&&(o.flags|=8192),i?(n&536870912)!==0&&(o.flags&128)===0&&(Ge(o),o.subtreeFlags&6&&(o.flags|=8192)):Ge(o),n=o.updateQueue,n!==null&&rl(o,n.retryQueue),n=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(n=t.memoizedState.cachePool.pool),i=null,o.memoizedState!==null&&o.memoizedState.cachePool!==null&&(i=o.memoizedState.cachePool.pool),i!==n&&(o.flags|=2048),t!==null&&K(cn),null;case 24:return n=null,t!==null&&(n=t.memoizedState.cache),o.memoizedState.cache!==n&&(o.flags|=2048),Ko(tt),Ge(o),null;case 25:return null;case 30:return null}throw Error(s(156,o.tag))}function rT(t,o){switch(Bd(o),o.tag){case 1:return t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 3:return Ko(tt),we(),t=o.flags,(t&65536)!==0&&(t&128)===0?(o.flags=t&-65537|128,o):null;case 26:case 27:case 5:return xo(o),null;case 31:if(o.memoizedState!==null){if(It(o),o.alternate===null)throw Error(s(340));rn()}return t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 13:if(It(o),t=o.memoizedState,t!==null&&t.dehydrated!==null){if(o.alternate===null)throw Error(s(340));rn()}return t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 19:return K(Je),null;case 4:return we(),null;case 10:return Ko(o.type),null;case 22:case 23:return It(o),eu(),t!==null&&K(cn),t=o.flags,t&65536?(o.flags=t&-65537|128,o):null;case 24:return Ko(tt),null;case 25:return null;default:return null}}function oy(t,o){switch(Bd(o),o.tag){case 3:Ko(tt),we();break;case 26:case 27:case 5:xo(o);break;case 4:we();break;case 31:o.memoizedState!==null&&It(o);break;case 13:It(o);break;case 19:K(Je);break;case 10:Ko(o.type);break;case 22:case 23:It(o),eu(),t!==null&&K(cn);break;case 24:Ko(tt)}}function Ss(t,o){try{var n=o.updateQueue,i=n!==null?n.lastEffect:null;if(i!==null){var p=i.next;n=p;do{if((n.tag&t)===t){i=void 0;var f=n.create,w=n.inst;i=f(),w.destroy=i}n=n.next}while(n!==p)}}catch(E){Be(o,o.return,E)}}function Ta(t,o,n){try{var i=o.updateQueue,p=i!==null?i.lastEffect:null;if(p!==null){var f=p.next;i=f;do{if((i.tag&t)===t){var w=i.inst,E=w.destroy;if(E!==void 0){w.destroy=void 0,p=o;var z=n,P=E;try{P()}catch(U){Be(p,z,U)}}}i=i.next}while(i!==f)}}catch(U){Be(o,o.return,U)}}function ay(t){var o=t.updateQueue;if(o!==null){var n=t.stateNode;try{Vh(o,n)}catch(i){Be(t,t.return,i)}}}function ny(t,o,n){n.props=fn(t.type,t.memoizedProps),n.state=t.memoizedState;try{n.componentWillUnmount()}catch(i){Be(t,o,i)}}function Cs(t,o){try{var n=t.ref;if(n!==null){switch(t.tag){case 26:case 27:case 5:var i=t.stateNode;break;case 30:i=t.stateNode;break;default:i=t.stateNode}typeof n=="function"?t.refCleanup=n(i):n.current=i}}catch(p){Be(t,o,p)}}function ko(t,o){var n=t.ref,i=t.refCleanup;if(n!==null)if(typeof i=="function")try{i()}catch(p){Be(t,o,p)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(p){Be(t,o,p)}else n.current=null}function ry(t){var o=t.type,n=t.memoizedProps,i=t.stateNode;try{e:switch(o){case"button":case"input":case"select":case"textarea":n.autoFocus&&i.focus();break e;case"img":n.src?i.src=n.src:n.srcSet&&(i.srcset=n.srcSet)}}catch(p){Be(t,t.return,p)}}function Mu(t,o,n){try{var i=t.stateNode;RT(i,t.type,n,o),i[Tt]=o}catch(p){Be(t,t.return,p)}}function sy(t){return t.tag===5||t.tag===3||t.tag===26||t.tag===27&&Ma(t.type)||t.tag===4}function Du(t){e:for(;;){for(;t.sibling===null;){if(t.return===null||sy(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.tag===27&&Ma(t.type)||t.flags&2||t.child===null||t.tag===4)continue e;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function _u(t,o,n){var i=t.tag;if(i===5||i===6)t=t.stateNode,o?(n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n).insertBefore(t,o):(o=n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n,o.appendChild(t),n=n._reactRootContainer,n!=null||o.onclick!==null||(o.onclick=Zo));else if(i!==4&&(i===27&&Ma(t.type)&&(n=t.stateNode,o=null),t=t.child,t!==null))for(_u(t,o,n),t=t.sibling;t!==null;)_u(t,o,n),t=t.sibling}function sl(t,o,n){var i=t.tag;if(i===5||i===6)t=t.stateNode,o?n.insertBefore(t,o):n.appendChild(t);else if(i!==4&&(i===27&&Ma(t.type)&&(n=t.stateNode),t=t.child,t!==null))for(sl(t,o,n),t=t.sibling;t!==null;)sl(t,o,n),t=t.sibling}function iy(t){var o=t.stateNode,n=t.memoizedProps;try{for(var i=t.type,p=o.attributes;p.length;)o.removeAttributeNode(p[0]);yt(o,i,n),o[mt]=t,o[Tt]=n}catch(f){Be(t,t.return,f)}}var Wo=!1,nt=!1,Ou=!1,ly=typeof WeakSet=="function"?WeakSet:Set,ct=null;function sT(t,o){if(t=t.containerInfo,op=Rl,t=xh(t),jd(t)){if("selectionStart"in t)var n={start:t.selectionStart,end:t.selectionEnd};else e:{n=(n=t.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var p=i.anchorOffset,f=i.focusNode;i=i.focusOffset;try{n.nodeType,f.nodeType}catch{n=null;break e}var w=0,E=-1,z=-1,P=0,U=0,W=t,I=null;t:for(;;){for(var F;W!==n||p!==0&&W.nodeType!==3||(E=w+p),W!==f||i!==0&&W.nodeType!==3||(z=w+i),W.nodeType===3&&(w+=W.nodeValue.length),(F=W.firstChild)!==null;)I=W,W=F;for(;;){if(W===t)break t;if(I===n&&++P===p&&(E=w),I===f&&++U===i&&(z=w),(F=W.nextSibling)!==null)break;W=I,I=W.parentNode}W=F}n=E===-1||z===-1?null:{start:E,end:z}}else n=null}n=n||{start:0,end:0}}else n=null;for(ap={focusedElem:t,selectionRange:n},Rl=!1,ct=o;ct!==null;)if(o=ct,t=o.child,(o.subtreeFlags&1028)!==0&&t!==null)t.return=o,ct=t;else for(;ct!==null;){switch(o=ct,f=o.alternate,t=o.flags,o.tag){case 0:if((t&4)!==0&&(t=o.updateQueue,t=t!==null?t.events:null,t!==null))for(n=0;n title"))),yt(f,i,n),f[mt]=t,lt(f),i=f;break e;case"link":var w=fb("link","href",p).get(i+(n.href||""));if(w){for(var E=0;EFe&&(w=Fe,Fe=ge,ge=w);var _=bh(E,ge),D=bh(E,Fe);if(_&&D&&(F.rangeCount!==1||F.anchorNode!==_.node||F.anchorOffset!==_.offset||F.focusNode!==D.node||F.focusOffset!==D.offset)){var L=W.createRange();L.setStart(_.node,_.offset),F.removeAllRanges(),ge>Fe?(F.addRange(L),F.extend(D.node,D.offset)):(L.setEnd(D.node,D.offset),F.addRange(L))}}}}for(W=[],F=E;F=F.parentNode;)F.nodeType===1&&W.push({element:F,left:F.scrollLeft,top:F.scrollTop});for(typeof E.focus=="function"&&E.focus(),E=0;En?32:n,O.T=null,n=Fu,Fu=null;var f=Aa,w=Jo;if(rt=0,lr=Aa=null,Jo=0,(Le&6)!==0)throw Error(s(331));var E=Le;if(Le|=4,vy(f.current),gy(f,f.current,w,n),Le=E,As(0,!1),Ot&&typeof Ot.onPostCommitFiberRoot=="function")try{Ot.onPostCommitFiberRoot(Vr,f)}catch{}return!0}finally{H.p=p,O.T=i,Py(t,o)}}function By(t,o,n){o=Xt(n,o),o=wu(t.stateNode,o,2),t=Sa(t,o,2),t!==null&&($r(t,2),To(t))}function Be(t,o,n){if(t.tag===3)By(t,t,n);else for(;o!==null;){if(o.tag===3){By(o,t,n);break}else if(o.tag===1){var i=o.stateNode;if(typeof o.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(ja===null||!ja.has(i))){t=Xt(n,t),n=Ig(2),i=Sa(o,n,2),i!==null&&(qg(n,i,o,t),$r(i,2),To(i));break}}o=o.return}}function Gu(t,o,n){var i=t.pingCache;if(i===null){i=t.pingCache=new cT;var p=new Set;i.set(o,p)}else p=i.get(o),p===void 0&&(p=new Set,i.set(o,p));p.has(n)||(Zu=!0,p.add(n),t=fT.bind(null,t,o,n),o.then(t,t))}function fT(t,o,n){var i=t.pingCache;i!==null&&i.delete(o),t.pingedLanes|=t.suspendedLanes&n,t.warmLanes&=~n,Ue===t&&(Ae&n)===n&&(Ye===4||Ye===3&&(Ae&62914560)===Ae&&300>_t()-cl?(Le&2)===0&&cr(t,0):Bu|=n,ir===Ae&&(ir=0)),To(t)}function Iy(t,o){o===0&&(o=_f()),t=an(t,o),t!==null&&($r(t,o),To(t))}function hT(t){var o=t.memoizedState,n=0;o!==null&&(n=o.retryLane),Iy(t,n)}function gT(t,o){var n=0;switch(t.tag){case 31:case 13:var i=t.stateNode,p=t.memoizedState;p!==null&&(n=p.retryLane);break;case 19:i=t.stateNode;break;case 22:i=t.stateNode._retryCache;break;default:throw Error(s(314))}i!==null&&i.delete(o),Iy(t,n)}function yT(t,o){return xt(t,o)}var gl=null,ur=null,Vu=!1,yl=!1,Wu=!1,za=0;function To(t){t!==ur&&t.next===null&&(ur===null?gl=ur=t:ur=ur.next=t),yl=!0,Vu||(Vu=!0,vT())}function As(t,o){if(!Wu&&yl){Wu=!0;do for(var n=!1,i=gl;i!==null;){if(t!==0){var p=i.pendingLanes;if(p===0)var f=0;else{var w=i.suspendedLanes,E=i.pingedLanes;f=(1<<31-Lt(42|t)+1)-1,f&=p&~(w&~E),f=f&201326741?f&201326741|1:f?f|2:0}f!==0&&(n=!0,Uy(i,f))}else f=Ae,f=wi(i,i===Ue?f:0,i.cancelPendingCommit!==null||i.timeoutHandle!==-1),(f&3)===0||Wr(i,f)||(n=!0,Uy(i,f));i=i.next}while(n);Wu=!1}}function bT(){qy()}function qy(){yl=Vu=!1;var t=0;za!==0&&AT()&&(t=za);for(var o=_t(),n=null,i=gl;i!==null;){var p=i.next,f=Fy(i,o);f===0?(i.next=null,n===null?gl=p:n.next=p,p===null&&(ur=n)):(n=i,(t!==0||(f&3)!==0)&&(yl=!0)),i=p}rt!==0&&rt!==5||As(t),za!==0&&(za=0)}function Fy(t,o){for(var n=t.suspendedLanes,i=t.pingedLanes,p=t.expirationTimes,f=t.pendingLanes&-62914561;0E)break;var U=z.transferSize,W=z.initiatorType;U&&Qy(W)&&(z=z.responseEnd,w+=U*(z"u"?null:document;function db(t,o,n){var i=pr;if(i&&typeof o=="string"&&o){var p=$t(o);p='link[rel="'+t+'"][href="'+p+'"]',typeof n=="string"&&(p+='[crossorigin="'+n+'"]'),cb.has(p)||(cb.add(p),t={rel:t,crossOrigin:n,href:o},i.querySelector(p)===null&&(o=i.createElement("link"),yt(o,"link",t),lt(o),i.head.appendChild(o)))}}function ZT(t){ea.D(t),db("dns-prefetch",t,null)}function BT(t,o){ea.C(t,o),db("preconnect",t,o)}function IT(t,o,n){ea.L(t,o,n);var i=pr;if(i&&t&&o){var p='link[rel="preload"][as="'+$t(o)+'"]';o==="image"&&n&&n.imageSrcSet?(p+='[imagesrcset="'+$t(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(p+='[imagesizes="'+$t(n.imageSizes)+'"]')):p+='[href="'+$t(t)+'"]';var f=p;switch(o){case"style":f=mr(t);break;case"script":f=fr(t)}ao.has(f)||(t=v({rel:"preload",href:o==="image"&&n&&n.imageSrcSet?void 0:t,as:o},n),ao.set(f,t),i.querySelector(p)!==null||o==="style"&&i.querySelector(Ds(f))||o==="script"&&i.querySelector(_s(f))||(o=i.createElement("link"),yt(o,"link",t),lt(o),i.head.appendChild(o)))}}function qT(t,o){ea.m(t,o);var n=pr;if(n&&t){var i=o&&typeof o.as=="string"?o.as:"script",p='link[rel="modulepreload"][as="'+$t(i)+'"][href="'+$t(t)+'"]',f=p;switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":f=fr(t)}if(!ao.has(f)&&(t=v({rel:"modulepreload",href:t},o),ao.set(f,t),n.querySelector(p)===null)){switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(_s(f)))return}i=n.createElement("link"),yt(i,"link",t),lt(i),n.head.appendChild(i)}}}function FT(t,o,n){ea.S(t,o,n);var i=pr;if(i&&t){var p=On(i).hoistableStyles,f=mr(t);o=o||"default";var w=p.get(f);if(!w){var E={loading:0,preload:null};if(w=i.querySelector(Ds(f)))E.loading=5;else{t=v({rel:"stylesheet",href:t,"data-precedence":o},n),(n=ao.get(f))&&dp(t,n);var z=w=i.createElement("link");lt(z),yt(z,"link",t),z._p=new Promise(function(P,U){z.onload=P,z.onerror=U}),z.addEventListener("load",function(){E.loading|=1}),z.addEventListener("error",function(){E.loading|=2}),E.loading|=4,Sl(w,o,i)}w={type:"stylesheet",instance:w,count:1,state:E},p.set(f,w)}}}function KT(t,o){ea.X(t,o);var n=pr;if(n&&t){var i=On(n).hoistableScripts,p=fr(t),f=i.get(p);f||(f=n.querySelector(_s(p)),f||(t=v({src:t,async:!0},o),(o=ao.get(p))&&up(t,o),f=n.createElement("script"),lt(f),yt(f,"link",t),n.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},i.set(p,f))}}function UT(t,o){ea.M(t,o);var n=pr;if(n&&t){var i=On(n).hoistableScripts,p=fr(t),f=i.get(p);f||(f=n.querySelector(_s(p)),f||(t=v({src:t,async:!0,type:"module"},o),(o=ao.get(p))&&up(t,o),f=n.createElement("script"),lt(f),yt(f,"link",t),n.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},i.set(p,f))}}function ub(t,o,n,i){var p=(p=he.current)?wl(p):null;if(!p)throw Error(s(446));switch(t){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(o=mr(n.href),n=On(p).hoistableStyles,i=n.get(o),i||(i={type:"style",instance:null,count:0,state:null},n.set(o,i)),i):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){t=mr(n.href);var f=On(p).hoistableStyles,w=f.get(t);if(w||(p=p.ownerDocument||p,w={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},f.set(t,w),(f=p.querySelector(Ds(t)))&&!f._p&&(w.instance=f,w.state.loading=5),ao.has(t)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},ao.set(t,n),f||HT(p,t,n,w.state))),o&&i===null)throw Error(s(528,""));return w}if(o&&i!==null)throw Error(s(529,""));return null;case"script":return o=n.async,n=n.src,typeof n=="string"&&o&&typeof o!="function"&&typeof o!="symbol"?(o=fr(n),n=On(p).hoistableScripts,i=n.get(o),i||(i={type:"script",instance:null,count:0,state:null},n.set(o,i)),i):{type:"void",instance:null,count:0,state:null};default:throw Error(s(444,t))}}function mr(t){return'href="'+$t(t)+'"'}function Ds(t){return'link[rel="stylesheet"]['+t+"]"}function pb(t){return v({},t,{"data-precedence":t.precedence,precedence:null})}function HT(t,o,n,i){t.querySelector('link[rel="preload"][as="style"]['+o+"]")?i.loading=1:(o=t.createElement("link"),i.preload=o,o.addEventListener("load",function(){return i.loading|=1}),o.addEventListener("error",function(){return i.loading|=2}),yt(o,"link",n),lt(o),t.head.appendChild(o))}function fr(t){return'[src="'+$t(t)+'"]'}function _s(t){return"script[async]"+t}function mb(t,o,n){if(o.count++,o.instance===null)switch(o.type){case"style":var i=t.querySelector('style[data-href~="'+$t(n.href)+'"]');if(i)return o.instance=i,lt(i),i;var p=v({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return i=(t.ownerDocument||t).createElement("style"),lt(i),yt(i,"style",p),Sl(i,n.precedence,t),o.instance=i;case"stylesheet":p=mr(n.href);var f=t.querySelector(Ds(p));if(f)return o.state.loading|=4,o.instance=f,lt(f),f;i=pb(n),(p=ao.get(p))&&dp(i,p),f=(t.ownerDocument||t).createElement("link"),lt(f);var w=f;return w._p=new Promise(function(E,z){w.onload=E,w.onerror=z}),yt(f,"link",i),o.state.loading|=4,Sl(f,n.precedence,t),o.instance=f;case"script":return f=fr(n.src),(p=t.querySelector(_s(f)))?(o.instance=p,lt(p),p):(i=n,(p=ao.get(f))&&(i=v({},n),up(i,p)),t=t.ownerDocument||t,p=t.createElement("script"),lt(p),yt(p,"link",i),t.head.appendChild(p),o.instance=p);case"void":return null;default:throw Error(s(443,o.type))}else o.type==="stylesheet"&&(o.state.loading&4)===0&&(i=o.instance,o.state.loading|=4,Sl(i,n.precedence,t));return o.instance}function Sl(t,o,n){for(var i=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),p=i.length?i[i.length-1]:null,f=p,w=0;w title"):null)}function GT(t,o,n){if(n===1||o.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof o.precedence!="string"||typeof o.href!="string"||o.href==="")break;return!0;case"link":if(typeof o.rel!="string"||typeof o.href!="string"||o.href===""||o.onLoad||o.onError)break;switch(o.rel){case"stylesheet":return t=o.disabled,typeof o.precedence=="string"&&t==null;default:return!0}case"script":if(o.async&&typeof o.async!="function"&&typeof o.async!="symbol"&&!o.onLoad&&!o.onError&&o.src&&typeof o.src=="string")return!0}return!1}function gb(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function VT(t,o,n,i){if(n.type==="stylesheet"&&(typeof i.media!="string"||matchMedia(i.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var p=mr(i.href),f=o.querySelector(Ds(p));if(f){o=f._p,o!==null&&typeof o=="object"&&typeof o.then=="function"&&(t.count++,t=kl.bind(t),o.then(t,t)),n.state.loading|=4,n.instance=f,lt(f);return}f=o.ownerDocument||o,i=pb(i),(p=ao.get(p))&&dp(i,p),f=f.createElement("link"),lt(f);var w=f;w._p=new Promise(function(E,z){w.onload=E,w.onerror=z}),yt(f,"link",i),n.instance=f}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(n,o),(o=n.state.preload)&&(n.state.loading&3)===0&&(t.count++,n=kl.bind(t),o.addEventListener("load",n),o.addEventListener("error",n))}}var pp=0;function WT(t,o){return t.stylesheets&&t.count===0&&El(t,t.stylesheets),0pp?50:800)+o);return t.unsuspend=n,function(){t.unsuspend=null,clearTimeout(i),clearTimeout(p)}}:null}function kl(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)El(this,this.stylesheets);else if(this.unsuspend){var t=this.unsuspend;this.unsuspend=null,t()}}}var Tl=null;function El(t,o){t.stylesheets=null,t.unsuspend!==null&&(t.count++,Tl=new Map,o.forEach($T,t),Tl=null,kl.call(t))}function $T(t,o){if(!(o.state.loading&4)){var n=Tl.get(t);if(n)var i=n.get(null);else{n=new Map,Tl.set(t,n);for(var p=t.querySelectorAll("link[data-precedence],style[data-precedence]"),f=0;f"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(a){console.error(a)}}return e(),wp.exports=uE(),wp.exports}var cx=pE(),Em=lx();const Rm=ix(Em);/** + * @remix-run/router v1.23.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Vs(){return Vs=Object.assign?Object.assign.bind():function(e){for(var a=1;a"u")throw new Error(a)}function jm(e,a){if(!e){typeof console<"u"&&console.warn(a);try{throw new Error(a)}catch{}}}function fE(){return Math.random().toString(36).substr(2,8)}function qb(e,a){return{usr:e.state,key:e.key,idx:a}}function Yp(e,a,r,s){return r===void 0&&(r=null),Vs({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof a=="string"?Pr(a):a,{state:r,key:a&&a.key||s||fE()})}function Jl(e){let{pathname:a="/",search:r="",hash:s=""}=e;return r&&r!=="?"&&(a+=r.charAt(0)==="?"?r:"?"+r),s&&s!=="#"&&(a+=s.charAt(0)==="#"?s:"#"+s),a}function Pr(e){let a={};if(e){let r=e.indexOf("#");r>=0&&(a.hash=e.substr(r),e=e.substr(0,r));let s=e.indexOf("?");s>=0&&(a.search=e.substr(s),e=e.substr(0,s)),e&&(a.pathname=e)}return a}function hE(e,a,r,s){s===void 0&&(s={});let{window:l=document.defaultView,v5Compat:d=!1}=s,u=l.history,m=Fa.Pop,h=null,g=b();g==null&&(g=0,u.replaceState(Vs({},u.state,{idx:g}),""));function b(){return(u.state||{idx:null}).idx}function v(){m=Fa.Pop;let k=b(),R=k==null?null:k-g;g=k,h&&h({action:m,location:x.location,delta:R})}function S(k,R){m=Fa.Push;let j=Yp(x.location,k,R);g=b()+1;let A=qb(j,g),M=x.createHref(j);try{u.pushState(A,"",M)}catch(q){if(q instanceof DOMException&&q.name==="DataCloneError")throw q;l.location.assign(M)}d&&h&&h({action:m,location:x.location,delta:1})}function T(k,R){m=Fa.Replace;let j=Yp(x.location,k,R);g=b();let A=qb(j,g),M=x.createHref(j);u.replaceState(A,"",M),d&&h&&h({action:m,location:x.location,delta:0})}function C(k){let R=l.location.origin!=="null"?l.location.origin:l.location.href,j=typeof k=="string"?k:Jl(k);return j=j.replace(/ $/,"%20"),Qe(R,"No window.location.(origin|href) available to create URL for href: "+j),new URL(j,R)}let x={get action(){return m},get location(){return e(l,u)},listen(k){if(h)throw new Error("A history only accepts one active listener");return l.addEventListener(Ib,v),h=k,()=>{l.removeEventListener(Ib,v),h=null}},createHref(k){return a(l,k)},createURL:C,encodeLocation(k){let R=C(k);return{pathname:R.pathname,search:R.search,hash:R.hash}},push:S,replace:T,go(k){return u.go(k)}};return x}var Fb;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Fb||(Fb={}));function gE(e,a,r){return r===void 0&&(r="/"),yE(e,a,r)}function yE(e,a,r,s){let l=typeof a=="string"?Pr(a):a,d=Mr(l.pathname||"/",r);if(d==null)return null;let u=dx(e);bE(u);let m=null;for(let h=0;m==null&&h{let h={relativePath:m===void 0?d.path||"":m,caseSensitive:d.caseSensitive===!0,childrenIndex:u,route:d};h.relativePath.startsWith("/")&&(Qe(h.relativePath.startsWith(s),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+s+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(s.length));let g=Ka([s,h.relativePath]),b=r.concat(h);d.children&&d.children.length>0&&(Qe(d.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+g+'".')),dx(d.children,a,b,g)),!(d.path==null&&!d.index)&&a.push({path:g,score:TE(g,d.index),routesMeta:b})};return e.forEach((d,u)=>{var m;if(d.path===""||!((m=d.path)!=null&&m.includes("?")))l(d,u);else for(let h of ux(d.path))l(d,u,h)}),a}function ux(e){let a=e.split("/");if(a.length===0)return[];let[r,...s]=a,l=r.endsWith("?"),d=r.replace(/\?$/,"");if(s.length===0)return l?[d,""]:[d];let u=ux(s.join("/")),m=[];return m.push(...u.map(h=>h===""?d:[d,h].join("/"))),l&&m.push(...u),m.map(h=>e.startsWith("/")&&h===""?"/":h)}function bE(e){e.sort((a,r)=>a.score!==r.score?r.score-a.score:EE(a.routesMeta.map(s=>s.childrenIndex),r.routesMeta.map(s=>s.childrenIndex)))}const vE=/^:[\w-]+$/,xE=3,wE=2,SE=1,CE=10,kE=-2,Kb=e=>e==="*";function TE(e,a){let r=e.split("/"),s=r.length;return r.some(Kb)&&(s+=kE),a&&(s+=wE),r.filter(l=>!Kb(l)).reduce((l,d)=>l+(vE.test(d)?xE:d===""?SE:CE),s)}function EE(e,a){return e.length===a.length&&e.slice(0,-1).every((s,l)=>s===a[l])?e[e.length-1]-a[a.length-1]:0}function RE(e,a,r){let{routesMeta:s}=e,l={},d="/",u=[];for(let m=0;m{let{paramName:S,isOptional:T}=b;if(S==="*"){let x=m[v]||"";u=d.slice(0,d.length-x.length).replace(/(.)\/+$/,"$1")}const C=m[v];return T&&!C?g[S]=void 0:g[S]=(C||"").replace(/%2F/g,"/"),g},{}),pathname:d,pathnameBase:u,pattern:e}}function jE(e,a,r){a===void 0&&(a=!1),r===void 0&&(r=!0),jm(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let s=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(u,m,h)=>(s.push({paramName:m,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(s.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,a?void 0:"i"),s]}function AE(e){try{return e.split("/").map(a=>decodeURIComponent(a).replace(/\//g,"%2F")).join("/")}catch(a){return jm(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+a+").")),e}}function Mr(e,a){if(a==="/")return e;if(!e.toLowerCase().startsWith(a.toLowerCase()))return null;let r=a.endsWith("/")?a.length-1:a.length,s=e.charAt(r);return s&&s!=="/"?null:e.slice(r)||"/"}const NE=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,zE=e=>NE.test(e);function ME(e,a){a===void 0&&(a="/");let{pathname:r,search:s="",hash:l=""}=typeof e=="string"?Pr(e):e,d;if(r)if(zE(r))d=r;else{if(r.includes("//")){let u=r;r=r.replace(/\/\/+/g,"/"),jm(!1,"Pathnames cannot have embedded double slashes - normalizing "+(u+" -> "+r))}r.startsWith("/")?d=Ub(r.substring(1),"/"):d=Ub(r,a)}else d=a;return{pathname:d,search:OE(s),hash:LE(l)}}function Ub(e,a){let r=a.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?r.length>1&&r.pop():l!=="."&&r.push(l)}),r.length>1?r.join("/"):"/"}function Tp(e,a,r,s){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+a+"` field ["+JSON.stringify(s)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function DE(e){return e.filter((a,r)=>r===0||a.route.path&&a.route.path.length>0)}function px(e,a){let r=DE(e);return a?r.map((s,l)=>l===r.length-1?s.pathname:s.pathnameBase):r.map(s=>s.pathnameBase)}function mx(e,a,r,s){s===void 0&&(s=!1);let l;typeof e=="string"?l=Pr(e):(l=Vs({},e),Qe(!l.pathname||!l.pathname.includes("?"),Tp("?","pathname","search",l)),Qe(!l.pathname||!l.pathname.includes("#"),Tp("#","pathname","hash",l)),Qe(!l.search||!l.search.includes("#"),Tp("#","search","hash",l)));let d=e===""||l.pathname==="",u=d?"/":l.pathname,m;if(u==null)m=r;else{let v=a.length-1;if(!s&&u.startsWith("..")){let S=u.split("/");for(;S[0]==="..";)S.shift(),v-=1;l.pathname=S.join("/")}m=v>=0?a[v]:"/"}let h=ME(l,m),g=u&&u!=="/"&&u.endsWith("/"),b=(d||u===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(g||b)&&(h.pathname+="/"),h}const Ka=e=>e.join("/").replace(/\/\/+/g,"/"),_E=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),OE=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,LE=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function PE(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const fx=["post","put","patch","delete"];new Set(fx);const ZE=["get",...fx];new Set(ZE);/** + * React Router v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Ws(){return Ws=Object.assign?Object.assign.bind():function(e){for(var a=1;a{m.current=!0}),y.useCallback(function(g,b){if(b===void 0&&(b={}),!m.current)return;if(typeof g=="number"){s.go(g);return}let v=mx(g,JSON.parse(u),d,b.relative==="path");e==null&&a!=="/"&&(v.pathname=v.pathname==="/"?a:Ka([a,v.pathname])),(b.replace?s.replace:s.push)(v,b.state,b)},[a,s,u,d,e])}function gc(e,a){let{relative:r}=a===void 0?{}:a,{future:s}=y.useContext(Wa),{matches:l}=y.useContext(jn),{pathname:d}=$a(),u=JSON.stringify(px(l,s.v7_relativeSplatPath));return y.useMemo(()=>mx(e,JSON.parse(u),d,r==="path"),[e,u,d,r])}function qE(e,a){return FE(e,a)}function FE(e,a,r,s){ti()||Qe(!1);let{navigator:l}=y.useContext(Wa),{matches:d}=y.useContext(jn),u=d[d.length-1],m=u?u.params:{};u&&u.pathname;let h=u?u.pathnameBase:"/";u&&u.route;let g=$a(),b;if(a){var v;let k=typeof a=="string"?Pr(a):a;h==="/"||(v=k.pathname)!=null&&v.startsWith(h)||Qe(!1),b=k}else b=g;let S=b.pathname||"/",T=S;if(h!=="/"){let k=h.replace(/^\//,"").split("/");T="/"+S.replace(/^\//,"").split("/").slice(k.length).join("/")}let C=gE(e,{pathname:T}),x=VE(C&&C.map(k=>Object.assign({},k,{params:Object.assign({},m,k.params),pathname:Ka([h,l.encodeLocation?l.encodeLocation(k.pathname).pathname:k.pathname]),pathnameBase:k.pathnameBase==="/"?h:Ka([h,l.encodeLocation?l.encodeLocation(k.pathnameBase).pathname:k.pathnameBase])})),d,r,s);return a&&x?y.createElement(hc.Provider,{value:{location:Ws({pathname:"/",search:"",hash:"",state:null,key:"default"},b),navigationType:Fa.Pop}},x):x}function KE(){let e=XE(),a=PE(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return y.createElement(y.Fragment,null,y.createElement("h2",null,"Unexpected Application Error!"),y.createElement("h3",{style:{fontStyle:"italic"}},a),r?y.createElement("pre",{style:l},r):null,null)}const UE=y.createElement(KE,null);class HE extends y.Component{constructor(a){super(a),this.state={location:a.location,revalidation:a.revalidation,error:a.error}}static getDerivedStateFromError(a){return{error:a}}static getDerivedStateFromProps(a,r){return r.location!==a.location||r.revalidation!=="idle"&&a.revalidation==="idle"?{error:a.error,location:a.location,revalidation:a.revalidation}:{error:a.error!==void 0?a.error:r.error,location:r.location,revalidation:a.revalidation||r.revalidation}}componentDidCatch(a,r){console.error("React Router caught the following error during render",a,r)}render(){return this.state.error!==void 0?y.createElement(jn.Provider,{value:this.props.routeContext},y.createElement(gx.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function GE(e){let{routeContext:a,match:r,children:s}=e,l=y.useContext(fc);return l&&l.static&&l.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=r.route.id),y.createElement(jn.Provider,{value:a},s)}function VE(e,a,r,s){var l;if(a===void 0&&(a=[]),r===void 0&&(r=null),s===void 0&&(s=null),e==null){var d;if(!r)return null;if(r.errors)e=r.matches;else if((d=s)!=null&&d.v7_partialHydration&&a.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let u=e,m=(l=r)==null?void 0:l.errors;if(m!=null){let b=u.findIndex(v=>v.route.id&&(m==null?void 0:m[v.route.id])!==void 0);b>=0||Qe(!1),u=u.slice(0,Math.min(u.length,b+1))}let h=!1,g=-1;if(r&&s&&s.v7_partialHydration)for(let b=0;b=0?u=u.slice(0,g+1):u=[u[0]];break}}}return u.reduceRight((b,v,S)=>{let T,C=!1,x=null,k=null;r&&(T=m&&v.route.id?m[v.route.id]:void 0,x=v.route.errorElement||UE,h&&(g<0&&S===0?(JE("route-fallback"),C=!0,k=null):g===S&&(C=!0,k=v.route.hydrateFallbackElement||null)));let R=a.concat(u.slice(0,S+1)),j=()=>{let A;return T?A=x:C?A=k:v.route.Component?A=y.createElement(v.route.Component,null):v.route.element?A=v.route.element:A=b,y.createElement(GE,{match:v,routeContext:{outlet:b,matches:R,isDataRoute:r!=null},children:A})};return r&&(v.route.ErrorBoundary||v.route.errorElement||S===0)?y.createElement(HE,{location:r.location,revalidation:r.revalidation,component:x,error:T,children:j(),routeContext:{outlet:null,matches:R,isDataRoute:!0}}):j()},null)}var vx=(function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e})(vx||{}),xx=(function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e})(xx||{});function WE(e){let a=y.useContext(fc);return a||Qe(!1),a}function $E(e){let a=y.useContext(hx);return a||Qe(!1),a}function YE(e){let a=y.useContext(jn);return a||Qe(!1),a}function wx(e){let a=YE(),r=a.matches[a.matches.length-1];return r.route.id||Qe(!1),r.route.id}function XE(){var e;let a=y.useContext(gx),r=$E(),s=wx();return a!==void 0?a:(e=r.errors)==null?void 0:e[s]}function QE(){let{router:e}=WE(vx.UseNavigateStable),a=wx(xx.UseNavigateStable),r=y.useRef(!1);return yx(()=>{r.current=!0}),y.useCallback(function(l,d){d===void 0&&(d={}),r.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,Ws({fromRouteId:a},d)))},[e,a])}const Hb={};function JE(e,a,r){Hb[e]||(Hb[e]=!0)}function eR(e,a){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function ut(e){Qe(!1)}function tR(e){let{basename:a="/",children:r=null,location:s,navigationType:l=Fa.Pop,navigator:d,static:u=!1,future:m}=e;ti()&&Qe(!1);let h=a.replace(/^\/*/,"/"),g=y.useMemo(()=>({basename:h,navigator:d,static:u,future:Ws({v7_relativeSplatPath:!1},m)}),[h,m,d,u]);typeof s=="string"&&(s=Pr(s));let{pathname:b="/",search:v="",hash:S="",state:T=null,key:C="default"}=s,x=y.useMemo(()=>{let k=Mr(b,h);return k==null?null:{location:{pathname:k,search:v,hash:S,state:T,key:C},navigationType:l}},[h,b,v,S,T,C,l]);return x==null?null:y.createElement(Wa.Provider,{value:g},y.createElement(hc.Provider,{children:r,value:x}))}function Sx(e){let{children:a,location:r}=e;return qE(Qp(a),r)}new Promise(()=>{});function Qp(e,a){a===void 0&&(a=[]);let r=[];return y.Children.forEach(e,(s,l)=>{if(!y.isValidElement(s))return;let d=[...a,l];if(s.type===y.Fragment){r.push.apply(r,Qp(s.props.children,d));return}s.type!==ut&&Qe(!1),!s.props.index||!s.props.children||Qe(!1);let u={id:s.props.id||d.join("-"),caseSensitive:s.props.caseSensitive,element:s.props.element,Component:s.props.Component,index:s.props.index,path:s.props.path,loader:s.props.loader,action:s.props.action,errorElement:s.props.errorElement,ErrorBoundary:s.props.ErrorBoundary,hasErrorBoundary:s.props.ErrorBoundary!=null||s.props.errorElement!=null,shouldRevalidate:s.props.shouldRevalidate,handle:s.props.handle,lazy:s.props.lazy};s.props.children&&(u.children=Qp(s.props.children,d)),r.push(u)}),r}/** + * React Router DOM v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function ec(){return ec=Object.assign?Object.assign.bind():function(e){for(var a=1;a=0)&&(r[l]=e[l]);return r}function oR(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function aR(e,a){return e.button===0&&(!a||a==="_self")&&!oR(e)}const nR=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],rR=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],sR="6";try{window.__reactRouterVersion=sR}catch{}const iR=y.createContext({isTransitioning:!1}),lR="startTransition",Gb=mc[lR];function cR(e){let{basename:a,children:r,future:s,window:l}=e,d=y.useRef();d.current==null&&(d.current=mE({window:l,v5Compat:!0}));let u=d.current,[m,h]=y.useState({action:u.action,location:u.location}),{v7_startTransition:g}=s||{},b=y.useCallback(v=>{g&&Gb?Gb(()=>h(v)):h(v)},[h,g]);return y.useLayoutEffect(()=>u.listen(b),[u,b]),y.useEffect(()=>eR(s),[s]),y.createElement(tR,{basename:a,children:r,location:m.location,navigationType:m.action,navigator:u,future:s})}const dR=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",uR=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,st=y.forwardRef(function(a,r){let{onClick:s,relative:l,reloadDocument:d,replace:u,state:m,target:h,to:g,preventScrollReset:b,viewTransition:v}=a,S=Cx(a,nR),{basename:T}=y.useContext(Wa),C,x=!1;if(typeof g=="string"&&uR.test(g)&&(C=g,dR))try{let A=new URL(window.location.href),M=g.startsWith("//")?new URL(A.protocol+g):new URL(g),q=Mr(M.pathname,T);M.origin===A.origin&&q!=null?g=q+M.search+M.hash:x=!0}catch{}let k=BE(g,{relative:l}),R=mR(g,{replace:u,state:m,target:h,preventScrollReset:b,relative:l,viewTransition:v});function j(A){s&&s(A),A.defaultPrevented||R(A)}return y.createElement("a",ec({},S,{href:C||k,onClick:x||d?s:j,ref:r,target:h}))}),Jp=y.forwardRef(function(a,r){let{"aria-current":s="page",caseSensitive:l=!1,className:d="",end:u=!1,style:m,to:h,viewTransition:g,children:b}=a,v=Cx(a,rR),S=gc(h,{relative:v.relative}),T=$a(),C=y.useContext(hx),{navigator:x,basename:k}=y.useContext(Wa),R=C!=null&&fR(S)&&g===!0,j=x.encodeLocation?x.encodeLocation(S).pathname:S.pathname,A=T.pathname,M=C&&C.navigation&&C.navigation.location?C.navigation.location.pathname:null;l||(A=A.toLowerCase(),M=M?M.toLowerCase():null,j=j.toLowerCase()),M&&k&&(M=Mr(M,k)||M);const q=j!=="/"&&j.endsWith("/")?j.length-1:j.length;let Z=A===j||!u&&A.startsWith(j)&&A.charAt(q)==="/",B=M!=null&&(M===j||!u&&M.startsWith(j)&&M.charAt(j.length)==="/"),X={isActive:Z,isPending:B,isTransitioning:R},ae=Z?s:void 0,ne;typeof d=="function"?ne=d(X):ne=[d,Z?"active":null,B?"pending":null,R?"transitioning":null].filter(Boolean).join(" ");let te=typeof m=="function"?m(X):m;return y.createElement(st,ec({},v,{"aria-current":ae,className:ne,ref:r,style:te,to:h,viewTransition:g}),typeof b=="function"?b(X):b)});var em;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(em||(em={}));var Vb;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Vb||(Vb={}));function pR(e){let a=y.useContext(fc);return a||Qe(!1),a}function mR(e,a){let{target:r,replace:s,state:l,preventScrollReset:d,relative:u,viewTransition:m}=a===void 0?{}:a,h=bx(),g=$a(),b=gc(e,{relative:u});return y.useCallback(v=>{if(aR(v,r)){v.preventDefault();let S=s!==void 0?s:Jl(g)===Jl(b);h(e,{replace:S,state:l,preventScrollReset:d,relative:u,viewTransition:m})}},[g,h,b,s,l,r,e,d,u,m])}function fR(e,a){a===void 0&&(a={});let r=y.useContext(iR);r==null&&Qe(!1);let{basename:s}=pR(em.useViewTransitionState),l=gc(e,{relative:a.relative});if(!r.isTransitioning)return!1;let d=Mr(r.currentLocation.pathname,s)||r.currentLocation.pathname,u=Mr(r.nextLocation.pathname,s)||r.nextLocation.pathname;return Xp(l.pathname,u)!=null||Xp(l.pathname,d)!=null}const kx="zmage.theme",Tx=y.createContext(null);function hR(){if(typeof window>"u")return"system";const e=localStorage.getItem(kx);return e==="light"||e==="dark"||e==="system"?e:"system"}function Wb(){return typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches}function gR({children:e}){const[a,r]=y.useState(hR),[s,l]=y.useState(()=>a==="system"?Wb()?"dark":"light":a);y.useEffect(()=>{const u=()=>{const h=a==="system"?Wb()?"dark":"light":a;l(h),document.documentElement.classList.toggle("dark",h==="dark")};if(u(),a!=="system")return;const m=window.matchMedia("(prefers-color-scheme: dark)");return m.addEventListener("change",u),()=>m.removeEventListener("change",u)},[a]);const d=y.useCallback(u=>{localStorage.setItem(kx,u),r(u)},[]);return c.jsx(Tx.Provider,{value:{theme:a,resolved:s,setTheme:d},children:e})}function Am(){const e=y.useContext(Tx);if(!e)throw new Error("useTheme must be inside ThemeProvider");return e}const yR={"nav.playground":"调试","nav.docs":"文档","nav.ai":"AI 接入指南","nav.github":"GitHub","useCases.eyebrow":"使用场景","useCases.title":"适合博客、CMS、MDX 和新闻页面的 React 图片预览","useCases.body":"react-zmage 是一个 React 图片查看器, 可以把普通 变成可原位展开的全屏图片预览。它支持多图浏览、键盘操作、移动端手势、事件触发、富文本 Wrapper 模式, 也支持 SSR/RSC 场景。","useCases.cta.docs":"查看文档","useCases.cta.wrapper":"试试 Wrapper 模式","useCases.card.blog.title":"博客图片预览","useCases.card.blog.body":"让文章里的图片可以全屏查看, 不需要改掉原本的文章排版, 也不需要额外做一套相册页面。","useCases.card.cms.title":"CMS 富文本图片","useCases.card.cms.body":"包住 CMS、Markdown 解析器或编辑器输出的 HTML, 让已有 自动接入查看器。","useCases.card.news.title":"新闻文章图集","useCases.card.news.body":"正文仍然保持可读, 读者需要看细节时再进入支持键盘、手势和多图浏览的查看器。","useCases.card.mdx.title":"MDX 和文档图片","useCases.card.mdx.body":"适合内容作者负责图片、React 应用负责页面外壳的文档页面, 直接用 Wrapper 模式接入。","useCases.card.lightbox.title":"React lightbox 替代方案","useCases.card.lightbox.body":"当你只需要一层原位展开的图片预览, 又想保留现有 HTML 结构时, 不必接入更重的相册框架。","useCases.card.ssr.title":"Next.js、SSR 和 RSC","useCases.card.ssr.body":"服务端渲染应用可以使用 SSR 安全入口, 再在客户端边界里打开交互式查看器。","useCases.mode.eyebrow":"如何选择模式","useCases.mode.title":"按你是否掌控图片 HTML 来选","useCases.mode.component":"你掌控 JSX, 可以直接把 换成 。","useCases.mode.imperative":"按钮、命令、事件或回调需要主动打开查看器。","useCases.mode.wrapper":"图片来自 CMS、MDX、Markdown 或富文本 HTML。","useCases.facts.eyebrow":"实体信息","useCases.facts.title":"希望搜索引擎和 AI 抓住的简短事实","useCases.fact.react":"兼容 React 16.8 到 19","useCases.fact.modes":"支持组件、命令式和 Wrapper 三种模式","useCases.fact.input":"支持键盘导航和移动端手势","useCases.fact.ssr":"提供 SSR/RSC 安全入口","useCases.fact.gallery":"不重构页面也能做多图浏览","useCases.fact.origin":"原位展开的全屏图片预览","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"人和 AI Agent 通常会问的问题","useCases.faq.what.q":"react-zmage 是什么?","useCases.faq.what.a":"react-zmage 是一个 React 图片查看器, 可以把普通 变成可原位展开的全屏图片预览, 并支持多图浏览、键盘导航、移动端手势、Wrapper 模式和 SSR/RSC。","useCases.faq.lightbox.q":"什么时候应该用 react-zmage, 而不是 React lightbox?","useCases.faq.lightbox.a":"当你希望已有图片可以全屏查看, 但不想围绕相册组件重写页面结构时, react-zmage 更合适。博客、CMS 富文本、MDX 文档、新闻文章和图片较多的内容页都适合。","useCases.faq.richText.q":"react-zmage 能处理 CMS、Markdown 或富文本图片吗?","useCases.faq.richText.a":"可以。Zmage.Wrapper 会绑定后代 , 适合 CMS、Markdown、MDX 或 dangerouslySetInnerHTML 渲染出来的内容, 同时保留原页面结构。","useCases.faq.ssr.q":"react-zmage 支持 Next.js、SSR 或 RSC 吗?","useCases.faq.ssr.a":"支持。SSR 或 RSC 场景使用 react-zmage/ssr 子路径导入, 交互式查看器 API 放在客户端事件或 Client Component 中调用。","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"让每张 ","hero.title.line2":"原位展开","hero.subtitle":"把任意 变成可原位展开的全屏图片查看器,支持键盘、手势和多图浏览。","hero.cta.start":"查看文档","hero.cta.playground":"玩玩各种参数","hero.ai.label":"AI 接入指南: 先读 llms.txt","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"复制快速 Prompt","hero.ai.copyLabel":"复制快速 AI Prompt","hero.ai.viewLlms":"查看 llms.txt →","ai.badge":"AI 接入指南","ai.title":"生成 react-zmage Agent 接入 Prompt","ai.subtitle":"先从 llms.txt 开始。保留 Auto, 让你的 Agent 先读项目再决定接入方式; 如果你想细控, 也可以手动指定环境、图片来源和交互策略。","ai.field.agent":"你使用哪个 Agent?","ai.field.depth":"配置深度","ai.field.environment":"项目环境","ai.field.mode":"使用模式","ai.field.imageSource":"图片来源","ai.field.interaction":"交互策略","ai.field.project":"项目描述","ai.autoTip":"不确定就保持 Auto。你的 Agent 会先检查项目结构、图片来源、渲染方式和样式入口, 再选择合适的 Zmage 模式和参数。","ai.project.placeholder":"描述你的应用、图片来源, 以及希望查看器完成什么。","ai.action.copy":"复制 Setup Prompt","ai.action.copied":"已复制","ai.action.openLlms":"打开 llms.txt","ai.copy.error":"复制失败。请在右侧预览中手动选择 prompt。","ai.preview.title":"Setup Prompt","ai.preview.subtitle":"会随左侧选择实时更新","ai.preview.copy":"复制","ai.preview.expand":"展开","ai.preview.show":"预览 Prompt","ai.preview.hide":"收起预览","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"生成适合通用 Coding Agent 的 prompt。","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"让 Agent 先检查项目, 再替你选择。","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"手动指定接入偏好。","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"真实交互示例","demo.title":"把童梦的图像故事铺成一页真实文章","demo.body":"这些图片来自《童梦》项目: 旧书、时间通道、狐狸、森林和水晶封印被排进同一个不规则版面。点击任意一张,首帧会从当前裁剪位置顺滑放大到查看模式。","demo.shiftHint":"按住 SHIFT 点击图片, 感受细腻流畅的过渡动画","demo.zoomHint":"打开后按 Space 进入缩放,再用滚轮继续缩放。","demo.story.project":"童梦","demo.story.author":"Guihuahuzi","demo.story.title":"一本积满尘的书,在图书馆角落打开了旧时间的入口。","demo.story.lead":"书页上原本不起眼的文字变成微缩场景,男孩看见森林从纸面生长,也听见结界另一端传来的召唤。","demo.story.middle":"狐狸成为他的同行伙伴。穿过潮汐、树冠和粉色火烈鸟之后,故事把视线推向密林深处的水晶封印。","demo.tile.cover":"旧书与时间通道","demo.tile.gallery":"森林里第一次相遇","demo.tile.ratio":"潮汐边缘的路径","demo.tile.controller":"水晶封印","demo.tile.zoom":"火烈鸟栖息地","demo.tile.lamp":"叶片下的灯光","demo.tile.rescue":"密林中的解封","demo.feature.cover":"封面裁剪与圆角匹配","demo.feature.space":"移动鼠标指针在放大模式下快速扫视","demo.feature.wheel":"使用鼠标滚轮顺滑切换缩放比例","demo.feature.shift":"Shift 慢动作打开/关闭","demo.caption":"点击图片进入查看模式;桌面端可按住 SHIFT 打开,进入放大后移动鼠标或滚动滚轮观察细节。","demo.scene.portal.alt":"旧书上的发光时间通道","demo.scene.portal.caption":"旧书中央亮起时间通道,森林从文字里立起来。","demo.scene.forest.alt":"男孩在森林里遇见狐狸","demo.scene.forest.caption":"狐狸在林间出现,成为男孩穿过异世界的伙伴。","demo.scene.tide.alt":"男孩站在潮汐边缘","demo.scene.tide.caption":"水面卷起螺旋,通向下一段未知路径。","demo.scene.canopy.alt":"男孩躺在巨大树冠下","demo.scene.canopy.caption":"树冠像书页一样展开,微光把路线标出来。","demo.scene.flamingo.alt":"男孩坐在粉色火烈鸟之间","demo.scene.flamingo.caption":"轻盈的火烈鸟群让旅程短暂停下来。","demo.scene.lamp.alt":"男孩在叶片下点亮灯光","demo.scene.lamp.caption":"叶片遮住黑暗,灯光把书里的线索照出来。","demo.scene.crystal.alt":"男孩站在水晶封印前","demo.scene.crystal.caption":"密林深处的水晶封印开始显露。","demo.scene.rescue.alt":"狐狸和男孩靠近水晶封印","demo.scene.rescue.caption":"钥匙靠近晶体,封印里的秘密即将被打开。","feature.dropin.title":"原位展开","feature.dropin.hint":"从页面原图的位置、尺寸、圆角和裁剪状态进入全屏,关闭时回到原位。","feature.mobile.title":"移动端兼容","feature.mobile.hint":"默认按设备选择交互:触屏端支持滑动翻页、下滑关闭、双击和双指缩放。","feature.set.title":"浏览操作完整","feature.set.hint":"缩放、旋转、翻页、下载和 caption 共用同一套浏览状态,多图时也保持连续。","feature.ssr.title":"SSR/RSC 友好","feature.ssr.hint":"提供服务端安全入口,在 Next.js、SSR 或 RSC 项目里可以把交互留给客户端边界。","modes.title":"按你的页面结构接入","modes.component.label":"组件模式","modes.component.desc":"你能控制 JSX 时,把 换成 ,原生属性继续透传。","modes.imperative.label":"命令式调用","modes.imperative.desc":"从按钮、回调或异步流程打开查看器,不要求页面上已有封面图。","modes.wrapper.label":"包裹器模式","modes.wrapper.desc":"包住 Markdown / CMS / dangerouslySetInnerHTML,让内部图片自动原位展开。","modes.try":"打开示例 →","modes.component.when":"当你完全控制要渲染的 JSX 时优先选组件模式。把 直接换成 ,原生属性继续透传,打开和关闭都会按原位展开过渡。","modes.imperative.when":"当入口不是图片本身时使用命令式调用。从事件处理器、第三方回调、异步流程等任意位置打开查看器,不需要额外挂一个封面 。","modes.wrapper.when":"当渲染出的 HTML 不在你的控制之内时使用包裹器模式 —— markdown 输出、CMS 富文本、dangerouslySetInnerHTML 等。包住子树,内部所有 自动获得查看能力。","footer.project":"项目","footer.repo":"代码仓库","footer.issues":"反馈与建议","footer.changelog":"更新日志","footer.useCases":"使用场景","footer.madeby":"作者","footer.illustrator":"插图作者","footer.license":"MIT 许可证","pg.title":"参数调试台","pg.subtitle":"调整任意 prop,实时查看 的反馈。","pg.reset":"重置","pg.share":"分享链接","pg.shared":"已复制链接","pg.tab.component":"组件","pg.tab.imperative":"命令式","pg.tab.wrapper":"包裹器","pg.preview.tip":"提示:Space 缩放 · ←/→ 翻页 · ESC 关闭","pg.preview.trigger":"触发查看器","pg.params.title":"参数","pg.params.subtitle":"悬停参数名查看说明, 点击书本图标跳转文档。","pg.events.title":"事件","pg.events.subtitle":"生命周期回调输出, 可展开查看完整事件流。","pg.events.empty":"启用任意 lifecycle 回调以查看事件流。","pg.code.title":"代码","pg.code.subtitle":"当前模式的可复制代码, 可展开查看完整内容。","pg.code.hideDefaults":"隐藏默认值","pg.copy":"复制","pg.copied":"已复制","pg.portalTarget.title":"自定义 Portal 挂载点","pg.portalTarget.body":"适合已有 overlay root、modal root 或微前端容器的应用。点击右侧图片时,查看器会挂到这个 root 下,而不是默认 document.body。","pg.portalTarget.root":"宿主应用的 overlay root","pg.portalTarget.imageAlt":"Portal 挂载点演示图片","group.data":"数据","group.preset":"预设","group.interface":"界面与交互","group.controller":"控制器","group.hotkey":"快捷键","group.animate":"动画","group.gesture":"手势","group.lifecycle":"生命周期","group.controlled":"受控","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"桌面端范围","common.presetScope.desktop.desc":"偏桌面端的参数。desktop preset 默认启用它, 或者它只在桌面端有实际作用。","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"移动端范围","common.presetScope.mobile.desc":"偏移动端或触控的参数。mobile preset 默认启用它, 或者它只在触控交互中有意义。","common.expand":"展开","common.required":"必填","common.default":"默认","common.add":"新增","common.remove":"删除","common.enable":"启用","common.disable":"禁用","param.viewInDocs":"在文档中查看","docs.title":"API 文档","docs.search.placeholder":"搜索文档...","docs.search.empty":"没有匹配项","docs.toc.title":"本页目录","docs.sidebar.gettingStarted":"开始使用","docs.sidebar.quickstart":"快速开始","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"概念","docs.sidebar.modes":"三种模式","docs.sidebar.theming":"主题集成","docs.sidebar.props":"API 参数","docs.sidebar.recipes":"场景示例","docs.sidebar.examples":"示例","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"参考","docs.sidebar.migration":"迁移指南","docs.sidebar.faq":"常见问题","preset.desktop":"桌面端","preset.mobile":"移动端","preset.auto":"自动","animate.flip.fade":"淡入淡出","animate.flip.crossFade":"交叉淡入","animate.flip.swipe":"滑动","animate.flip.zoom":"缩放","animate.flip.blur":"失焦","animate.flip.none":"无","animate.slowMotion":"慢动作","gesture.swipe":"拖拽翻页","gesture.dragExit":"拖拽退出","gesture.wheelZoom":"滚轮缩放","gesture.pinchZoom":"双指缩放","gesture.doubleTapZoom":"双击缩放","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"跟随 preset 的手势配置。桌面预设在 zoom 态开启滚轮缩放;移动端预设开启拖拽翻页、拖拽退出、双指缩放和双击缩放。","gesture.swipe.desc":"横向拖拽切换 set 中的图片。单图模式下自动忽略。","gesture.dragExit.desc":"纵向拖拽关闭查看器,走现有 onBrowsing(false) 关闭路径。","gesture.wheelZoom.desc":"查看器已经处于 zoom 态时,用鼠标滚轮或触控板继续缩放。桌面预设默认开启,移动端预设默认关闭。","gesture.pinchZoom.desc":"移动端双指缩放。缩回 fit 比例时退出 zoom,并把图片回中。","gesture.doubleTapZoom.desc":"移动端单指双击缩放。首次双击按 tap 位置放大;zoom 态再次双击回到 fit 视图。","gesture.touchAction.desc":"CSS touch-action 策略。managed 会在启用 pinch 时使用 none,仅启用双击缩放时使用 manipulation;显式值会原样写入。","gesture.threshold.desc":"接受手势所需的最小拖拽距离,单位 px。","gesture.velocity.desc":"接受手势所需的最小速度,单位 px/ms。","gesture.axisLock.desc":"轴向锁定比例,用于避免斜向移动同时触发横向和纵向手势。","gesture.resistance.desc":"loop=false 且位于首尾页时的边界阻尼比例。","gesture.opacity.desc":"纵向拖拽退出时是否随拖拽距离降低图片透明度。","gesture.wheelZoom.step.desc":"滚轮缩放灵敏度。值越大,同样的滚轮距离缩放越快。","gesture.wheelZoom.smooth.desc":"是否通过现有 zoom-follow RAF 平滑插值;关闭后立即跳到目标缩放。","gesture.wheelZoom.minScale.desc":"滚轮缩小的最小比例。继续缩小时到达该比例会退出 zoom。","gesture.wheelZoom.maxScale.desc":"滚轮放大的最大比例。","gesture.wheelZoom.center.desc":"滚轮缩放焦点。pointer 使用滚轮事件位置;viewport 使用屏幕中心。","gesture.wheelZoom.reverse.desc":"反转滚轮缩放方向,其它滚轮行为保持不变。","gesture.wheelZoom.exitGuardDuration.desc":"wheel 缩小退出 zoom 后的保护时间,单位 ms。保护期内会拦截残留滚轮事件。","gesture.pinchZoom.minScale.desc":"双指缩放的最小比例。fit 表示适配屏幕的浏览态尺寸。","gesture.pinchZoom.maxScale.desc":"双指缩放的最大比例。","gesture.pinchZoom.resetBelowFit.desc":"双指缩小到 fit 比例时退出 zoom 并把图片回中。","gesture.pinchZoom.center.desc":"双指缩放焦点。gesture 使用双指中点;viewport 使用屏幕中心。","gesture.doubleTapZoom.scale.desc":"双击进入 zoom 时的目标缩放比例。","gesture.doubleTapZoom.minScale.desc":"双击缩放的最小限制。","gesture.doubleTapZoom.maxScale.desc":"双击缩放的最大限制。","gesture.doubleTapZoom.center.desc":"双击缩放焦点。tap 使用点击位置;viewport 使用屏幕中心。","gesture.doubleTapZoom.interval.desc":"两次 tap 的最大间隔,单位 ms。","gesture.doubleTapZoom.distance.desc":"两次 tap 允许的最大位移,单位 px。","controller.pagination":"分页指示器","controller.rotate":"旋转","controller.rotateLeft":"左旋","controller.rotateRight":"右旋","controller.zoom":"缩放","controller.download":"下载","controller.close":"关闭","controller.flip":"翻页","controller.flipLeft":"上一张","controller.flipRight":"下一张","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"顶部页码指示器,展示当前位置 / 总页数","controller.rotate.desc":"旋转控制组(包含左旋与右旋按钮)","controller.rotateLeft.desc":"逆时针旋转 90°","controller.rotateRight.desc":"顺时针旋转 90°","controller.zoom.desc":"进入 / 退出 1:1 放大模式","controller.download.desc":"下载当前图片","controller.close.desc":"关闭查看器","controller.flip.desc":"翻页控制组(包含上 / 下一张按钮)","controller.flipLeft.desc":"切换到上一张图片","controller.flipRight.desc":"切换到下一张图片","controller.backdrop.desc":"工具栏背景色。未传时沿用顶层 backdrop。当顶层 backdrop 为深色实色时建议设为半透明值 (例如 `rgba(0,0,0,0.4)`)。","controller.color.desc":'工具栏图标默认色。未传时使用 currentColor。单按钮字符串覆盖 (例如 `controller.zoom = "#ff8800"`) 仍优先生效。',"controller.placement.desc":"工具栏位置。只移动工具栏本体,左右翻页按钮和分页指示器位置不变。","controller.layout.desc":"调整工具栏、左右翻页按钮、分页器和 caption 的安全偏移。数值按 px 处理,字符串可传任意 CSS 长度;标量 inset 会按目标自身进入方向生效,layout.mobile 可覆盖移动端位置。","controller.layout.toolbarInset.desc":"工具栏安全偏移。标量会按当前 placement 自动作用在 top / right / bottom / left 的对应边。","controller.layout.flipInset.desc":"左右翻页按钮安全偏移。标量会同时作用在左侧和右侧按钮。","controller.layout.paginationInset.desc":"分页器安全偏移。标量会作用在分页器的底部进入方向,用于避开 caption 或页面自定义 UI。","controller.layout.captionInset.desc":"caption 安全偏移。标量会作用在 caption 的底部进入方向,用于避免与分页器或底部控制区相切。","controller.render.desc":"完全自定义控制器渲染函数。接收 state、actions 和内置 slots;controller=false 时不会调用。","controller.overriddenBy":"由组合开关启用","snippet.overriddenByProp":"由 {umbrella} 属性覆盖","hotkey.close":"关闭 (Escape)","hotkey.zoom":"缩放 (Space)","hotkey.flip":"翻页 (←/→)","hotkey.flipLeft":"上一张 (←)","hotkey.flipRight":"下一张 (→)","hotkey.rotate":"旋转 ([ / ])","hotkey.rotateLeft":"逆时针旋转 ([)","hotkey.rotateRight":"顺时针旋转 (])","hotkey.download":"下载 (Mod+S)","hotkey.close.desc":"按 Escape 关闭查看器","hotkey.zoom.desc":"按 Space 切换 1:1 放大模式","hotkey.flip.desc":"按 ← / → 在 set 中翻页","hotkey.flipLeft.desc":"按 ← 切换到上一张","hotkey.flipRight.desc":"按 → 切换到下一张","hotkey.rotate.desc":"按 [ / ] 旋转图片 (组合开关; 同时绑定左右两个方向)","hotkey.rotateLeft.desc":"按 [ 逆时针旋转 90°","hotkey.rotateRight.desc":"按 ] 顺时针旋转 90°","hotkey.download.desc":'按 Cmd+S (macOS) 或 Ctrl+S (Windows/Linux) 下载当前图片。默认关闭 — 启用后会劫持浏览器"另存为网页"快捷键。',"animate.browsing.desc":"查看器开 / 关时的过渡动画","animate.flip.desc":"在 set 中翻页时的过渡方式","animate.slowMotion.desc":"启用后,按住 Shift 打开或关闭会把整条浏览转场放慢到 10 倍,便于观察或演示","animate.cover.desc":"封面到查看器的几何过渡","animate.cover.objectFit.desc":"打开前匹配封面图片的 object-fit / object-position 几何","animate.cover.clip.desc":"用 clip-path 匹配 img 自身可见裁切区域; 动画期间可能触发重绘, 移动端性能敏感时可关闭","animate.cover.radius.desc":"从封面圆角过渡到查看器圆角","param.src.label":"src","param.src.desc":"图片地址,必填项。","param.alt.label":"alt","param.alt.desc":"图片标题,作为大图查看时的标题显示。","param.caption.label":"caption","param.caption.desc":"大图下方的辅助文案。可传字符串使用默认胶囊样式,或传 { text, style?, className? } 自定义样式。多图时可由 set[i].caption 单独覆盖。","param.set.label":"set","param.set.desc":"图片集合;传入后启用画廊模式,左右键翻页。","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"初始页索引,从 0 开始。","param.preset.label":"preset","param.preset.desc":"预设方案,默认 auto,决定 controller / hotKey / animate / gesture 的默认值。","param.backdrop.label":"backdrop","param.backdrop.desc":"查看器背景颜色,任意有效 CSS 颜色字符串。","param.zIndex.label":"zIndex","param.zIndex.desc":"查看器层级。","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"查看器 Portal 的 DOM 挂载目标,默认 document.body。用于宿主应用已有 overlay root、modal root 或微前端容器的场景;它只改变挂载父节点,查看器仍是 fixed 全屏布局。","param.radius.label":"radius","param.radius.desc":"图片圆角,单位 px。","param.edge.label":"edge","param.edge.desc":"图片到视口的最小边距,单位 px。","param.loop.label":"loop","param.loop.desc":"到达末尾时是否循环回到第一张。","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"滚动页面时自动关闭查看器。","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"双击图片时关闭查看器。默认关闭,启用后浏览态双击图片即退出。","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"查看时保留封面图。","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Loading 指示器显示前的延迟 (ms)。在此期间内图片加载完成则不显示 loading,避免快速切换缓存图时的视觉闪烁。默认 200ms (业界 react-loadable 经典值);设为 0 = 立即显示 (旧行为)。","param.controller.label":"controller","param.controller.desc":"控制器配置;传 false 关闭整组,或传部分对象覆盖按钮、位置、覆盖层布局和自定义渲染。","param.hotKey.label":"hotKey","param.hotKey.desc":"快捷键开关。","param.animate.label":"animate","param.animate.desc":"动画配置:浏览、封面几何、慢动作和翻页动画。","param.gesture.label":"gesture","param.gesture.desc":"跟随 preset 的手势配置。桌面在 zoom 态开启 wheelZoom;移动端默认开启 swipe、dragExit、pinchZoom 和 doubleTapZoom。gesture=false 可全部关闭。","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"查看器打开/关闭时回调,参数 boolean。","param.onZooming.label":"onZooming","param.onZooming.desc":"进入/退出放大模式时回调,参数 boolean。","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"翻页时回调,参数为新页索引。","param.onRotating.label":"onRotating","param.onRotating.desc":"旋转时回调,参数为角度。","param.onError.label":"onError","param.onError.desc":"图片加载失败时回调(封面与浏览态共用),参数为原生 SyntheticEvent。","param.browsing.label":"browsing","param.browsing.desc":"受控的浏览状态;给值即转为受控模式,需要配套 onBrowsing。","playground.preset.aria":"切换数据预设","playground.preset.default.label":"默认","playground.preset.default.hint":"童夢 · 2 张","playground.preset.testset.label":"测试集","playground.preset.testset.hint":"6 张 · 多比例多格式","docs.section.installation.title":"安装","docs.section.installation.intro":"通过包管理器安装:","docs.section.installation.agent":"AI Agent 应先阅读 https://zmage.caldis.me/llms.txt, 然后保持基础接入最小化。","docs.section.installation.then":"然后导入组件和样式表:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"对于服务端渲染应用,使用 /ssr 入口可避免在 import 阶段触碰 document:","docs.section.modes.title":"三种调用方式","docs.section.modes.intro":"react-zmage 通过三种调用方式暴露相同的配置接口,选择哪一种取决于你对页面 HTML 的控制权:","docs.section.modes.componentTitle":"组件","docs.section.modes.componentBody":"默认调用方式 —— 当你完全控制要渲染的 JSX 时使用。把 替换为 即可,所有原生 HTML 属性(className / style / onClick 等)按原样转发到内部 。","docs.section.modes.imperativeTitle":"命令式","docs.section.modes.imperativeBody":"当你没有合适的封面 ,或不希望在组件树里多挂载节点时使用。可以从事件处理器、第三方回调或异步流程中调用,在任意位置弹出查看器。返回值是一个 destructor 闭包,用于手动关闭。","docs.section.modes.wrapperTitle":"包裹器","docs.section.modes.wrapperBody":"当渲染出的 HTML 不在你的控制之内时使用 —— markdown 输出、CMS 富文本、dangerouslySetInnerHTML 等。Wrapper 会从被点击的 读取 src / alt; backdrop、控制器、快捷键、动画、回调、set 等查看器配置仍然写在 上。","docs.section.modes.wrapperNote":"包裹器会在 componentDidMount / componentDidUpdate 期间查找子节点中的 img。包裹器渲染之后再注入的图片,需等到包裹器重新渲染时才会被绑定。传入 set 时,Wrapper 会用被点击图片的 src 匹配 set 并作为初始页;不传 set 时,可从 data-zmage-caption 或最近的 figcaption 读取 caption。","docs.section.theming.title":"主题集成","docs.section.theming.intro":"react-zmage 在设计上不感知宿主站点的主题系统 —— 它不读取 prefers-color-scheme,也不绑定任何 CSS 变量框架。是否切换深浅色完全由消费方决定:","docs.section.theming.bullet.backdrop":"通过 backdrop 属性传入查看器背景色(任意有效 CSS 颜色字符串)。默认值为白色 #FFFFFF。","docs.section.theming.bullet.icons":"控制器图标使用 SVG currentColor;在你的全局样式里覆盖即可与设计系统对齐。","docs.section.theming.bullet.scoped":"所有运行时样式作用域被收敛到 #zmage 容器内,不会污染外层应用。","docs.section.theming.defaultTitle":"默认行为","docs.section.theming.defaultBody":"不传 backdrop 时,查看器使用白色背景。这在浅色站点是无感的,在深色站点会与控制器白色图标产生对比丢失:","docs.section.theming.patternTitle":"组件用法 / 受控","docs.section.theming.patternBody":"从你已有的主题 hook(next-themes / 自家 ThemeProvider 等)读 resolved 值,映射到具体颜色后传给 backdrop。建议封装成一个本地组件,集中管理:","docs.section.theming.imperativeTitle":"命令式调用","docs.section.theming.imperativeBody":"在事件处理器中读取当前 DOM 状态(例如 document.documentElement 上的主题 class),换算成 backdrop 后再调用 Zmage.browsing:","docs.section.theming.iconsTitle":"与设计系统的图标颜色对齐","docs.section.theming.iconsBody":"控制器图标在 #zmage 容器内,可以用任意 CSS 选择器覆盖颜色。如果你用 CSS 变量做主题(Tailwind shadcn 等),直接绑定到设计令牌即可:","docs.section.theming.toolbarTitle":"将工具栏与蒙版背景解耦","docs.section.theming.toolbarBody":'默认情况下工具栏容器底色等于顶层 backdrop,图标用 currentColor 渲染。当 backdrop 是深色实色时,深色图标融在深色容器上,几乎不可辨。传 controller.backdrop (容器底色) 和 controller.color (图标色) 即可解耦。单按钮字符串覆盖 (例如 controller.zoom = "#ff8800") 仍优先于 controller.color。',"docs.search.desc.installation":"通过包管理器安装并引入样式表","docs.search.desc.ssr":"服务端渲染入口,import 时不会触碰 document","docs.search.desc.modes":"组件 / 命令式 / 包裹器 —— 三种调用方式","docs.search.desc.theming":"让查看器的背景与图标与你的站点主题保持一致","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"预设选择: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"controller、hotKey、animate 与 gesture 的默认组合","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget 等界面参数","docs.search.desc.propsController":"控制栏按钮、位置和自定义渲染","docs.search.desc.propsHotkey":"快捷键: ESC / 空格 / 方向键","docs.search.desc.propsAnimate":"浏览动画与翻页动画","docs.search.desc.propsGesture":"滚轮缩放、拖拽翻页、拖拽退出、双指缩放和双击缩放","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"受控的浏览状态","docs.search.desc.examples":"单图与多图画廊示例","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet 等类型声明","docs.search.desc.migration":"从 0.x 升级的注意事项","docs.search.desc.faq":"常见集成问题与版本相关的修复说明","docs.section.props.title":"API 参数","docs.section.props.intro":"BaseType 上的所有属性,在三种调用方式中均可使用。","docs.section.props.wrapperScope.title":"Wrapper 模式下的参数范围","docs.section.props.wrapperScope.intro":" 自己不渲染封面图,而是给已有的子级 绑定查看器。因此有些参数在包裹器模式下有不同语义。","docs.section.props.wrapperScope.data":"src 和 alt 应放在子级 上。顶层 src / alt 会被点击的 DOM 节点覆盖。不传 set 时,caption 可从 data-zmage-caption 或最近的 figcaption 读取。","docs.section.props.wrapperScope.config":"set 和 defaultPage 可用于显式共享图库。若被点击图片的 src 出现在 set 中,Wrapper 会打开匹配索引;defaultPage 只作为兜底。preset、controller、hotKey、animate、backdrop、zIndex、portalTarget、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay 正常生效。","docs.section.props.wrapperScope.lifecycle":"onBrowsing、onZooming、onSwitching、onRotating、onError 正常生效,因为 Wrapper 内部打开的是同一个查看器。","docs.section.props.wrapperScope.controlled":"browsing 是组件模式的受控态,不能控制 Wrapper。需要用外部状态打开时,使用组件模式,或自行调用 Zmage.browsing()。","docs.section.props.interface":"界面与交互","docs.section.props.portalTarget.title":"自定义 Portal 挂载点","docs.section.props.portalTarget.body":"默认情况下,浏览层挂到 document.body。若你的应用已经有统一的 overlay root、modal root、shadow host 或微前端 shell 容器,可以把该元素传给 portalTarget,方便统一管理层级、样式作用域和宿主框架的生命周期。","docs.section.props.portalTarget.boundary":"portalTarget 只改变 DOM 父节点。查看器仍使用 fixed 全屏布局,不会被挂载容器裁剪成局部预览;需要调整遮罩层级时继续使用 zIndex。","docs.section.props.controller.keyHeader":"名称","docs.section.props.controller.descHeader":"说明","docs.section.props.controller.umbrella":"rotate 是 rotateLeft / rotateRight 的组合开关 — 启用时同时显示左右两个旋转按钮;flip 与 flipLeft / flipRight 同理。","docs.section.props.controller.layoutTitle":"覆盖层布局","docs.section.props.controller.layoutIntro":"layout 只调整工具栏、左右翻页按钮、分页器和 caption 的覆盖层偏移,不参与图片首帧和缩放动画的几何计算。数值按 px 处理,字符串按 CSS 长度透传;标量 inset 会按目标自身进入方向生效,layout.mobile 会在移动端覆盖基础布局。","docs.section.props.controller.renderTitle":"自定义渲染","docs.section.props.controller.renderIntro":"render 接收 { state, actions, slots } 并返回 React 节点。返回 null 可隐藏整个控制器层;只想替换部分 UI 时可以复用 slots。","docs.section.props.hotkey.umbrella":"flip 是 flipLeft / flipRight 的组合开关, rotate 是 rotateLeft / rotateRight 的组合开关 — 启用任一组合时同时绑定左右两侧;每侧也可单独配置。每个 entry 支持字符串描述符 (如 'Mod+S' / 'BracketLeft') 自定义按键, Mod 跨平台代表 ⌘ (mac) 或 Ctrl (win/linux)。","docs.section.props.hotkey.customTitle":"自定义按键","docs.section.props.hotkey.customIntro":"每个 hotKey 入口接受 boolean (启/禁)、string (自定义描述符) 或 string[] (多绑)。描述符使用 e.code 命名 (按键物理位置, 与键盘布局无关), Mod 前缀跨平台代表 ⌘/Ctrl, 未声明的修饰键不可同时按下 (例如 Space 不会被 Cmd+Space 误触发)。","docs.section.props.hotkey.cheatsheetTitle":"描述符速查","docs.section.props.hotkey.cheatsheet.shorthand":"单字母 / 数字短形式自动归一化","docs.section.props.hotkey.cheatsheet.arrows":"方向键","docs.section.props.hotkey.cheatsheet.punct":"标点 / 符号 (按键物理名)","docs.section.props.hotkey.cheatsheet.whitespace":"空白 / 控制键","docs.section.props.hotkey.cheatsheet.modifier":"修饰键前缀 (用 + 拼接)","docs.section.props.animate.typeHeader":"类型","set.src.desc":"图片地址,必填项","set.alt.desc":"该张图片的标题","set.caption.desc":"该张图片下方的辅助文案;若提供则覆盖外层 caption","set.className.desc":"应用到该张图片的自定义类名","set.style.desc":"应用到该张图片的自定义内联样式","docs.section.props.preset.title":"预设默认值表","docs.section.props.preset.intro":"preset 是一组打包好的默认值,会作用于 controller / hotKey / animate / gesture 四组子参数。省略 preset 时默认使用 auto。auto 在运行时根据 matchMedia('(pointer: coarse) and (hover: none)') 解析为 desktop 或 mobile;SSR 与无 matchMedia 环境下回退到 desktop。","docs.section.props.preset.subParamHeader":"子参数","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"示例","docs.section.examples.singleTitle":"单图","docs.section.examples.galleryTitle":"多图画廊","docs.section.examples.mobileTitle":"移动端手势","docs.section.examples.mobileBody":"强制使用 mobile preset,在触控设备上体验拖曳切图、拖曳退出、双指缩放和单指双击缩放。","docs.section.examples.controllerTitle":"自定义控制器","docs.section.examples.controllerBody":"可以把控制器放到屏幕边缘,也可以用 render 回调完全替换 UI,回调会收到 state 和 actions。","docs.section.examples.coverTitle":"裁剪封面","docs.section.examples.coverBody":"把 object-fit 和圆角放在封面 img 本身,打开时的首帧就能匹配封面可见裁切区域。","docs.section.examples.portalTargetTitle":"挂到宿主 overlay root","docs.section.examples.portalTargetBody":"当页面有统一的弹层容器时,把该 DOM 节点传给 portalTarget。示例仍是全屏查看器,只是 Portal 的父节点换成了宿主 root。","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"类型与运行时导出位于同一处,完整的属性联合类型为 BaseType:","docs.section.typescript.refIntro":"组件接受 ref,会转发到封面 img:","docs.section.migration.title":"迁移指南","docs.section.migration.from":"从 0.x 升级:","docs.section.migration.bullet1":"组件是 forwardRef exotic;请勿使用 new Zmage()。","docs.section.migration.bullet2":"如果你引用的是 SSR 入口,请改为 react-zmage/ssr。","docs.section.faq.title":"常见问题","docs.section.faq.tailwind-shrink.q":"为什么用了 Tailwind / normalize.css / Bootstrap 后,大图打开时比封面更小?","docs.section.faq.tailwind-shrink.a":"这些样式重置默认设置 img { max-width: 100% },会把查看器内的大图限制成封面尺寸。1.1.2 之前的版本受此影响;1.1.2+ 已为 .imageLayer 内部 img 加了防御样式,建议升级到 >=1.1.2。","docs.section.faq.r19-imperative.q":"在 React 18 / 19 下 Zmage.browsing() 返回 undefined,为什么?","docs.section.faq.r19-imperative.a":"React 17 时 RENDER.REF.current?.outBrowsing 是同步可用的,React 18+ 提交是异步的,导致旧版本拿不到引用。1.1.2 已改为返回稳定的销毁闭包,升级到 >=1.1.2 即可。","docs.section.faq.wrapper-empty.q":"为什么 打开了一个空白查看器,且控制台报 src 为空?","docs.section.faq.wrapper-empty.a":"旧版包裹器把 defaultProps.src='' 直接展开覆盖了被点击 img 的 src。1.1.2 已改为读取被点击 DOM 节点上的真实 src / alt,升级即可解决。","docs.section.faq.vite-esm.q":'在 Vite / Next.js 浏览器端调用命令式 API 时报 "no compatible mount API",为什么?',"docs.section.faq.vite-esm.a":"1.1.2 之前用 require('react-dom/client') 做运行时探测,而浏览器 ESM 没有 require 全局。1.1.2 已改为静态 import,升级到 >=1.1.2 即可。","docs.section.faq.wrapper-dynamic.q":"我在挂载之后注入的 img 没有被包裹器绑定点击事件?","docs.section.faq.wrapper-dynamic.a":"包裹器只在 componentDidMount / componentDidUpdate 时查找子节点 img。如果你绕过 React 渲染树注入 DOM(例如 dangerouslySetInnerHTML 在父级未重渲染时改动),要么强制让包裹器重渲染,要么从你自己的点击处理器中调用 Zmage.browsing()。","docs.section.faq.lazy-src.q":"我的 用 data-src / 懒加载, src 是占位图 — 打开 Zmage 看到的也是占位图, 怎么办?","docs.section.faq.lazy-src.a":"Zmage 默认从 的 src 读图, 占位图就是它能看到的全部。把要预览的真实 URL 通过 set 显式传入即可: 。命令式调用同理: Zmage.browsing({ src: realUrl })。","docs.section.faq.cover-vs-set.q":"想在页面上放缩略图, 点开时显示高清大图 — 不传 set 行吗?","docs.section.faq.cover-vs-set.a":'不行。不传 set 时, cover 的 src 就是预览图; 要"小图入口 + 大图查看"必须显式分离: 。这套模式同时解决 data-src 懒加载 (上一条 FAQ) 和 CDN 多尺寸场景。如果你想要的是"图墙/网格 + 点击进入查看模式" (gallery UI), Zmage 不直接提供 — 把图墙自己渲染好, 点击时调用 Zmage.browsing({ src, set }) 即可。',"docs.section.faq.controlled-mismatch.q":"我的受控 browsing 属性和查看器实际状态总是对不上?","docs.section.faq.controlled-mismatch.a":"受控模式必须同时提供 browsing 和 onBrowsing。只传 browsing 时内部状态只会同步一次,之后就会漂移 —— 始终成对使用即可。","docs.section.faq.ssr.q":"在 Next.js / Remix / SSR 框架中怎么用 react-zmage?","docs.section.faq.ssr.a":"使用 react-zmage/ssr 入口,它在 import 时不会触碰 document。命令式 Zmage.browsing() 如果可能在服务端代码路径或渲染期间被调用,需要加 typeof window !== 'undefined' 的保护。","docs.section.faq.theme.q":"怎么让查看器跟随我的深色 / 浅色主题?","docs.section.faq.theme.a":"按照上方「主题集成」章节传入 backdrop 即可。本库刻意不感知主题系统,也不读 prefers-color-scheme,主题映射由你的应用决定。"},bR={"nav.playground":"Playground","nav.docs":"Docs","nav.ai":"AI install guide","nav.github":"GitHub","useCases.eyebrow":"Use cases","useCases.title":"React image preview for blogs, CMS, MDX, and news pages","useCases.body":"react-zmage is a React image viewer that turns ordinary elements into a fullscreen, origin-expand image preview. It supports galleries, keyboard navigation, mobile gestures, imperative opening, Wrapper mode for rich text, and SSR/RSC usage.","useCases.cta.docs":"Read docs","useCases.cta.wrapper":"Try Wrapper mode","useCases.card.blog.title":"Blog image preview","useCases.card.blog.body":"Make article images open fullscreen without replacing your post layout or building a separate gallery surface.","useCases.card.cms.title":"CMS rich text images","useCases.card.cms.body":"Wrap rendered HTML from a CMS, markdown parser, or editor output and let existing nodes open in the viewer.","useCases.card.news.title":"News article galleries","useCases.card.news.body":"Keep editorial pages readable while giving readers keyboard, gesture, and multi-image browsing when they need detail.","useCases.card.mdx.title":"MDX and documentation images","useCases.card.mdx.body":"Use Wrapper mode for docs pages where content authors control images but the React app owns the shell.","useCases.card.lightbox.title":"React lightbox alternative","useCases.card.lightbox.body":"Use a smaller image preview layer when you want origin-expand zoom and existing markup support instead of a full gallery framework.","useCases.card.ssr.title":"Next.js, SSR, and RSC","useCases.card.ssr.body":"Import the SSR-safe subpath for server-rendered apps, then open the interactive viewer from client boundaries.","useCases.mode.eyebrow":"Choosing a mode","useCases.mode.title":"Pick based on who owns the image markup","useCases.mode.component":"You own the JSX and can replace with .","useCases.mode.imperative":"A button, command, event, or callback should open the viewer.","useCases.mode.wrapper":"The images come from CMS, MDX, markdown, or rich text HTML.","useCases.facts.eyebrow":"Entity facts","useCases.facts.title":"The short version crawlers should understand","useCases.fact.react":"React 16.8 through 19","useCases.fact.modes":"Component, imperative, and Wrapper mode","useCases.fact.input":"Keyboard navigation and mobile gestures","useCases.fact.ssr":"SSR/RSC-safe import path","useCases.fact.gallery":"Gallery browsing without page restructuring","useCases.fact.origin":"Origin-expand fullscreen image preview","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Questions people and AI agents usually ask","useCases.faq.what.q":"What is react-zmage?","useCases.faq.what.a":"react-zmage is a React image viewer that turns ordinary elements into a fullscreen, origin-expand image preview with gallery browsing, keyboard navigation, mobile gestures, Wrapper mode, and SSR/RSC support.","useCases.faq.lightbox.q":"When should I use react-zmage instead of a React lightbox?","useCases.faq.lightbox.a":"Use react-zmage when you want existing images to open fullscreen without rebuilding the page around a gallery component. It works well for blogs, CMS rich text, MDX docs, news articles, and image-heavy content pages.","useCases.faq.richText.q":"Can react-zmage handle CMS, markdown, or rich text images?","useCases.faq.richText.a":"Yes. Zmage.Wrapper can bind descendant nodes inside CMS, markdown, MDX, or dangerouslySetInnerHTML content, while preserving the page markup and layout.","useCases.faq.ssr.q":"Does react-zmage support Next.js, SSR, or RSC?","useCases.faq.ssr.a":"Yes. Use the react-zmage/ssr subpath for SSR or RSC-safe imports, and call interactive viewer APIs from client-side event handlers or client components.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Let every ","hero.title.line2":"expand in place","hero.subtitle":"Turn any into a fullscreen image viewer that expands from its original position, with keyboard, gestures, and multi-image browsing.","hero.cta.start":"Read docs","hero.cta.playground":"Play with parameters","hero.ai.label":"AI install guide: read llms.txt first","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Copy quick prompt","hero.ai.copyLabel":"Copy quick AI prompt","hero.ai.viewLlms":"view llms.txt →","ai.badge":"AI install guide","ai.title":"Create a react-zmage agent integration prompt","ai.subtitle":"Start from llms.txt. Keep Auto so your agent can inspect the project first, or fine-tune the environment, image source, and interaction strategy before copying.","ai.field.agent":"Which agent are you using?","ai.field.depth":"Setup depth","ai.field.environment":"Project environment","ai.field.mode":"Usage mode","ai.field.imageSource":"Image source","ai.field.interaction":"Interaction strategy","ai.field.project":"Project description","ai.autoTip":"Keep Auto if you are unsure. Your agent will inspect the project structure, image source, render mode, and style entry before choosing the right Zmage mode and props.","ai.project.placeholder":"Describe your app, image source, and what the viewer should do.","ai.action.copy":"Copy setup prompt","ai.action.copied":"Copied","ai.action.openLlms":"Open llms.txt","ai.copy.error":"Copy failed. Select the prompt manually from the preview.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"Updates as you choose options","ai.preview.copy":"Copy","ai.preview.expand":"Expand","ai.preview.show":"Preview prompt","ai.preview.hide":"Hide preview","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Makes the prompt fit a general coding agent.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Let the agent inspect the project first.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Set integration preferences manually.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Live interaction surface","demo.title":"A story page built from Child's Dream","demo.body":"These images come from Child's Dream: an old book, a time portal, a fox companion, a forest route, and a crystal seal. Click any image and the first frame expands from that exact crop into the viewer.","demo.shiftHint":"Hold SHIFT while clicking an image to feel the smooth transition","demo.zoomHint":"Open a tile, press Space to enter zoom, then use the wheel to keep scaling.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"A dusty book in the library corner opens a doorway to old time.","demo.story.lead":"The plain words on the page turn into a miniature scene. The boy sees a forest rising from paper and hears a call from the other side of the barrier.","demo.story.middle":"A fox becomes his companion. After tides, canopies, and pink flamingos, the route leads deeper into the forest toward a crystal seal.","demo.tile.cover":"Old book and time portal","demo.tile.gallery":"First meeting in the woods","demo.tile.ratio":"Path at the tide edge","demo.tile.controller":"Crystal seal","demo.tile.zoom":"Flamingo stopover","demo.tile.lamp":"Light under the leaves","demo.tile.rescue":"Release in the forest","demo.feature.cover":"Cover clip and radius match","demo.feature.space":"Move the pointer to scan quickly while zoomed in","demo.feature.wheel":"Use the mouse wheel to scale smoothly","demo.feature.shift":"Shift slows open and close","demo.caption":"Click an image to open the viewer. On desktop, hold SHIFT while opening, then move the pointer or use the wheel after zooming in.","demo.scene.portal.alt":"A glowing time portal on an old book","demo.scene.portal.caption":"A time portal lights up inside the old book and a forest rises from the words.","demo.scene.forest.alt":"The boy meets a fox in the forest","demo.scene.forest.caption":"The fox appears among the trees and becomes the boy's companion.","demo.scene.tide.alt":"The boy stands at the edge of a tide","demo.scene.tide.caption":"The water curls into a spiral and points toward the next unknown path.","demo.scene.canopy.alt":"The boy lies under a giant canopy","demo.scene.canopy.caption":"The canopy opens like pages while small lights mark the route.","demo.scene.flamingo.alt":"The boy sits among pink flamingos","demo.scene.flamingo.caption":"A flock of light flamingos gives the journey a quiet pause.","demo.scene.lamp.alt":"The boy lights a lamp under broad leaves","demo.scene.lamp.caption":"Leaves hold back the dark while the lamp reveals clues in the book.","demo.scene.crystal.alt":"The boy stands before a crystal seal","demo.scene.crystal.caption":"The crystal seal begins to show itself deep in the forest.","demo.scene.rescue.alt":"The fox and the boy approach the crystal seal","demo.scene.rescue.caption":"The key nears the crystal and the secret inside the seal is about to open.","feature.dropin.title":"Origin Expand","feature.dropin.hint":"Open from the image's original position, size, radius, and crop; close back to the same place.","feature.mobile.title":"Mobile ready","feature.mobile.hint":"Auto preset selects touch behavior: swipe between images, drag down to close, double tap, and pinch zoom.","feature.set.title":"Complete browsing tools","feature.set.hint":"Zoom, rotate, flip, download, and captions share one browsing state, even across multi-image sets.","feature.ssr.title":"SSR/RSC friendly","feature.ssr.hint":"Use the server-safe entry in Next.js, SSR, or RSC projects, then keep viewer interaction inside client boundaries.","modes.title":"Fit the page you already have","modes.component.label":"Component mode","modes.component.desc":"When you control JSX, replace with and keep native props passing through.","modes.imperative.label":"Imperative call","modes.imperative.desc":"Open the viewer from buttons, callbacks, or async flows without requiring a cover image.","modes.wrapper.label":"Wrapper mode","modes.wrapper.desc":"Wrap Markdown / CMS / dangerouslySetInnerHTML so inner images expand in place automatically.","modes.try":"Open example →","modes.component.when":"Choose component mode when you control the JSX you render. Replace any with ; native props keep passing through, and open / close uses the same in-place transition.","modes.imperative.when":"Choose the imperative call when the entry point is not the image itself. Open the viewer from event handlers, third-party callbacks, or async flows without mounting a cover .","modes.wrapper.when":"Choose wrapper mode when you don't control the rendered HTML — markdown output, CMS rich text, dangerouslySetInnerHTML. Wrap the subtree and every inner automatically gains the viewer.","footer.project":"Project","footer.repo":"Repository","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Use cases","footer.madeby":"Made by","footer.illustrator":"Illustrator","footer.license":"MIT License","pg.title":"Playground","pg.subtitle":"Tweak every prop and watch the viewer react in real time.","pg.reset":"Reset","pg.share":"Share","pg.shared":"Link copied","pg.tab.component":"Component","pg.tab.imperative":"Imperative","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Tip: Space to zoom · ←/→ to flip · ESC to close","pg.preview.trigger":"Trigger viewer","pg.params.title":"Parameters","pg.params.subtitle":"Hover a prop name for help, or use the book icon to open its docs.","pg.events.title":"Events","pg.events.subtitle":"Lifecycle callback output for the current session.","pg.events.empty":"Enable any lifecycle callback to see events stream here.","pg.code.title":"Code","pg.code.subtitle":"Copy-ready code for the active mode.","pg.code.hideDefaults":"Hide defaults","pg.copy":"Copy","pg.copied":"Copied","pg.portalTarget.title":"Custom Portal target","pg.portalTarget.body":"For apps that already own an overlay root, modal root, or micro-frontend container. Click the image on the right and the viewer mounts there instead of document.body.","pg.portalTarget.root":"Host overlay root","pg.portalTarget.imageAlt":"Portal target demo image","group.data":"Data","group.preset":"Preset","group.interface":"Interface","group.controller":"Controller","group.hotkey":"HotKey","group.animate":"Animate","group.gesture":"Gesture","group.lifecycle":"Lifecycle","group.controlled":"Controlled","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Desktop scope","common.presetScope.desktop.desc":"Desktop-focused parameter. The desktop preset enables it by default or is the only environment where it has practical effect.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Mobile scope","common.presetScope.mobile.desc":"Mobile or touch-focused parameter. The mobile preset enables it by default or it only matters for touch interaction.","common.expand":"Expand","common.required":"Required","common.default":"Default","common.add":"Add","common.remove":"Remove","common.enable":"Enable","common.disable":"Disable","param.viewInDocs":"View in docs","docs.title":"API Reference","docs.search.placeholder":"Search docs...","docs.search.empty":"No matches","docs.toc.title":"On this page","docs.sidebar.gettingStarted":"Getting started","docs.sidebar.quickstart":"Quickstart","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Concepts","docs.sidebar.modes":"Modes","docs.sidebar.theming":"Theming","docs.sidebar.props":"Props","docs.sidebar.recipes":"Recipes","docs.sidebar.examples":"Examples","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Reference","docs.sidebar.migration":"Migration","docs.sidebar.faq":"FAQ","preset.desktop":"Desktop","preset.mobile":"Mobile","preset.auto":"Auto","animate.flip.fade":"Fade","animate.flip.crossFade":"Cross fade","animate.flip.swipe":"Swipe","animate.flip.zoom":"Zoom","animate.flip.blur":"Blur","animate.flip.none":"None","animate.slowMotion":"Slow motion","gesture.swipe":"Swipe","gesture.dragExit":"Drag exit","gesture.wheelZoom":"Wheel zoom","gesture.pinchZoom":"Pinch zoom","gesture.doubleTapZoom":"Double-tap zoom","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Preset-driven gesture config. Desktop preset enables wheel zoom while zoomed; mobile preset enables drag paging, drag-to-exit, pinch zoom, and double-tap zoom.","gesture.swipe.desc":"Horizontal drag paging within a set. Ignored for single-image viewers.","gesture.dragExit.desc":"Vertical drag-to-exit. Closes through the existing onBrowsing(false) close path.","gesture.wheelZoom.desc":"Mouse-wheel or trackpad zoom while the viewer is already zoomed. Desktop preset enables it; mobile preset disables it.","gesture.pinchZoom.desc":"Two-finger pinch zoom on mobile. Shrinking back to the fit scale exits zoom and recenters the image.","gesture.doubleTapZoom.desc":"Single-finger double tap on mobile. First double tap zooms around the tap position; double tap while zoomed returns to the fit view.","gesture.touchAction.desc":"CSS touch-action strategy. managed chooses none for pinch zoom and manipulation for double-tap-only setups; explicit values are passed through.","gesture.threshold.desc":"Minimum drag distance required to accept the gesture, in px.","gesture.velocity.desc":"Minimum velocity required to accept the gesture, in px/ms.","gesture.axisLock.desc":"Axis-lock ratio used to avoid diagonal movement triggering both horizontal and vertical gestures.","gesture.resistance.desc":"Boundary resistance ratio when loop=false and the viewer is at the first or last image.","gesture.opacity.desc":"Whether vertical drag-to-exit lowers image opacity as drag distance grows.","gesture.wheelZoom.step.desc":"Wheel zoom sensitivity. Higher values zoom faster for the same wheel delta.","gesture.wheelZoom.smooth.desc":"Interpolate wheel zoom through the existing zoom-follow RAF instead of snapping immediately.","gesture.wheelZoom.minScale.desc":"Minimum wheel zoom scale. Reaching it with zoom-out exits zoom mode.","gesture.wheelZoom.maxScale.desc":"Maximum wheel zoom scale.","gesture.wheelZoom.center.desc":"Wheel zoom focal point: pointer uses the wheel event position; viewport uses the screen center.","gesture.wheelZoom.reverse.desc":"Reverse wheel zoom direction while keeping all other wheel behavior unchanged.","gesture.wheelZoom.exitGuardDuration.desc":"Protection time after wheel zoom-out exits zoom mode, in ms. Residual wheel events are ignored during this window.","gesture.pinchZoom.minScale.desc":"Minimum pinch scale. fit means the screen-fitting browsing size.","gesture.pinchZoom.maxScale.desc":"Maximum pinch scale.","gesture.pinchZoom.resetBelowFit.desc":"When pinch shrinks to the fit scale, exit zoom and recenter the image.","gesture.pinchZoom.center.desc":"Pinch focal point: gesture uses the two-finger midpoint; viewport uses the screen center.","gesture.doubleTapZoom.scale.desc":"Target scale for entering zoom with a double tap.","gesture.doubleTapZoom.minScale.desc":"Minimum scale used to clamp double-tap zoom.","gesture.doubleTapZoom.maxScale.desc":"Maximum scale used to clamp double-tap zoom.","gesture.doubleTapZoom.center.desc":"Double-tap focal point: tap uses the tap position; viewport uses the screen center.","gesture.doubleTapZoom.interval.desc":"Maximum time between taps, in ms.","gesture.doubleTapZoom.distance.desc":"Maximum movement between taps, in px.","controller.pagination":"Pagination","controller.rotate":"Rotate","controller.rotateLeft":"Rotate left","controller.rotateRight":"Rotate right","controller.zoom":"Zoom","controller.download":"Download","controller.close":"Close","controller.flip":"Flip","controller.flipLeft":"Previous","controller.flipRight":"Next","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Top-bar page indicator showing current position / total pages","controller.rotate.desc":"Rotation control group (includes left and right buttons)","controller.rotateLeft.desc":"Rotate 90° counter-clockwise","controller.rotateRight.desc":"Rotate 90° clockwise","controller.zoom.desc":"Enter / leave 1:1 zoom mode","controller.download.desc":"Download the current image","controller.close.desc":"Close the viewer","controller.flip.desc":"Flip control group (includes previous and next buttons)","controller.flipLeft.desc":"Move to the previous image","controller.flipRight.desc":"Move to the next image","controller.backdrop.desc":"Toolbar background. Falls back to top-level `backdrop` when omitted. Set to a translucent value (e.g. `rgba(0,0,0,0.4)`) when `backdrop` is solid dark.","controller.color.desc":'Toolbar icon color. Falls back to `currentColor` when omitted. Per-button string overrides (e.g. `controller.zoom = "#ff8800"`) still take precedence.',"controller.placement.desc":"Toolbar placement. Only moves the toolbar capsule; side flip buttons and pagination keep their normal positions.","controller.layout.desc":"Adjust safe insets for the toolbar, side flip buttons, pagination, and caption. Numbers are px, strings are CSS lengths; scalar inset follows each target's natural entry edge, and layout.mobile overrides the mobile preset.","controller.layout.toolbarInset.desc":"Safe inset for the toolbar. A scalar follows the current placement and applies to the matching top / right / bottom / left edge.","controller.layout.flipInset.desc":"Safe inset for the side flip buttons. A scalar applies to both left and right buttons.","controller.layout.paginationInset.desc":"Safe inset for pagination dots. A scalar applies to the pagination bottom entry edge, useful when caption or custom page UI needs extra space.","controller.layout.captionInset.desc":"Safe inset for the caption. A scalar applies to the caption bottom entry edge, useful when it should sit above pagination or bottom controls.","controller.render.desc":"Fully custom controller render callback. Receives state, actions, and built-in slots; disabled when controller=false.","controller.overriddenBy":"Enabled by","snippet.overriddenByProp":"overridden by {umbrella}","hotkey.close":"Close (Escape)","hotkey.zoom":"Zoom (Space)","hotkey.flip":"Flip (←/→)","hotkey.flipLeft":"Previous (←)","hotkey.flipRight":"Next (→)","hotkey.rotate":"Rotate ([ / ])","hotkey.rotateLeft":"Rotate left ([)","hotkey.rotateRight":"Rotate right (])","hotkey.download":"Download (Mod+S)","hotkey.close.desc":"Press Escape to close the viewer","hotkey.zoom.desc":"Press Space to toggle 1:1 zoom mode","hotkey.flip.desc":"Press ← / → to flip pages within a set","hotkey.flipLeft.desc":"Press ← to move to the previous image","hotkey.flipRight.desc":"Press → to move to the next image","hotkey.rotate.desc":"Press [ / ] to rotate the image (umbrella; binds both directions)","hotkey.rotateLeft.desc":"Press [ to rotate counterclockwise 90°","hotkey.rotateRight.desc":"Press ] to rotate clockwise 90°","hotkey.download.desc":'Press Cmd+S (macOS) or Ctrl+S (Windows/Linux) to download the current image. Off by default — opt in to hijack the browser "Save Page As" shortcut.',"animate.browsing.desc":"Open / close transition for the viewer","animate.flip.desc":"Transition style when flipping pages within a set","animate.slowMotion.desc":"When enabled, holding Shift while opening or closing slows the full browsing transition to 10x for inspection or demos","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"Image URL. Required.","param.alt.label":"alt","param.alt.desc":"Image title, shown above the viewer.","param.caption.label":"caption","param.caption.desc":"Caption below the viewer. string for the default pill, or { text, style?, className? } to customize. set[i].caption may override per page.","param.set.label":"set","param.set.desc":"Multi-image set; enables gallery mode with arrow-key navigation.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Initial page index (0-based).","param.preset.label":"preset","param.preset.desc":"Preset bundle; defaults to auto and drives controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Viewer backdrop color. Any valid CSS color.","param.zIndex.label":"zIndex","param.zIndex.desc":"Stacking level for the viewer.","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"DOM element used as the viewer Portal mount target. Defaults to document.body. Use it with an app overlay root, modal root, or micro-frontend container; it changes only the mount parent and the viewer still uses fullscreen fixed positioning.","param.radius.label":"radius","param.radius.desc":"Image corner radius (px).","param.edge.label":"edge","param.edge.desc":"Minimum margin between image and viewport (px).","param.loop.label":"loop","param.loop.desc":"Loop back to the first image when reaching the end.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Close the viewer when the page scrolls.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Close the viewer on image double-click. Off by default; turn on to dismiss with a double-click.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Keep the cover image visible while browsing.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Delay (ms) before showing the loading indicator. If the image loads within this window, the indicator never appears — prevents the flash on cached page changes. Default 200ms (industry-standard react-loadable value); set 0 for legacy instant-show.","param.controller.label":"controller","param.controller.desc":"Control-bar config. Pass false to disable all, or a partial object to override buttons, placement, overlay layout, and custom render.","param.hotKey.label":"hotKey","param.hotKey.desc":"Keyboard shortcuts.","param.animate.label":"animate","param.animate.desc":"Animation config: browsing, cover geometry, slow motion, and flip animation.","param.gesture.label":"gesture","param.gesture.desc":"Preset-driven gesture config. Desktop enables wheelZoom while zoomed; mobile enables swipe, dragExit, pinchZoom, and doubleTapZoom by default. gesture=false disables all.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Fired when the viewer opens/closes (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Fired when entering/leaving zoom mode (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Fired on page change (new page index).","param.onRotating.label":"onRotating","param.onRotating.desc":"Fired on rotation (degrees).","param.onError.label":"onError","param.onError.desc":"Fired when an image (cover or viewer) fails to load. Receives the SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"Controlled browsing state. Providing this switches to controlled mode; pair with onBrowsing.","playground.preset.aria":"Switch data preset","playground.preset.default.label":"Default","playground.preset.default.hint":"Childs Dream · 2 imgs","playground.preset.testset.label":"Test set","playground.preset.testset.hint":"6 imgs · ratios + formats","docs.section.installation.title":"Installation","docs.section.installation.intro":"Install via your package manager:","docs.section.installation.agent":"AI agents should read https://zmage.caldis.me/llms.txt first, then keep basic integrations minimal.","docs.section.installation.then":"Then import the component and its stylesheet:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"For server-rendered apps, use the /ssr entry to avoid touching document at import time:","docs.section.modes.title":"Three modes","docs.section.modes.intro":"react-zmage exposes the same configuration surface through three call shapes; which one to pick depends on how much control you have over the rendered HTML:","docs.section.modes.componentTitle":"Component","docs.section.modes.componentBody":"The default — use this when you control the JSX you render. Swap any for ; every native HTML attribute (className, style, onClick, etc.) passes through to the underlying .","docs.section.modes.imperativeTitle":"Imperative","docs.section.modes.imperativeBody":"Reach for this when you have no good cover , or don't want to mount extra nodes in your component tree. Call from event handlers, async callbacks, or third-party widgets to open the viewer from anywhere. Returns a destructor closure for manual close.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"Use this when you don't control the rendered HTML — markdown output, CMS rich text, dangerouslySetInnerHTML. Wrapper reads src / alt from the clicked ; viewer props such as backdrop, controls, hotkeys, animation, callbacks, and set stay on .","docs.section.modes.wrapperNote":"Wrapper queries img children during componentDidMount / componentDidUpdate. Imgs injected after the wrapper renders won't get bound until the wrapper re-renders. If set is supplied, the clicked img's src is matched against set and used as the initial page; if no set is supplied, data-zmage-caption or the nearest figcaption can become the viewer caption.","docs.section.theming.title":"Theming","docs.section.theming.intro":"react-zmage is intentionally agnostic to the host site's theme system — it does not read prefers-color-scheme and is not bound to any CSS-variable framework. Light/dark integration is the consumer's responsibility:","docs.section.theming.bullet.backdrop":"The viewer backdrop is set via the `backdrop` prop (any valid CSS color string). Default is white (#FFFFFF).","docs.section.theming.bullet.icons":"Control-bar icons render with SVG `currentColor`; override via your global CSS to align with your design system.","docs.section.theming.bullet.scoped":"All runtime styles are scoped under the `#zmage` portal container; they will not bleed into the rest of your app.","docs.section.theming.defaultTitle":"Default behavior","docs.section.theming.defaultBody":"When you omit `backdrop`, the viewer renders with a white panel. This is fine on light sites but produces poor contrast against the white control-bar icons on a dark site:","docs.section.theming.patternTitle":"Component / controlled usage","docs.section.theming.patternBody":"Read your existing theme hook (next-themes, a custom ThemeProvider, etc.), map the resolved value to a color, and pass it as `backdrop`. Wrapping in a small local component keeps the call sites clean:","docs.section.theming.imperativeTitle":"Imperative usage","docs.section.theming.imperativeBody":"In an event handler, read the current DOM state (e.g. a theme class on `documentElement`), translate it to a color, then pass it to `Zmage.browsing`:","docs.section.theming.iconsTitle":"Aligning icons with the design system","docs.section.theming.iconsBody":"Control icons live inside the `#zmage` container; override their color from your global CSS. If you use CSS variables for theming (Tailwind / shadcn / vanilla tokens), bind directly to the design token:","docs.section.theming.toolbarTitle":"Decoupling the toolbar from the modal backdrop","docs.section.theming.toolbarBody":'By default the toolbar capsule shares the modal `backdrop` and icons render with `currentColor`. On a solid dark `backdrop` that means dark icons on a dark capsule — invisible. Pass `controller.backdrop` (capsule color) and `controller.color` (icon color) to decouple them. Per-button string overrides (e.g. `controller.zoom = "#ff8800"`) still take precedence over `controller.color`.',"docs.search.desc.installation":"Install via your package manager and import the stylesheet","docs.search.desc.ssr":"Server-side-rendering entry that does not touch document at import time","docs.search.desc.modes":"Component / imperative / wrapper — three ways to invoke the viewer","docs.search.desc.theming":"Align the viewer backdrop and icons with your host site theme","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Preset selection: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Default controller, hotKey, animate, and gesture bundles","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget and other UI knobs","docs.search.desc.propsController":"Buttons, placement, and custom controller render","docs.search.desc.propsHotkey":"Keyboard shortcuts: ESC / Space / arrows","docs.search.desc.propsAnimate":"Browsing and flip animations","docs.search.desc.propsGesture":"Wheel zoom, drag paging, drag-to-exit, pinch, and double-tap zoom","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"Controlled browsing state","docs.search.desc.examples":"Single image and multi-image gallery examples","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet type declarations","docs.search.desc.migration":"Upgrade notes from 0.x","docs.search.desc.faq":"Common integration gotchas and version-specific fixes","docs.section.props.title":"Props","docs.section.props.intro":"Every prop on BaseType can be passed in any of the three modes.","docs.section.props.wrapperScope.title":"Wrapper mode prop scope","docs.section.props.wrapperScope.intro":" does not render the cover image itself. It binds existing descendant nodes, so a few props have wrapper-specific meaning.","docs.section.props.wrapperScope.data":"src and alt should live on the child . Top-level src / alt are overridden by the clicked DOM node. caption may be read from data-zmage-caption or the nearest figcaption when no set is supplied.","docs.section.props.wrapperScope.config":"set and defaultPage are supported for an explicit shared gallery. When the clicked img src appears in set, Wrapper opens that matching index; defaultPage is only the fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, and loadingDelay apply normally.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating, and onError work because Wrapper opens the same viewer internally.","docs.section.props.wrapperScope.controlled":"browsing is component-controlled state and does not control Wrapper. To open from your own state, use component mode or call Zmage.browsing() yourself.","docs.section.props.interface":"Interface & interaction","docs.section.props.portalTarget.title":"Custom Portal target","docs.section.props.portalTarget.body":"By default, the viewer layer mounts into document.body. If your app already has an overlay root, modal root, shadow host, or micro-frontend shell container, pass that element to portalTarget so stacking, style scope, and host lifecycle stay under your app shell.","docs.section.props.portalTarget.boundary":"portalTarget changes only the DOM parent. The viewer still uses fullscreen fixed positioning and is not clipped into a local preview; use zIndex when you need to adjust stacking.","docs.section.props.controller.keyHeader":"Key","docs.section.props.controller.descHeader":"Description","docs.section.props.controller.umbrella":"rotate is the umbrella for rotateLeft / rotateRight — enabling it shows both buttons. flip works the same way over flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Overlay layout","docs.section.props.controller.layoutIntro":"layout only offsets toolbar, side flip, pagination, and caption overlays; it does not participate in first-frame or zoom geometry. Numbers are px, strings are CSS lengths, scalar inset follows each target's natural entry edge, and layout.mobile overrides the base layout on mobile.","docs.section.props.controller.renderTitle":"Custom render","docs.section.props.controller.renderIntro":"render receives { state, actions, slots } and must return a React node. Return null to hide the controller layer; reuse slots when you only want to replace part of the UI.","docs.section.props.hotkey.umbrella":"flip is the umbrella for flipLeft / flipRight, and rotate is the umbrella for rotateLeft / rotateRight — enabling either binds both side keys. Each entry also accepts a string descriptor like 'Mod+S' or 'BracketLeft' to override the default binding (Mod = ⌘ on macOS, Ctrl on Windows/Linux).","docs.section.props.hotkey.customTitle":"Custom bindings","docs.section.props.hotkey.customIntro":"Each hotKey entry accepts a boolean (on/off), a string (custom descriptor), or a string[] (multiple bindings). Descriptors use e.code names — physical key positions, layout-independent. Modifier prefixes use Mod for cross-platform ⌘/Ctrl. Strict modifier matching: undeclared modifiers must NOT be pressed (e.g. Space is never matched by Cmd+Space).","docs.section.props.hotkey.cheatsheetTitle":"Descriptor cheatsheet","docs.section.props.hotkey.cheatsheet.shorthand":"single letters / digits auto-normalized","docs.section.props.hotkey.cheatsheet.arrows":"arrow keys","docs.section.props.hotkey.cheatsheet.punct":"punctuation (physical key names)","docs.section.props.hotkey.cheatsheet.whitespace":"whitespace / control keys","docs.section.props.hotkey.cheatsheet.modifier":"modifier prefixes (chain with +)","docs.section.props.animate.typeHeader":"Type","set.src.desc":"Image URL — required","set.alt.desc":"Image title for this entry","set.caption.desc":"Caption below this entry; overrides the outer caption when provided","set.className.desc":"Custom class applied to this entry","set.style.desc":"Custom inline style applied to this entry","docs.section.props.preset.title":"Preset bundles","docs.section.props.preset.intro":"preset is a bundle of defaults applied to the controller / hotKey / animate / gesture sub-objects. Omitting preset uses auto. auto is resolved at runtime via matchMedia('(pointer: coarse) and (hover: none)') to either desktop or mobile, falling back to desktop under SSR or when matchMedia is unavailable.","docs.section.props.preset.subParamHeader":"Sub-param","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Examples","docs.section.examples.singleTitle":"Single image","docs.section.examples.galleryTitle":"Multi-image gallery","docs.section.examples.mobileTitle":"Mobile gestures","docs.section.examples.mobileBody":"Force the mobile preset to try drag paging, drag-to-exit, pinch zoom, and double-tap zoom on touch devices.","docs.section.examples.controllerTitle":"Custom controller","docs.section.examples.controllerBody":"Place the controller at a screen edge, or replace the full UI with a render callback that receives state and actions.","docs.section.examples.coverTitle":"Cropped cover","docs.section.examples.coverBody":"Put object-fit and border radius on the cover img itself so the opening frame can match the visible crop.","docs.section.examples.portalTargetTitle":"Mount into a host overlay root","docs.section.examples.portalTargetBody":"When the page has a shared overlay container, pass that DOM node to portalTarget. The example is still fullscreen; only the Portal parent changes to the host root.","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Types are co-located with the runtime export. The full prop union is BaseType:","docs.section.typescript.refIntro":"The component accepts a ref, which forwards to the cover img:","docs.section.migration.title":"Migration","docs.section.migration.from":"Upgrading from 0.x:","docs.section.migration.bullet1":"Component is a forwardRef exotic; do not new Zmage().","docs.section.migration.bullet2":"If you import the SSR entry, switch to react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"Why does the modal image start smaller than the cover when I use Tailwind / normalize.css / Bootstrap?","docs.section.faq.tailwind-shrink.a":"Those resets ship a global `img { max-width: 100% }` which clamps the modal image to its cover size. Versions before 1.1.2 were affected; 1.1.2+ defends `.imageLayer` against this. Upgrade to >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` returns undefined under React 18 / 19 — why?","docs.section.faq.r19-imperative.a":"Latent bug fixed in 1.1.2. The old code read `RENDER.REF.current?.outBrowsing` synchronously, which worked under React 17 but breaks under R18+ (commits are async). 1.1.2 returns a stable destructor closure — upgrade to >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` opens a blank modal and the browser warns about empty src. Why?","docs.section.faq.wrapper-empty.a":"The wrapper used to spread `defaultProps.src=''` over the clicked img, blanking out src/alt. 1.1.2 reads the clicked DOM node's src/alt explicitly. Upgrade to fix.","docs.section.faq.vite-esm.q":'Imperative API throws "no compatible mount API" in Vite / Next.js client. Why?',"docs.section.faq.vite-esm.a":"Pre-1.1.2 used `require('react-dom/client')` for runtime detection, but browser ESM has no `require` global. 1.1.2 switches to a static import — upgrade to >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"Wrapper isn't binding click handlers to images I added after mount.","docs.section.faq.wrapper-dynamic.a":"Wrapper queries `` only in `componentDidMount` and `componentDidUpdate`. If you inject DOM imgs outside React's render tree (e.g. dangerouslySetInnerHTML changing without a parent re-render), force the wrapper to re-render — or call `Zmage.browsing()` from your own click handler instead.","docs.section.faq.lazy-src.q":"My `` uses lazy-loading with `data-src` — opening Zmage shows the placeholder, not the real image. How do I fix it?","docs.section.faq.lazy-src.a":"Zmage reads the cover ``'s `src` by default — the placeholder is all it sees. Pass the real URL explicitly via `set`: ``. Same idea for the imperative call: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"I want a thumbnail on the page and the full-resolution image when clicked — can I skip `set`?","docs.section.faq.cover-vs-set.a":'No. Without `set`, the cover `src` is what the viewer shows. To get a "thumbnail entrypoint + full-size viewer", separate them explicitly: ``. The same pattern handles lazy-loaded `data-src` (FAQ above) and CDN multi-resolution. If you want a "grid/gallery + open viewer" UI, Zmage doesn\'t provide that — render the gallery yourself and call `Zmage.browsing({ src, set })` on click.',"docs.section.faq.controlled-mismatch.q":"My controlled `browsing` prop and the modal state are out of sync.","docs.section.faq.controlled-mismatch.a":"Controlled mode requires both `browsing` and `onBrowsing`. If you pass only `browsing` (no callback), internal state syncs once and then drifts. Always pair them.","docs.section.faq.ssr.q":"How do I use react-zmage in Next.js / Remix / SSR frameworks?","docs.section.faq.ssr.a":"Use the `react-zmage/ssr` entry — it avoids touching `document` at import time. The imperative `Zmage.browsing()` still needs a `typeof window !== 'undefined'` guard if it might run during render or in a server-only path.","docs.section.faq.theme.q":"How do I make the viewer follow my dark/light theme?","docs.section.faq.theme.a":"Pass `backdrop` per the Theming section above. The library is theme-agnostic by design and does not read prefers-color-scheme — your app owns the mapping."},vR={"nav.playground":"プレイグラウンド","nav.docs":"ドキュメント","nav.ai":"AI 導入ガイド","nav.github":"GitHub","useCases.eyebrow":"ユースケース","useCases.title":"ブログ、CMS、MDX、ニュース向けの React 画像プレビュー","useCases.body":"react-zmage は、通常の を元の位置から開くフルスクリーン画像プレビューに変える React 画像ビューアです。ギャラリー、キーボード操作、モバイルジェスチャー、命令的な起動、リッチテキスト向け Wrapper モード、SSR/RSC に対応します。","useCases.cta.docs":"ドキュメントを見る","useCases.cta.wrapper":"Wrapper モードを試す","useCases.card.blog.title":"ブログ画像プレビュー","useCases.card.blog.body":"記事レイアウトを置き換えたり別のギャラリー画面を作ったりせずに、記事内画像をフルスクリーンで開けます。","useCases.card.cms.title":"CMS リッチテキスト画像","useCases.card.cms.body":"CMS、Markdown パーサー、エディターが出力した HTML を包み、既存の からビューアを開けます。","useCases.card.news.title":"ニュース記事ギャラリー","useCases.card.news.body":"記事本文の読みやすさを保ちつつ、詳細を見たい時だけキーボード、ジェスチャー、複数画像閲覧を使えます。","useCases.card.mdx.title":"MDX とドキュメント画像","useCases.card.mdx.body":"画像はコンテンツ作者が管理し、React アプリがページシェルを持つドキュメントでは Wrapper モードが使えます。","useCases.card.lightbox.title":"React lightbox の代替","useCases.card.lightbox.body":"完全なギャラリー基盤ではなく、元位置から開く画像プレビューと既存マークアップの維持だけが必要な時に使えます。","useCases.card.ssr.title":"Next.js、SSR、RSC","useCases.card.ssr.body":"サーバーレンダリングアプリでは SSR 安全なサブパスを import し、クライアント境界からインタラクティブなビューアを開きます。","useCases.mode.eyebrow":"モード選択","useCases.mode.title":"画像マークアップを誰が持つかで選ぶ","useCases.mode.component":"JSX を管理していて、 に置き換えられる場合。","useCases.mode.imperative":"ボタン、コマンド、イベント、コールバックからビューアを開きたい場合。","useCases.mode.wrapper":"画像が CMS、MDX、Markdown、リッチテキスト HTML から来る場合。","useCases.facts.eyebrow":"エンティティ情報","useCases.facts.title":"クローラーに伝えたい短い事実","useCases.fact.react":"React 16.8 から 19 まで対応","useCases.fact.modes":"Component、imperative、Wrapper モード","useCases.fact.input":"キーボード操作とモバイルジェスチャー","useCases.fact.ssr":"SSR/RSC 安全な import パス","useCases.fact.gallery":"ページを組み替えずに複数画像を閲覧","useCases.fact.origin":"元位置から開くフルスクリーン画像プレビュー","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"人と AI Agent がよく聞くこと","useCases.faq.what.q":"react-zmage とは?","useCases.faq.what.a":"react-zmage は、通常の を元位置から開くフルスクリーン画像プレビューに変える React 画像ビューアです。ギャラリー、キーボード操作、モバイルジェスチャー、Wrapper モード、SSR/RSC に対応します。","useCases.faq.lightbox.q":"React lightbox ではなく react-zmage を使うのはどんな時?","useCases.faq.lightbox.a":"既存画像をフルスクリーンで見せたいが、ページ全体をギャラリーコンポーネント中心に作り直したくない時に向いています。ブログ、CMS リッチテキスト、MDX ドキュメント、ニュース記事、画像の多いコンテンツページに合います。","useCases.faq.richText.q":"CMS、Markdown、リッチテキスト画像も扱えますか?","useCases.faq.richText.a":"はい。Zmage.Wrapper は CMS、Markdown、MDX、dangerouslySetInnerHTML の中にある子孫 をバインドし、既存のマークアップとレイアウトを保てます。","useCases.faq.ssr.q":"Next.js、SSR、RSC に対応していますか?","useCases.faq.ssr.a":"はい。SSR や RSC では react-zmage/ssr サブパスから import し、インタラクティブな API はクライアントイベントや Client Component から呼び出します。","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"すべての を","hero.title.line2":"元の位置から開く","hero.subtitle":"任意の を、元の位置から開くフルスクリーン画像ビューアに変えます。キーボード、ジェスチャー、複数画像の閲覧に対応します。","hero.cta.start":"ドキュメントを見る","hero.cta.playground":"各種パラメータを試す","hero.ai.label":"AI 導入ガイド: まず llms.txt を読む","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"クイック Prompt をコピー","hero.ai.copyLabel":"クイック AI Prompt をコピー","hero.ai.viewLlms":"llms.txt を表示 →","ai.badge":"AI 導入ガイド","ai.title":"react-zmage の Agent 統合 Prompt を作成","ai.subtitle":"まず llms.txt から始めてください。Auto のままにすると Agent が先にプロジェクトを確認します。必要なら環境、画像ソース、操作方針を細かく指定できます。","ai.field.agent":"どの Agent を使いますか?","ai.field.depth":"設定の深さ","ai.field.environment":"プロジェクト環境","ai.field.mode":"使用モード","ai.field.imageSource":"画像ソース","ai.field.interaction":"インタラクション方針","ai.field.project":"プロジェクト説明","ai.autoTip":"迷ったら Auto のままで構いません。Agent が先にプロジェクト構造、画像ソース、レンダリング方式、スタイル入口を確認し、適切な Zmage モードと props を選びます。","ai.project.placeholder":"アプリ、画像ソース、viewer に求める動作を説明してください。","ai.action.copy":"setup prompt をコピー","ai.action.copied":"コピーしました","ai.action.openLlms":"llms.txt を開く","ai.copy.error":"コピーに失敗しました。プレビューから prompt を手動で選択してください。","ai.preview.title":"Setup prompt","ai.preview.subtitle":"選択に合わせて更新されます","ai.preview.copy":"コピー","ai.preview.expand":"展開","ai.preview.show":"Prompt をプレビュー","ai.preview.hide":"プレビューを閉じる","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"一般的なコーディング Agent 向けの prompt にします。","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Agent に先にプロジェクトを確認させます。","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"統合方針を手動で指定します。","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"実際に操作できるサーフェス","demo.title":"Child's Dream の物語を一枚の紙面に組む","demo.body":"Child's Dream の画像を使い、古い本、時間の入口、狐、森の道、水晶の封印を不規則な紙面に並べています。どの画像をクリックしても、その切り抜き位置からビューアへ滑らかに広がります。","demo.shiftHint":"SHIFT を押しながら画像をクリックし、なめらかな遷移を感じてください","demo.zoomHint":"画像を開き、Space でズームに入り、その後ホイールでさらに拡大縮小できます。","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"図書館の片隅にある埃をかぶった本が、古い時間への入口を開きます。","demo.story.lead":"ページの何気ない文字が小さな本物の景色へ変わり、少年は紙から森が立ち上がるのを見て、結界の向こうからの呼び声を聞きます。","demo.story.middle":"狐が彼の旅の仲間になります。潮、樹冠、ピンクのフラミンゴを越え、道は森の奥の水晶の封印へ続きます。","demo.tile.cover":"古い本と時間の入口","demo.tile.gallery":"森での最初の出会い","demo.tile.ratio":"潮の縁の道","demo.tile.controller":"水晶の封印","demo.tile.zoom":"フラミンゴの休息地","demo.tile.lamp":"葉の下の明かり","demo.tile.rescue":"森の中の解放","demo.feature.cover":"カバーの clip と角丸が一致","demo.feature.space":"拡大中にポインターを動かして素早く見渡す","demo.feature.wheel":"マウスホイールでなめらかに倍率を切り替える","demo.feature.shift":"Shift で開閉をスローに","demo.caption":"画像をクリックしてビューアを開きます。デスクトップでは SHIFT を押しながら開き、ズーム後にポインター移動やホイール操作を試せます。","demo.scene.portal.alt":"古い本に光る時間の入口","demo.scene.portal.caption":"古い本の中央で時間の入口が光り、文字の中から森が立ち上がります。","demo.scene.forest.alt":"少年が森で狐に出会う","demo.scene.forest.caption":"狐が木々の間に現れ、少年の旅の仲間になります。","demo.scene.tide.alt":"少年が潮の縁に立つ","demo.scene.tide.caption":"水面が渦を巻き、次の未知の道を示します。","demo.scene.canopy.alt":"少年が大きな樹冠の下に横たわる","demo.scene.canopy.caption":"樹冠がページのように開き、小さな光が道を示します。","demo.scene.flamingo.alt":"少年がピンクのフラミンゴの間に座る","demo.scene.flamingo.caption":"軽やかなフラミンゴの群れが旅に静かな間を作ります。","demo.scene.lamp.alt":"少年が大きな葉の下で灯りをともす","demo.scene.lamp.caption":"葉が暗闇を遮り、灯りが本の中の手がかりを照らします。","demo.scene.crystal.alt":"少年が水晶の封印の前に立つ","demo.scene.crystal.caption":"森の奥で水晶の封印が姿を現し始めます。","demo.scene.rescue.alt":"狐と少年が水晶の封印に近づく","demo.scene.rescue.caption":"鍵が水晶に近づき、封印の中の秘密が開こうとしています。","feature.dropin.title":"原位置展開","feature.dropin.hint":"画像の位置、サイズ、角丸、切り抜き状態から開き、閉じると同じ場所へ戻ります。","feature.mobile.title":"モバイル対応","feature.mobile.hint":"Auto preset がタッチ操作を選びます。スワイプで切替、下方向ドラッグで閉じる、ダブルタップ、ピンチズームに対応します。","feature.set.title":"閲覧操作をまとめて提供","feature.set.hint":"ズーム、回転、ページ送り、ダウンロード、caption が同じ閲覧状態で動き、複数画像でも連続します。","feature.ssr.title":"SSR/RSC に対応","feature.ssr.hint":"Next.js、SSR、RSC ではサーバー安全な入口を使い、viewer の操作はクライアント境界に置けます。","modes.title":"今あるページ構造に合わせて接続","modes.component.label":"コンポーネントモード","modes.component.desc":"JSX を制御できるなら、 に置き換え、ネイティブ props はそのまま渡します。","modes.imperative.label":"命令的呼び出し","modes.imperative.desc":"ボタン、callback、非同期処理から開けます。ページ上のカバー画像は不要です。","modes.wrapper.label":"ラッパーモード","modes.wrapper.desc":"Markdown / CMS / dangerouslySetInnerHTML を包み、内部画像を自動で原位置展開します。","modes.try":"例を開く →","modes.component.when":"レンダリングする JSX を制御できるなら、コンポーネントモードを選びます。任意の に置き換えるだけで、ネイティブ props はそのまま渡り、開閉は同じ原位置展開でつながります。","modes.imperative.when":"入口が画像そのものではない場合は、命令的呼び出しを選びます。イベントハンドラ、サードパーティ callback、非同期処理から、カバー用 を追加せずにビューアを開けます。","modes.wrapper.when":"レンダリングされる HTML を自分で制御できない場合は、ラッパーモードを選びます。markdown、CMS リッチテキスト、dangerouslySetInnerHTML などを包むだけで、内部の が自動的にビューアを獲得します。","footer.project":"プロジェクト","footer.repo":"リポジトリ","footer.issues":"Issues","footer.changelog":"変更履歴","footer.useCases":"ユースケース","footer.madeby":"制作","footer.illustrator":"イラスト","footer.license":"MIT ライセンス","pg.title":"プレイグラウンド","pg.subtitle":"各 prop を調整して、ビューアの反応をリアルタイムに確認できます。","pg.reset":"リセット","pg.share":"共有","pg.shared":"リンクをコピーしました","pg.tab.component":"コンポーネント","pg.tab.imperative":"命令式","pg.tab.wrapper":"ラッパー","pg.preview.tip":"ヒント:Space でズーム · ←/→ でページ送り · ESC で閉じる","pg.preview.trigger":"ビューアを開く","pg.params.title":"パラメータ","pg.params.subtitle":"prop 名にホバーすると説明を表示し、本アイコンから該当 docs を開けます。","pg.events.title":"イベント","pg.events.subtitle":"現在のセッションのライフサイクル callback 出力です。","pg.events.empty":"ライフサイクルコールバックを有効にすると、ここにイベントが流れます。","pg.code.title":"コード","pg.code.subtitle":"現在のモードでコピーできるコードです。","pg.code.hideDefaults":"デフォルト値を非表示","pg.copy":"コピー","pg.copied":"コピーしました","pg.portalTarget.title":"カスタム Portal ターゲット","pg.portalTarget.body":"アプリ側に overlay root、modal root、micro-frontend コンテナがある場合に使います。右の画像をクリックすると、ビューアは document.body ではなくその root にマウントされます。","pg.portalTarget.root":"ホスト側 overlay root","pg.portalTarget.imageAlt":"portalTarget デモ画像","group.data":"データ","group.preset":"プリセット","group.interface":"インターフェース","group.controller":"コントローラー","group.hotkey":"ホットキー","group.animate":"アニメーション","group.gesture":"Gesture","group.lifecycle":"ライフサイクル","group.controlled":"制御コンポーネント","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"デスクトップ範囲","common.presetScope.desktop.desc":"デスクトップ向けのパラメータです。desktop preset で既定有効、またはデスクトップでのみ実用的な効果があります。","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"モバイル範囲","common.presetScope.mobile.desc":"モバイルまたはタッチ向けのパラメータです。mobile preset で既定有効、またはタッチ操作でのみ意味があります。","common.expand":"展開","common.required":"必須","common.default":"デフォルト","common.add":"追加","common.remove":"削除","common.enable":"有効","common.disable":"無効","param.viewInDocs":"ドキュメントで見る","docs.title":"API リファレンス","docs.search.placeholder":"ドキュメントを検索...","docs.search.empty":"一致する項目はありません","docs.toc.title":"このページの目次","docs.sidebar.gettingStarted":"はじめに","docs.sidebar.quickstart":"クイックスタート","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"コンセプト","docs.sidebar.modes":"3 つのモード","docs.sidebar.theming":"テーマ統合","docs.sidebar.props":"Props","docs.sidebar.recipes":"レシピ","docs.sidebar.examples":"サンプル","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"リファレンス","docs.sidebar.migration":"マイグレーション","docs.sidebar.faq":"よくある質問","preset.desktop":"デスクトップ","preset.mobile":"モバイル","preset.auto":"自動","animate.flip.fade":"フェード","animate.flip.crossFade":"クロスフェード","animate.flip.swipe":"スワイプ","animate.flip.zoom":"ズーム","animate.flip.blur":"ぼかし","animate.flip.none":"なし","animate.slowMotion":"スローモーション","gesture.swipe":"スワイプ","gesture.dragExit":"ドラッグ終了","gesture.wheelZoom":"ホイールズーム","gesture.pinchZoom":"ピンチズーム","gesture.doubleTapZoom":"ダブルタップズーム","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"preset に従うジェスチャー設定です。desktop はズーム中のホイールズームを有効化し、mobile はドラッグページング、ドラッグ終了、ピンチズーム、ダブルタップズームを有効化します。","gesture.swipe.desc":"set 内で横方向ドラッグによるページ移動を行います。単一画像ビューアでは無視されます。","gesture.dragExit.desc":"縦方向ドラッグで終了します。既存の onBrowsing(false) の閉じる経路を使います。","gesture.wheelZoom.desc":"ビューアがすでにズーム中のとき、マウスホイールまたはトラックパッドでズームします。desktop では有効、mobile では無効です。","gesture.pinchZoom.desc":"mobile での 2 本指ピンチズームです。fit スケールまで縮小するとズームを終了し、画像を中央に戻します。","gesture.doubleTapZoom.desc":"mobile での 1 本指ダブルタップです。最初のダブルタップはタップ位置を中心にズームし、ズーム中のダブルタップは fit 表示へ戻します。","gesture.touchAction.desc":"CSS touch-action の戦略です。managed は pinch zoom で none、double tap のみの設定で manipulation を選びます。明示値はそのまま渡されます。","gesture.threshold.desc":"ジェスチャーとして受理する最小ドラッグ距離(px)です。","gesture.velocity.desc":"ジェスチャーとして受理する最小速度(px/ms)です。","gesture.axisLock.desc":"斜め移動で横方向と縦方向の両方が発火しないようにする軸ロック比率です。","gesture.resistance.desc":"loop=false かつ先頭または末尾画像にいるときの端抵抗比率です。","gesture.opacity.desc":"縦方向ドラッグ終了時、距離に応じて画像の不透明度を下げるかどうかです。","gesture.wheelZoom.step.desc":"ホイールズーム感度です。同じホイール delta でも値が大きいほど速くズームします。","gesture.wheelZoom.smooth.desc":"即時ジャンプではなく、既存の zoom-follow RAF でホイールズームを補間します。","gesture.wheelZoom.minScale.desc":"ホイールズームの最小スケールです。ズームアウトでここに到達するとズームモードを終了します。","gesture.wheelZoom.maxScale.desc":"ホイールズームの最大スケールです。","gesture.wheelZoom.center.desc":"ホイールズームの焦点です。pointer は wheel イベント位置、viewport は画面中央を使います。","gesture.wheelZoom.reverse.desc":"他の wheel 動作は変えず、ホイールズーム方向だけを反転します。","gesture.wheelZoom.exitGuardDuration.desc":"ホイールズームアウトでズームモードを終了した後の保護時間(ms)です。この間の残留 wheel イベントは無視されます。","gesture.pinchZoom.minScale.desc":"ピンチの最小スケールです。fit は画面に収まる閲覧サイズを意味します。","gesture.pinchZoom.maxScale.desc":"ピンチの最大スケールです。","gesture.pinchZoom.resetBelowFit.desc":"ピンチで fit スケールまで縮小したら、ズームを終了して画像を中央に戻します。","gesture.pinchZoom.center.desc":"ピンチの焦点です。gesture は 2 本指の中点、viewport は画面中央を使います。","gesture.doubleTapZoom.scale.desc":"ダブルタップでズームに入るときの目標スケールです。","gesture.doubleTapZoom.minScale.desc":"ダブルタップズームを制限する最小スケールです。","gesture.doubleTapZoom.maxScale.desc":"ダブルタップズームを制限する最大スケールです。","gesture.doubleTapZoom.center.desc":"ダブルタップの焦点です。tap はタップ位置、viewport は画面中央を使います。","gesture.doubleTapZoom.interval.desc":"2 回のタップの最大間隔(ms)です。","gesture.doubleTapZoom.distance.desc":"2 回のタップ間で許容する最大移動量(px)です。","controller.pagination":"ページネーション","controller.rotate":"回転","controller.rotateLeft":"左回転","controller.rotateRight":"右回転","controller.zoom":"ズーム","controller.download":"ダウンロード","controller.close":"閉じる","controller.flip":"ページ送り","controller.flipLeft":"前へ","controller.flipRight":"次へ","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"上部のページインジケーター。現在位置 / 総ページ数を表示します","controller.rotate.desc":"回転コントロール群(左回転と右回転ボタンを含む)","controller.rotateLeft.desc":"反時計回りに 90° 回転","controller.rotateRight.desc":"時計回りに 90° 回転","controller.zoom.desc":"1:1 ズームモードの開始 / 終了","controller.download.desc":"現在の画像をダウンロード","controller.close.desc":"ビューアを閉じる","controller.flip.desc":"ページ送りコントロール群(前へ / 次へボタンを含む)","controller.flipLeft.desc":"前の画像へ移動","controller.flipRight.desc":"次の画像へ移動","controller.backdrop.desc":"ツールバーの背景色。未指定時は最上位の backdrop を継承。最上位 backdrop が暗い実色の場合は半透明値 (例: `rgba(0,0,0,0.4)`) を推奨。","controller.color.desc":'ツールバーアイコンの色。未指定時は currentColor を継承。単一ボタンの文字列指定 (例: `controller.zoom = "#ff8800"`) が優先されます。',"controller.placement.desc":"ツールバー位置です。移動するのはツールバー本体のみで、左右のページ送りボタンとページネーションは通常位置のままです。","controller.layout.desc":"ツールバー、左右の flip ボタン、ページネーション、caption のセーフ inset を調整します。数値は px、文字列は CSS 長として扱われ、スカラー inset は対象ごとの自然な進入辺に適用され、layout.mobile はモバイル preset で上書きされます。","controller.layout.toolbarInset.desc":"ツールバーのセーフ inset。スカラー値は現在の placement に従って、対応する top / right / bottom / left の辺に適用されます。","controller.layout.flipInset.desc":"左右の flip ボタンのセーフ inset。スカラー値は左ボタンと右ボタンの両方に適用されます。","controller.layout.paginationInset.desc":"ページネーションのセーフ inset。スカラー値は下側の進入辺に適用され、caption やページ側 UI を避けるときに使えます。","controller.layout.captionInset.desc":"caption のセーフ inset。スカラー値は下側の進入辺に適用され、ページネーションや下部コントロールより上に置きたい場合に使います。","controller.render.desc":"完全に独自のコントローラー render コールバックです。state、actions、組み込み slots を受け取ります。controller=false の場合は無効です。","controller.overriddenBy":"親スイッチで有効化","snippet.overriddenByProp":"{umbrella} により上書き","hotkey.close":"閉じる (Escape)","hotkey.zoom":"ズーム (Space)","hotkey.flip":"ページ送り (←/→)","hotkey.flipLeft":"前へ (←)","hotkey.flipRight":"次へ (→)","hotkey.rotate":"回転 ([ / ])","hotkey.rotateLeft":"左回転 ([)","hotkey.rotateRight":"右回転 (])","hotkey.download":"ダウンロード (Mod+S)","hotkey.close.desc":"Escape キーでビューアを閉じる","hotkey.zoom.desc":"Space キーで 1:1 ズームモードを切り替え","hotkey.flip.desc":"← / → キーで set 内のページを送る","hotkey.flipLeft.desc":"← キーで前の画像へ移動","hotkey.flipRight.desc":"→ キーで次の画像へ移動","hotkey.rotate.desc":"[ / ] キーで画像を回転 (組み合わせスイッチ; 左右両方をバインド)","hotkey.rotateLeft.desc":"[ キーで反時計回りに 90° 回転","hotkey.rotateRight.desc":"] キーで時計回りに 90° 回転","hotkey.download.desc":"Cmd+S (macOS) または Ctrl+S (Windows/Linux) で現在の画像をダウンロード。デフォルトはオフ — 有効化するとブラウザの「ページを保存」ショートカットを上書きします。","animate.browsing.desc":"ビューアの開閉時のトランジション","animate.flip.desc":"set 内でページを送る際のトランジションスタイル","animate.slowMotion.desc":"有効にすると、開閉時に Shift を押している間、閲覧トランジション全体が 10 倍に遅くなり、確認やデモに使えます","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"画像 URL。必須項目。","param.alt.label":"alt","param.alt.desc":"画像タイトル。ビューア上部に表示されます。","param.caption.label":"caption","param.caption.desc":"画像下部のキャプション。string でデフォルトピル、または { text, style?, className? } でカスタマイズ。set[i].caption で個別に上書き可。","param.set.label":"set","param.set.desc":"画像セット。渡すとギャラリーモードになり、矢印キーでページ送りできます。","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"初期ページのインデックス(0 始まり)。","param.preset.label":"preset","param.preset.desc":"プリセットバンドル。既定は auto で、controller / hotKey / animate / gesture のデフォルト値を決定します。","param.backdrop.label":"backdrop","param.backdrop.desc":"ビューアの背景色。任意の有効な CSS カラー文字列。","param.zIndex.label":"zIndex","param.zIndex.desc":"ビューアの重ね順。","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"ビューア Portal のマウント先 DOM 要素。既定は document.body。アプリの overlay root、modal root、micro-frontend コンテナに接続するための設定で、変わるのはマウント親だけです。ビューアは引き続き fixed の全画面レイアウトです。","param.radius.label":"radius","param.radius.desc":"画像の角丸(px)。","param.edge.label":"edge","param.edge.desc":"画像とビューポートの最小マージン(px)。","param.loop.label":"loop","param.loop.desc":"末尾に到達したら最初の画像に戻るかどうか。","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"ページがスクロールされたらビューアを閉じる。","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"画像をダブルクリックでビューアを閉じる。既定はオフ。","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"閲覧中もカバー画像を表示し続ける。","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"ローディングインジケータを表示するまでの遅延 (ms)。この期間内に画像が読み込まれれば、ローディングは表示されません — キャッシュ画像を素早く切り替える際のちらつきを防ぎます。既定 200ms;0 = 即時表示 (旧動作)。","param.controller.label":"controller","param.controller.desc":"コントロールバー設定です。false で全体を無効化し、部分オブジェクトでボタン、位置、オーバーレイ配置、カスタム render を上書きします。","param.hotKey.label":"hotKey","param.hotKey.desc":"キーボードショートカット。","param.animate.label":"animate","param.animate.desc":"閲覧、カバー形状、スローモーション、ページ送りのアニメーション設定です。","param.gesture.label":"gesture","param.gesture.desc":"preset に従うジェスチャー設定です。desktop はズーム中の wheelZoom を有効化し、mobile は既定で swipe、dragExit、pinchZoom、doubleTapZoom を有効化します。gesture=false ですべて無効化します。","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"ビューアの開閉時に呼ばれます(boolean)。","param.onZooming.label":"onZooming","param.onZooming.desc":"ズームモードの開始 / 終了時に呼ばれます(boolean)。","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"ページ切り替え時に呼ばれます(新しいページのインデックス)。","param.onRotating.label":"onRotating","param.onRotating.desc":"回転時に呼ばれます(角度)。","param.onError.label":"onError","param.onError.desc":"画像の読み込み失敗時に呼ばれます(カバー/ビューア共通、SyntheticEvent を受け取る)。","param.browsing.label":"browsing","param.browsing.desc":"制御された閲覧状態。値を渡すと制御モードになります。onBrowsing と組み合わせて使用してください。","docs.section.installation.title":"インストール","docs.section.installation.intro":"パッケージマネージャーでインストール:","docs.section.installation.agent":"AI Agent はまず https://zmage.caldis.me/llms.txt を読み、基本接続は最小限にしてください。","docs.section.installation.then":"コンポーネントとスタイルシートをインポート:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"サーバーレンダリングアプリでは、import 時に document に触れない /ssr エントリを使用してください:","docs.section.modes.title":"3 つの呼び出し方","docs.section.modes.intro":"react-zmage は同じ設定インターフェースを 3 つの呼び出し形式で提供します:","docs.section.modes.componentTitle":"コンポーネント","docs.section.modes.componentBody":"一番標準的な使い方 ── レンダリングする JSX を自分で制御できるときに選んでください。任意の に置き換えるだけで、ネイティブ HTML 属性 (className、style、onClick など) はすべて内側の に透過します。","docs.section.modes.imperativeTitle":"命令式","docs.section.modes.imperativeBody":"適切なカバー用 がない、あるいはコンポーネントツリーに余計なノードをマウントしたくないときに選んでください。イベントハンドラ、非同期コールバック、サードパーティ製ウィジェットから呼び出して、どこからでもビューアを開けます。戻り値は手動クローズ用のデストラクタクロージャです。","docs.section.modes.wrapperTitle":"ラッパー","docs.section.modes.wrapperBody":"レンダリングされる HTML を自分で制御できないとき(markdown 出力、CMS リッチテキスト、dangerouslySetInnerHTML など)に使ってください。Wrapper はクリックされた から src / alt を読み取り、backdrop、コントロール、ホットキー、アニメーション、コールバック、set などのビューア設定は に置きます。","docs.section.modes.wrapperNote":"Wrapper は componentDidMount / componentDidUpdate のタイミングで子の img を検索します。Wrapper がレンダリングされた後に挿入された画像は、Wrapper が再レンダリングされるまでひも付きません。set を渡した場合、クリックされた img の src を set と照合して初期ページにします。set がない場合は、data-zmage-caption または最も近い figcaption をビューアの caption として使えます。","docs.section.theming.title":"テーマ統合","docs.section.theming.intro":"react-zmage は意図的にホストサイトのテーマシステムから独立しています ── prefers-color-scheme を読まず、特定の CSS 変数フレームワークにも縛られません。ライト/ダークの統合は利用側が制御します:","docs.section.theming.bullet.backdrop":"ビューアの背景色は backdrop プロパティで指定します(任意の有効な CSS カラー文字列)。デフォルトは白 #FFFFFF です。","docs.section.theming.bullet.icons":"コントロールバーのアイコンは SVG の currentColor で描画されます。グローバル CSS で上書きすればデザインシステムと揃えられます。","docs.section.theming.bullet.scoped":"ランタイムのスタイルはすべて #zmage コンテナ内にスコープされており、アプリの他の部分に漏れません。","docs.section.theming.defaultTitle":"デフォルト動作","docs.section.theming.defaultBody":"backdrop を省略するとビューアは白い背景でレンダリングされます。ライトサイトでは違和感がありませんが、ダークサイトではコントロールバーの白いアイコンとコントラストが取れなくなります:","docs.section.theming.patternTitle":"コンポーネント / 制御パターン","docs.section.theming.patternBody":"既存のテーマフック(next-themes、独自の ThemeProvider など)から resolved 値を読み取り、色にマッピングして backdrop に渡します。小さなローカルコンポーネントにラップしておくと呼び出し側がすっきりします:","docs.section.theming.imperativeTitle":"命令式の利用","docs.section.theming.imperativeBody":"イベントハンドラ内で現在の DOM 状態(documentElement のテーマクラスなど)を読み取り、色に変換してから Zmage.browsing に渡します:","docs.section.theming.iconsTitle":"デザインシステムとアイコン色を揃える","docs.section.theming.iconsBody":"コントロールアイコンは #zmage コンテナ内に存在します。グローバル CSS から色を上書きできます。Tailwind や shadcn のように CSS 変数でテーマを管理しているなら、デザイントークンに直接バインドできます:","docs.section.theming.toolbarTitle":"ツールバーをモーダル backdrop から切り離す","docs.section.theming.toolbarBody":'デフォルトではツールバーの背景は最上位の backdrop を継承し、アイコンは currentColor で描画されます。暗い実色の backdrop では、暗いアイコンが暗いツールバーに溶け込んで見えません。controller.backdrop (ツールバー背景) と controller.color (アイコン色) を指定して切り離してください。単一ボタンの文字列指定 (例: controller.zoom = "#ff8800") は controller.color よりも優先されます。',"docs.search.desc.installation":"パッケージマネージャーでインストールしてスタイルシートを取り込む","docs.search.desc.ssr":"import 時に document に触れない SSR エントリ","docs.search.desc.modes":"コンポーネント / 命令式 / ラッパー ── 3 つの呼び出し方","docs.search.desc.theming":"ビューアの背景とアイコンをサイトのテーマと揃える","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"プリセット選択: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"controller / hotKey / animate / gesture のデフォルトセット","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget などの UI パラメータ","docs.search.desc.propsController":"コントロールバーのボタン、配置、カスタム render","docs.search.desc.propsHotkey":"キーボードショートカット: ESC / Space / 矢印キー","docs.search.desc.propsAnimate":"閲覧アニメーションとページ送りアニメーション","docs.search.desc.propsGesture":"ホイールズーム、ドラッグページング、ドラッグ終了、ピンチ、ダブルタップズーム","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"制御された閲覧状態","docs.search.desc.examples":"単一画像と複数画像ギャラリーのサンプル","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet などの型宣言","docs.search.desc.migration":"0.x からのアップグレードノート","docs.search.desc.faq":"よくある統合上の落とし穴とバージョン別の修正ノート","docs.section.props.title":"Props","docs.section.props.intro":"BaseType に定義されたすべての prop は、3 つのモードのいずれでも利用できます。","docs.section.props.wrapperScope.title":"Wrapper モードの prop 範囲","docs.section.props.wrapperScope.intro":" はカバー画像自体をレンダリングしません。既存の子孫 ノードにビューアを結び付けるため、一部の prop は Wrapper モード固有の意味を持ちます。","docs.section.props.wrapperScope.data":"src と alt は子の に置きます。トップレベルの src / alt は、クリックされた DOM ノードの値で上書きされます。set がない場合、caption は data-zmage-caption または最も近い figcaption から読み取れます。","docs.section.props.wrapperScope.config":"set と defaultPage は明示的な共有ギャラリーに使えます。クリックされた img の src が set に含まれる場合、Wrapper は対応する index を開きます。defaultPage は fallback です。preset、controller、hotKey、animate、backdrop、zIndex、portalTarget、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay は通常どおり適用されます。","docs.section.props.wrapperScope.lifecycle":"onBrowsing、onZooming、onSwitching、onRotating、onError は動作します。Wrapper 内部で同じビューアを開くためです。","docs.section.props.wrapperScope.controlled":"browsing はコンポーネントモードの controlled state であり、Wrapper は制御しません。外部 state から開きたい場合は、コンポーネントモードを使うか Zmage.browsing() を直接呼び出してください。","docs.section.props.interface":"インターフェースとインタラクション","docs.section.props.portalTarget.title":"カスタム Portal ターゲット","docs.section.props.portalTarget.body":"既定ではビューア層は document.body にマウントされます。アプリに overlay root、modal root、shadow host、micro-frontend shell コンテナがある場合は、その要素を portalTarget に渡すことで、重ね順、スタイルのスコープ、ホスト側のライフサイクル管理をアプリシェル側に残せます。","docs.section.props.portalTarget.boundary":"portalTarget は DOM の親だけを変えます。ビューアは fixed の全画面レイアウトのままで、ローカルプレビューのようにコンテナ内へ切り抜かれません。重ね順の調整には zIndex を使ってください。","docs.section.props.controller.keyHeader":"キー","docs.section.props.controller.descHeader":"説明","docs.section.props.controller.umbrella":"rotate は rotateLeft / rotateRight の親スイッチで、有効にすると両方のボタンが表示されます。flip も flipLeft / flipRight に対して同様に動作します。","docs.section.props.controller.layoutTitle":"オーバーレイ配置","docs.section.props.controller.layoutIntro":"layout は toolbar、左右 flip、pagination、caption のオーバーレイ offset だけを調整します。画像の初期フレームやズームジオメトリには関与しません。数値は px、文字列は CSS 長として透過され、スカラー inset は対象ごとの自然な進入辺に適用され、layout.mobile はモバイルで基礎配置を上書きします。","docs.section.props.controller.renderTitle":"カスタム render","docs.section.props.controller.renderIntro":"render は { state, actions, slots } を受け取り、React ノードを返します。null を返すとコントローラーレイヤーを隠せます。一部だけ差し替えたい場合は slots を再利用できます。","docs.section.props.hotkey.umbrella":"flip は flipLeft / flipRight、rotate は rotateLeft / rotateRight の親スイッチです — いずれかを有効にすると左右両方のキーがバインドされます。各 entry は 'Mod+S' / 'BracketLeft' などの文字列ディスクリプターで上書きできます (Mod は macOS で ⌘、Windows/Linux で Ctrl を表す)。","docs.section.props.hotkey.customTitle":"カスタムバインディング","docs.section.props.hotkey.customIntro":"各 hotKey エントリは boolean (オン/オフ)、string (カスタムディスクリプター)、string[] (複数バインド) を受け付けます。ディスクリプターは e.code 名 (キーの物理位置、キーボードレイアウト非依存) を使用し、Mod プレフィックスはクロスプラットフォームで ⌘/Ctrl を表します。厳密な修飾キー判定: 宣言されていない修飾キーが押されている場合は一致しません (例: Space は Cmd+Space では発火しません)。","docs.section.props.hotkey.cheatsheetTitle":"ディスクリプター早見表","docs.section.props.hotkey.cheatsheet.shorthand":"単一の英字 / 数字は自動正規化","docs.section.props.hotkey.cheatsheet.arrows":"矢印キー","docs.section.props.hotkey.cheatsheet.punct":"記号 (キーの物理名)","docs.section.props.hotkey.cheatsheet.whitespace":"空白 / 制御キー","docs.section.props.hotkey.cheatsheet.modifier":"修飾キープレフィックス (+ で連結)","docs.section.props.animate.typeHeader":"型","set.src.desc":"画像 URL(必須)","set.alt.desc":"この画像のタイトル","set.caption.desc":"この画像のキャプション。指定すると外側の caption を上書きします","set.className.desc":"この画像に適用するカスタムクラス","set.style.desc":"この画像に適用するカスタムインラインスタイル","docs.section.props.preset.title":"プリセットの内訳","docs.section.props.preset.intro":"preset は controller / hotKey / animate / gesture の各サブオブジェクトに適用されるデフォルト値の束です。preset を省略すると auto になります。auto は実行時に matchMedia('(pointer: coarse) and (hover: none)') によって desktop または mobile に解決され、SSR や matchMedia 非対応環境では desktop にフォールバックします。","docs.section.props.preset.subParamHeader":"サブパラメータ","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"サンプル","docs.section.examples.singleTitle":"単一画像","docs.section.examples.galleryTitle":"複数画像ギャラリー","docs.section.examples.mobileTitle":"モバイルジェスチャー","docs.section.examples.mobileBody":"mobile preset を強制し、タッチ端末でドラッグ切り替え、ドラッグ終了、ピンチズーム、ダブルタップズームを試せます。","docs.section.examples.controllerTitle":"カスタムコントローラー","docs.section.examples.controllerBody":"コントローラーを画面端へ移動したり、state と actions を受け取る render コールバックで UI 全体を差し替えられます。","docs.section.examples.coverTitle":"クロップされたカバー","docs.section.examples.coverBody":"object-fit と border radius をカバー img 自体に置くと、開く最初のフレームが見えている切り抜きに一致します。","docs.section.examples.portalTargetTitle":"ホストの overlay root にマウント","docs.section.examples.portalTargetBody":"ページに共有 overlay コンテナがある場合、その DOM ノードを portalTarget に渡します。例は引き続き全画面ビューアで、変わるのは Portal の親だけです。","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"型はランタイムのエクスポートと同じ場所に置かれています。完全な prop ユニオン型は BaseType です:","docs.section.typescript.refIntro":"コンポーネントは ref を受け取り、カバーの img に転送します:","docs.section.migration.title":"マイグレーション","docs.section.migration.from":"0.x からの移行:","docs.section.migration.bullet1":"コンポーネントは forwardRef exotic です。new Zmage() しないでください。","docs.section.migration.bullet2":"SSR エントリを参照している場合は react-zmage/ssr に切り替えてください。","docs.section.faq.title":"よくある質問","docs.section.faq.tailwind-shrink.q":"Tailwind / normalize.css / Bootstrap を使うと、ビューア内の大きな画像がカバーよりも小さく表示されるのはなぜ?","docs.section.faq.tailwind-shrink.a":"これらのリセット CSS はグローバルに `img { max-width: 100% }` を当てるため、ビューア内の画像がカバーサイズに圧縮されます。1.1.2 より前のバージョンでこの影響を受けます。1.1.2 以降は `.imageLayer` 配下の img に対してこれを防ぐスタイルを追加しているので、>=1.1.2 にアップグレードしてください。","docs.section.faq.r19-imperative.q":"React 18 / 19 で `Zmage.browsing()` が undefined を返すのはなぜ?","docs.section.faq.r19-imperative.a":"1.1.2 で修正済みのバグです。旧コードは `RENDER.REF.current?.outBrowsing` を同期的に読んでおり、React 17 では動作しましたが、R18+ ではコミットが非同期になるため壊れます。1.1.2 では安定したデストラクタクロージャを返すようになっています — >=1.1.2 にアップグレードしてください。","docs.section.faq.wrapper-empty.q":"`` が空のビューアを開き、ブラウザが空の src を警告します。なぜ?","docs.section.faq.wrapper-empty.a":"旧版のラッパーはクリックされた img の上に `defaultProps.src=''` をスプレッドしてしまい、src / alt を空にしていました。1.1.2 ではクリックされた DOM ノードから src / alt を直接読み取るように修正されています。アップグレードで解決します。","docs.section.faq.vite-esm.q":'Vite / Next.js のクライアントで命令的 API を呼ぶと "no compatible mount API" が出ます。なぜ?',"docs.section.faq.vite-esm.a":"1.1.2 より前は `require('react-dom/client')` でランタイム検出していましたが、ブラウザの ESM には `require` グローバルがありません。1.1.2 では静的 import に切り替えました — >=1.1.2 にアップグレードしてください。","docs.section.faq.wrapper-dynamic.q":"マウント後に追加した画像にラッパーがクリックハンドラをひも付けてくれません。","docs.section.faq.wrapper-dynamic.a":"ラッパーは `componentDidMount` と `componentDidUpdate` のときだけ `` を探します。React のレンダーツリー外で DOM の img を注入している場合(例: 親が再レンダーしないままの dangerouslySetInnerHTML)、ラッパーを強制的に再レンダーさせるか、自前のクリックハンドラから `Zmage.browsing()` を呼び出してください。","docs.section.faq.lazy-src.q":"`` で data-src / 遅延読み込みを使っているのですが、Zmage を開くと実画像ではなくプレースホルダが表示されます。どうすればよいですか?","docs.section.faq.lazy-src.a":"Zmage はデフォルトでカバー `` の `src` を読みます — プレースホルダしか見えません。プレビュー対象の実 URL を `set` で明示的に渡してください: ``。命令型呼び出しも同様: `Zmage.browsing({ src: realUrl })`。","docs.section.faq.cover-vs-set.q":"ページにはサムネイルを表示し、クリック時に高解像度の画像を見せたい — `set` を省略できますか?","docs.section.faq.cover-vs-set.a":"いいえ。`set` を渡さないとカバーの `src` がそのままビューアで表示されます。「サムネイル入口 + 大画像ビューア」にするには明示的に分離する必要があります: ``。同じパターンで data-src 遅延読み込み (上の FAQ) と CDN マルチ解像度の両方を解決できます。「グリッド/ギャラリー + ビューアを開く」UI が欲しい場合、Zmage 自体は提供しません — ギャラリーは自分で描画し、クリック時に `Zmage.browsing({ src, set })` を呼んでください。","docs.section.faq.controlled-mismatch.q":"受け渡した `browsing` プロップとビューアの実状態がずれてしまいます。","docs.section.faq.controlled-mismatch.a":"制御モードでは `browsing` と `onBrowsing` の両方が必要です。`browsing` だけを渡した場合、内部状態は最初に一度だけ同期され、その後ずれていきます。必ず対で使ってください。","docs.section.faq.ssr.q":"Next.js / Remix / SSR フレームワークでの使い方は?","docs.section.faq.ssr.a":"`react-zmage/ssr` エントリを使ってください — import 時に `document` に触れません。命令的な `Zmage.browsing()` は、レンダリング中やサーバー専用パスで実行され得る場合、`typeof window !== 'undefined'` のガードが必要です。","docs.section.faq.theme.q":"ビューアをダーク / ライトテーマに追従させるには?","docs.section.faq.theme.a":"上の「テーマ統合」セクションに従って `backdrop` を渡してください。本ライブラリは設計上テーマ非依存で、prefers-color-scheme も読みません — テーママッピングはアプリ側の責任です。","playground.preset.aria":"データプリセット切替","playground.preset.default.label":"デフォルト","playground.preset.default.hint":"童夢 · 2 枚","playground.preset.testset.label":"テスト集","playground.preset.testset.hint":"6 枚 · 比率と形式"},xR={"nav.playground":"플레이그라운드","nav.docs":"문서","nav.ai":"AI 설치 가이드","nav.github":"GitHub","useCases.eyebrow":"사용 사례","useCases.title":"블로그, CMS, MDX, 뉴스 페이지를 위한 React 이미지 미리보기","useCases.body":"react-zmage는 일반 를 원래 위치에서 펼쳐지는 전체 화면 이미지 미리보기로 바꾸는 React 이미지 뷰어입니다. 갤러리, 키보드 탐색, 모바일 제스처, 명령형 실행, 리치 텍스트용 Wrapper 모드, SSR/RSC를 지원합니다.","useCases.cta.docs":"문서 보기","useCases.cta.wrapper":"Wrapper 모드 체험","useCases.card.blog.title":"블로그 이미지 미리보기","useCases.card.blog.body":"게시글 레이아웃을 바꾸거나 별도 갤러리 화면을 만들지 않고도 글 안의 이미지를 전체 화면으로 열 수 있습니다.","useCases.card.cms.title":"CMS 리치 텍스트 이미지","useCases.card.cms.body":"CMS, Markdown 파서, 에디터가 렌더링한 HTML을 감싸 기존 가 뷰어를 열도록 할 수 있습니다.","useCases.card.news.title":"뉴스 기사 갤러리","useCases.card.news.body":"기사 본문은 읽기 쉽게 유지하고, 자세히 볼 때만 키보드, 제스처, 다중 이미지 탐색을 제공합니다.","useCases.card.mdx.title":"MDX와 문서 이미지","useCases.card.mdx.body":"이미지는 콘텐츠 작성자가 관리하고 React 앱은 페이지 껍데기를 담당하는 문서 페이지에 Wrapper 모드를 사용할 수 있습니다.","useCases.card.lightbox.title":"React lightbox 대안","useCases.card.lightbox.body":"전체 갤러리 프레임워크보다, 원위치 펼침 이미지 미리보기와 기존 마크업 유지가 필요할 때 가볍게 사용할 수 있습니다.","useCases.card.ssr.title":"Next.js, SSR, RSC","useCases.card.ssr.body":"서버 렌더링 앱에서는 SSR 안전 서브패스를 import하고, 클라이언트 경계에서 인터랙티브 뷰어를 엽니다.","useCases.mode.eyebrow":"모드 선택","useCases.mode.title":"이미지 마크업을 누가 소유하는지에 따라 선택","useCases.mode.component":"JSX를 직접 관리하며 로 바꿀 수 있습니다.","useCases.mode.imperative":"버튼, 명령, 이벤트, 콜백에서 뷰어를 열어야 합니다.","useCases.mode.wrapper":"이미지가 CMS, MDX, Markdown, 리치 텍스트 HTML에서 옵니다.","useCases.facts.eyebrow":"엔티티 정보","useCases.facts.title":"크롤러가 이해해야 할 짧은 사실","useCases.fact.react":"React 16.8부터 19까지 지원","useCases.fact.modes":"Component, imperative, Wrapper 모드","useCases.fact.input":"키보드 탐색과 모바일 제스처","useCases.fact.ssr":"SSR/RSC 안전 import 경로","useCases.fact.gallery":"페이지 재구성 없이 다중 이미지 탐색","useCases.fact.origin":"원위치 펼침 전체 화면 이미지 미리보기","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"사람과 AI Agent가 자주 묻는 질문","useCases.faq.what.q":"react-zmage는 무엇인가요?","useCases.faq.what.a":"react-zmage는 일반 를 원래 위치에서 펼쳐지는 전체 화면 이미지 미리보기로 바꾸는 React 이미지 뷰어입니다. 갤러리, 키보드 탐색, 모바일 제스처, Wrapper 모드, SSR/RSC를 지원합니다.","useCases.faq.lightbox.q":"React lightbox 대신 react-zmage를 언제 쓰면 좋나요?","useCases.faq.lightbox.a":"기존 이미지를 전체 화면으로 열고 싶지만 페이지를 갤러리 컴포넌트 중심으로 다시 만들고 싶지 않을 때 적합합니다. 블로그, CMS 리치 텍스트, MDX 문서, 뉴스 기사, 이미지가 많은 콘텐츠 페이지에 잘 맞습니다.","useCases.faq.richText.q":"CMS, Markdown, 리치 텍스트 이미지도 처리할 수 있나요?","useCases.faq.richText.a":"네. Zmage.Wrapper는 CMS, Markdown, MDX, dangerouslySetInnerHTML 콘텐츠 안의 하위 를 연결하면서 기존 마크업과 레이아웃을 유지할 수 있습니다.","useCases.faq.ssr.q":"Next.js, SSR, RSC를 지원하나요?","useCases.faq.ssr.a":"네. SSR 또는 RSC에서는 react-zmage/ssr 서브패스를 import하고, 인터랙티브 API는 클라이언트 이벤트나 Client Component에서 호출합니다.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"모든 를","hero.title.line2":"원래 자리에서 펼치기","hero.subtitle":"임의의 를 원래 위치에서 펼쳐지는 전체 화면 이미지 뷰어로 바꾸고, 키보드·제스처·다중 이미지 탐색을 지원합니다.","hero.cta.start":"문서 보기","hero.cta.playground":"여러 파라미터 체험","hero.ai.label":"AI 설치 가이드: 먼저 llms.txt 읽기","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"빠른 Prompt 복사","hero.ai.copyLabel":"빠른 AI Prompt 복사","hero.ai.viewLlms":"llms.txt 보기 →","ai.badge":"AI 설치 가이드","ai.title":"react-zmage Agent 통합 Prompt 만들기","ai.subtitle":"llms.txt부터 시작하세요. Auto를 유지하면 Agent가 먼저 프로젝트를 확인합니다. 필요하면 환경, 이미지 소스, 인터랙션 전략을 조정한 뒤 복사할 수 있습니다.","ai.field.agent":"어떤 Agent를 사용하나요?","ai.field.depth":"설정 깊이","ai.field.environment":"프로젝트 환경","ai.field.mode":"사용 모드","ai.field.imageSource":"이미지 소스","ai.field.interaction":"인터랙션 전략","ai.field.project":"프로젝트 설명","ai.autoTip":"확실하지 않으면 Auto를 유지하세요. Agent가 먼저 프로젝트 구조, 이미지 소스, 렌더링 방식, 스타일 진입점을 확인한 뒤 적절한 Zmage 모드와 props를 선택합니다.","ai.project.placeholder":"앱, 이미지 소스, viewer가 해야 할 일을 설명하세요.","ai.action.copy":"setup prompt 복사","ai.action.copied":"복사됨","ai.action.openLlms":"llms.txt 열기","ai.copy.error":"복사에 실패했습니다. 미리보기에서 prompt를 직접 선택하세요.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"선택에 따라 업데이트됩니다","ai.preview.copy":"복사","ai.preview.expand":"펼치기","ai.preview.show":"Prompt 미리보기","ai.preview.hide":"미리보기 접기","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"일반 코딩 Agent에 맞는 prompt를 만듭니다.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Agent가 먼저 프로젝트를 살펴보게 합니다.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"통합 선호도를 직접 지정합니다.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"실제 인터랙션 표면","demo.title":"Child's Dream 이미지를 한 편의 이야기 지면으로 배치","demo.body":"Child's Dream의 오래된 책, 시간 통로, 여우, 숲길, 수정 봉인을 불규칙한 지면에 배치했습니다. 어떤 이미지를 눌러도 현재 잘린 위치에서 뷰어로 부드럽게 확대됩니다.","demo.shiftHint":"SHIFT를 누른 채 이미지를 클릭해 섬세한 전환을 느껴보세요","demo.zoomHint":"이미지를 열고 Space로 줌에 들어간 뒤 휠로 계속 확대하거나 축소하세요.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"도서관 구석의 먼지 쌓인 책이 오래된 시간으로 통하는 문을 엽니다.","demo.story.lead":"페이지의 평범한 글자가 작은 실제 장면으로 바뀌고, 소년은 종이 위에서 숲이 자라는 모습과 결계 너머의 부름을 느낍니다.","demo.story.middle":"여우는 소년의 동행이 됩니다. 물결, 나무 그늘, 분홍 플라밍고를 지나 길은 숲 깊은 곳의 수정 봉인으로 이어집니다.","demo.tile.cover":"오래된 책과 시간 통로","demo.tile.gallery":"숲에서의 첫 만남","demo.tile.ratio":"물결 끝의 길","demo.tile.controller":"수정 봉인","demo.tile.zoom":"플라밍고 쉼터","demo.tile.lamp":"잎 아래의 빛","demo.tile.rescue":"숲속의 해방","demo.feature.cover":"커버 clip과 라운드 일치","demo.feature.space":"확대 상태에서 포인터를 움직여 빠르게 훑어보기","demo.feature.wheel":"마우스 휠로 배율을 부드럽게 전환","demo.feature.shift":"Shift로 열기와 닫기 느리게 보기","demo.caption":"이미지를 클릭해 뷰어를 여세요. 데스크톱에서는 SHIFT를 누른 채 열고, 확대 후 포인터 이동이나 휠 조작을 시도할 수 있습니다.","demo.scene.portal.alt":"오래된 책 위에 빛나는 시간 통로","demo.scene.portal.caption":"오래된 책 한가운데 시간 통로가 빛나고 글자 속에서 숲이 일어납니다.","demo.scene.forest.alt":"소년이 숲에서 여우를 만남","demo.scene.forest.caption":"여우가 나무 사이에 나타나 소년의 동행이 됩니다.","demo.scene.tide.alt":"소년이 물결 가장자리에 서 있음","demo.scene.tide.caption":"물이 나선형으로 말리며 다음 낯선 길을 가리킵니다.","demo.scene.canopy.alt":"소년이 커다란 나무 그늘 아래 누워 있음","demo.scene.canopy.caption":"나무 그늘이 책장처럼 열리고 작은 빛들이 길을 표시합니다.","demo.scene.flamingo.alt":"소년이 분홍 플라밍고 사이에 앉아 있음","demo.scene.flamingo.caption":"가벼운 플라밍고 무리가 여정에 조용한 쉼표를 만듭니다.","demo.scene.lamp.alt":"소년이 넓은 잎 아래에서 빛을 밝힘","demo.scene.lamp.caption":"잎이 어둠을 막고 빛이 책 속 단서를 드러냅니다.","demo.scene.crystal.alt":"소년이 수정 봉인 앞에 서 있음","demo.scene.crystal.caption":"숲 깊은 곳에서 수정 봉인이 모습을 드러내기 시작합니다.","demo.scene.rescue.alt":"여우와 소년이 수정 봉인에 다가감","demo.scene.rescue.caption":"열쇠가 수정에 가까워지고 봉인 속 비밀이 곧 열립니다.","feature.dropin.title":"원위치 펼치기","feature.dropin.hint":"이미지의 위치, 크기, 라운드, 잘림 상태에서 열리고 닫을 때 같은 자리로 돌아갑니다.","feature.mobile.title":"모바일 호환","feature.mobile.hint":"Auto preset이 터치 동작을 선택합니다. 스와이프 이동, 아래로 드래그해 닫기, 더블 탭, 핀치 줌을 지원합니다.","feature.set.title":"완전한 탐색 도구","feature.set.hint":"줌, 회전, 페이지 이동, 다운로드, caption이 하나의 탐색 상태를 공유하며 여러 이미지에서도 이어집니다.","feature.ssr.title":"SSR/RSC 친화적","feature.ssr.hint":"Next.js, SSR, RSC에서는 서버 안전 진입점을 쓰고 viewer 인터랙션은 클라이언트 경계 안에 둘 수 있습니다.","modes.title":"이미 있는 페이지 구조에 맞게 연결","modes.component.label":"컴포넌트 모드","modes.component.desc":"JSX를 제어할 수 있다면 로 바꾸고 네이티브 props는 그대로 전달합니다.","modes.imperative.label":"명령형 호출","modes.imperative.desc":"버튼, callback, 비동기 흐름에서 열 수 있으며 페이지에 커버 이미지가 필요하지 않습니다.","modes.wrapper.label":"래퍼 모드","modes.wrapper.desc":"Markdown / CMS / dangerouslySetInnerHTML을 감싸 내부 이미지가 자동으로 원위치에서 펼쳐집니다.","modes.try":"예제 열기 →","modes.component.when":"렌더링하는 JSX를 직접 제어할 수 있다면 컴포넌트 모드를 선택합니다. 로 바꾸기만 하면 네이티브 props는 계속 전달되고, 열기와 닫기는 같은 원위치 펼치기 전환으로 이어집니다.","modes.imperative.when":"진입점이 이미지 자체가 아니라면 명령형 호출을 선택합니다. 이벤트 핸들러, 서드파티 callback, 비동기 흐름에서 커버 를 추가하지 않고 뷰어를 열 수 있습니다.","modes.wrapper.when":"렌더링되는 HTML을 직접 제어할 수 없다면 래퍼 모드를 선택합니다 — markdown, CMS 리치 텍스트, dangerouslySetInnerHTML. 하위 트리를 감싸기만 하면 내부의 모든 가 자동으로 뷰어를 얻습니다.","footer.project":"프로젝트","footer.repo":"저장소","footer.issues":"이슈 / 피드백","footer.changelog":"변경 이력","footer.useCases":"사용 사례","footer.madeby":"제작","footer.illustrator":"일러스트","footer.license":"MIT 라이선스","pg.title":"플레이그라운드","pg.subtitle":"모든 prop을 조정하고 뷰어가 실시간으로 반응하는 모습을 확인하세요.","pg.reset":"초기화","pg.share":"공유","pg.shared":"링크가 복사되었습니다","pg.tab.component":"컴포넌트","pg.tab.imperative":"명령형","pg.tab.wrapper":"래퍼","pg.preview.tip":"팁: Space로 줌 · ←/→로 페이지 이동 · ESC로 닫기","pg.preview.trigger":"뷰어 열기","pg.params.title":"파라미터","pg.params.subtitle":"prop 이름에 hover하면 설명을 보고, 책 아이콘으로 문서를 열 수 있습니다.","pg.events.title":"이벤트","pg.events.subtitle":"현재 세션의 라이프사이클 콜백 출력입니다.","pg.events.empty":"라이프사이클 콜백을 활성화하면 이벤트 스트림이 여기에 표시됩니다.","pg.code.title":"코드","pg.code.subtitle":"현재 모드에서 복사할 수 있는 코드입니다.","pg.code.hideDefaults":"기본값 숨기기","pg.copy":"복사","pg.copied":"복사됨","pg.portalTarget.title":"사용자 지정 Portal 대상","pg.portalTarget.body":"앱에 overlay root, modal root, micro-frontend 컨테이너가 이미 있을 때 사용합니다. 오른쪽 이미지를 클릭하면 뷰어가 document.body 대신 그 root 아래에 마운트됩니다.","pg.portalTarget.root":"호스트 overlay root","pg.portalTarget.imageAlt":"portalTarget 데모 이미지","group.data":"데이터","group.preset":"프리셋","group.interface":"인터페이스","group.controller":"컨트롤러","group.hotkey":"단축키","group.animate":"애니메이션","group.gesture":"Gesture","group.lifecycle":"라이프사이클","group.controlled":"제어 컴포넌트","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"데스크톱 범위","common.presetScope.desktop.desc":"데스크톱 중심 파라미터입니다. desktop preset에서 기본으로 켜지거나 데스크톱에서만 실질적인 효과가 있습니다.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"모바일 범위","common.presetScope.mobile.desc":"모바일 또는 터치 중심 파라미터입니다. mobile preset에서 기본으로 켜지거나 터치 상호작용에서만 의미가 있습니다.","common.expand":"펼치기","common.required":"필수","common.default":"기본값","common.add":"추가","common.remove":"제거","common.enable":"사용","common.disable":"사용 안 함","param.viewInDocs":"문서에서 보기","docs.title":"API 레퍼런스","docs.search.placeholder":"문서 검색...","docs.search.empty":"일치하는 항목 없음","docs.toc.title":"이 페이지의 목차","docs.sidebar.gettingStarted":"시작하기","docs.sidebar.quickstart":"빠른 시작","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"개념","docs.sidebar.modes":"세 가지 모드","docs.sidebar.theming":"테마 통합","docs.sidebar.props":"Props","docs.sidebar.recipes":"레시피","docs.sidebar.examples":"예제","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"레퍼런스","docs.sidebar.migration":"마이그레이션","docs.sidebar.faq":"자주 묻는 질문","preset.desktop":"데스크톱","preset.mobile":"모바일","preset.auto":"자동","animate.flip.fade":"페이드","animate.flip.crossFade":"크로스 페이드","animate.flip.swipe":"스와이프","animate.flip.zoom":"줌","animate.flip.blur":"블러","animate.flip.none":"없음","animate.slowMotion":"슬로 모션","gesture.swipe":"스와이프","gesture.dragExit":"드래그 종료","gesture.wheelZoom":"휠 줌","gesture.pinchZoom":"핀치 줌","gesture.doubleTapZoom":"더블 탭 줌","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"프리셋을 따르는 제스처 설정입니다. desktop은 줌 상태에서 휠 줌을 켜고, mobile은 드래그 페이징, 드래그 종료, 핀치 줌, 더블 탭 줌을 켭니다.","gesture.swipe.desc":"set 안에서 가로 드래그로 페이지를 넘깁니다. 단일 이미지 뷰어에서는 무시됩니다.","gesture.dragExit.desc":"세로 드래그로 종료합니다. 기존 onBrowsing(false) 닫기 경로를 사용합니다.","gesture.wheelZoom.desc":"뷰어가 이미 줌 상태일 때 마우스 휠 또는 트랙패드로 줌합니다. desktop은 켜고 mobile은 끕니다.","gesture.pinchZoom.desc":"mobile의 두 손가락 핀치 줌입니다. fit 스케일까지 줄이면 줌을 종료하고 이미지를 가운데로 되돌립니다.","gesture.doubleTapZoom.desc":"mobile의 한 손가락 더블 탭입니다. 첫 더블 탭은 탭 위치를 중심으로 줌하고, 줌 상태에서 더블 탭하면 fit 보기로 돌아갑니다.","gesture.touchAction.desc":"CSS touch-action 전략입니다. managed는 핀치 줌에 none을, 더블 탭만 있는 설정에 manipulation을 사용합니다. 명시한 값은 그대로 전달됩니다.","gesture.threshold.desc":"제스처로 인정할 최소 드래그 거리(px)입니다.","gesture.velocity.desc":"제스처로 인정할 최소 속도(px/ms)입니다.","gesture.axisLock.desc":"대각선 움직임이 가로와 세로 제스처를 동시에 트리거하지 않도록 하는 축 잠금 비율입니다.","gesture.resistance.desc":"loop=false이고 첫 이미지 또는 마지막 이미지에 있을 때의 경계 저항 비율입니다.","gesture.opacity.desc":"세로 드래그 종료 시 드래그 거리가 커질수록 이미지 불투명도를 낮출지 여부입니다.","gesture.wheelZoom.step.desc":"휠 줌 감도입니다. 값이 클수록 같은 wheel delta에서 더 빠르게 줌합니다.","gesture.wheelZoom.smooth.desc":"즉시 점프하지 않고 기존 zoom-follow RAF로 휠 줌을 보간합니다.","gesture.wheelZoom.minScale.desc":"휠 줌의 최소 스케일입니다. 줌아웃으로 이 값에 도달하면 줌 모드를 종료합니다.","gesture.wheelZoom.maxScale.desc":"휠 줌의 최대 스케일입니다.","gesture.wheelZoom.center.desc":"휠 줌 초점입니다. pointer는 wheel 이벤트 위치를, viewport는 화면 중앙을 사용합니다.","gesture.wheelZoom.reverse.desc":"다른 wheel 동작은 유지하면서 휠 줌 방향만 반전합니다.","gesture.wheelZoom.exitGuardDuration.desc":"휠 줌아웃으로 줌 모드를 종료한 뒤의 보호 시간(ms)입니다. 이 시간 동안 남은 wheel 이벤트는 무시됩니다.","gesture.pinchZoom.minScale.desc":"핀치 최소 스케일입니다. fit은 화면에 맞춘 브라우징 크기를 뜻합니다.","gesture.pinchZoom.maxScale.desc":"핀치 최대 스케일입니다.","gesture.pinchZoom.resetBelowFit.desc":"핀치가 fit 스케일까지 줄어들면 줌을 종료하고 이미지를 가운데로 되돌립니다.","gesture.pinchZoom.center.desc":"핀치 초점입니다. gesture는 두 손가락의 중간점을, viewport는 화면 중앙을 사용합니다.","gesture.doubleTapZoom.scale.desc":"더블 탭으로 줌에 들어갈 때의 목표 스케일입니다.","gesture.doubleTapZoom.minScale.desc":"더블 탭 줌을 제한하는 최소 스케일입니다.","gesture.doubleTapZoom.maxScale.desc":"더블 탭 줌을 제한하는 최대 스케일입니다.","gesture.doubleTapZoom.center.desc":"더블 탭 초점입니다. tap은 탭 위치를, viewport는 화면 중앙을 사용합니다.","gesture.doubleTapZoom.interval.desc":"두 탭 사이의 최대 시간(ms)입니다.","gesture.doubleTapZoom.distance.desc":"두 탭 사이의 최대 이동량(px)입니다.","controller.pagination":"페이지네이션","controller.rotate":"회전","controller.rotateLeft":"왼쪽 회전","controller.rotateRight":"오른쪽 회전","controller.zoom":"줌","controller.download":"다운로드","controller.close":"닫기","controller.flip":"페이지 이동","controller.flipLeft":"이전","controller.flipRight":"다음","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"상단의 페이지 표시기 — 현재 위치 / 전체 페이지 수","controller.rotate.desc":"회전 컨트롤 그룹(왼쪽 / 오른쪽 회전 버튼 포함)","controller.rotateLeft.desc":"반시계 방향으로 90° 회전","controller.rotateRight.desc":"시계 방향으로 90° 회전","controller.zoom.desc":"1:1 줌 모드 진입 / 종료","controller.download.desc":"현재 이미지 다운로드","controller.close.desc":"뷰어 닫기","controller.flip.desc":"페이지 이동 컨트롤 그룹(이전 / 다음 버튼 포함)","controller.flipLeft.desc":"이전 이미지로 이동","controller.flipRight.desc":"다음 이미지로 이동","controller.backdrop.desc":"툴바 배경색. 미지정 시 최상위 backdrop을 따릅니다. 최상위 backdrop이 어두운 단색일 때 반투명 값 (예: `rgba(0,0,0,0.4)`)을 권장합니다.","controller.color.desc":'툴바 아이콘 색상. 미지정 시 currentColor를 따릅니다. 개별 버튼 문자열 지정 (예: `controller.zoom = "#ff8800"`)이 우선합니다.',"controller.placement.desc":"툴바 위치입니다. 툴바 캡슐만 이동하며, 양쪽 페이지 이동 버튼과 페이지네이션은 기존 위치를 유지합니다.","controller.layout.desc":"툴바, 좌우 flip 버튼, 페이지네이션, caption의 안전 inset을 조정합니다. 숫자는 px, 문자열은 CSS 길이로 처리되며 scalar inset은 각 대상의 자연스러운 진입 방향에 적용되고 layout.mobile은 모바일 preset에서 덮어씁니다.","controller.layout.toolbarInset.desc":"툴바의 안전 inset입니다. scalar 값은 현재 placement에 따라 해당 top / right / bottom / left 가장자리에 적용됩니다.","controller.layout.flipInset.desc":"좌우 flip 버튼의 안전 inset입니다. scalar 값은 왼쪽과 오른쪽 버튼에 모두 적용됩니다.","controller.layout.paginationInset.desc":"페이지네이션의 안전 inset입니다. scalar 값은 하단 진입 방향에 적용되어 caption이나 사용자 UI와 겹치지 않게 합니다.","controller.layout.captionInset.desc":"caption의 안전 inset입니다. scalar 값은 하단 진입 방향에 적용되어 페이지네이션이나 하단 컨트롤보다 위에 둘 수 있습니다.","controller.render.desc":"완전히 사용자 지정한 컨트롤러 render 콜백입니다. state, actions, 내장 slots를 받으며 controller=false일 때는 비활성화됩니다.","controller.overriddenBy":"상위 스위치에 의해 활성화","snippet.overriddenByProp":"{umbrella}에 의해 재정의됨","hotkey.close":"닫기 (Escape)","hotkey.zoom":"줌 (Space)","hotkey.flip":"페이지 이동 (←/→)","hotkey.flipLeft":"이전 (←)","hotkey.flipRight":"다음 (→)","hotkey.rotate":"회전 ([ / ])","hotkey.rotateLeft":"왼쪽 회전 ([)","hotkey.rotateRight":"오른쪽 회전 (])","hotkey.download":"다운로드 (Mod+S)","hotkey.close.desc":"Escape를 눌러 뷰어 닫기","hotkey.zoom.desc":"Space를 눌러 1:1 줌 모드 토글","hotkey.flip.desc":"← / → 키로 set 안에서 페이지 이동","hotkey.flipLeft.desc":"← 키로 이전 이미지로 이동","hotkey.flipRight.desc":"→ 키로 다음 이미지로 이동","hotkey.rotate.desc":"[ / ] 키로 이미지 회전 (조합 스위치; 양방향 모두 바인딩)","hotkey.rotateLeft.desc":"[ 키로 시계 반대 방향 90° 회전","hotkey.rotateRight.desc":"] 키로 시계 방향 90° 회전","hotkey.download.desc":'Cmd+S (macOS) 또는 Ctrl+S (Windows/Linux)로 현재 이미지 다운로드. 기본 비활성 — 활성화 시 브라우저의 "다른 이름으로 페이지 저장" 단축키를 가로챕니다.',"animate.browsing.desc":"뷰어를 열고 닫을 때의 트랜지션","animate.flip.desc":"set 내에서 페이지를 이동할 때의 트랜지션 스타일","animate.slowMotion.desc":"켜면 열거나 닫을 때 Shift를 누르는 동안 전체 브라우징 전환이 10배 느려져 확인이나 데모에 사용할 수 있습니다","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"이미지 URL. 필수 항목.","param.alt.label":"alt","param.alt.desc":"이미지 제목. 뷰어 상단에 표시됩니다.","param.caption.label":"caption","param.caption.desc":"뷰어 하단 캡션. string 이면 기본 필 스타일, { text, style?, className? } 이면 사용자 정의. set[i].caption 으로 항목별 덮어쓰기 가능.","param.set.label":"set","param.set.desc":"다중 이미지 세트. 전달하면 화살표 키로 이동 가능한 갤러리 모드가 활성화됩니다.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"초기 페이지 인덱스 (0부터 시작).","param.preset.label":"preset","param.preset.desc":"프리셋 번들. 기본값은 auto이며 controller / hotKey / animate / gesture의 기본값을 결정합니다.","param.backdrop.label":"backdrop","param.backdrop.desc":"뷰어 배경색. 유효한 CSS 색상 문자열이면 됩니다.","param.zIndex.label":"zIndex","param.zIndex.desc":"뷰어의 쌓임 순서.","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"뷰어 Portal을 마운트할 DOM 요소입니다. 기본값은 document.body입니다. 앱의 overlay root, modal root, micro-frontend 컨테이너에 연결할 때 사용하며, 마운트 부모만 바뀌고 뷰어는 여전히 fixed 전체 화면 레이아웃을 사용합니다.","param.radius.label":"radius","param.radius.desc":"이미지 모서리 반경 (px).","param.edge.label":"edge","param.edge.desc":"이미지와 뷰포트 사이의 최소 여백 (px).","param.loop.label":"loop","param.loop.desc":"끝에 도달했을 때 첫 이미지로 순환할지 여부.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"페이지 스크롤 시 뷰어를 닫습니다.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"이미지 더블클릭으로 뷰어를 닫습니다. 기본값은 꺼짐.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"뷰어가 열려 있는 동안에도 커버 이미지를 표시합니다.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"로딩 인디케이터 표시 전 지연 (ms). 이 기간 안에 이미지 로딩이 완료되면 로딩이 표시되지 않습니다 — 캐시된 이미지를 빠르게 전환할 때 깜빡임을 방지합니다. 기본 200ms; 0 = 즉시 표시 (구버전 동작).","param.controller.label":"controller","param.controller.desc":"컨트롤 바 설정입니다. false는 전체를 끄고, 부분 객체는 버튼, 위치, 오버레이 레이아웃, 사용자 지정 render를 덮어씁니다.","param.hotKey.label":"hotKey","param.hotKey.desc":"키보드 단축키.","param.animate.label":"animate","param.animate.desc":"브라우징, 커버 기하, 슬로 모션, 페이지 전환 애니메이션 설정입니다.","param.gesture.label":"gesture","param.gesture.desc":"프리셋을 따르는 제스처 설정입니다. desktop은 줌 상태에서 wheelZoom을 켜고, mobile은 기본적으로 swipe, dragExit, pinchZoom, doubleTapZoom을 켭니다. gesture=false는 모두 끕니다.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"뷰어가 열리거나 닫힐 때 호출됩니다 (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"줌 모드 진입 / 종료 시 호출됩니다 (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"페이지 변경 시 호출됩니다 (새 페이지 인덱스).","param.onRotating.label":"onRotating","param.onRotating.desc":"회전 시 호출됩니다 (각도).","param.onError.label":"onError","param.onError.desc":"이미지 로드 실패 시 호출됩니다 (커버/뷰어 공통, SyntheticEvent 전달).","param.browsing.label":"browsing","param.browsing.desc":"제어된 브라우징 상태. 값을 전달하면 제어 모드로 전환되며 onBrowsing과 함께 사용해야 합니다.","docs.section.installation.title":"설치","docs.section.installation.intro":"패키지 매니저로 설치:","docs.section.installation.agent":"AI Agent는 먼저 https://zmage.caldis.me/llms.txt 를 읽고, 기본 통합은 최소한으로 유지해야 합니다.","docs.section.installation.then":"컴포넌트와 스타일시트를 가져오기:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"서버 렌더링 앱이라면, import 시 document에 접근하지 않는 /ssr 엔트리를 사용하세요:","docs.section.modes.title":"세 가지 호출 방식","docs.section.modes.intro":"react-zmage는 동일한 설정 인터페이스를 세 가지 호출 형태로 제공합니다:","docs.section.modes.componentTitle":"컴포넌트","docs.section.modes.componentBody":"기본 방식 — 렌더링하는 JSX를 직접 제어할 때 사용합니다. 로 바꾸기만 하면, 모든 네이티브 HTML 속성(className, style, onClick 등)이 내부의 로 그대로 전달됩니다.","docs.section.modes.imperativeTitle":"명령형","docs.section.modes.imperativeBody":"적절한 커버 가 없거나, 컴포넌트 트리에 추가 노드를 마운트하고 싶지 않을 때 사용합니다. 이벤트 핸들러, 비동기 콜백, 서드파티 위젯 등 어디에서든 호출하여 뷰어를 열 수 있습니다. 수동으로 닫을 수 있도록 destructor 클로저를 반환합니다.","docs.section.modes.wrapperTitle":"래퍼","docs.section.modes.wrapperBody":"렌더링되는 HTML을 직접 제어할 수 없을 때 사용합니다 — markdown 출력, CMS 리치 텍스트, dangerouslySetInnerHTML. Wrapper는 클릭된 에서 src / alt를 읽고, backdrop, 컨트롤, 단축키, 애니메이션, 콜백, set 같은 뷰어 설정은 에 둡니다.","docs.section.modes.wrapperNote":"Wrapper는 componentDidMount / componentDidUpdate 시점에 자식 img를 탐색합니다. Wrapper가 렌더링된 뒤에 주입된 이미지는 Wrapper가 다시 렌더될 때까지 연결되지 않습니다. set이 전달되면 클릭된 img의 src를 set과 대조해 초기 페이지로 사용하고, set이 없으면 data-zmage-caption 또는 가장 가까운 figcaption을 뷰어 caption으로 사용할 수 있습니다.","docs.section.theming.title":"테마 통합","docs.section.theming.intro":"react-zmage는 의도적으로 호스트 사이트의 테마 시스템에 종속되지 않습니다 — prefers-color-scheme을 읽지 않으며, 특정 CSS 변수 프레임워크에 묶이지도 않습니다. 라이트/다크 통합은 사용자 측의 책임입니다:","docs.section.theming.bullet.backdrop":"뷰어 배경은 backdrop 속성으로 지정합니다(유효한 CSS 색상 문자열). 기본값은 흰색 #FFFFFF입니다.","docs.section.theming.bullet.icons":"컨트롤 바 아이콘은 SVG currentColor로 렌더링됩니다. 글로벌 CSS에서 덮어쓰면 디자인 시스템과 정렬할 수 있습니다.","docs.section.theming.bullet.scoped":"런타임 스타일은 모두 #zmage 컨테이너 내부로 스코프되어 앱의 다른 부분에 누수되지 않습니다.","docs.section.theming.defaultTitle":"기본 동작","docs.section.theming.defaultBody":"backdrop을 생략하면 뷰어가 흰색 패널로 렌더링됩니다. 라이트 사이트에서는 자연스럽지만, 다크 사이트에서는 흰색 컨트롤 아이콘과 대비가 약해집니다:","docs.section.theming.patternTitle":"컴포넌트 / 제어 사용","docs.section.theming.patternBody":"기존 테마 훅(next-themes, 자체 ThemeProvider 등)에서 resolved 값을 읽고 색상으로 매핑한 뒤 backdrop으로 전달하세요. 작은 로컬 컴포넌트로 감싸두면 호출부가 깔끔해집니다:","docs.section.theming.imperativeTitle":"명령형 사용","docs.section.theming.imperativeBody":"이벤트 핸들러에서 현재 DOM 상태(예: documentElement의 테마 클래스)를 읽고 색상으로 변환한 뒤 Zmage.browsing에 전달하세요:","docs.section.theming.iconsTitle":"디자인 시스템과 아이콘 색상 정렬","docs.section.theming.iconsBody":"컨트롤 아이콘은 #zmage 컨테이너 안에 있습니다. 글로벌 CSS에서 색상을 덮어쓸 수 있습니다. CSS 변수로 테마를 관리한다면(Tailwind / shadcn 등), 디자인 토큰에 직접 바인딩할 수 있습니다:","docs.section.theming.toolbarTitle":"툴바를 모달 backdrop에서 분리하기","docs.section.theming.toolbarBody":'기본적으로 툴바 캡슐은 최상위 backdrop을 따르고 아이콘은 currentColor로 그려집니다. 어두운 단색 backdrop에서는 어두운 아이콘이 어두운 캡슐에 묻혀 보이지 않습니다. controller.backdrop(캡슐 색상)과 controller.color(아이콘 색상)을 지정해 분리하세요. 개별 버튼 문자열 지정(예: controller.zoom = "#ff8800")은 controller.color보다 우선합니다.',"docs.search.desc.installation":"패키지 매니저로 설치하고 스타일시트 가져오기","docs.search.desc.ssr":"import 시 document에 접근하지 않는 SSR 엔트리","docs.search.desc.modes":"컴포넌트 / 명령형 / 래퍼 — 세 가지 호출 방식","docs.search.desc.theming":"뷰어 배경과 아이콘을 사이트 테마와 정렬","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"프리셋 선택: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"controller / hotKey / animate / gesture 기본 묶음","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget 등 UI 옵션","docs.search.desc.propsController":"컨트롤 바 버튼, 위치, 사용자 지정 render","docs.search.desc.propsHotkey":"키보드 단축키: ESC / Space / 화살표","docs.search.desc.propsAnimate":"브라우징 및 페이지 이동 애니메이션","docs.search.desc.propsGesture":"휠 줌, 드래그 페이징, 드래그 종료, 핀치, 더블 탭 줌","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"제어된 브라우징 상태","docs.search.desc.examples":"단일 이미지와 다중 이미지 갤러리 예제","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet 타입 선언","docs.search.desc.migration":"0.x에서의 업그레이드 노트","docs.search.desc.faq":"흔한 통합 이슈와 버전별 수정 사항","docs.section.props.title":"Props","docs.section.props.intro":"BaseType의 모든 속성은 세 가지 모드 중 어떤 것에서도 사용할 수 있습니다.","docs.section.props.wrapperScope.title":"Wrapper 모드의 prop 범위","docs.section.props.wrapperScope.intro":"는 커버 이미지를 직접 렌더링하지 않습니다. 이미 존재하는 하위 노드에 뷰어를 연결하므로, 일부 prop은 Wrapper 모드에서 별도의 의미를 갖습니다.","docs.section.props.wrapperScope.data":"src와 alt는 자식 에 둡니다. 최상위 src / alt는 클릭된 DOM 노드 값으로 덮어써집니다. set이 없을 때는 caption을 data-zmage-caption 또는 가장 가까운 figcaption에서 읽을 수 있습니다.","docs.section.props.wrapperScope.config":"set과 defaultPage는 명시적인 공유 갤러리에 사용할 수 있습니다. 클릭된 img src가 set에 있으면 Wrapper는 해당 index를 열고, defaultPage는 fallback으로만 쓰입니다. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, loadingDelay는 평소처럼 적용됩니다.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating, onError는 정상 동작합니다. Wrapper 내부에서 같은 뷰어를 열기 때문입니다.","docs.section.props.wrapperScope.controlled":"browsing은 컴포넌트 모드의 controlled state이며 Wrapper를 제어하지 않습니다. 외부 state로 열고 싶다면 컴포넌트 모드를 쓰거나 Zmage.browsing()을 직접 호출하세요.","docs.section.props.interface":"인터페이스 및 인터랙션","docs.section.props.portalTarget.title":"사용자 지정 Portal 대상","docs.section.props.portalTarget.body":"기본적으로 뷰어 레이어는 document.body에 마운트됩니다. 앱에 overlay root, modal root, shadow host, micro-frontend shell 컨테이너가 있다면 그 요소를 portalTarget에 넘겨 쌓임 순서, 스타일 범위, 호스트 생명주기를 앱 셸 안에서 관리할 수 있습니다.","docs.section.props.portalTarget.boundary":"portalTarget은 DOM 부모만 바꿉니다. 뷰어는 여전히 fixed 전체 화면 레이아웃을 사용하며 로컬 미리보기처럼 컨테이너 안으로 잘리지 않습니다. 쌓임 순서를 조정할 때는 zIndex를 사용하세요.","docs.section.props.controller.keyHeader":"키","docs.section.props.controller.descHeader":"설명","docs.section.props.controller.umbrella":"rotate는 rotateLeft / rotateRight의 상위 스위치로, 활성화하면 두 버튼이 모두 표시됩니다. flip도 flipLeft / flipRight에 대해 동일하게 동작합니다.","docs.section.props.controller.layoutTitle":"오버레이 레이아웃","docs.section.props.controller.layoutIntro":"layout은 toolbar, 좌우 flip, pagination, caption 오버레이 offset만 조정하며 이미지 첫 프레임이나 zoom 지오메트리에는 참여하지 않습니다. 숫자는 px, 문자열은 CSS 길이로 전달되고 scalar inset은 각 대상의 자연스러운 진입 방향에 적용되며 layout.mobile은 모바일에서 기본 레이아웃을 덮어씁니다.","docs.section.props.controller.renderTitle":"사용자 지정 render","docs.section.props.controller.renderIntro":"render는 { state, actions, slots }를 받고 React 노드를 반환해야 합니다. null을 반환하면 컨트롤러 레이어를 숨길 수 있고, 일부 UI만 바꾸려면 slots를 재사용할 수 있습니다.","docs.section.props.hotkey.umbrella":"flip은 flipLeft / flipRight의, rotate는 rotateLeft / rotateRight의 상위 스위치입니다 — 어느 쪽이든 활성화하면 좌우 양쪽 키가 함께 바인딩됩니다. 각 entry는 'Mod+S' / 'BracketLeft' 같은 문자열 디스크립터로 기본 바인딩을 재정의할 수 있습니다 (Mod는 macOS에서 ⌘, Windows/Linux에서 Ctrl).","docs.section.props.hotkey.customTitle":"사용자 지정 바인딩","docs.section.props.hotkey.customIntro":"각 hotKey 엔트리는 boolean (켜기/끄기), string (사용자 지정 디스크립터), string[] (여러 바인딩)을 받습니다. 디스크립터는 e.code 이름을 사용하며 — 키의 물리적 위치 기반, 키보드 레이아웃과 무관합니다. Mod 접두사는 크로스 플랫폼 ⌘/Ctrl을 의미합니다. 엄격한 수정자 매칭: 선언되지 않은 수정자가 눌려 있으면 안 됩니다 (예: Space는 Cmd+Space로 발화되지 않음).","docs.section.props.hotkey.cheatsheetTitle":"디스크립터 치트시트","docs.section.props.hotkey.cheatsheet.shorthand":"단일 문자 / 숫자는 자동 정규화","docs.section.props.hotkey.cheatsheet.arrows":"화살표 키","docs.section.props.hotkey.cheatsheet.punct":"문장 부호 (키의 물리적 이름)","docs.section.props.hotkey.cheatsheet.whitespace":"공백 / 제어 키","docs.section.props.hotkey.cheatsheet.modifier":"수정자 접두사 (+로 연결)","docs.section.props.animate.typeHeader":"타입","set.src.desc":"이미지 URL — 필수","set.alt.desc":"해당 이미지의 제목","set.caption.desc":"해당 이미지의 캡션. 지정하면 외부 caption을 덮어씁니다","set.className.desc":"해당 이미지에 적용되는 사용자 정의 클래스","set.style.desc":"해당 이미지에 적용되는 사용자 정의 인라인 스타일","docs.section.props.preset.title":"프리셋 번들","docs.section.props.preset.intro":"preset은 controller / hotKey / animate / gesture 하위 객체에 적용되는 기본값 묶음입니다. preset을 생략하면 auto를 사용합니다. auto는 런타임에 matchMedia('(pointer: coarse) and (hover: none)')를 통해 desktop 또는 mobile로 해석되며, SSR 또는 matchMedia가 없는 환경에서는 desktop으로 폴백됩니다.","docs.section.props.preset.subParamHeader":"하위 파라미터","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"예제","docs.section.examples.singleTitle":"단일 이미지","docs.section.examples.galleryTitle":"다중 이미지 갤러리","docs.section.examples.mobileTitle":"모바일 제스처","docs.section.examples.mobileBody":"mobile preset을 강제로 사용해 터치 기기에서 드래그 전환, 드래그 종료, 핀치 줌, 더블 탭 줌을 확인합니다.","docs.section.examples.controllerTitle":"사용자 지정 컨트롤러","docs.section.examples.controllerBody":"컨트롤러를 화면 가장자리로 옮기거나 state와 actions를 받는 render 콜백으로 전체 UI를 교체할 수 있습니다.","docs.section.examples.coverTitle":"잘린 커버","docs.section.examples.coverBody":"object-fit과 border radius를 커버 img 자체에 두면 열리는 첫 프레임이 보이는 크롭과 맞춰집니다.","docs.section.examples.portalTargetTitle":"호스트 overlay root에 마운트","docs.section.examples.portalTargetBody":"페이지에 공유 overlay 컨테이너가 있다면 그 DOM 노드를 portalTarget에 넘깁니다. 예시는 여전히 전체 화면 뷰어이며, Portal의 부모만 호스트 root로 바뀝니다.","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"타입은 런타임 export와 같은 위치에 있습니다. 전체 prop 유니온 타입은 BaseType입니다:","docs.section.typescript.refIntro":"컴포넌트는 ref를 받아 커버 img로 전달합니다:","docs.section.migration.title":"마이그레이션","docs.section.migration.from":"0.x에서 업그레이드:","docs.section.migration.bullet1":"컴포넌트는 forwardRef exotic이므로 new Zmage()로 호출하지 마세요.","docs.section.migration.bullet2":"SSR 엔트리를 가져오고 있다면 react-zmage/ssr로 전환하세요.","docs.section.faq.title":"자주 묻는 질문","docs.section.faq.tailwind-shrink.q":"Tailwind / normalize.css / Bootstrap을 사용하면 모달 이미지가 커버보다 작게 시작하는 이유는?","docs.section.faq.tailwind-shrink.a":"해당 리셋들은 전역으로 `img { max-width: 100% }`를 적용하므로 모달 이미지가 커버 크기로 제한됩니다. 1.1.2 이전 버전이 영향을 받으며, 1.1.2+ 에서는 `.imageLayer`에 방어 스타일을 추가했습니다. >=1.1.2로 업그레이드하세요.","docs.section.faq.r19-imperative.q":"React 18 / 19에서 `Zmage.browsing()`이 undefined를 반환하는 이유는?","docs.section.faq.r19-imperative.a":"1.1.2에서 수정된 버그입니다. 기존 코드는 `RENDER.REF.current?.outBrowsing`을 동기적으로 읽었는데, React 17에서는 동작했지만 R18+ 에서는 커밋이 비동기라 깨집니다. 1.1.2는 안정적인 destructor 클로저를 반환합니다. >=1.1.2로 업그레이드하세요.","docs.section.faq.wrapper-empty.q":"``가 빈 모달을 열고 브라우저가 빈 src 경고를 띄웁니다. 왜죠?","docs.section.faq.wrapper-empty.a":"기존 래퍼는 클릭된 img 위에 `defaultProps.src=''`를 스프레드해 src/alt를 비웠습니다. 1.1.2는 클릭된 DOM 노드의 src/alt를 명시적으로 읽도록 수정되었습니다. 업그레이드하면 해결됩니다.","docs.section.faq.vite-esm.q":'Vite / Next.js 클라이언트에서 명령형 API가 "no compatible mount API"를 던집니다. 왜죠?',"docs.section.faq.vite-esm.a":"1.1.2 이전에는 런타임 감지에 `require('react-dom/client')`를 사용했지만 브라우저 ESM에는 `require` 전역이 없습니다. 1.1.2는 정적 import로 전환했습니다 — >=1.1.2로 업그레이드하세요.","docs.section.faq.wrapper-dynamic.q":"마운트 이후에 추가한 이미지에 래퍼가 클릭 핸들러를 연결하지 않습니다.","docs.section.faq.wrapper-dynamic.a":"래퍼는 `componentDidMount`와 `componentDidUpdate` 시점에만 ``를 탐색합니다. React 렌더 트리 바깥에서 DOM img를 주입한다면(예: 부모가 재렌더되지 않은 채로 변하는 dangerouslySetInnerHTML), 래퍼가 다시 렌더되도록 강제하거나, 직접 클릭 핸들러에서 `Zmage.browsing()`을 호출하세요.","docs.section.faq.lazy-src.q":"제 ``는 data-src / 지연 로딩을 사용합니다 — Zmage를 열면 실제 이미지가 아니라 플레이스홀더가 보입니다. 어떻게 수정하나요?","docs.section.faq.lazy-src.a":"Zmage는 기본적으로 커버 ``의 `src`를 읽습니다 — 플레이스홀더가 전부입니다. 미리보기할 실제 URL을 `set`으로 명시적으로 전달하세요: ``. 명령형 호출도 동일합니다: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"페이지에는 썸네일을 보여주고 클릭하면 고해상도 이미지를 표시하고 싶습니다 — `set`을 생략할 수 있나요?","docs.section.faq.cover-vs-set.a":'아니요. `set`을 주지 않으면 커버의 `src`가 곧 뷰어가 보여주는 것입니다. "썸네일 진입점 + 풀사이즈 뷰어"를 만들려면 명시적으로 분리해야 합니다: ``. 같은 패턴이 data-src 지연 로딩 (위 FAQ) 과 CDN 다중 해상도 시나리오를 모두 해결합니다. "그리드/갤러리 + 뷰어 열기" UI를 원한다면 Zmage가 직접 제공하지 않습니다 — 갤러리는 직접 렌더하고 클릭 시 `Zmage.browsing({ src, set })`을 호출하세요.',"docs.section.faq.controlled-mismatch.q":"제어된 `browsing` prop이 모달 상태와 어긋납니다.","docs.section.faq.controlled-mismatch.a":"제어 모드에서는 `browsing`과 `onBrowsing`이 모두 필요합니다. `browsing`만 전달하면 내부 상태가 한 번만 동기화된 뒤 점점 어긋납니다. 항상 짝으로 사용하세요.","docs.section.faq.ssr.q":"Next.js / Remix / SSR 프레임워크에서 어떻게 사용하나요?","docs.section.faq.ssr.a":"`react-zmage/ssr` 엔트리를 사용하세요 — import 시 `document`에 접근하지 않습니다. 명령형 `Zmage.browsing()`이 렌더 도중이나 서버 전용 경로에서 실행될 가능성이 있다면 `typeof window !== 'undefined'` 가드가 필요합니다.","docs.section.faq.theme.q":"뷰어를 다크 / 라이트 테마에 맞추려면?","docs.section.faq.theme.a":"위의 「테마 통합」 섹션에 따라 `backdrop`을 전달하세요. 라이브러리는 설계상 테마에 비종속적이며 prefers-color-scheme도 읽지 않습니다 — 매핑은 앱 측의 책임입니다.","playground.preset.aria":"데이터 프리셋 전환","playground.preset.default.label":"기본","playground.preset.default.hint":"童夢 · 2 장","playground.preset.testset.label":"테스트 세트","playground.preset.testset.hint":"6 장 · 비율 + 포맷"},wR={"nav.playground":"Playground","nav.docs":"Documentation","nav.ai":"Guide installation IA","nav.github":"GitHub","useCases.eyebrow":"Cas d'utilisation","useCases.title":"Apercu d'images React pour blogs, CMS, MDX et pages d'actualite","useCases.body":"react-zmage est un visualiseur d'images React qui transforme des elements ordinaires en apercu plein ecran avec ouverture depuis l'origine. Il prend en charge les galeries, le clavier, les gestes mobiles, l'ouverture imperative, le mode Wrapper pour rich text et SSR/RSC.","useCases.cta.docs":"Lire la documentation","useCases.cta.wrapper":"Essayer le mode Wrapper","useCases.card.blog.title":"Apercu d'images de blog","useCases.card.blog.body":"Ouvrez les images d'article en plein ecran sans remplacer la mise en page du post ni creer une galerie separee.","useCases.card.cms.title":"Images rich text de CMS","useCases.card.cms.body":"Encadrez le HTML rendu par un CMS, un parseur Markdown ou un editeur pour que les existants ouvrent le visualiseur.","useCases.card.news.title":"Galeries d'articles d'actualite","useCases.card.news.body":"Gardez les pages editoriales lisibles tout en offrant clavier, gestes et navigation multi-image pour voir les details.","useCases.card.mdx.title":"Images MDX et documentation","useCases.card.mdx.body":"Utilisez le mode Wrapper pour les pages de docs ou les auteurs controlent les images et l'app React controle la structure.","useCases.card.lightbox.title":"Alternative a React lightbox","useCases.card.lightbox.body":"Utilisez une couche d'apercu plus legere quand vous voulez le zoom origin-expand et conserver le markup existant sans adopter une galerie complete.","useCases.card.ssr.title":"Next.js, SSR et RSC","useCases.card.ssr.body":"Importez le sous-chemin compatible SSR dans les apps rendues cote serveur, puis ouvrez le visualiseur interactif depuis des frontieres client.","useCases.mode.eyebrow":"Choisir un mode","useCases.mode.title":"Choisissez selon qui possede le markup image","useCases.mode.component":"Vous controlez le JSX et pouvez remplacer par .","useCases.mode.imperative":"Un bouton, une commande, un evenement ou un callback doit ouvrir le visualiseur.","useCases.mode.wrapper":"Les images viennent d'un CMS, de MDX, de Markdown ou de HTML rich text.","useCases.facts.eyebrow":"Faits d'entite","useCases.facts.title":"La version courte que les crawlers doivent comprendre","useCases.fact.react":"React 16.8 a 19","useCases.fact.modes":"Modes Component, imperative et Wrapper","useCases.fact.input":"Navigation clavier et gestes mobiles","useCases.fact.ssr":"Chemin d'import compatible SSR/RSC","useCases.fact.gallery":"Navigation de galerie sans restructurer la page","useCases.fact.origin":"Apercu plein ecran avec origin-expand","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Questions frequentes des personnes et des AI Agents","useCases.faq.what.q":"Qu'est-ce que react-zmage?","useCases.faq.what.a":"react-zmage est un visualiseur d'images React qui transforme des elements ordinaires en apercu plein ecran avec origin-expand, galerie, clavier, gestes mobiles, mode Wrapper et support SSR/RSC.","useCases.faq.lightbox.q":"Quand utiliser react-zmage plutot qu'une React lightbox?","useCases.faq.lightbox.a":"Utilisez react-zmage quand vous voulez ouvrir des images existantes en plein ecran sans reconstruire la page autour d'une galerie. Il convient aux blogs, CMS rich text, docs MDX, articles d'actualite et pages riches en images.","useCases.faq.richText.q":"react-zmage gere-t-il les images CMS, Markdown ou rich text?","useCases.faq.richText.a":"Oui. Zmage.Wrapper peut lier les noeuds descendants dans du contenu CMS, Markdown, MDX ou dangerouslySetInnerHTML, tout en conservant le markup et la mise en page existants.","useCases.faq.ssr.q":"react-zmage prend-il en charge Next.js, SSR ou RSC?","useCases.faq.ssr.a":"Oui. Utilisez le sous-chemin react-zmage/ssr pour les imports SSR ou RSC, puis appelez les APIs interactives depuis des evenements client ou des Client Components.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Faites partir chaque ","hero.title.line2":"de sa position","hero.subtitle":"Transformez n'importe quel en visionneuse plein écran qui s'ouvre depuis sa position d'origine, avec clavier, gestes et navigation multi-images.","hero.cta.start":"Lire la doc","hero.cta.playground":"Essayer les paramètres","hero.ai.label":"Guide installation IA : lire llms.txt d’abord","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Copier le prompt rapide","hero.ai.copyLabel":"Copier le prompt AI rapide","hero.ai.viewLlms":"voir llms.txt →","ai.badge":"Guide installation IA","ai.title":"Créez un prompt d’intégration react-zmage","ai.subtitle":"Commencez par llms.txt. Gardez Auto pour laisser votre agent inspecter le projet, ou ajustez l’environnement, la source d’images et les interactions avant de copier.","ai.field.agent":"Quel agent utilisez-vous ?","ai.field.depth":"Niveau de configuration","ai.field.environment":"Environnement du projet","ai.field.mode":"Mode d’utilisation","ai.field.imageSource":"Source des images","ai.field.interaction":"Stratégie d’interaction","ai.field.project":"Description du projet","ai.autoTip":"Gardez Auto si vous hésitez. Votre agent inspectera d’abord la structure du projet, la source des images, le mode de rendu et l’entrée des styles, puis choisira le bon mode Zmage et les bonnes props.","ai.project.placeholder":"Décrivez votre app, la source des images et ce que le viewer doit faire.","ai.action.copy":"Copier le setup prompt","ai.action.copied":"Copié","ai.action.openLlms":"Ouvrir llms.txt","ai.copy.error":"La copie a échoué. Sélectionnez le prompt manuellement dans l’aperçu.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"Se met à jour avec vos options","ai.preview.copy":"Copier","ai.preview.expand":"Agrandir","ai.preview.show":"Voir le prompt","ai.preview.hide":"Masquer l’aperçu","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Rend le prompt compatible avec un agent de code général.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Laissez l’agent inspecter le projet d’abord.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Spécifiez manuellement les préférences d’intégration.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Surface interactive réelle","demo.title":"Une page narrative construite avec Child's Dream","demo.body":"Ces images viennent de Child's Dream: un vieux livre, un portail temporel, un renard, une route forestière et un sceau de cristal. Cliquez une image; la première image s’agrandit depuis ce recadrage exact vers le viewer.","demo.shiftHint":"Maintenez SHIFT en cliquant une image pour sentir la transition fluide","demo.zoomHint":"Ouvrez une image, appuyez sur Space pour zoomer, puis utilisez la molette pour continuer.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"Un livre poussiéreux dans un coin de bibliothèque ouvre une porte vers un temps ancien.","demo.story.lead":"Les mots ordinaires de la page deviennent une scène miniature. Le garçon voit une forêt sortir du papier et entend un appel depuis l’autre côté de la barrière.","demo.story.middle":"Un renard devient son compagnon. Après les marées, les canopées et les flamants roses, la route mène plus loin dans la forêt vers un sceau de cristal.","demo.tile.cover":"Vieux livre et portail","demo.tile.gallery":"Première rencontre en forêt","demo.tile.ratio":"Chemin au bord de la marée","demo.tile.controller":"Sceau de cristal","demo.tile.zoom":"Halte des flamants","demo.tile.lamp":"Lumière sous les feuilles","demo.tile.rescue":"Libération dans la forêt","demo.feature.cover":"Clip et rayon de cover alignés","demo.feature.space":"Déplacez le pointeur pour parcourir vite l’image zoomée","demo.feature.wheel":"Utilisez la molette pour changer l’échelle avec douceur","demo.feature.shift":"Shift ralentit ouverture et fermeture","demo.caption":"Cliquez une image pour ouvrir le viewer. Sur desktop, maintenez SHIFT à l’ouverture, puis déplacez le pointeur ou utilisez la molette après zoom.","demo.scene.portal.alt":"Un portail temporel lumineux sur un vieux livre","demo.scene.portal.caption":"Un portail temporel s’allume dans le vieux livre et une forêt sort des mots.","demo.scene.forest.alt":"Le garçon rencontre un renard dans la forêt","demo.scene.forest.caption":"Le renard apparaît entre les arbres et devient le compagnon du garçon.","demo.scene.tide.alt":"Le garçon se tient au bord d’une marée","demo.scene.tide.caption":"L’eau se courbe en spirale et indique le prochain chemin inconnu.","demo.scene.canopy.alt":"Le garçon repose sous une immense canopée","demo.scene.canopy.caption":"La canopée s’ouvre comme des pages pendant que de petites lumières marquent la route.","demo.scene.flamingo.alt":"Le garçon est assis parmi des flamants roses","demo.scene.flamingo.caption":"Un vol léger de flamants offre une pause calme au voyage.","demo.scene.lamp.alt":"Le garçon allume une lampe sous de larges feuilles","demo.scene.lamp.caption":"Les feuilles retiennent l’obscurité pendant que la lampe révèle des indices dans le livre.","demo.scene.crystal.alt":"Le garçon se tient devant un sceau de cristal","demo.scene.crystal.caption":"Le sceau de cristal commence à apparaître au fond de la forêt.","demo.scene.rescue.alt":"Le renard et le garçon approchent du sceau de cristal","demo.scene.rescue.caption":"La clé approche du cristal et le secret du sceau est sur le point de s’ouvrir.","feature.dropin.title":"Ouverture depuis l'origine","feature.dropin.hint":"Ouvre depuis la position, la taille, le rayon et le recadrage de l'image, puis revient au même endroit.","feature.mobile.title":"Compatible mobile","feature.mobile.hint":"Le preset Auto choisit les gestes tactiles: glisser entre les images, tirer vers le bas pour fermer, double tap et pinch zoom.","feature.set.title":"Outils de navigation complets","feature.set.hint":"Zoom, rotation, changement d'image, telechargement et captions partagent un meme etat, meme dans les sets multi-image.","feature.ssr.title":"Compatible SSR/RSC","feature.ssr.hint":"Utilisez l'entree sure cote serveur dans Next.js, SSR ou RSC, puis gardez l'interaction du viewer dans les frontieres client.","modes.title":"S'adapte à votre page existante","modes.component.label":"Mode composant","modes.component.desc":"Quand vous contrôlez le JSX, remplacez par et gardez les props natives.","modes.imperative.label":"Appel impératif","modes.imperative.desc":"Ouvrez la visionneuse depuis boutons, callbacks ou flux asynchrones, sans image de couverture.","modes.wrapper.label":"Mode wrapper","modes.wrapper.desc":"Encapsulez Markdown / CMS / dangerouslySetInnerHTML pour que les images internes s'ouvrent depuis leur place.","modes.try":"Ouvrir l'exemple →","modes.component.when":"Choisissez le mode composant quand vous contrôlez le JSX rendu. Remplacez n'importe quel par ; les props natives continuent de passer, et ouverture / fermeture utilisent la même transition depuis l'origine.","modes.imperative.when":"Choisissez l'appel impératif quand le point d'entrée n'est pas l'image elle-même. Ouvrez la visionneuse depuis gestionnaires d'événement, callbacks tiers ou flux asynchrones sans monter de de couverture.","modes.wrapper.when":"Choisissez le mode wrapper quand vous ne contrôlez pas le HTML rendu — markdown, rich text CMS, dangerouslySetInnerHTML. Encapsulez le sous-arbre, et chaque interne gagne automatiquement la visionneuse.","footer.project":"Projet","footer.repo":"Dépôt","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Cas d'utilisation","footer.madeby":"Créé par","footer.illustrator":"Illustration","footer.license":"Licence MIT","pg.title":"Playground","pg.subtitle":"Ajustez chaque prop et regardez la visionneuse réagir en temps réel.","pg.reset":"Réinitialiser","pg.share":"Partager","pg.shared":"Lien copié","pg.tab.component":"Composant","pg.tab.imperative":"Impératif","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Astuce : Espace pour zoomer · ←/→ pour changer de page · ESC pour fermer","pg.preview.trigger":"Déclencher la visionneuse","pg.params.title":"Paramètres","pg.params.subtitle":"Survolez un prop pour l’aide, ou ouvrez sa doc avec l’icône livre.","pg.events.title":"Événements","pg.events.subtitle":"Sortie des callbacks de cycle de vie pour cette session.","pg.events.empty":"Activez n'importe quel callback de cycle de vie pour voir le flux d'événements ici.","pg.code.title":"Code","pg.code.subtitle":"Code prêt à copier pour le mode actif.","pg.code.hideDefaults":"Masquer les valeurs par défaut","pg.copy":"Copier","pg.copied":"Copié","pg.portalTarget.title":"Cible Portal personnalisée","pg.portalTarget.body":"Pour les apps qui possèdent déjà une racine d'overlay, de modale ou de micro-frontend. Cliquez l'image à droite: la visionneuse s'y monte au lieu de document.body.","pg.portalTarget.root":"Racine overlay hôte","pg.portalTarget.imageAlt":"Image de démonstration portalTarget","group.data":"Données","group.preset":"Préréglage","group.interface":"Interface","group.controller":"Contrôleur","group.hotkey":"Raccourcis","group.animate":"Animation","group.gesture":"Gesture","group.lifecycle":"Cycle de vie","group.controlled":"Contrôlé","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Portée bureau","common.presetScope.desktop.desc":"Option orientée bureau. Le preset desktop l'active par défaut ou c'est le seul environnement où elle a un effet pratique.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Portée mobile","common.presetScope.mobile.desc":"Option orientée mobile ou tactile. Le preset mobile l'active par défaut ou elle ne compte que pour l'interaction tactile.","common.expand":"Agrandir","common.required":"Obligatoire","common.default":"Par défaut","common.add":"Ajouter","common.remove":"Supprimer","common.enable":"Activer","common.disable":"Désactiver","param.viewInDocs":"Voir dans la doc","docs.title":"Référence API","docs.search.placeholder":"Rechercher dans la doc...","docs.search.empty":"Aucun résultat","docs.toc.title":"Sur cette page","docs.sidebar.gettingStarted":"Premiers pas","docs.sidebar.quickstart":"Démarrage rapide","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Concepts","docs.sidebar.modes":"Modes","docs.sidebar.theming":"Thèmes","docs.sidebar.props":"Props","docs.sidebar.recipes":"Recettes","docs.sidebar.examples":"Exemples","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Référence","docs.sidebar.migration":"Migration","docs.sidebar.faq":"FAQ","preset.desktop":"Bureau","preset.mobile":"Mobile","preset.auto":"Auto","animate.flip.fade":"Fondu","animate.flip.crossFade":"Fondu enchaîné","animate.flip.swipe":"Glissement","animate.flip.zoom":"Zoom","animate.flip.blur":"Flou","animate.flip.none":"Aucun","animate.slowMotion":"Ralenti","gesture.swipe":"Glissement","gesture.dragExit":"Glisser pour fermer","gesture.wheelZoom":"Zoom molette","gesture.pinchZoom":"Pinch zoom","gesture.doubleTapZoom":"Zoom double tap","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Configuration des gestes pilotée par preset. Desktop active le zoom molette quand l’image est déjà zoomée ; mobile active le glissement de page, le glissement pour fermer, le pinch zoom et le double tap.","gesture.swipe.desc":"Glissement horizontal pour changer de page dans un set. Ignoré pour les visionneuses à image unique.","gesture.dragExit.desc":"Glissement vertical pour fermer. Passe par le chemin de fermeture onBrowsing(false) existant.","gesture.wheelZoom.desc":"Zoom à la molette ou au trackpad quand la visionneuse est déjà zoomée. Desktop l’active ; mobile le désactive.","gesture.pinchZoom.desc":"Pinch zoom à deux doigts sur mobile. Revenir à l’échelle fit quitte le zoom et recentre l’image.","gesture.doubleTapZoom.desc":"Double tap à un doigt sur mobile. Le premier double tap zoome autour du point touché ; un double tap en zoom revient à la vue fit.","gesture.touchAction.desc":"Stratégie CSS touch-action. managed choisit none pour pinch zoom et manipulation pour les configs double tap seules ; les valeurs explicites sont transmises telles quelles.","gesture.threshold.desc":"Distance minimale de glissement pour accepter le geste, en px.","gesture.velocity.desc":"Vitesse minimale pour accepter le geste, en px/ms.","gesture.axisLock.desc":"Ratio de verrouillage d’axe pour éviter qu’un mouvement diagonal déclenche les gestes horizontal et vertical à la fois.","gesture.resistance.desc":"Résistance en bord quand loop=false et que la visionneuse est sur la première ou la dernière image.","gesture.opacity.desc":"Indique si le glissement vertical pour fermer réduit l’opacité de l’image avec la distance.","gesture.wheelZoom.step.desc":"Sensibilité du zoom molette. Des valeurs plus hautes zooment plus vite pour le même delta de molette.","gesture.wheelZoom.smooth.desc":"Interpoler le zoom molette via le RAF zoom-follow existant au lieu de sauter immédiatement.","gesture.wheelZoom.minScale.desc":"Échelle minimale du zoom molette. L’atteindre en dézoomant quitte le mode zoom.","gesture.wheelZoom.maxScale.desc":"Échelle maximale du zoom molette.","gesture.wheelZoom.center.desc":"Point focal du zoom molette : pointer utilise la position de l’événement molette ; viewport utilise le centre de l’écran.","gesture.wheelZoom.reverse.desc":"Inverse la direction du zoom molette sans modifier le reste du comportement wheel.","gesture.wheelZoom.exitGuardDuration.desc":"Temps de protection après une sortie de zoom par la molette, en ms. Les événements wheel résiduels sont ignorés pendant cette fenêtre.","gesture.pinchZoom.minScale.desc":"Échelle minimale du pinch. fit signifie la taille de navigation adaptée à l’écran.","gesture.pinchZoom.maxScale.desc":"Échelle maximale du pinch.","gesture.pinchZoom.resetBelowFit.desc":"Quand le pinch revient à l’échelle fit, quitter le zoom et recentrer l’image.","gesture.pinchZoom.center.desc":"Point focal du pinch : gesture utilise le milieu des deux doigts ; viewport utilise le centre de l’écran.","gesture.doubleTapZoom.scale.desc":"Échelle cible pour entrer en zoom avec un double tap.","gesture.doubleTapZoom.minScale.desc":"Échelle minimale utilisée pour borner le zoom double tap.","gesture.doubleTapZoom.maxScale.desc":"Échelle maximale utilisée pour borner le zoom double tap.","gesture.doubleTapZoom.center.desc":"Point focal du double tap : tap utilise la position touchée ; viewport utilise le centre de l’écran.","gesture.doubleTapZoom.interval.desc":"Temps maximal entre deux taps, en ms.","gesture.doubleTapZoom.distance.desc":"Mouvement maximal entre deux taps, en px.","controller.pagination":"Pagination","controller.rotate":"Rotation","controller.rotateLeft":"Rotation gauche","controller.rotateRight":"Rotation droite","controller.zoom":"Zoom","controller.download":"Télécharger","controller.close":"Fermer","controller.flip":"Pagination","controller.flipLeft":"Précédent","controller.flipRight":"Suivant","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Indicateur de page en haut, affichant la position actuelle / le nombre total de pages","controller.rotate.desc":"Groupe de contrôles de rotation (boutons gauche et droit)","controller.rotateLeft.desc":"Rotation de 90° dans le sens anti-horaire","controller.rotateRight.desc":"Rotation de 90° dans le sens horaire","controller.zoom.desc":"Activer / quitter le mode zoom 1:1","controller.download.desc":"Télécharger l'image actuelle","controller.close.desc":"Fermer la visionneuse","controller.flip.desc":"Groupe de contrôles de navigation (boutons précédent et suivant)","controller.flipLeft.desc":"Aller à l'image précédente","controller.flipRight.desc":"Aller à l'image suivante","controller.backdrop.desc":"Fond de la barre d'outils. Hérite du `backdrop` parent si non défini. Sur un `backdrop` sombre uni, préférer une valeur translucide (p. ex. `rgba(0,0,0,0.4)`).","controller.color.desc":'Couleur des icônes. Hérite de `currentColor` si non défini. Les overrides par bouton (p. ex. `controller.zoom = "#ff8800"`) restent prioritaires.',"controller.placement.desc":"Position de la toolbar. Ne déplace que la capsule de contrôle ; les boutons latéraux et la pagination gardent leur position normale.","controller.layout.desc":"Ajuste les marges sûres de la toolbar, des boutons flip latéraux, de la pagination et de la caption. Les nombres sont en px, les chaînes sont des longueurs CSS ; un inset scalaire suit le bord naturel d'entrée de chaque cible, et layout.mobile remplace la version mobile.","controller.layout.toolbarInset.desc":"Marge sûre de la toolbar. Une valeur scalaire suit le placement actuel et s'applique au bord top / right / bottom / left correspondant.","controller.layout.flipInset.desc":"Marge sûre des boutons flip latéraux. Une valeur scalaire s'applique aux boutons gauche et droit.","controller.layout.paginationInset.desc":"Marge sûre de la pagination. Une valeur scalaire s'applique au bord d'entrée bas, utile pour éviter une caption ou une UI personnalisée.","controller.layout.captionInset.desc":"Marge sûre de la caption. Une valeur scalaire s'applique au bord d'entrée bas, utile pour la placer au-dessus de la pagination ou des contrôles bas.","controller.render.desc":"Callback de rendu de contrôleur entièrement personnalisé. Reçoit state, actions et les slots intégrés ; désactivé quand controller=false.","controller.overriddenBy":"Activé par","snippet.overriddenByProp":"remplacé par {umbrella}","hotkey.close":"Fermer (Escape)","hotkey.zoom":"Zoom (Espace)","hotkey.flip":"Navigation (←/→)","hotkey.flipLeft":"Précédent (←)","hotkey.flipRight":"Suivant (→)","hotkey.rotate":"Rotation ([ / ])","hotkey.rotateLeft":"Rotation à gauche ([)","hotkey.rotateRight":"Rotation à droite (])","hotkey.download":"Télécharger (Mod+S)","hotkey.close.desc":"Appuyez sur Escape pour fermer la visionneuse","hotkey.zoom.desc":"Appuyez sur Espace pour basculer le mode zoom 1:1","hotkey.flip.desc":"Appuyez sur ← / → pour changer de page dans un set","hotkey.flipLeft.desc":"Appuyez sur ← pour aller à l'image précédente","hotkey.flipRight.desc":"Appuyez sur → pour aller à l'image suivante","hotkey.rotate.desc":"Appuyez sur [ / ] pour faire pivoter l'image (commutateur parent ; lie les deux directions)","hotkey.rotateLeft.desc":"Appuyez sur [ pour pivoter de 90° dans le sens antihoraire","hotkey.rotateRight.desc":"Appuyez sur ] pour pivoter de 90° dans le sens horaire","hotkey.download.desc":"Appuyez sur Cmd+S (macOS) ou Ctrl+S (Windows/Linux) pour télécharger l'image actuelle. Désactivé par défaut — l'activer remplace le raccourci « Enregistrer la page » du navigateur.","animate.browsing.desc":"Transition d'ouverture / fermeture de la visionneuse","animate.flip.desc":"Style de transition lors du changement de page dans un set","animate.slowMotion.desc":"Quand il est activé, maintenir Shift à l’ouverture ou à la fermeture ralentit toute la transition de navigation à 10x pour inspection ou démo","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"URL de l'image. Obligatoire.","param.alt.label":"alt","param.alt.desc":"Titre de l'image, affiché au-dessus de la visionneuse.","param.caption.label":"caption","param.caption.desc":"Légende sous la visionneuse. string pour le pill par défaut ou { text, style?, className? } pour personnaliser. Surchargeable par set[i].caption.","param.set.label":"set","param.set.desc":"Ensemble multi-images ; active le mode galerie avec navigation aux flèches.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Index de la page initiale (commence à 0).","param.preset.label":"preset","param.preset.desc":"Bundle de préréglages ; auto par défaut et définit controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Couleur de fond de la visionneuse. Toute couleur CSS valide.","param.zIndex.label":"zIndex","param.zIndex.desc":"Niveau d'empilement de la visionneuse.","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"Élément DOM utilisé comme cible de montage du Portal. Par défaut: document.body. À utiliser avec une racine d'overlay, de modale ou de micro-frontend; seul le parent de montage change, la visionneuse reste en fixed plein écran.","param.radius.label":"radius","param.radius.desc":"Rayon des coins de l'image (px).","param.edge.label":"edge","param.edge.desc":"Marge minimale entre l'image et la viewport (px).","param.loop.label":"loop","param.loop.desc":"Reboucler vers la première image en atteignant la fin.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Fermer la visionneuse au défilement de la page.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Fermer la visionneuse au double-clic sur l'image. Désactivé par défaut.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Garder l'image de couverture visible pendant la navigation.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Délai (ms) avant d'afficher l'indicateur de chargement. Si l'image termine de charger dans cette fenêtre, le loading n'est pas affiché — évite le clignotement lors du basculement rapide entre images en cache. Par défaut 200ms ; 0 = affichage immédiat (comportement hérité).","param.controller.label":"controller","param.controller.desc":"Configuration de la barre de contrôle. false désactive tout ; un objet partiel remplace les boutons, la position, le layout des overlays et le rendu personnalisé.","param.hotKey.label":"hotKey","param.hotKey.desc":"Raccourcis clavier.","param.animate.label":"animate","param.animate.desc":"Configuration d’animation : navigation, géométrie de couverture, ralenti et animation de page.","param.gesture.label":"gesture","param.gesture.desc":"Configuration des gestes pilotée par preset. Desktop active wheelZoom en mode zoom ; mobile active par défaut swipe, dragExit, pinchZoom et doubleTapZoom. gesture=false désactive tout.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Déclenché à l'ouverture/fermeture de la visionneuse (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Déclenché à l'entrée/sortie du mode zoom (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Déclenché lors d'un changement de page (nouvel index).","param.onRotating.label":"onRotating","param.onRotating.desc":"Déclenché lors d'une rotation (degrés).","param.onError.label":"onError","param.onError.desc":"Déclenché lorsqu'une image (couverture ou visionneuse) ne se charge pas. Reçoit le SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"État de navigation contrôlé. Le fournir bascule en mode contrôlé ; à coupler avec onBrowsing.","docs.section.installation.title":"Installation","docs.section.installation.intro":"Installez via votre gestionnaire de paquets :","docs.section.installation.agent":"Les agents IA doivent d’abord lire https://zmage.caldis.me/llms.txt, puis garder les intégrations de base minimales.","docs.section.installation.then":"Puis importez le composant et sa feuille de style :","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"Pour les applications rendues côté serveur, utilisez l'entrée /ssr afin de ne pas toucher à document à l'import :","docs.section.modes.title":"Trois modes","docs.section.modes.intro":"react-zmage expose la même surface de configuration via trois formes d'appel :","docs.section.modes.componentTitle":"Composant","docs.section.modes.componentBody":"Le mode par défaut — à utiliser quand vous contrôlez le JSX rendu. Remplacez n'importe quel par ; chaque attribut HTML natif (className, style, onClick, etc.) est transmis à l' sous-jacent.","docs.section.modes.imperativeTitle":"Impératif","docs.section.modes.imperativeBody":"À privilégier quand vous n'avez pas de bon de couverture, ou ne voulez pas monter de nœuds supplémentaires dans votre arbre de composants. Appelez depuis des gestionnaires d'événement, des callbacks asynchrones ou des widgets tiers pour ouvrir la visionneuse depuis n'importe où. Retourne une closure de destruction pour une fermeture manuelle.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"À utiliser quand vous ne contrôlez pas le HTML rendu — sortie markdown, texte enrichi CMS, dangerouslySetInnerHTML. Wrapper lit src / alt depuis le cliqué ; les props de visionneuse comme backdrop, contrôles, raccourcis, animation, callbacks et set restent sur .","docs.section.modes.wrapperNote":"Wrapper recherche les enfants img pendant componentDidMount / componentDidUpdate. Les images injectées après le rendu du wrapper ne seront liées qu'au prochain rendu. Si set est fourni, le src du img cliqué est comparé à set et utilisé comme page initiale ; sans set, data-zmage-caption ou la figcaption la plus proche peut devenir la caption de la visionneuse.","docs.section.theming.title":"Thèmes","docs.section.theming.intro":"react-zmage est volontairement agnostique vis-à-vis du système de thème du site hôte — il ne lit pas prefers-color-scheme et n'est lié à aucun framework de variables CSS. L'intégration clair/sombre est la responsabilité du consommateur :","docs.section.theming.bullet.backdrop":"Le fond de la visionneuse est défini via la prop backdrop (toute chaîne de couleur CSS valide). La valeur par défaut est blanc (#FFFFFF).","docs.section.theming.bullet.icons":"Les icônes de la barre de contrôle utilisent SVG currentColor ; surchargez via votre CSS global pour les aligner sur votre design system.","docs.section.theming.bullet.scoped":"Tous les styles d'exécution sont confinés au conteneur #zmage ; ils ne déborderont pas dans le reste de votre application.","docs.section.theming.defaultTitle":"Comportement par défaut","docs.section.theming.defaultBody":"Si vous omettez backdrop, la visionneuse s'affiche avec un panneau blanc. C'est correct sur les sites clairs, mais le contraste devient mauvais avec les icônes blanches sur un site sombre :","docs.section.theming.patternTitle":"Usage composant / contrôlé","docs.section.theming.patternBody":"Lisez votre hook de thème existant (next-themes, un ThemeProvider personnalisé, etc.), traduisez la valeur résolue en couleur et passez-la à backdrop. Encapsuler dans un petit composant local garde les sites d'appel propres :","docs.section.theming.imperativeTitle":"Usage impératif","docs.section.theming.imperativeBody":"Dans un gestionnaire d'événement, lisez l'état actuel du DOM (par ex. une classe de thème sur documentElement), traduisez en couleur, puis passez à Zmage.browsing :","docs.section.theming.iconsTitle":"Aligner les icônes avec le design system","docs.section.theming.iconsBody":"Les icônes de contrôle vivent à l'intérieur du conteneur #zmage ; surchargez leur couleur depuis votre CSS global. Si vous utilisez des variables CSS pour le thème (Tailwind / shadcn / tokens vanilla), liez-les directement au design token :","docs.section.theming.toolbarTitle":"Découpler la barre d'outils du backdrop modal","docs.section.theming.toolbarBody":'Par défaut la capsule de la barre hérite du `backdrop` parent et les icônes sont dessinées avec `currentColor`. Sur un `backdrop` sombre uni, les icônes sombres se fondent dans la capsule sombre. Passez `controller.backdrop` (fond de capsule) et `controller.color` (couleur d\'icône) pour les découpler. Les overrides par bouton (p. ex. `controller.zoom = "#ff8800"`) restent prioritaires sur `controller.color`.',"docs.search.desc.installation":"Installer via votre gestionnaire de paquets et importer la feuille de style","docs.search.desc.ssr":"Entrée SSR qui ne touche pas à document à l'import","docs.search.desc.modes":"Composant / impératif / wrapper — trois manières d'invoquer la visionneuse","docs.search.desc.theming":"Aligner le fond et les icônes de la visionneuse sur le thème de votre site","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Choix de préréglage : auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Valeurs par défaut de controller, hotKey, animate et gesture","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget et autres réglages d'UI","docs.search.desc.propsController":"Boutons, position et rendu personnalisé de la barre de contrôle","docs.search.desc.propsHotkey":"Raccourcis clavier : ESC / Espace / flèches","docs.search.desc.propsAnimate":"Animations de navigation et de changement de page","docs.search.desc.propsGesture":"Zoom à la molette, glissement de page, glissement pour fermer, pinch et double tap","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"État de navigation contrôlé","docs.search.desc.examples":"Exemples d'image unique et de galerie multi-images","docs.search.desc.typescript":"Déclarations de types BaseType / Set / ControllerSet / GestureSet","docs.search.desc.migration":"Notes de mise à niveau depuis 0.x","docs.search.desc.faq":"Pièges d'intégration courants et correctifs par version","docs.section.props.title":"Props","docs.section.props.intro":"Toutes les props de BaseType peuvent être passées dans n'importe lequel des trois modes.","docs.section.props.wrapperScope.title":"Portée des props en mode Wrapper","docs.section.props.wrapperScope.intro":" ne rend pas lui-même l'image de couverture. Il lie des nœuds descendants déjà présents ; certaines props ont donc une signification propre en mode Wrapper.","docs.section.props.wrapperScope.data":"src et alt doivent être placés sur le enfant. Les src / alt de premier niveau sont remplacés par le nœud DOM cliqué. Sans set, caption peut être lue depuis data-zmage-caption ou depuis la figcaption la plus proche.","docs.section.props.wrapperScope.config":"set et defaultPage sont pris en charge pour une galerie partagée explicite. Quand le src du img cliqué apparaît dans set, Wrapper ouvre l'index correspondant ; defaultPage ne sert que de fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick et loadingDelay s'appliquent normalement.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating et onError fonctionnent, car Wrapper ouvre la même visionneuse en interne.","docs.section.props.wrapperScope.controlled":"browsing est l'état contrôlé du mode composant et ne contrôle pas Wrapper. Pour ouvrir depuis votre propre état, utilisez le mode composant ou appelez Zmage.browsing() vous-même.","docs.section.props.interface":"Interface et interaction","docs.section.props.portalTarget.title":"Cible Portal personnalisée","docs.section.props.portalTarget.body":"Par défaut, la couche de visionneuse se monte dans document.body. Si votre app possède déjà une racine d'overlay, de modale, un shadow host ou un conteneur shell de micro-frontend, passez cet élément à portalTarget afin de garder le stacking, le scope de styles et le cycle de vie côté hôte.","docs.section.props.portalTarget.boundary":"portalTarget ne change que le parent DOM. La visionneuse reste en fixed plein écran et n'est pas découpée en aperçu local; utilisez zIndex pour ajuster l'empilement.","docs.section.props.controller.keyHeader":"Clé","docs.section.props.controller.descHeader":"Description","docs.section.props.controller.umbrella":"rotate est le commutateur parent de rotateLeft / rotateRight — l'activer affiche les deux boutons. flip fonctionne de la même manière sur flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Layout des overlays","docs.section.props.controller.layoutIntro":"layout ne fait que décaler les overlays toolbar, flip latéral, pagination et caption ; il ne modifie pas la géométrie de la première frame ni du zoom. Les nombres sont en px, les chaînes sont des longueurs CSS, un inset scalaire suit le bord naturel d'entrée de chaque cible, et layout.mobile remplace le layout de base sur mobile.","docs.section.props.controller.renderTitle":"Rendu personnalisé","docs.section.props.controller.renderIntro":"render reçoit { state, actions, slots } et doit retourner un nœud React. Retournez null pour masquer la couche de contrôle ; réutilisez slots si vous ne remplacez qu'une partie de l'UI.","docs.section.props.hotkey.umbrella":"flip est le commutateur parent de flipLeft / flipRight, et rotate celui de rotateLeft / rotateRight — activer l'un ou l'autre lie les deux touches latérales. Chaque entrée accepte aussi un descripteur en chaîne tel que 'Mod+S' ou 'BracketLeft' pour redéfinir la touche par défaut (Mod = ⌘ sur macOS, Ctrl sur Windows/Linux).","docs.section.props.hotkey.customTitle":"Raccourcis personnalisés","docs.section.props.hotkey.customIntro":"Chaque entrée hotKey accepte un boolean (activé/désactivé), une string (descripteur personnalisé) ou un string[] (plusieurs raccourcis). Les descripteurs utilisent les noms e.code — positions physiques des touches, indépendantes de la disposition. Le préfixe Mod représente ⌘/Ctrl multiplateforme. Correspondance stricte des modificateurs : les modificateurs non déclarés ne doivent PAS être pressés (par ex. Space n'est jamais déclenché par Cmd+Space).","docs.section.props.hotkey.cheatsheetTitle":"Aide-mémoire des descripteurs","docs.section.props.hotkey.cheatsheet.shorthand":"lettres / chiffres uniques normalisés automatiquement","docs.section.props.hotkey.cheatsheet.arrows":"flèches directionnelles","docs.section.props.hotkey.cheatsheet.punct":"ponctuation (noms physiques des touches)","docs.section.props.hotkey.cheatsheet.whitespace":"touches d'espacement / contrôle","docs.section.props.hotkey.cheatsheet.modifier":"préfixes de modificateurs (chaînés avec +)","docs.section.props.animate.typeHeader":"Type","set.src.desc":"URL de l'image — obligatoire","set.alt.desc":"Titre de cette image","set.caption.desc":"Légende de cette image ; remplace la caption externe lorsqu'elle est fournie","set.className.desc":"Classe personnalisée appliquée à cette image","set.style.desc":"Style en ligne personnalisé appliqué à cette image","docs.section.props.preset.title":"Paquets de preset","docs.section.props.preset.intro":"preset est un paquet de valeurs par défaut appliquées aux sous-objets controller / hotKey / animate / gesture. Omettre preset utilise auto. auto est résolu à l'exécution via matchMedia('(pointer: coarse) and (hover: none)') vers desktop ou mobile ; en SSR ou sans matchMedia, on retombe sur desktop.","docs.section.props.preset.subParamHeader":"Sous-paramètre","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Exemples","docs.section.examples.singleTitle":"Image unique","docs.section.examples.galleryTitle":"Galerie multi-images","docs.section.examples.mobileTitle":"Gestes mobiles","docs.section.examples.mobileBody":"Force le preset mobile pour tester le glissement entre images, le glissement pour fermer, le pinch zoom et le double tap sur les appareils tactiles.","docs.section.examples.controllerTitle":"Controleur personnalise","docs.section.examples.controllerBody":"Place le controleur sur un bord de l'ecran ou remplace toute l'UI avec un callback render qui recoit state et actions.","docs.section.examples.coverTitle":"Couverture recadree","docs.section.examples.coverBody":"Place object-fit et border radius sur le img de couverture pour que la premiere frame corresponde au recadrage visible.","docs.section.examples.portalTargetTitle":"Monter dans une racine overlay hôte","docs.section.examples.portalTargetBody":"Quand la page a un conteneur d'overlay partagé, passez ce nœud DOM à portalTarget. L'exemple reste plein écran; seul le parent du Portal devient la racine hôte.","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Les types sont co-localisés avec l'export d'exécution. Le type union complet des props est BaseType :","docs.section.typescript.refIntro":"Le composant accepte une ref, transférée à l'img de couverture :","docs.section.migration.title":"Migration","docs.section.migration.from":"Mise à niveau depuis 0.x :","docs.section.migration.bullet1":"Le composant est un forwardRef exotic ; n'utilisez pas new Zmage().","docs.section.migration.bullet2":"Si vous importez l'entrée SSR, basculez sur react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"Pourquoi l'image dans la modale s'ouvre-t-elle plus petite que la couverture quand j'utilise Tailwind / normalize.css / Bootstrap ?","docs.section.faq.tailwind-shrink.a":"Ces resets appliquent globalement `img { max-width: 100% }`, ce qui contraint l'image dans la modale à la taille de sa couverture. Les versions antérieures à 1.1.2 sont concernées ; 1.1.2+ ajoute un style défensif sur `.imageLayer`. Mettez à jour vers >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` retourne undefined sous React 18 / 19 — pourquoi ?","docs.section.faq.r19-imperative.a":"Bug latent corrigé en 1.1.2. L'ancien code lisait `RENDER.REF.current?.outBrowsing` de façon synchrone, ce qui marchait sous React 17 mais casse sous R18+ (les commits sont asynchrones). 1.1.2 retourne une closure de destruction stable — mettez à jour vers >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` ouvre une modale vide et le navigateur signale un src vide. Pourquoi ?","docs.section.faq.wrapper-empty.a":"L'ancien wrapper diffusait `defaultProps.src=''` par-dessus l'img cliquée, vidant src/alt. 1.1.2 lit explicitement le src/alt du nœud DOM cliqué. Mettez à jour pour corriger.","docs.section.faq.vite-esm.q":`L'API impérative lance "no compatible mount API" dans le client Vite / Next.js. Pourquoi ?`,"docs.section.faq.vite-esm.a":"Avant 1.1.2, on utilisait `require('react-dom/client')` pour la détection runtime, mais l'ESM navigateur n'a pas de global `require`. 1.1.2 passe à un import statique — mettez à jour vers >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"Le wrapper ne lie pas les handlers de clic aux images ajoutées après le montage.","docs.section.faq.wrapper-dynamic.a":"Le wrapper ne cherche les `` que dans `componentDidMount` et `componentDidUpdate`. Si vous injectez des img DOM hors de l'arbre React (par ex. un dangerouslySetInnerHTML qui change sans re-render parent), forcez le wrapper à se re-render — ou appelez `Zmage.browsing()` depuis votre propre handler de clic.","docs.section.faq.lazy-src.q":"Mon `` utilise le lazy-loading avec `data-src` — l'ouverture de Zmage affiche le placeholder au lieu de l'image réelle. Comment corriger ?","docs.section.faq.lazy-src.a":"Zmage lit par défaut la `src` du `` de couverture — le placeholder est tout ce qu'il voit. Passez l'URL réelle explicitement via `set` : ``. Idem pour l'appel impératif : `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"Je veux une miniature sur la page et l'image en pleine résolution au clic — puis-je sauter `set` ?","docs.section.faq.cover-vs-set.a":'Non. Sans `set`, la `src` de la couverture est aussi ce que le visualiseur affiche. Pour "miniature en entrée + visualiseur pleine taille", séparez-les explicitement : ``. Le même schéma gère le `data-src` lazy-loaded (FAQ précédente) et la multi-résolution CDN. Si vous voulez une UI "grille/galerie + ouvrir le visualiseur", Zmage ne la fournit pas — rendez la galerie vous-même et appelez `Zmage.browsing({ src, set })` au clic.',"docs.section.faq.controlled-mismatch.q":"Mon prop contrôlé `browsing` et l'état de la modale se désynchronisent.","docs.section.faq.controlled-mismatch.a":"Le mode contrôlé exige à la fois `browsing` et `onBrowsing`. Si vous ne passez que `browsing` (sans callback), l'état interne se synchronise une fois puis dérive. Couplez-les toujours.","docs.section.faq.ssr.q":"Comment utiliser react-zmage dans Next.js / Remix / un framework SSR ?","docs.section.faq.ssr.a":"Utilisez l'entrée `react-zmage/ssr` — elle évite de toucher à `document` à l'import. L'API impérative `Zmage.browsing()` doit être protégée par `typeof window !== 'undefined'` si elle peut s'exécuter pendant le rendu ou côté serveur.","docs.section.faq.theme.q":"Comment faire suivre le thème clair/sombre à la visionneuse ?","docs.section.faq.theme.a":"Passez `backdrop` comme expliqué dans la section Thèmes. La bibliothèque est volontairement agnostique au thème et ne lit pas prefers-color-scheme — c'est à votre application de gérer le mapping.","playground.preset.aria":"Changer le preset de données","playground.preset.default.label":"Par défaut","playground.preset.default.hint":"Childs Dream · 2 images","playground.preset.testset.label":"Jeu de test","playground.preset.testset.hint":"6 images · ratios + formats"},SR={"nav.playground":"Playground","nav.docs":"Dokumentation","nav.ai":"AI-Installation","nav.github":"GitHub","useCases.eyebrow":"Use Cases","useCases.title":"React-Bildvorschau fuer Blogs, CMS, MDX und News-Seiten","useCases.body":"react-zmage ist ein React-Bildviewer, der normale -Elemente in eine bildschirmfuellende Bildvorschau mit Origin-Expand verwandelt. Unterstuetzt werden Galerien, Tastatursteuerung, mobile Gesten, imperative Oeffnung, Wrapper-Modus fuer Rich Text sowie SSR/RSC.","useCases.cta.docs":"Dokumentation lesen","useCases.cta.wrapper":"Wrapper-Modus testen","useCases.card.blog.title":"Bildvorschau fuer Blogs","useCases.card.blog.body":"Artikelbilder lassen sich im Vollbild oeffnen, ohne das Post-Layout zu ersetzen oder eine eigene Galerieoberflaeche zu bauen.","useCases.card.cms.title":"CMS-Rich-Text-Bilder","useCases.card.cms.body":"Umschliesse HTML aus CMS, Markdown-Parser oder Editor-Ausgabe, damit vorhandene -Knoten den Viewer oeffnen.","useCases.card.news.title":"Bilderstrecken in News-Artikeln","useCases.card.news.body":"Die Artikelseite bleibt gut lesbar; Details koennen bei Bedarf mit Tastatur, Gesten und Mehrbildnavigation betrachtet werden.","useCases.card.mdx.title":"MDX- und Dokumentationsbilder","useCases.card.mdx.body":"Nutze den Wrapper-Modus fuer Dokumentationsseiten, auf denen Autoren die Bilder liefern und die React-App die Seitenhuelle stellt.","useCases.card.lightbox.title":"Alternative zu React Lightbox","useCases.card.lightbox.body":"Nutze eine leichtere Bildvorschau, wenn du Origin-Expand-Zoom und vorhandenes Markup behalten willst, statt ein komplettes Galeriesystem einzubauen.","useCases.card.ssr.title":"Next.js, SSR und RSC","useCases.card.ssr.body":"Importiere den SSR-sicheren Subpath in servergerenderten Apps und oeffne den interaktiven Viewer aus Client-Boundaries.","useCases.mode.eyebrow":"Modus waehlen","useCases.mode.title":"Waehle nach Besitz des Bild-Markups","useCases.mode.component":"Du besitzt das JSX und kannst durch ersetzen.","useCases.mode.imperative":"Ein Button, Command, Event oder Callback soll den Viewer oeffnen.","useCases.mode.wrapper":"Die Bilder kommen aus CMS, MDX, Markdown oder Rich-Text-HTML.","useCases.facts.eyebrow":"Entity-Fakten","useCases.facts.title":"Die Kurzfassung fuer Crawler","useCases.fact.react":"React 16.8 bis 19","useCases.fact.modes":"Component-, imperative und Wrapper-Modus","useCases.fact.input":"Tastaturnavigation und mobile Gesten","useCases.fact.ssr":"SSR/RSC-sicherer Importpfad","useCases.fact.gallery":"Mehrbildnavigation ohne Seitenumbau","useCases.fact.origin":"Origin-Expand-Vollbild-Bildvorschau","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Fragen, die Menschen und AI Agents meist stellen","useCases.faq.what.q":"Was ist react-zmage?","useCases.faq.what.a":"react-zmage ist ein React-Bildviewer, der normale -Elemente in eine bildschirmfuellende Origin-Expand-Bildvorschau verwandelt, mit Galerien, Tastatursteuerung, mobilen Gesten, Wrapper-Modus und SSR/RSC-Unterstuetzung.","useCases.faq.lightbox.q":"Wann sollte ich react-zmage statt einer React Lightbox verwenden?","useCases.faq.lightbox.a":"Nutze react-zmage, wenn vorhandene Bilder im Vollbild oeffnen sollen, ohne die Seite um eine Galeriekomponente herum neu zu bauen. Das passt gut fuer Blogs, CMS-Rich-Text, MDX-Dokumente, News-Artikel und bildlastige Inhaltsseiten.","useCases.faq.richText.q":"Kann react-zmage CMS-, Markdown- oder Rich-Text-Bilder behandeln?","useCases.faq.richText.a":"Ja. Zmage.Wrapper kann untergeordnete -Knoten in CMS-, Markdown-, MDX- oder dangerouslySetInnerHTML-Inhalten binden und das bestehende Layout erhalten.","useCases.faq.ssr.q":"Unterstuetzt react-zmage Next.js, SSR oder RSC?","useCases.faq.ssr.a":"Ja. Verwende fuer SSR oder RSC den Subpath react-zmage/ssr und rufe interaktive Viewer-APIs aus Client-Events oder Client Components auf.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Jedes ","hero.title.line2":"am Ursprung öffnen","hero.subtitle":"Mach aus jedem einen Vollbild-Bildviewer, der von seiner ursprünglichen Position aus öffnet und Tastatur, Gesten sowie Bildserien unterstützt.","hero.cta.start":"Docs lesen","hero.cta.playground":"Parameter ausprobieren","hero.ai.label":"AI-Installationsguide: zuerst llms.txt lesen","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Schnellen Prompt kopieren","hero.ai.copyLabel":"Schnellen AI Prompt kopieren","hero.ai.viewLlms":"llms.txt ansehen →","ai.badge":"AI-Installationsguide","ai.title":"Erstelle einen react-zmage Agent-Integrationsprompt","ai.subtitle":"Beginne mit llms.txt. Lass Auto aktiv, damit dein Agent zuerst das Projekt prüft, oder stimme Umgebung, Bildquelle und Interaktion vor dem Kopieren fein ab.","ai.field.agent":"Welchen Agent verwendest du?","ai.field.depth":"Setup-Tiefe","ai.field.environment":"Projektumgebung","ai.field.mode":"Nutzungsmodus","ai.field.imageSource":"Bildquelle","ai.field.interaction":"Interaktionsstrategie","ai.field.project":"Projektbeschreibung","ai.autoTip":"Lass Auto aktiv, wenn du unsicher bist. Dein Agent prüft zuerst Projektstruktur, Bildquelle, Rendering-Modus und Style-Einstieg und wählt dann den passenden Zmage-Modus und die passenden Props.","ai.project.placeholder":"Beschreibe deine App, die Bildquelle und was der Viewer leisten soll.","ai.action.copy":"Setup Prompt kopieren","ai.action.copied":"Kopiert","ai.action.openLlms":"llms.txt öffnen","ai.copy.error":"Kopieren fehlgeschlagen. Wähle den Prompt manuell in der Vorschau aus.","ai.preview.title":"Setup Prompt","ai.preview.subtitle":"Aktualisiert sich mit deinen Optionen","ai.preview.copy":"Kopieren","ai.preview.expand":"Erweitern","ai.preview.show":"Prompt ansehen","ai.preview.hide":"Vorschau ausblenden","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Macht den Prompt passend für einen allgemeinen Coding Agent.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Der Agent prüft zuerst das Projekt.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Integrationswünsche manuell festlegen.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Live-Interaktionsfläche","demo.title":"Eine Story-Seite aus Child's Dream","demo.body":"Die Bilder stammen aus Child's Dream: ein altes Buch, ein Zeitportal, ein Fuchs, eine Waldroute und ein Kristallsiegel. Klicke ein Bild an; der erste Frame wächst aus genau diesem Ausschnitt in den Viewer.","demo.shiftHint":"Halte SHIFT beim Klick auf ein Bild, um den feinen Übergang zu spüren","demo.zoomHint":"Öffne ein Bild, drücke Space zum Zoomen und nutze danach das Wheel zum Weiterzoomen.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"Ein staubiges Buch in der Bibliothek öffnet eine Tür in eine alte Zeit.","demo.story.lead":"Die unscheinbaren Wörter auf der Seite werden zu einer Miniaturszene. Der Junge sieht einen Wald aus Papier wachsen und hört einen Ruf von der anderen Seite der Barriere.","demo.story.middle":"Ein Fuchs begleitet ihn. Nach Gezeiten, Baumkronen und rosa Flamingos führt der Weg tiefer in den Wald zum Kristallsiegel.","demo.tile.cover":"Altes Buch und Zeitportal","demo.tile.gallery":"Erste Begegnung im Wald","demo.tile.ratio":"Pfad am Rand der Flut","demo.tile.controller":"Kristallsiegel","demo.tile.zoom":"Flamingo-Rast","demo.tile.lamp":"Licht unter den Blättern","demo.tile.rescue":"Lösung im Wald","demo.feature.cover":"Cover-Clip und Radius stimmen überein","demo.feature.space":"Bewege den Mauszeiger, um im Zoom schnell zu scannen","demo.feature.wheel":"Nutze das Mausrad für weiches Skalieren","demo.feature.shift":"Shift verlangsamt Öffnen und Schließen","demo.caption":"Klicke ein Bild an, um den Viewer zu öffnen. Auf dem Desktop kannst du beim Öffnen SHIFT halten und nach dem Zoomen Mauszeiger oder Mausrad nutzen.","demo.scene.portal.alt":"Ein leuchtendes Zeitportal auf einem alten Buch","demo.scene.portal.caption":"Im alten Buch leuchtet ein Zeitportal auf, und aus den Wörtern wächst ein Wald.","demo.scene.forest.alt":"Der Junge trifft im Wald einen Fuchs","demo.scene.forest.caption":"Der Fuchs erscheint zwischen den Bäumen und wird zum Begleiter des Jungen.","demo.scene.tide.alt":"Der Junge steht am Rand der Flut","demo.scene.tide.caption":"Das Wasser rollt sich zu einer Spirale und weist zum nächsten unbekannten Pfad.","demo.scene.canopy.alt":"Der Junge liegt unter einem riesigen Blätterdach","demo.scene.canopy.caption":"Das Blätterdach öffnet sich wie Seiten, während kleine Lichter den Weg markieren.","demo.scene.flamingo.alt":"Der Junge sitzt zwischen rosa Flamingos","demo.scene.flamingo.caption":"Eine leichte Flamingo-Schar lässt die Reise kurz ruhen.","demo.scene.lamp.alt":"Der Junge entzündet Licht unter breiten Blättern","demo.scene.lamp.caption":"Blätter halten die Dunkelheit zurück, während das Licht Hinweise im Buch zeigt.","demo.scene.crystal.alt":"Der Junge steht vor einem Kristallsiegel","demo.scene.crystal.caption":"Tief im Wald beginnt das Kristallsiegel sichtbar zu werden.","demo.scene.rescue.alt":"Fuchs und Junge nähern sich dem Kristallsiegel","demo.scene.rescue.caption":"Der Schlüssel nähert sich dem Kristall, und das Geheimnis im Siegel öffnet sich bald.","feature.dropin.title":"Ursprungsöffnung","feature.dropin.hint":"Öffnet aus Position, Größe, Radius und Zuschnitt des Bildes und schließt wieder dorthin zurück.","feature.mobile.title":"Mobil kompatibel","feature.mobile.hint":"Das Auto-Preset waehlt Touch-Verhalten: Wischen zum Blaettern, nach unten ziehen zum Schliessen, Doppeltipp und Pinch-Zoom.","feature.set.title":"Komplette Browsing-Werkzeuge","feature.set.hint":"Zoom, Rotation, Blaettern, Download und Captions teilen sich einen Browsing-Zustand, auch in Bildserien.","feature.ssr.title":"SSR/RSC-freundlich","feature.ssr.hint":"Nutze den server-sicheren Einstieg in Next.js-, SSR- oder RSC-Projekten und halte die Viewer-Interaktion in Client-Boundaries.","modes.title":"Passt zu deiner vorhandenen Seite","modes.component.label":"Komponentenmodus","modes.component.desc":"Wenn du JSX kontrollierst, ersetze durch ; native Props laufen weiter durch.","modes.imperative.label":"Imperativer Aufruf","modes.imperative.desc":"Öffne den Viewer aus Buttons, Callbacks oder async Abläufen, ohne ein Cover-Bild vorauszusetzen.","modes.wrapper.label":"Wrapper-Modus","modes.wrapper.desc":"Umschließe Markdown / CMS / dangerouslySetInnerHTML, damit innere Bilder automatisch aus ihrem Ursprung öffnen.","modes.try":"Beispiel öffnen →","modes.component.when":"Wähle den Komponentenmodus, wenn du das gerenderte JSX kontrollierst. Ersetze jedes durch ; native Props laufen weiter durch, und Öffnen / Schließen nutzt dieselbe Ursprungsöffnung.","modes.imperative.when":"Wähle den imperativen Aufruf, wenn der Einstieg nicht das Bild selbst ist. Öffne den Viewer aus Event-Handlern, Drittanbieter-Callbacks oder async Abläufen, ohne ein Cover- zu montieren.","modes.wrapper.when":"Wähle den Wrapper-Modus, wenn du das gerenderte HTML nicht kontrollierst — markdown, CMS-Rich-Text, dangerouslySetInnerHTML. Umschließe den Teilbaum, und jedes innere erhält automatisch den Viewer.","footer.project":"Projekt","footer.repo":"Repository","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Use Cases","footer.madeby":"Erstellt von","footer.illustrator":"Illustration","footer.license":"MIT-Lizenz","pg.title":"Playground","pg.subtitle":"Justiere jeden Prop und sieh dem Viewer in Echtzeit beim Reagieren zu.","pg.reset":"Zurücksetzen","pg.share":"Teilen","pg.shared":"Link kopiert","pg.tab.component":"Komponente","pg.tab.imperative":"Imperativ","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Tipp: Leertaste zum Zoomen · ←/→ zum Blättern · ESC zum Schließen","pg.preview.trigger":"Viewer öffnen","pg.params.title":"Parameter","pg.params.subtitle":"Prop-Namen zeigen Hilfe beim Hover, das Buchsymbol öffnet die Docs.","pg.events.title":"Events","pg.events.subtitle":"Lifecycle-Ausgabe für die aktuelle Sitzung.","pg.events.empty":"Aktiviere einen Lifecycle-Callback, um den Event-Stream hier zu sehen.","pg.code.title":"Code","pg.code.subtitle":"Kopierfertiger Code für den aktiven Modus.","pg.code.hideDefaults":"Standardwerte ausblenden","pg.copy":"Kopieren","pg.copied":"Kopiert","pg.portalTarget.title":"Eigenes Portal-Ziel","pg.portalTarget.body":"Für Apps mit eigenem Overlay-Root, Modal-Root oder Micro-Frontend-Container. Beim Klick auf das Bild rechts wird der Viewer dort statt in document.body gemountet.","pg.portalTarget.root":"Host Overlay Root","pg.portalTarget.imageAlt":"Portal-Ziel Demo-Bild","group.data":"Daten","group.preset":"Preset","group.interface":"Oberfläche","group.controller":"Controller","group.hotkey":"Tastenkürzel","group.animate":"Animation","group.gesture":"Gesture","group.lifecycle":"Lifecycle","group.controlled":"Controlled","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Desktop-Bereich","common.presetScope.desktop.desc":"Desktop-orientierte Option. Das Desktop-Preset aktiviert sie standardmäßig oder sie hat nur dort praktische Wirkung.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Mobiler Bereich","common.presetScope.mobile.desc":"Mobile oder touch-orientierte Option. Das mobile Preset aktiviert sie standardmäßig oder sie ist nur für Touch-Interaktion relevant.","common.expand":"Erweitern","common.required":"Erforderlich","common.default":"Standard","common.add":"Hinzufügen","common.remove":"Entfernen","common.enable":"Aktivieren","common.disable":"Deaktivieren","param.viewInDocs":"In Doku ansehen","docs.title":"API-Referenz","docs.search.placeholder":"Doku durchsuchen...","docs.search.empty":"Keine Treffer","docs.toc.title":"Auf dieser Seite","docs.sidebar.gettingStarted":"Erste Schritte","docs.sidebar.quickstart":"Schnellstart","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Konzepte","docs.sidebar.modes":"Modi","docs.sidebar.theming":"Theming","docs.sidebar.props":"Props","docs.sidebar.recipes":"Rezepte","docs.sidebar.examples":"Beispiele","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Referenz","docs.sidebar.migration":"Migration","docs.sidebar.faq":"FAQ","preset.desktop":"Desktop","preset.mobile":"Mobil","preset.auto":"Auto","animate.flip.fade":"Fade","animate.flip.crossFade":"Cross-Fade","animate.flip.swipe":"Swipe","animate.flip.zoom":"Zoom","animate.flip.blur":"Unschärfe","animate.flip.none":"Keine","animate.slowMotion":"Zeitlupe","gesture.swipe":"Swipe","gesture.dragExit":"Drag exit","gesture.wheelZoom":"Wheel-Zoom","gesture.pinchZoom":"Pinch-Zoom","gesture.doubleTapZoom":"Double-Tap-Zoom","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Preset-gesteuerte Gesten. Desktop aktiviert Wheel-Zoom im Zoomzustand; Mobile aktiviert Ziehen zum Blättern, Ziehen-zum-Schließen, Pinch-Zoom und Double-Tap-Zoom.","gesture.swipe.desc":"Horizontales Drag-Paging innerhalb eines Sets. Bei Einzelbild-Viewern ignoriert.","gesture.dragExit.desc":"Vertikales Ziehen-zum-Schließen. Schließt über den bestehenden onBrowsing(false)-Schließpfad.","gesture.wheelZoom.desc":"Mausrad- oder Trackpad-Zoom, während der Viewer bereits gezoomt ist. Desktop aktiviert ihn, Mobile deaktiviert ihn.","gesture.pinchZoom.desc":"Zwei-Finger-Pinch-Zoom auf Mobilgeräten. Zurück auf die Fit-Skalierung verkleinern beendet Zoom und zentriert das Bild.","gesture.doubleTapZoom.desc":"Ein-Finger-Doppeltipp auf Mobilgeräten. Der erste Doppeltipp zoomt um die Tipp-Position; ein Doppeltipp im Zoom kehrt zur Fit-Ansicht zurück.","gesture.touchAction.desc":"CSS-touch-action-Strategie. managed nutzt none für Pinch-Zoom und manipulation für reine Double-Tap-Setups; explizite Werte werden unverändert gesetzt.","gesture.threshold.desc":"Mindest-Dragdistanz zum Akzeptieren der Geste, in px.","gesture.velocity.desc":"Mindestgeschwindigkeit zum Akzeptieren der Geste, in px/ms.","gesture.axisLock.desc":"Achsen-Sperrverhältnis, damit diagonale Bewegung nicht horizontale und vertikale Gesten zugleich auslöst.","gesture.resistance.desc":"Randwiderstand, wenn loop=false ist und der Viewer am ersten oder letzten Bild steht.","gesture.opacity.desc":"Ob vertikales Ziehen-zum-Schließen die Bilddeckkraft mit wachsender Distanz senkt.","gesture.wheelZoom.step.desc":"Wheel-Zoom-Empfindlichkeit. Höhere Werte zoomen bei gleichem Wheel-Delta schneller.","gesture.wheelZoom.smooth.desc":"Wheel-Zoom über den bestehenden zoom-follow-RAF interpolieren statt sofort zu springen.","gesture.wheelZoom.minScale.desc":"Minimale Wheel-Zoom-Skalierung. Beim Herauszoomen bis dorthin wird der Zoommodus verlassen.","gesture.wheelZoom.maxScale.desc":"Maximale Wheel-Zoom-Skalierung.","gesture.wheelZoom.center.desc":"Fokuspunkt des Wheel-Zooms: pointer nutzt die Wheel-Event-Position, viewport die Bildschirmmitte.","gesture.wheelZoom.reverse.desc":"Wheel-Zoom-Richtung umkehren, ohne anderes Wheel-Verhalten zu ändern.","gesture.wheelZoom.exitGuardDuration.desc":"Schutzzeit nach dem Wheel-Zoom-out aus dem Zoommodus, in ms. Restliche Wheel-Events werden in diesem Fenster ignoriert.","gesture.pinchZoom.minScale.desc":"Minimale Pinch-Skalierung. fit bedeutet die viewport-passende Browsing-Größe.","gesture.pinchZoom.maxScale.desc":"Maximale Pinch-Skalierung.","gesture.pinchZoom.resetBelowFit.desc":"Wenn Pinch bis zur Fit-Skalierung schrumpft, Zoom verlassen und das Bild neu zentrieren.","gesture.pinchZoom.center.desc":"Fokuspunkt des Pinch: gesture nutzt den Zwei-Finger-Mittelpunkt, viewport die Bildschirmmitte.","gesture.doubleTapZoom.scale.desc":"Zielskalierung beim Eintritt in Zoom per Doppeltipp.","gesture.doubleTapZoom.minScale.desc":"Minimale Skalierung für Double-Tap-Zoom.","gesture.doubleTapZoom.maxScale.desc":"Maximale Skalierung für Double-Tap-Zoom.","gesture.doubleTapZoom.center.desc":"Fokuspunkt des Doppeltipps: tap nutzt die Tipp-Position, viewport die Bildschirmmitte.","gesture.doubleTapZoom.interval.desc":"Maximale Zeit zwischen zwei Tipps, in ms.","gesture.doubleTapZoom.distance.desc":"Maximale Bewegung zwischen zwei Tipps, in px.","controller.pagination":"Seitennavigation","controller.rotate":"Drehen","controller.rotateLeft":"Links drehen","controller.rotateRight":"Rechts drehen","controller.zoom":"Zoom","controller.download":"Download","controller.close":"Schließen","controller.flip":"Blättern","controller.flipLeft":"Vorherige","controller.flipRight":"Nächste","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Seitenanzeige oben — zeigt aktuelle Position / Gesamtseiten","controller.rotate.desc":"Rotations-Steuergruppe (mit Links- und Rechts-Buttons)","controller.rotateLeft.desc":"Um 90° gegen den Uhrzeigersinn drehen","controller.rotateRight.desc":"Um 90° im Uhrzeigersinn drehen","controller.zoom.desc":"1:1-Zoom-Modus betreten / verlassen","controller.download.desc":"Aktuelles Bild herunterladen","controller.close.desc":"Viewer schließen","controller.flip.desc":"Blätter-Steuergruppe (mit Vorherige- und Nächste-Buttons)","controller.flipLeft.desc":"Zum vorherigen Bild wechseln","controller.flipRight.desc":"Zum nächsten Bild wechseln","controller.backdrop.desc":"Hintergrund der Toolbar. Fällt auf das übergeordnete `backdrop` zurück. Bei dunklem Volltonhintergrund einen Halbtransparentwert empfohlen (z. B. `rgba(0,0,0,0.4)`).","controller.color.desc":'Symbolfarbe der Toolbar. Fällt auf `currentColor` zurück. Einzelbutton-String-Override (z. B. `controller.zoom = "#ff8800"`) hat weiterhin Vorrang.',"controller.placement.desc":"Toolbar-Position. Bewegt nur die Toolbar-Kapsel; seitliche Blätter-Buttons und Pagination behalten ihre normalen Positionen.","controller.layout.desc":"Passt die sicheren Abstände von Toolbar, seitlichen Flip-Buttons, Pagination und caption an. Zahlen sind px, Strings sind CSS-Längen; ein skalarer inset folgt der natürlichen Eintrittskante des Ziels, layout.mobile überschreibt das mobile Preset.","controller.layout.toolbarInset.desc":"Sicherer Abstand der Toolbar. Ein skalarer Wert folgt dem aktuellen placement und wirkt auf die passende top / right / bottom / left-Kante.","controller.layout.flipInset.desc":"Sicherer Abstand der seitlichen Flip-Buttons. Ein skalarer Wert wirkt auf den linken und rechten Button.","controller.layout.paginationInset.desc":"Sicherer Abstand der Pagination. Ein skalarer Wert wirkt auf die untere Eintrittskante und hilft, caption oder eigene Seiten-UI zu meiden.","controller.layout.captionInset.desc":"Sicherer Abstand der caption. Ein skalarer Wert wirkt auf die untere Eintrittskante, damit caption über Pagination oder unteren Controls sitzt.","controller.render.desc":"Vollständig eigener Controller-Render-Callback. Erhält state, actions und eingebaute slots; bei controller=false deaktiviert.","controller.overriddenBy":"Aktiviert durch","snippet.overriddenByProp":"überschrieben durch {umbrella}","hotkey.close":"Schließen (Escape)","hotkey.zoom":"Zoom (Leertaste)","hotkey.flip":"Blättern (←/→)","hotkey.flipLeft":"Vorherige (←)","hotkey.flipRight":"Nächste (→)","hotkey.rotate":"Drehen ([ / ])","hotkey.rotateLeft":"Links drehen ([)","hotkey.rotateRight":"Rechts drehen (])","hotkey.download":"Herunterladen (Mod+S)","hotkey.close.desc":"Escape drücken, um den Viewer zu schließen","hotkey.zoom.desc":"Leertaste drücken, um 1:1-Zoom umzuschalten","hotkey.flip.desc":"← / → drücken, um in einem set zu blättern","hotkey.flipLeft.desc":"← drücken, um zum vorherigen Bild zu wechseln","hotkey.flipRight.desc":"→ drücken, um zum nächsten Bild zu wechseln","hotkey.rotate.desc":"[ / ] drücken, um das Bild zu drehen (Sammelschalter; bindet beide Richtungen)","hotkey.rotateLeft.desc":"[ drücken, um 90° gegen den Uhrzeigersinn zu drehen","hotkey.rotateRight.desc":"] drücken, um 90° im Uhrzeigersinn zu drehen","hotkey.download.desc":'Cmd+S (macOS) oder Ctrl+S (Windows/Linux) drücken, um das aktuelle Bild herunterzuladen. Standardmäßig aus — beim Aktivieren wird der Browser-Shortcut „Seite speichern unter" überschrieben.',"animate.browsing.desc":"Übergang beim Öffnen / Schließen des Viewers","animate.flip.desc":"Übergangsstil beim Blättern in einem set","animate.slowMotion.desc":"Wenn aktiviert, verlangsamt gehaltenes Shift beim Öffnen oder Schließen den gesamten Browsing-Übergang auf 10x für Inspektion oder Demos","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"Bild-URL. Pflichtfeld.","param.alt.label":"alt","param.alt.desc":"Bildtitel, wird über dem Viewer angezeigt.","param.caption.label":"caption","param.caption.desc":"Bildunterschrift unter dem Viewer. string für das Standard-Pill oder { text, style?, className? } zum Anpassen. Pro Eintrag überschreibbar via set[i].caption.","param.set.label":"set","param.set.desc":"Multi-Bild-Set; aktiviert den Galerie-Modus mit Pfeiltastennavigation.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Initialer Seitenindex (0-basiert).","param.preset.label":"preset","param.preset.desc":"Preset-Bundle; Standard ist auto und es bestimmt controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Hintergrundfarbe des Viewers. Beliebige gültige CSS-Farbe.","param.zIndex.label":"zIndex","param.zIndex.desc":"Stapelreihenfolge des Viewers.","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"DOM-Element als Mount-Ziel des Viewer-Portals. Standard ist document.body. Für App-Overlay-Roots, Modal-Roots oder Micro-Frontend-Container; es ändert nur den Mount-Parent, der Viewer bleibt fixed im Vollbild.","param.radius.label":"radius","param.radius.desc":"Eckenradius des Bildes (px).","param.edge.label":"edge","param.edge.desc":"Mindestabstand zwischen Bild und Viewport (px).","param.loop.label":"loop","param.loop.desc":"Beim Erreichen des Endes wieder zum ersten Bild springen.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Viewer beim Scrollen der Seite schließen.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Viewer per Doppelklick auf das Bild schließen. Standardmäßig aus.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Coverbild beim Browsen sichtbar lassen.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Verzögerung (ms) vor Anzeige der Ladeanzeige. Lädt das Bild innerhalb dieses Fensters, wird kein Loading angezeigt — verhindert das Aufblitzen beim schnellen Wechsel zwischengespeicherter Bilder. Standard 200ms; 0 = sofortige Anzeige (altes Verhalten).","param.controller.label":"controller","param.controller.desc":"Konfiguration der Steuerleiste. false deaktiviert alles; ein Teilobjekt überschreibt Buttons, Position, Overlay-Layout und eigenen Render.","param.hotKey.label":"hotKey","param.hotKey.desc":"Tastaturkürzel.","param.animate.label":"animate","param.animate.desc":"Animationskonfiguration: Browsing, Cover-Geometrie, Zeitlupe und Blätteranimation.","param.gesture.label":"gesture","param.gesture.desc":"Preset-gesteuerte Gestenkonfiguration. Desktop aktiviert wheelZoom im Zoomzustand; Mobile aktiviert standardmäßig swipe, dragExit, pinchZoom und doubleTapZoom. gesture=false deaktiviert alles.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Wird beim Öffnen/Schließen des Viewers ausgelöst (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Wird beim Betreten/Verlassen des Zoom-Modus ausgelöst (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Wird beim Seitenwechsel ausgelöst (neuer Seitenindex).","param.onRotating.label":"onRotating","param.onRotating.desc":"Wird bei Rotation ausgelöst (Grad).","param.onError.label":"onError","param.onError.desc":"Wird ausgelöst, wenn ein Bild (Cover oder Viewer) nicht geladen werden kann. Erhält das SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"Controlled-Browsing-Status. Mit Wert wechselst du in den controlled-Modus; mit onBrowsing kombinieren.","docs.section.installation.title":"Installation","docs.section.installation.intro":"Über deinen Paketmanager installieren:","docs.section.installation.agent":"AI Agents sollten zuerst https://zmage.caldis.me/llms.txt lesen und einfache Integrationen minimal halten.","docs.section.installation.then":"Anschließend Komponente und Stylesheet importieren:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"Für serverseitig gerenderte Apps verwende den /ssr-Eintrag, um document beim Import nicht zu berühren:","docs.section.modes.title":"Drei Modi","docs.section.modes.intro":"react-zmage stellt dieselbe Konfigurationsfläche über drei Aufrufformen bereit:","docs.section.modes.componentTitle":"Komponente","docs.section.modes.componentBody":"Der Standardfall — nutze dies, wenn du das gerenderte JSX kontrollierst. Tausche jedes gegen ; jedes native HTML-Attribut (className, style, onClick usw.) wird an das zugrundeliegende durchgereicht.","docs.section.modes.imperativeTitle":"Imperativ","docs.section.modes.imperativeBody":"Greif hierzu, wenn du kein passendes Cover- hast oder keine zusätzlichen Knoten in deinen Komponentenbaum hängen willst. Aufruf aus Event-Handlern, async Callbacks oder Drittanbieter-Widgets, um den Viewer von überall zu öffnen. Gibt eine Destruktor-Closure zum manuellen Schließen zurück.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"Nutze dies, wenn du das gerenderte HTML nicht kontrollierst — Markdown-Output, CMS-Rich-Text, dangerouslySetInnerHTML. Wrapper liest src / alt aus dem angeklickten ; Viewer-Props wie backdrop, Controls, Hotkeys, Animation, Callbacks und set bleiben auf .","docs.section.modes.wrapperNote":"Wrapper sucht img-Kinder während componentDidMount / componentDidUpdate. Bilder, die nach dem Rendering eingefügt werden, werden erst beim nächsten Re-Render gebunden. Wenn set gesetzt ist, wird das src des angeklickten img mit set abgeglichen und als Startseite verwendet; ohne set kann data-zmage-caption oder die nächste figcaption zur Viewer-Caption werden.","docs.section.theming.title":"Theming","docs.section.theming.intro":"react-zmage ist bewusst agnostisch gegenüber dem Theme-System der Host-Site — es liest weder prefers-color-scheme noch ist es an ein bestimmtes CSS-Variablen-Framework gebunden. Hell/Dunkel-Integration liegt beim Konsumenten:","docs.section.theming.bullet.backdrop":"Der Viewer-Hintergrund wird via backdrop-Prop gesetzt (jede gültige CSS-Farbe). Standard ist Weiß (#FFFFFF).","docs.section.theming.bullet.icons":"Steuerleisten-Icons werden mit SVG currentColor gerendert; per globalem CSS überschreiben, um sie an dein Design-System anzugleichen.","docs.section.theming.bullet.scoped":"Alle Runtime-Styles sind im #zmage-Container gescopt; sie schwappen nicht in den Rest deiner App über.","docs.section.theming.defaultTitle":"Standardverhalten","docs.section.theming.defaultBody":"Wenn du backdrop weglässt, rendert der Viewer mit weißem Panel. Auf hellen Seiten ist das unauffällig, auf dunklen Seiten ergibt sich aber schlechter Kontrast zu den weißen Steuer-Icons:","docs.section.theming.patternTitle":"Komponenten- / Controlled-Nutzung","docs.section.theming.patternBody":"Lies deinen bestehenden Theme-Hook (next-themes, einen eigenen ThemeProvider usw.), bilde den Wert auf eine Farbe ab und übergib ihn an backdrop. Eine kleine lokale Komponente hält die Aufrufstellen sauber:","docs.section.theming.imperativeTitle":"Imperative Nutzung","docs.section.theming.imperativeBody":"Lies im Event-Handler den aktuellen DOM-Status (z. B. eine Theme-Klasse auf documentElement), übersetze ihn in eine Farbe und übergib sie an Zmage.browsing:","docs.section.theming.iconsTitle":"Icons mit dem Design-System angleichen","docs.section.theming.iconsBody":"Steuer-Icons leben innerhalb des #zmage-Containers; überschreibe ihre Farbe per globalem CSS. Wenn du CSS-Variablen für Theming nutzt (Tailwind / shadcn / vanilla Tokens), binde direkt an den Design-Token:","docs.section.theming.toolbarTitle":"Toolbar vom Modal-Backdrop entkoppeln","docs.section.theming.toolbarBody":'Standardmäßig erbt die Toolbar-Kapsel den obersten `backdrop` und Icons werden mit `currentColor` gezeichnet. Auf einem dunklen Volltonhintergrund verschwinden dunkle Icons in der dunklen Kapsel. Mit `controller.backdrop` (Kapselhintergrund) und `controller.color` (Icon-Farbe) lassen sich beide entkoppeln. Einzelbutton-String-Overrides (z. B. `controller.zoom = "#ff8800"`) haben weiterhin Vorrang vor `controller.color`.',"docs.search.desc.installation":"Über Paketmanager installieren und Stylesheet importieren","docs.search.desc.ssr":"SSR-Eintrag, der document beim Import nicht berührt","docs.search.desc.modes":"Komponente / imperativ / Wrapper — drei Aufrufweisen","docs.search.desc.theming":"Viewer-Hintergrund und Icons an das Site-Theme angleichen","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Preset-Auswahl: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Standard-Bundles für controller, hotKey, animate und gesture","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget und weitere UI-Stellschrauben","docs.search.desc.propsController":"Steuerleisten-Buttons, Position und eigener Render","docs.search.desc.propsHotkey":"Tastenkürzel: ESC / Leertaste / Pfeile","docs.search.desc.propsAnimate":"Browsing- und Blätter-Animationen","docs.search.desc.propsGesture":"Wheel-Zoom, Ziehen zum Blättern, Ziehen-zum-Schließen, Pinch und Double-Tap-Zoom","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"Controlled-Browsing-Status","docs.search.desc.examples":"Beispiele für Einzelbild und Multi-Bild-Galerie","docs.search.desc.typescript":"BaseType / Set / ControllerSet / GestureSet Typdeklarationen","docs.search.desc.migration":"Upgrade-Hinweise von 0.x","docs.search.desc.faq":"Häufige Integrations-Fallstricke und versionsspezifische Fixes","docs.section.props.title":"Props","docs.section.props.intro":"Jeder Prop von BaseType kann in jedem der drei Modi übergeben werden.","docs.section.props.wrapperScope.title":"Prop-Bereich im Wrapper-Modus","docs.section.props.wrapperScope.intro":" rendert das Cover-Bild nicht selbst. Er bindet vorhandene untergeordnete -Knoten, daher haben einige Props im Wrapper-Modus eine eigene Bedeutung.","docs.section.props.wrapperScope.data":"src und alt gehören auf das untergeordnete . Top-Level src / alt werden durch den angeklickten DOM-Knoten überschrieben. Ohne set kann caption aus data-zmage-caption oder der nächsten figcaption gelesen werden.","docs.section.props.wrapperScope.config":"set und defaultPage werden für eine explizite gemeinsame Galerie unterstützt. Wenn das angeklickte img-src in set vorkommt, öffnet Wrapper diesen passenden Index; defaultPage ist nur der Fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick und loadingDelay gelten normal.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating und onError funktionieren, weil Wrapper intern denselben Viewer öffnet.","docs.section.props.wrapperScope.controlled":"browsing ist der kontrollierte Zustand des Komponentenmodus und steuert Wrapper nicht. Wenn du aus eigenem State öffnen willst, nutze den Komponentenmodus oder rufe Zmage.browsing() selbst auf.","docs.section.props.interface":"Oberfläche & Interaktion","docs.section.props.portalTarget.title":"Eigenes Portal-Ziel","docs.section.props.portalTarget.body":"Standardmäßig mountet die Viewer-Ebene in document.body. Wenn deine App bereits einen Overlay-Root, Modal-Root, Shadow-Host oder Micro-Frontend-Shell-Container hat, übergib dieses Element an portalTarget, damit Stapelung, Style-Scope und Host-Lebenszyklus bei der App-Shell bleiben.","docs.section.props.portalTarget.boundary":"portalTarget ändert nur den DOM-Parent. Der Viewer bleibt fixed im Vollbild und wird nicht zu einer lokalen Vorschau beschnitten; nutze zIndex für die Stapelreihenfolge.","docs.section.props.controller.keyHeader":"Schlüssel","docs.section.props.controller.descHeader":"Beschreibung","docs.section.props.controller.umbrella":"rotate ist der übergeordnete Schalter für rotateLeft / rotateRight — beim Aktivieren werden beide Buttons angezeigt. flip funktioniert genauso für flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Overlay-Layout","docs.section.props.controller.layoutIntro":"layout verschiebt nur Toolbar-, seitliche Flip-, Pagination- und caption-Overlays; es ist nicht Teil der Geometrie für First Frame oder Zoom. Zahlen sind px, Strings CSS-Längen, ein skalarer inset folgt der natürlichen Eintrittskante des Ziels, und layout.mobile überschreibt das Basislayout auf Mobile.","docs.section.props.controller.renderTitle":"Eigener Render","docs.section.props.controller.renderIntro":"render erhält { state, actions, slots } und muss einen React-Knoten zurückgeben. Gib null zurück, um die Controller-Ebene auszublenden; verwende slots, wenn du nur Teile der UI ersetzen willst.","docs.section.props.hotkey.umbrella":"flip ist der übergeordnete Schalter für flipLeft / flipRight, rotate für rotateLeft / rotateRight — beim Aktivieren werden beide Seitentasten gebunden. Jeder Eintrag akzeptiert zudem einen String-Deskriptor wie 'Mod+S' oder 'BracketLeft', um die Standardbindung zu überschreiben (Mod = ⌘ unter macOS, Ctrl unter Windows/Linux).","docs.section.props.hotkey.customTitle":"Eigene Tastenbindungen","docs.section.props.hotkey.customIntro":"Jeder hotKey-Eintrag akzeptiert ein boolean (ein/aus), einen string (eigener Deskriptor) oder ein string[] (mehrere Bindungen). Deskriptoren verwenden e.code-Namen — physische Tastenpositionen, layoutunabhängig. Modifizierer-Präfixe nutzen Mod als plattformübergreifendes ⌘/Ctrl. Strenge Modifizierer-Prüfung: nicht deklarierte Modifizierer dürfen NICHT gedrückt sein (z. B. wird Space niemals durch Cmd+Space ausgelöst).","docs.section.props.hotkey.cheatsheetTitle":"Deskriptor-Spickzettel","docs.section.props.hotkey.cheatsheet.shorthand":"einzelne Buchstaben / Ziffern werden automatisch normalisiert","docs.section.props.hotkey.cheatsheet.arrows":"Pfeiltasten","docs.section.props.hotkey.cheatsheet.punct":"Satzzeichen (physische Tastennamen)","docs.section.props.hotkey.cheatsheet.whitespace":"Leer- / Steuertasten","docs.section.props.hotkey.cheatsheet.modifier":"Modifizierer-Präfixe (mit + verkettet)","docs.section.props.animate.typeHeader":"Typ","set.src.desc":"Bild-URL — erforderlich","set.alt.desc":"Titel für diesen Eintrag","set.caption.desc":"Bildunterschrift für diesen Eintrag; überschreibt die äußere caption, falls gesetzt","set.className.desc":"Benutzerdefinierte Klasse für diesen Eintrag","set.style.desc":"Benutzerdefiniertes Inline-Style für diesen Eintrag","docs.section.props.preset.title":"Preset-Bundles","docs.section.props.preset.intro":"preset bündelt Standardwerte für die Unterobjekte controller / hotKey / animate / gesture. Ohne preset gilt auto. auto wird zur Laufzeit über matchMedia('(pointer: coarse) and (hover: none)') zu desktop oder mobile aufgelöst; in SSR oder ohne matchMedia greift desktop.","docs.section.props.preset.subParamHeader":"Unterparameter","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Beispiele","docs.section.examples.singleTitle":"Einzelnes Bild","docs.section.examples.galleryTitle":"Multi-Bild-Galerie","docs.section.examples.mobileTitle":"Mobile Gesten","docs.section.examples.mobileBody":"Erzwinge das mobile Preset, um Drag-Paging, Drag-to-exit, Pinch-Zoom und Double-Tap-Zoom auf Touch-Geräten zu testen.","docs.section.examples.controllerTitle":"Eigener Controller","docs.section.examples.controllerBody":"Platziere den Controller an einem Bildschirmrand oder ersetze die gesamte UI mit einem render-Callback, der state und actions erhält.","docs.section.examples.coverTitle":"Zugeschnittenes Cover","docs.section.examples.coverBody":"Lege object-fit und border radius direkt auf das Cover-img, damit der erste Öffnungsframe den sichtbaren Zuschnitt trifft.","docs.section.examples.portalTargetTitle":"In einen Host Overlay Root mounten","docs.section.examples.portalTargetBody":"Wenn die Seite einen gemeinsamen Overlay-Container hat, übergib diesen DOM-Knoten an portalTarget. Das Beispiel bleibt Vollbild; nur der Portal-Parent wechselt zum Host-Root.","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Typen liegen am selben Ort wie der Runtime-Export. Die vollständige Prop-Union ist BaseType:","docs.section.typescript.refIntro":"Die Komponente akzeptiert eine ref, die an das Cover-img weitergeleitet wird:","docs.section.migration.title":"Migration","docs.section.migration.from":"Upgrade von 0.x:","docs.section.migration.bullet1":"Die Komponente ist ein forwardRef-Exotic; rufe sie nicht mit new Zmage() auf.","docs.section.migration.bullet2":"Falls du den SSR-Eintrag importierst, wechsle zu react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"Warum startet das Modal-Bild kleiner als das Cover, wenn ich Tailwind / normalize.css / Bootstrap nutze?","docs.section.faq.tailwind-shrink.a":"Diese Resets liefern global `img { max-width: 100% }` aus, was das Modal-Bild auf seine Cover-Größe begrenzt. Versionen vor 1.1.2 sind betroffen; 1.1.2+ schützt `.imageLayer` davor. Aktualisiere auf >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` liefert unter React 18 / 19 undefined — warum?","docs.section.faq.r19-imperative.a":"Latenter Bug, behoben in 1.1.2. Der alte Code las `RENDER.REF.current?.outBrowsing` synchron, was unter React 17 funktionierte, unter R18+ aber bricht (Commits sind asynchron). 1.1.2 gibt eine stabile Destruktor-Closure zurück — aktualisiere auf >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` öffnet ein leeres Modal und der Browser warnt vor leerem src. Warum?","docs.section.faq.wrapper-empty.a":"Der alte Wrapper hat `defaultProps.src=''` über die geklickte img gespreitet und damit src/alt geleert. 1.1.2 liest src/alt explizit vom geklickten DOM-Knoten. Aktualisieren behebt es.","docs.section.faq.vite-esm.q":'Die imperative API wirft im Vite- / Next.js-Client "no compatible mount API". Warum?',"docs.section.faq.vite-esm.a":"Vor 1.1.2 wurde `require('react-dom/client')` zur Runtime-Erkennung verwendet, aber Browser-ESM hat kein `require`-Global. 1.1.2 wechselt zu einem statischen Import — aktualisiere auf >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"Der Wrapper bindet keine Click-Handler an Bilder, die ich nach dem Mount eingefügt habe.","docs.section.faq.wrapper-dynamic.a":"Der Wrapper sucht `` nur in `componentDidMount` und `componentDidUpdate`. Wenn du DOM-imgs außerhalb des React-Render-Trees einfügst (z. B. ein dangerouslySetInnerHTML, das ohne Eltern-Re-Render mutiert), erzwinge ein Re-Render des Wrappers — oder rufe `Zmage.browsing()` aus deinem eigenen Click-Handler auf.","docs.section.faq.lazy-src.q":"Mein `` nutzt Lazy-Loading mit `data-src` — beim Öffnen von Zmage sehe ich den Platzhalter statt des echten Bildes. Wie behebe ich das?","docs.section.faq.lazy-src.a":"Zmage liest standardmäßig die `src` des Cover-`` — der Platzhalter ist alles, was es sieht. Übergib die echte URL explizit über `set`: ``. Beim imperativen Aufruf gleichermaßen: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"Ich möchte eine Thumbnail auf der Seite und das hochauflösende Bild beim Klick — kann ich `set` weglassen?","docs.section.faq.cover-vs-set.a":'Nein. Ohne `set` ist die Cover-`src` auch das, was der Viewer zeigt. Für "Thumbnail-Einstieg + Vollbild-Viewer" musst du sie explizit trennen: ``. Dasselbe Muster löst lazy-loaded `data-src` (vorherige FAQ) und CDN-Multi-Auflösung. Wenn du eine "Grid/Gallery + Viewer öffnen"-UI willst, bietet Zmage das nicht — render die Galerie selbst und rufe beim Klick `Zmage.browsing({ src, set })` auf.',"docs.section.faq.controlled-mismatch.q":"Mein controlled `browsing`-Prop und der Modal-Status laufen auseinander.","docs.section.faq.controlled-mismatch.a":"Der controlled-Modus erfordert sowohl `browsing` als auch `onBrowsing`. Wenn du nur `browsing` (ohne Callback) übergibst, synchronisiert sich der interne Status einmal und driftet dann. Immer paaren.","docs.section.faq.ssr.q":"Wie nutze ich react-zmage in Next.js / Remix / SSR-Frameworks?","docs.section.faq.ssr.a":"Verwende den `react-zmage/ssr`-Eintrag — er berührt `document` beim Import nicht. Das imperative `Zmage.browsing()` braucht einen `typeof window !== 'undefined'`-Guard, falls es während des Renderings oder in einem Server-only-Pfad ausgeführt werden könnte.","docs.section.faq.theme.q":"Wie folgt der Viewer meinem Hell-/Dunkel-Theme?","docs.section.faq.theme.a":"Übergib `backdrop` wie im Theming-Abschnitt oben beschrieben. Die Bibliothek ist bewusst theme-agnostisch und liest prefers-color-scheme nicht — dein App regelt das Mapping.","playground.preset.aria":"Datenvoreinstellung wechseln","playground.preset.default.label":"Standard","playground.preset.default.hint":"Childs Dream · 2 Bilder","playground.preset.testset.label":"Testset","playground.preset.testset.hint":"6 Bilder · Verh. + Format"},CR={"nav.playground":"Playground","nav.docs":"Documentación","nav.ai":"Guía de instalación AI","nav.github":"GitHub","useCases.eyebrow":"Casos de uso","useCases.title":"Vista previa de imagenes React para blogs, CMS, MDX y noticias","useCases.body":"react-zmage es un visor de imagenes para React que convierte elementos normales en una vista previa a pantalla completa con expansion desde el origen. Soporta galerias, teclado, gestos moviles, apertura imperativa, modo Wrapper para rich text y SSR/RSC.","useCases.cta.docs":"Leer docs","useCases.cta.wrapper":"Probar modo Wrapper","useCases.card.blog.title":"Vista previa para blogs","useCases.card.blog.body":"Abre imagenes de articulos a pantalla completa sin reemplazar el layout del post ni crear una galeria aparte.","useCases.card.cms.title":"Imagenes de rich text en CMS","useCases.card.cms.body":"Envuelve HTML renderizado por un CMS, parser Markdown o editor para que los existentes abran el visor.","useCases.card.news.title":"Galerias en articulos de noticias","useCases.card.news.body":"Mantiene legible la pagina editorial y permite ver detalles con teclado, gestos y navegacion de varias imagenes.","useCases.card.mdx.title":"Imagenes en MDX y documentacion","useCases.card.mdx.body":"Usa Wrapper mode cuando los autores controlan las imagenes y la app React controla la estructura de la pagina.","useCases.card.lightbox.title":"Alternativa a React lightbox","useCases.card.lightbox.body":"Usa una capa de vista previa mas ligera cuando quieres zoom origin-expand y soporte para markup existente, sin adoptar una galeria completa.","useCases.card.ssr.title":"Next.js, SSR y RSC","useCases.card.ssr.body":"Importa el subpath seguro para SSR en apps renderizadas en servidor y abre el visor interactivo desde fronteras cliente.","useCases.mode.eyebrow":"Elegir modo","useCases.mode.title":"Elige segun quien controla el markup de imagen","useCases.mode.component":"Controlas el JSX y puedes reemplazar por .","useCases.mode.imperative":"Un boton, comando, evento o callback debe abrir el visor.","useCases.mode.wrapper":"Las imagenes vienen de CMS, MDX, Markdown o HTML rich text.","useCases.facts.eyebrow":"Datos de entidad","useCases.facts.title":"La version corta que los crawlers deben entender","useCases.fact.react":"React 16.8 hasta 19","useCases.fact.modes":"Modo Component, imperative y Wrapper","useCases.fact.input":"Navegacion con teclado y gestos moviles","useCases.fact.ssr":"Ruta de import segura para SSR/RSC","useCases.fact.gallery":"Navegacion de galeria sin reestructurar la pagina","useCases.fact.origin":"Vista previa fullscreen con origin-expand","useCases.faq.eyebrow":"FAQ","useCases.faq.title":"Preguntas que suelen hacer personas y AI Agents","useCases.faq.what.q":"Que es react-zmage?","useCases.faq.what.a":"react-zmage es un visor de imagenes React que convierte elementos normales en una vista previa fullscreen con origin-expand, galeria, teclado, gestos moviles, Wrapper mode y soporte SSR/RSC.","useCases.faq.lightbox.q":"Cuando conviene usar react-zmage en vez de una React lightbox?","useCases.faq.lightbox.a":"Usa react-zmage cuando quieres que imagenes existentes se abran a pantalla completa sin reconstruir la pagina alrededor de una galeria. Encaja bien en blogs, CMS rich text, docs MDX, articulos de noticias y paginas con muchas imagenes.","useCases.faq.richText.q":"react-zmage puede manejar imagenes de CMS, Markdown o rich text?","useCases.faq.richText.a":"Si. Zmage.Wrapper puede enlazar nodos descendientes dentro de CMS, Markdown, MDX o dangerouslySetInnerHTML, conservando el markup y layout existentes.","useCases.faq.ssr.q":"react-zmage soporta Next.js, SSR o RSC?","useCases.faq.ssr.a":"Si. Usa el subpath react-zmage/ssr para imports seguros en SSR o RSC, y llama las APIs interactivas desde eventos cliente o Client Components.","hero.pill":"React 16.8-19 · SSR ready","hero.title.line1":"Haz que cada ","hero.title.line2":"se abra desde su lugar","hero.subtitle":"Convierte cualquier en un visor de pantalla completa que se abre desde su posición original, con teclado, gestos y navegación multiimagen.","hero.cta.start":"Leer docs","hero.cta.playground":"Probar parámetros","hero.ai.label":"Guía de instalación AI: lee llms.txt primero","hero.ai.directive":"Read https://zmage.caldis.me/llms.txt to add react-zmage to my project.","hero.ai.quick":"Copiar prompt rápido","hero.ai.copyLabel":"Copiar prompt rápido de AI","hero.ai.viewLlms":"ver llms.txt →","ai.badge":"Guía de instalación AI","ai.title":"Crea un prompt de integración para react-zmage","ai.subtitle":"Empieza por llms.txt. Mantén Auto para que tu agente inspeccione el proyecto primero, o ajusta entorno, fuente de imágenes e interacción antes de copiar.","ai.field.agent":"¿Qué agente usas?","ai.field.depth":"Nivel de configuración","ai.field.environment":"Entorno del proyecto","ai.field.mode":"Modo de uso","ai.field.imageSource":"Fuente de imágenes","ai.field.interaction":"Estrategia de interacción","ai.field.project":"Descripción del proyecto","ai.autoTip":"Mantén Auto si no estás seguro. Tu agente revisará primero la estructura del proyecto, la fuente de imágenes, el modo de renderizado y la entrada de estilos, y luego elegirá el modo y las props correctas de Zmage.","ai.project.placeholder":"Describe tu app, la fuente de imágenes y lo que debe hacer el visor.","ai.action.copy":"Copiar setup prompt","ai.action.copied":"Copiado","ai.action.openLlms":"Abrir llms.txt","ai.copy.error":"No se pudo copiar. Selecciona el prompt manualmente desde la vista previa.","ai.preview.title":"Setup prompt","ai.preview.subtitle":"Se actualiza con tus opciones","ai.preview.copy":"Copiar","ai.preview.expand":"Expandir","ai.preview.show":"Ver prompt","ai.preview.hide":"Ocultar vista previa","ai.option.auto":"Auto","ai.option.other":"Other","ai.option.agent.codex":"Codex","ai.option.agent.claude":"Claude","ai.option.agent.cursor":"Cursor","ai.option.agent.devin":"Devin","ai.option.agent.auto.desc":"Hace que el prompt funcione con un agente de código general.","ai.option.depth.auto":"Auto","ai.option.depth.auto.desc":"Permite que el agente inspeccione primero el proyecto.","ai.option.depth.fine":"Fine tune","ai.option.depth.fine.desc":"Define manualmente las preferencias de integración.","ai.option.env.vite":"Vite / CSR","ai.option.env.nextRsc":"Next.js App Router / RSC","ai.option.env.ssr":"SSR","ai.option.env.cmsMdx":"CMS / MDX / Markdown","ai.option.env.event":"Event handler only","ai.option.mode.component":"Component","ai.option.mode.imperative":"Imperative","ai.option.mode.wrapper":"Wrapper","ai.option.image.single":"Single image","ai.option.image.set":"Set gallery","ai.option.image.caption":"Captions","ai.option.image.wrapperCaption":"Wrapper captions","ai.option.interaction.presetAuto":"Preset auto","ai.option.interaction.desktopTools":"Desktop tools","ai.option.interaction.mobileGestures":"Mobile gestures","ai.option.interaction.noBrowsingAnimation":"No browsing animation","ai.option.interaction.customController":"Custom controller","demo.eyebrow":"Superficie interactiva real","demo.title":"Una página narrativa hecha con Child's Dream","demo.body":"Las imágenes vienen de Child's Dream: un libro antiguo, un portal del tiempo, un zorro, una ruta por el bosque y un sello de cristal. Haz clic en cualquier imagen y el primer fotograma se expande desde ese recorte exacto hacia el visor.","demo.shiftHint":"Mantén SHIFT al hacer clic en una imagen para sentir la transición suave","demo.zoomHint":"Abre una imagen, pulsa Space para ampliar y luego usa la rueda para seguir escalando.","demo.story.project":"Child's Dream","demo.story.author":"Guihuahuzi","demo.story.title":"Un libro cubierto de polvo en la biblioteca abre una puerta al tiempo antiguo.","demo.story.lead":"Las palabras sencillas de la página se convierten en una escena en miniatura. El niño ve crecer un bosque desde el papel y oye una llamada desde el otro lado de la barrera.","demo.story.middle":"Un zorro se vuelve su compañero. Tras mareas, copas de árboles y flamencos rosados, la ruta entra más hondo en el bosque hacia un sello de cristal.","demo.tile.cover":"Libro antiguo y portal","demo.tile.gallery":"Primer encuentro en el bosque","demo.tile.ratio":"Camino al borde de la marea","demo.tile.controller":"Sello de cristal","demo.tile.zoom":"Pausa entre flamencos","demo.tile.lamp":"Luz bajo las hojas","demo.tile.rescue":"Liberación en el bosque","demo.feature.cover":"Clip y radio de portada coinciden","demo.feature.space":"Mueve el puntero para explorar rápido en modo zoom","demo.feature.wheel":"Usa la rueda del ratón para cambiar la escala con suavidad","demo.feature.shift":"Shift ralentiza abrir y cerrar","demo.caption":"Haz clic en una imagen para abrir el visor. En escritorio, mantén SHIFT al abrir y luego mueve el puntero o usa la rueda tras ampliar.","demo.scene.portal.alt":"Un portal del tiempo luminoso sobre un libro antiguo","demo.scene.portal.caption":"Un portal del tiempo se ilumina en el libro antiguo y un bosque nace de las palabras.","demo.scene.forest.alt":"El niño encuentra un zorro en el bosque","demo.scene.forest.caption":"El zorro aparece entre los árboles y se convierte en compañero del niño.","demo.scene.tide.alt":"El niño está al borde de una marea","demo.scene.tide.caption":"El agua se curva en espiral y señala el siguiente camino desconocido.","demo.scene.canopy.alt":"El niño yace bajo una gran copa","demo.scene.canopy.caption":"La copa se abre como páginas mientras pequeñas luces marcan la ruta.","demo.scene.flamingo.alt":"El niño se sienta entre flamencos rosados","demo.scene.flamingo.caption":"Una bandada ligera de flamencos da una pausa tranquila al viaje.","demo.scene.lamp.alt":"El niño enciende una luz bajo hojas grandes","demo.scene.lamp.caption":"Las hojas contienen la oscuridad mientras la luz revela pistas del libro.","demo.scene.crystal.alt":"El niño está frente a un sello de cristal","demo.scene.crystal.caption":"El sello de cristal empieza a mostrarse en lo profundo del bosque.","demo.scene.rescue.alt":"El zorro y el niño se acercan al sello de cristal","demo.scene.rescue.caption":"La llave se acerca al cristal y el secreto del sello está por abrirse.","feature.dropin.title":"Apertura en origen","feature.dropin.hint":"Abre desde la posición, tamaño, radio y recorte de la imagen, y vuelve al mismo lugar al cerrar.","feature.mobile.title":"Compatible con movil","feature.mobile.hint":"El preset Auto elige interaccion tactil: deslizar entre imagenes, arrastrar hacia abajo para cerrar, doble toque y pinch zoom.","feature.set.title":"Herramientas completas","feature.set.hint":"Zoom, rotacion, cambio de pagina, descarga y captions comparten un mismo estado, incluso en sets de varias imagenes.","feature.ssr.title":"Compatible con SSR/RSC","feature.ssr.hint":"Usa la entrada segura para servidor en Next.js, SSR o RSC, y deja la interaccion del visor dentro de fronteras cliente.","modes.title":"Encaja con la página que ya tienes","modes.component.label":"Modo componente","modes.component.desc":"Cuando controlas el JSX, cambia por y conserva las props nativas.","modes.imperative.label":"Llamada imperativa","modes.imperative.desc":"Abre el visor desde botones, callbacks o flujos asíncronos sin exigir una imagen de portada.","modes.wrapper.label":"Modo wrapper","modes.wrapper.desc":"Envuelve Markdown / CMS / dangerouslySetInnerHTML para que las imágenes internas se abran desde su lugar.","modes.try":"Abrir ejemplo →","modes.component.when":"Elige el modo componente cuando controlas el JSX que renderizas. Sustituye cualquier por ; las props nativas siguen pasando y abrir / cerrar usa la misma transición desde el origen.","modes.imperative.when":"Elige la llamada imperativa cuando el punto de entrada no es la imagen. Abre el visor desde manejadores de eventos, callbacks de terceros o flujos asíncronos sin montar un de portada.","modes.wrapper.when":"Elige el modo wrapper cuando no controlas el HTML renderizado — markdown, rich text de CMS, dangerouslySetInnerHTML. Envuelve el subárbol y cada interno obtiene automáticamente el visor.","footer.project":"Proyecto","footer.repo":"Repositorio","footer.issues":"Issues","footer.changelog":"Changelog","footer.useCases":"Casos de uso","footer.madeby":"Creado por","footer.illustrator":"Ilustración","footer.license":"Licencia MIT","pg.title":"Playground","pg.subtitle":"Ajusta cada prop y observa al visor reaccionar en tiempo real.","pg.reset":"Restablecer","pg.share":"Compartir","pg.shared":"Enlace copiado","pg.tab.component":"Componente","pg.tab.imperative":"Imperativa","pg.tab.wrapper":"Wrapper","pg.preview.tip":"Tip: Espacio para zoom · ←/→ para pasar páginas · ESC para cerrar","pg.preview.trigger":"Abrir visor","pg.params.title":"Parámetros","pg.params.subtitle":"Pasa el cursor sobre un prop para ver ayuda, o abre sus docs con el icono de libro.","pg.events.title":"Eventos","pg.events.subtitle":"Salida de callbacks de ciclo de vida para esta sesión.","pg.events.empty":"Activa cualquier callback de ciclo de vida para ver el flujo de eventos aquí.","pg.code.title":"Código","pg.code.subtitle":"Código listo para copiar para el modo activo.","pg.code.hideDefaults":"Ocultar valores por defecto","pg.copy":"Copiar","pg.copied":"Copiado","pg.portalTarget.title":"Destino Portal personalizado","pg.portalTarget.body":"Para apps que ya tienen un overlay root, modal root o contenedor de micro-frontend. Al hacer clic en la imagen de la derecha, el visor se monta ahí en vez de document.body.","pg.portalTarget.root":"Overlay root anfitrión","pg.portalTarget.imageAlt":"Imagen de demostración de portalTarget","group.data":"Datos","group.preset":"Preset","group.interface":"Interfaz","group.controller":"Controlador","group.hotkey":"Atajos","group.animate":"Animación","group.gesture":"Gesture","group.lifecycle":"Ciclo de vida","group.controlled":"Controlado","common.presetScope.desktop.short":"D","common.presetScope.desktop.title":"Ámbito de escritorio","common.presetScope.desktop.desc":"Opción enfocada al escritorio. El preset desktop la activa por defecto o solo tiene efecto práctico en ese entorno.","common.presetScope.mobile.short":"M","common.presetScope.mobile.title":"Ámbito móvil","common.presetScope.mobile.desc":"Opción enfocada a móvil o touch. El preset mobile la activa por defecto o solo importa para interacción táctil.","common.expand":"Expandir","common.required":"Obligatorio","common.default":"Por defecto","common.add":"Añadir","common.remove":"Eliminar","common.enable":"Activar","common.disable":"Desactivar","param.viewInDocs":"Ver en docs","docs.title":"Referencia de la API","docs.search.placeholder":"Buscar en la documentación...","docs.search.empty":"Sin coincidencias","docs.toc.title":"En esta página","docs.sidebar.gettingStarted":"Primeros pasos","docs.sidebar.quickstart":"Inicio rápido","docs.sidebar.ssr":"SSR","docs.sidebar.concepts":"Conceptos","docs.sidebar.modes":"Modos","docs.sidebar.theming":"Tematización","docs.sidebar.props":"Props","docs.sidebar.recipes":"Recetas","docs.sidebar.examples":"Ejemplos","docs.sidebar.typescript":"TypeScript","docs.sidebar.reference":"Referencia","docs.sidebar.migration":"Migración","docs.sidebar.faq":"FAQ","preset.desktop":"Escritorio","preset.mobile":"Móvil","preset.auto":"Auto","animate.flip.fade":"Fundido","animate.flip.crossFade":"Fundido cruzado","animate.flip.swipe":"Deslizar","animate.flip.zoom":"Zoom","animate.flip.blur":"Desenfoque","animate.flip.none":"Ninguno","animate.slowMotion":"Cámara lenta","gesture.swipe":"Deslizar","gesture.dragExit":"Salir arrastrando","gesture.wheelZoom":"Zoom con rueda","gesture.pinchZoom":"Pinch zoom","gesture.doubleTapZoom":"Zoom con doble toque","gesture.touchAction":"touchAction","gesture.threshold":"threshold","gesture.velocity":"velocity","gesture.axisLock":"axisLock","gesture.resistance":"resistance","gesture.opacity":"opacity","gesture.wheelZoom.step":"step","gesture.wheelZoom.smooth":"smooth","gesture.wheelZoom.minScale":"minScale","gesture.wheelZoom.maxScale":"maxScale","gesture.wheelZoom.center":"center","gesture.wheelZoom.reverse":"reverse","gesture.wheelZoom.exitGuardDuration":"exitGuardDuration","gesture.pinchZoom.resetBelowFit":"resetBelowFit","gesture.doubleTapZoom.scale":"scale","gesture.doubleTapZoom.interval":"interval","gesture.doubleTapZoom.distance":"distance","gesture.desc":"Configuración de gestos según preset. Desktop activa zoom con rueda cuando ya está ampliado; mobile activa paginación por arrastre, arrastre para salir, pinch zoom y doble toque.","gesture.swipe.desc":"Paginación horizontal por arrastre dentro de un set. Se ignora en visores de una sola imagen.","gesture.dragExit.desc":"Arrastre vertical para salir. Cierra por la ruta existente onBrowsing(false).","gesture.wheelZoom.desc":"Zoom con rueda o trackpad mientras el visor ya está ampliado. Desktop lo activa; mobile lo desactiva.","gesture.pinchZoom.desc":"Pinch zoom de dos dedos en mobile. Reducir hasta la escala fit sale del zoom y recentra la imagen.","gesture.doubleTapZoom.desc":"Doble toque con un dedo en mobile. El primer doble toque amplía alrededor del punto tocado; otro doble toque estando ampliado vuelve a la vista fit.","gesture.touchAction.desc":"Estrategia CSS touch-action. managed usa none para pinch zoom y manipulation cuando solo hay doble toque; los valores explícitos se pasan tal cual.","gesture.threshold.desc":"Distancia mínima de arrastre para aceptar el gesto, en px.","gesture.velocity.desc":"Velocidad mínima para aceptar el gesto, en px/ms.","gesture.axisLock.desc":"Relación de bloqueo de eje para evitar que un movimiento diagonal dispare gestos horizontales y verticales a la vez.","gesture.resistance.desc":"Resistencia en los bordes cuando loop=false y el visor está en la primera o última imagen.","gesture.opacity.desc":"Si el arrastre vertical para salir reduce la opacidad de la imagen a medida que crece la distancia.","gesture.wheelZoom.step.desc":"Sensibilidad del zoom con rueda. Valores mayores amplían más rápido con el mismo delta de rueda.","gesture.wheelZoom.smooth.desc":"Interpolar el zoom con rueda con el RAF zoom-follow existente, en vez de saltar de inmediato.","gesture.wheelZoom.minScale.desc":"Escala mínima del zoom con rueda. Alcanzarla al reducir sale del modo zoom.","gesture.wheelZoom.maxScale.desc":"Escala máxima del zoom con rueda.","gesture.wheelZoom.center.desc":"Foco del zoom con rueda: pointer usa la posición del evento de rueda; viewport usa el centro de la pantalla.","gesture.wheelZoom.reverse.desc":"Invierte la dirección del zoom con rueda sin cambiar el resto del comportamiento.","gesture.wheelZoom.exitGuardDuration.desc":"Tiempo de protección tras salir del modo zoom por rueda, en ms. Los eventos de rueda residuales se ignoran durante esta ventana.","gesture.pinchZoom.minScale.desc":"Escala mínima de pinch. fit significa el tamaño de navegación ajustado a pantalla.","gesture.pinchZoom.maxScale.desc":"Escala máxima de pinch.","gesture.pinchZoom.resetBelowFit.desc":"Cuando pinch reduce hasta la escala fit, sale del zoom y recentra la imagen.","gesture.pinchZoom.center.desc":"Foco de pinch: gesture usa el punto medio de los dos dedos; viewport usa el centro de la pantalla.","gesture.doubleTapZoom.scale.desc":"Escala objetivo al entrar en zoom con doble toque.","gesture.doubleTapZoom.minScale.desc":"Escala mínima usada para limitar el zoom con doble toque.","gesture.doubleTapZoom.maxScale.desc":"Escala máxima usada para limitar el zoom con doble toque.","gesture.doubleTapZoom.center.desc":"Foco del doble toque: tap usa la posición tocada; viewport usa el centro de la pantalla.","gesture.doubleTapZoom.interval.desc":"Tiempo máximo entre toques, en ms.","gesture.doubleTapZoom.distance.desc":"Movimiento máximo entre toques, en px.","controller.pagination":"Paginación","controller.rotate":"Rotar","controller.rotateLeft":"Rotar a la izquierda","controller.rotateRight":"Rotar a la derecha","controller.zoom":"Zoom","controller.download":"Descargar","controller.close":"Cerrar","controller.flip":"Pasar","controller.flipLeft":"Anterior","controller.flipRight":"Siguiente","controller.backdrop":"backdrop","controller.color":"color","controller.placement":"placement","controller.layout":"layout","controller.render":"render","controller.pagination.desc":"Indicador de página superior con la posición actual / total","controller.rotate.desc":"Grupo de rotación (incluye botones izquierda y derecha)","controller.rotateLeft.desc":"Rotar 90° en sentido antihorario","controller.rotateRight.desc":"Rotar 90° en sentido horario","controller.zoom.desc":"Entrar / salir del modo zoom 1:1","controller.download.desc":"Descargar la imagen actual","controller.close.desc":"Cerrar el visor","controller.flip.desc":"Grupo de paginación (incluye botones anterior y siguiente)","controller.flipLeft.desc":"Ir a la imagen anterior","controller.flipRight.desc":"Ir a la siguiente imagen","controller.backdrop.desc":"Fondo de la barra. Si se omite, hereda el `backdrop` superior. Cuando el `backdrop` es un color oscuro sólido se recomienda un valor translúcido (p. ej. `rgba(0,0,0,0.4)`).","controller.color.desc":'Color de iconos de la barra. Si se omite, usa `currentColor`. Los overrides por botón (p. ej. `controller.zoom = "#ff8800"`) siguen prevaleciendo.',"controller.placement.desc":"Posición de la toolbar. Solo mueve la cápsula de controles; los botones laterales y la paginación mantienen su posición normal.","controller.layout.desc":"Ajusta los insets seguros de toolbar, botones laterales de flip, paginación y caption. Los números son px, las cadenas son longitudes CSS; un inset escalar sigue el borde natural de entrada de cada objetivo, y layout.mobile sobrescribe el preset móvil.","controller.layout.toolbarInset.desc":"Inset seguro del toolbar. Un valor escalar sigue el placement actual y se aplica al borde top / right / bottom / left correspondiente.","controller.layout.flipInset.desc":"Inset seguro de los botones laterales de flip. Un valor escalar se aplica a los botones izquierdo y derecho.","controller.layout.paginationInset.desc":"Inset seguro de la paginación. Un valor escalar se aplica al borde inferior de entrada, útil cuando una caption o UI personalizada necesita más espacio.","controller.layout.captionInset.desc":"Inset seguro de la caption. Un valor escalar se aplica al borde inferior de entrada, útil para colocarla por encima de la paginación o controles inferiores.","controller.render.desc":"Callback para renderizar un controlador completamente personalizado. Recibe state, actions y slots integrados; se desactiva con controller=false.","controller.overriddenBy":"Activado por","snippet.overriddenByProp":"sobrescrito por {umbrella}","hotkey.close":"Cerrar (Escape)","hotkey.zoom":"Zoom (Espacio)","hotkey.flip":"Pasar (←/→)","hotkey.flipLeft":"Anterior (←)","hotkey.flipRight":"Siguiente (→)","hotkey.rotate":"Rotar ([ / ])","hotkey.rotateLeft":"Rotar a la izquierda ([)","hotkey.rotateRight":"Rotar a la derecha (])","hotkey.download":"Descargar (Mod+S)","hotkey.close.desc":"Pulsa Escape para cerrar el visor","hotkey.zoom.desc":"Pulsa Espacio para alternar el modo zoom 1:1","hotkey.flip.desc":"Pulsa ← / → para pasar páginas dentro de un set","hotkey.flipLeft.desc":"Pulsa ← para ir a la imagen anterior","hotkey.flipRight.desc":"Pulsa → para ir a la siguiente imagen","hotkey.rotate.desc":"Pulsa [ / ] para rotar la imagen (interruptor maestro; vincula ambas direcciones)","hotkey.rotateLeft.desc":"Pulsa [ para rotar 90° en sentido antihorario","hotkey.rotateRight.desc":"Pulsa ] para rotar 90° en sentido horario","hotkey.download.desc":"Pulsa Cmd+S (macOS) o Ctrl+S (Windows/Linux) para descargar la imagen actual. Desactivado por defecto — al activarlo se sobrescribe el atajo «Guardar página como» del navegador.","animate.browsing.desc":"Transición al abrir / cerrar el visor","animate.flip.desc":"Estilo de transición al pasar páginas dentro de un set","animate.slowMotion.desc":"Cuando está activo, mantener Shift al abrir o cerrar ralentiza toda la transición del visor a 10x para inspección o demos","animate.cover.desc":"Cover-to-viewer transition geometry","animate.cover.objectFit.desc":"Match the cover image object-fit / object-position geometry before animating","animate.cover.clip.desc":"Use clip-path to match the img's own visible crop; may repaint during animation, so disable on performance-sensitive mobile pages","animate.cover.radius.desc":"Animate from the cover border radius to the viewer radius","param.src.label":"src","param.src.desc":"URL de la imagen. Obligatorio.","param.alt.label":"alt","param.alt.desc":"Título de la imagen, mostrado encima del visor.","param.caption.label":"caption","param.caption.desc":"Pie de imagen bajo el visor. string para el pill por defecto o { text, style?, className? } para personalizar. Cada set[i].caption puede sobrescribirlo.","param.set.label":"set","param.set.desc":"Conjunto de imágenes; activa el modo galería con navegación por teclas de flecha.","param.defaultPage.label":"defaultPage","param.defaultPage.desc":"Índice de la página inicial (empieza en 0).","param.preset.label":"preset","param.preset.desc":"Bundle de presets; por defecto usa auto y define controller / hotKey / animate / gesture.","param.backdrop.label":"backdrop","param.backdrop.desc":"Color de fondo del visor. Cualquier color CSS válido.","param.zIndex.label":"zIndex","param.zIndex.desc":"Nivel de apilamiento del visor.","param.portalTarget.label":"portalTarget","param.portalTarget.desc":"Elemento DOM usado como destino de montaje del Portal del visor. Por defecto es document.body. Úsalo con un overlay root, modal root o contenedor de micro-frontend; solo cambia el padre de montaje y el visor sigue usando fixed a pantalla completa.","param.radius.label":"radius","param.radius.desc":"Radio de las esquinas de la imagen (px).","param.edge.label":"edge","param.edge.desc":"Margen mínimo entre la imagen y el viewport (px).","param.loop.label":"loop","param.loop.desc":"Volver a la primera imagen al llegar al final.","param.hideOnScroll.label":"hideOnScroll","param.hideOnScroll.desc":"Cerrar el visor cuando la página se desplaza.","param.hideOnDblClick.label":"hideOnDblClick","param.hideOnDblClick.desc":"Cerrar el visor al hacer doble clic en la imagen. Desactivado por defecto.","param.coverVisible.label":"coverVisible","param.coverVisible.desc":"Mantener la imagen de portada visible durante la navegación.","param.loadingDelay.label":"loadingDelay","param.loadingDelay.desc":"Retraso (ms) antes de mostrar el indicador de carga. Si la imagen termina de cargar dentro de esta ventana, no se muestra el loading — evita el parpadeo al cambiar entre imágenes en caché. Por defecto 200ms; 0 = mostrar al instante (comportamiento antiguo).","param.controller.label":"controller","param.controller.desc":"Configuración de la barra de control. false desactiva todo; un objeto parcial sobrescribe botones, posición, layout de overlays y render personalizado.","param.hotKey.label":"hotKey","param.hotKey.desc":"Atajos de teclado.","param.animate.label":"animate","param.animate.desc":"Configuración de animación: navegación, geometría de portada, cámara lenta y animación de página.","param.gesture.label":"gesture","param.gesture.desc":"Configuración de gestos según preset. Desktop activa wheelZoom estando ampliado; mobile activa por defecto swipe, dragExit, pinchZoom y doubleTapZoom. gesture=false desactiva todo.","param.onBrowsing.label":"onBrowsing","param.onBrowsing.desc":"Se dispara al abrir/cerrar el visor (boolean).","param.onZooming.label":"onZooming","param.onZooming.desc":"Se dispara al entrar/salir del modo zoom (boolean).","param.onSwitching.label":"onSwitching","param.onSwitching.desc":"Se dispara al cambiar de página (nuevo índice).","param.onRotating.label":"onRotating","param.onRotating.desc":"Se dispara al rotar (grados).","param.onError.label":"onError","param.onError.desc":"Se dispara cuando una imagen (portada o visor) falla al cargar. Recibe el SyntheticEvent.","param.browsing.label":"browsing","param.browsing.desc":"Estado de navegación controlado. Pasarlo cambia al modo controlado; combínalo con onBrowsing.","docs.section.installation.title":"Instalación","docs.section.installation.intro":"Instala mediante tu gestor de paquetes:","docs.section.installation.agent":"Los AI agents deben leer primero https://zmage.caldis.me/llms.txt y mantener mínima la integración básica.","docs.section.installation.then":"Después importa el componente y su hoja de estilos:","docs.section.installation.ssrTitle":"SSR","docs.section.installation.ssrBody":"Para apps con renderizado en servidor, usa la entrada /ssr para no tocar document al importar:","docs.section.modes.title":"Tres modos","docs.section.modes.intro":"react-zmage expone la misma superficie de configuración a través de tres formas de invocación:","docs.section.modes.componentTitle":"Componente","docs.section.modes.componentBody":"La opción por defecto — úsala cuando controlas el JSX que renderizas. Cambia cualquier por ; cada atributo HTML nativo (className, style, onClick, etc.) se reenvía al subyacente.","docs.section.modes.imperativeTitle":"Imperativa","docs.section.modes.imperativeBody":"Úsala cuando no tienes una buena de portada o no quieres montar nodos extra en tu árbol de componentes. Llama desde manejadores de eventos, callbacks asíncronos o widgets de terceros para abrir el visor desde cualquier sitio. Devuelve una closure destructora para cerrar manualmente.","docs.section.modes.wrapperTitle":"Wrapper","docs.section.modes.wrapperBody":"Úsala cuando no controlas el HTML renderizado — salida de markdown, texto enriquecido de un CMS, dangerouslySetInnerHTML. Wrapper lee src / alt del pulsado; las props del visor, como backdrop, controles, atajos, animación, callbacks y set, se mantienen en .","docs.section.modes.wrapperNote":"Wrapper consulta los hijos img durante componentDidMount / componentDidUpdate. Las imágenes inyectadas tras el render del wrapper no se enlazarán hasta que vuelva a renderizarse. Si se pasa set, el src del img pulsado se compara con set y se usa como página inicial; si no se pasa set, data-zmage-caption o la figcaption más cercana pueden convertirse en la caption del visor.","docs.section.theming.title":"Tematización","docs.section.theming.intro":"react-zmage es deliberadamente agnóstico al sistema de temas del sitio anfitrión: no lee prefers-color-scheme y no está atado a ningún framework de variables CSS. La integración claro/oscuro corresponde al consumidor:","docs.section.theming.bullet.backdrop":"El fondo del visor se define con la prop backdrop (cualquier color CSS válido). El valor por defecto es blanco (#FFFFFF).","docs.section.theming.bullet.icons":"Los iconos de la barra de control usan SVG currentColor; sobrescríbelos en tu CSS global para alinearlos con tu sistema de diseño.","docs.section.theming.bullet.scoped":"Todos los estilos de runtime están confinados al contenedor #zmage; no se filtran al resto de tu aplicación.","docs.section.theming.defaultTitle":"Comportamiento por defecto","docs.section.theming.defaultBody":"Si omites backdrop, el visor se renderiza con un panel blanco. Va bien en sitios claros, pero produce mal contraste con los iconos blancos en sitios oscuros:","docs.section.theming.patternTitle":"Uso como componente / controlado","docs.section.theming.patternBody":"Lee tu hook de tema existente (next-themes, un ThemeProvider propio, etc.), mapea el valor resuelto a un color y pásalo como backdrop. Encapsularlo en un pequeño componente local mantiene los puntos de uso limpios:","docs.section.theming.imperativeTitle":"Uso imperativo","docs.section.theming.imperativeBody":"En un manejador de eventos, lee el estado actual del DOM (p. ej., una clase de tema en documentElement), tradúcelo a un color y pásalo a Zmage.browsing:","docs.section.theming.iconsTitle":"Alinear iconos con el sistema de diseño","docs.section.theming.iconsBody":"Los iconos de control viven dentro del contenedor #zmage; sobrescribe su color desde tu CSS global. Si usas variables CSS para temas (Tailwind / shadcn / tokens vanilla), enlaza directamente al token de diseño:","docs.section.theming.toolbarTitle":"Desacoplar la barra del backdrop del modal","docs.section.theming.toolbarBody":'Por defecto la cápsula de la barra hereda el `backdrop` superior y los iconos se dibujan con `currentColor`. En un `backdrop` oscuro sólido los iconos oscuros se confunden con la cápsula oscura. Pasa `controller.backdrop` (fondo de la cápsula) y `controller.color` (color de iconos) para desacoplarlos. Los overrides por botón (p. ej. `controller.zoom = "#ff8800"`) siguen prevaleciendo sobre `controller.color`.',"docs.search.desc.installation":"Instalar mediante tu gestor de paquetes e importar la hoja de estilos","docs.search.desc.ssr":"Entrada SSR que no toca document al importar","docs.search.desc.modes":"Componente / imperativa / wrapper — tres formas de invocar el visor","docs.search.desc.theming":"Alinea el fondo y los iconos del visor con el tema de tu sitio","docs.search.desc.propsData":"src · alt · caption · set · defaultPage","docs.search.desc.propsPreset":"Selección de preset: auto / desktop / mobile","docs.search.desc.propsPresetBundles":"Valores por defecto de controller, hotKey, animate y gesture","docs.search.desc.propsInterface":"backdrop · radius · edge · loop · zIndex · portalTarget y otros ajustes de UI","docs.search.desc.propsController":"Botones, posición y render personalizado de la barra de control","docs.search.desc.propsHotkey":"Atajos de teclado: ESC / Espacio / flechas","docs.search.desc.propsAnimate":"Animaciones de navegación y paso de página","docs.search.desc.propsGesture":"Zoom con rueda, arrastre para paginar, arrastre para salir, pinch y doble toque","docs.search.desc.propsLifecycle":"onBrowsing · onZooming · onSwitching · onRotating","docs.search.desc.propsControlled":"Estado de navegación controlado","docs.search.desc.examples":"Ejemplos de imagen única y galería de varias imágenes","docs.search.desc.typescript":"Declaraciones de tipo BaseType / Set / ControllerSet / GestureSet","docs.search.desc.migration":"Notas de actualización desde 0.x","docs.search.desc.faq":"Trampas comunes de integración y correcciones por versión","docs.section.props.title":"Props","docs.section.props.intro":"Cualquier prop de BaseType puede pasarse en cualquiera de los tres modos.","docs.section.props.wrapperScope.title":"Alcance de props en modo Wrapper","docs.section.props.wrapperScope.intro":" no renderiza por sí mismo la imagen de portada. Enlaza nodos descendientes ya existentes, así que algunas props tienen significado propio en este modo.","docs.section.props.wrapperScope.data":"src y alt deben estar en el hijo. Los src / alt de nivel superior son sobrescritos por el nodo DOM pulsado. Si no se pasa set, caption puede leerse desde data-zmage-caption o desde la figcaption más cercana.","docs.section.props.wrapperScope.config":"set y defaultPage son compatibles para una galería compartida explícita. Cuando el src del img pulsado aparece en set, Wrapper abre ese índice; defaultPage queda solo como fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick y loadingDelay se aplican normalmente.","docs.section.props.wrapperScope.lifecycle":"onBrowsing, onZooming, onSwitching, onRotating y onError funcionan porque Wrapper abre internamente el mismo visor.","docs.section.props.wrapperScope.controlled":"browsing es el estado controlado del modo componente y no controla Wrapper. Para abrir desde tu propio estado, usa el modo componente o llama a Zmage.browsing() directamente.","docs.section.props.interface":"Interfaz e interacción","docs.section.props.portalTarget.title":"Destino Portal personalizado","docs.section.props.portalTarget.body":"Por defecto, la capa del visor se monta en document.body. Si tu app ya tiene un overlay root, modal root, shadow host o contenedor shell de micro-frontend, pasa ese elemento a portalTarget para mantener el apilamiento, el alcance de estilos y el ciclo de vida dentro del shell anfitrión.","docs.section.props.portalTarget.boundary":"portalTarget solo cambia el padre DOM. El visor sigue usando fixed a pantalla completa y no se recorta como una vista previa local; usa zIndex para ajustar el apilamiento.","docs.section.props.controller.keyHeader":"Clave","docs.section.props.controller.descHeader":"Descripción","docs.section.props.controller.umbrella":"rotate es el interruptor maestro de rotateLeft / rotateRight — al activarlo se muestran ambos botones. flip funciona de la misma forma sobre flipLeft / flipRight.","docs.section.props.controller.layoutTitle":"Layout de overlays","docs.section.props.controller.layoutIntro":"layout solo desplaza los overlays de toolbar, flip lateral, paginación y caption; no participa en la geometría del primer frame ni del zoom. Los números son px, las cadenas son longitudes CSS, un inset escalar sigue el borde natural de entrada de cada objetivo, y layout.mobile sobrescribe el layout base en móvil.","docs.section.props.controller.renderTitle":"Render personalizado","docs.section.props.controller.renderIntro":"render recibe { state, actions, slots } y debe devolver un nodo React. Devuelve null para ocultar la capa de controles; reutiliza slots cuando solo quieras reemplazar parte de la UI.","docs.section.props.hotkey.umbrella":"flip es el interruptor maestro de flipLeft / flipRight, y rotate de rotateLeft / rotateRight — al activar cualquiera se enlazan ambas teclas laterales. Cada entrada también acepta un descriptor de cadena como 'Mod+S' o 'BracketLeft' para sustituir el atajo predeterminado (Mod = ⌘ en macOS, Ctrl en Windows/Linux).","docs.section.props.hotkey.customTitle":"Atajos personalizados","docs.section.props.hotkey.customIntro":"Cada entrada hotKey acepta un boolean (activar/desactivar), una string (descriptor personalizado) o un string[] (varios enlaces). Los descriptores usan nombres e.code — posiciones físicas de tecla, independientes del idioma del teclado. El prefijo Mod representa ⌘/Ctrl multiplataforma. Coincidencia estricta de modificadores: los modificadores no declarados NO deben estar pulsados (p. ej. Space nunca se dispara con Cmd+Space).","docs.section.props.hotkey.cheatsheetTitle":"Chuleta de descriptores","docs.section.props.hotkey.cheatsheet.shorthand":"letras / dígitos sueltos normalizados automáticamente","docs.section.props.hotkey.cheatsheet.arrows":"teclas de flecha","docs.section.props.hotkey.cheatsheet.punct":"puntuación (nombres físicos de teclas)","docs.section.props.hotkey.cheatsheet.whitespace":"teclas de espacio / control","docs.section.props.hotkey.cheatsheet.modifier":"prefijos de modificador (encadenados con +)","docs.section.props.animate.typeHeader":"Tipo","set.src.desc":"URL de la imagen — obligatorio","set.alt.desc":"Título de esta imagen","set.caption.desc":"Pie de imagen para este elemento; sobrescribe la caption externa si se indica","set.className.desc":"Clase personalizada aplicada a este elemento","set.style.desc":"Estilo en línea personalizado aplicado a este elemento","docs.section.props.preset.title":"Paquetes de preset","docs.section.props.preset.intro":"preset es un paquete de valores por defecto aplicados a los subobjetos controller / hotKey / animate / gesture. Si se omite preset se usa auto. auto se resuelve en tiempo de ejecución mediante matchMedia('(pointer: coarse) and (hover: none)') a desktop o mobile; en SSR o sin matchMedia se usa desktop.","docs.section.props.preset.subParamHeader":"Subparámetro","docs.section.props.preset.desktopHeader":"desktop","docs.section.props.preset.mobileHeader":"mobile","docs.section.examples.title":"Ejemplos","docs.section.examples.singleTitle":"Imagen única","docs.section.examples.galleryTitle":"Galería de varias imágenes","docs.section.examples.mobileTitle":"Gestos móviles","docs.section.examples.mobileBody":"Fuerza el preset mobile para probar arrastre entre páginas, arrastre para salir, pinch zoom y doble toque en dispositivos táctiles.","docs.section.examples.controllerTitle":"Controlador personalizado","docs.section.examples.controllerBody":"Coloca el controlador en un borde de la pantalla o reemplaza toda la UI con un callback render que recibe state y actions.","docs.section.examples.coverTitle":"Portada recortada","docs.section.examples.coverBody":"Pon object-fit y border radius en el img de portada para que el primer frame coincida con el recorte visible.","docs.section.examples.portalTargetTitle":"Montar en un overlay root anfitrión","docs.section.examples.portalTargetBody":"Cuando la página tiene un contenedor de overlays compartido, pasa ese nodo DOM a portalTarget. El ejemplo sigue siendo de pantalla completa; solo cambia el padre del Portal.","docs.section.examples.portalTargetRoot":"app-overlay-root","docs.section.typescript.title":"TypeScript","docs.section.typescript.intro":"Los tipos están junto al export de runtime. La unión completa de props es BaseType:","docs.section.typescript.refIntro":"El componente acepta una ref, que se reenvía al img de portada:","docs.section.migration.title":"Migración","docs.section.migration.from":"Actualizar desde 0.x:","docs.section.migration.bullet1":"El componente es un forwardRef exotic; no uses new Zmage().","docs.section.migration.bullet2":"Si importas la entrada SSR, cambia a react-zmage/ssr.","docs.section.faq.title":"FAQ","docs.section.faq.tailwind-shrink.q":"¿Por qué la imagen del modal se abre más pequeña que la portada cuando uso Tailwind / normalize.css / Bootstrap?","docs.section.faq.tailwind-shrink.a":"Esos resets aplican globalmente `img { max-width: 100% }`, lo que limita la imagen del modal al tamaño de su portada. Las versiones anteriores a 1.1.2 se ven afectadas; 1.1.2+ defiende `.imageLayer` frente a esto. Actualiza a >=1.1.2.","docs.section.faq.r19-imperative.q":"`Zmage.browsing()` devuelve undefined en React 18 / 19, ¿por qué?","docs.section.faq.r19-imperative.a":"Bug latente corregido en 1.1.2. El código antiguo leía `RENDER.REF.current?.outBrowsing` de forma síncrona, lo cual funcionaba en React 17 pero falla en R18+ (los commits son asíncronos). 1.1.2 devuelve una closure destructora estable: actualiza a >=1.1.2.","docs.section.faq.wrapper-empty.q":"`` abre un modal en blanco y el navegador advierte de src vacío. ¿Por qué?","docs.section.faq.wrapper-empty.a":"El wrapper antiguo expandía `defaultProps.src=''` sobre el img clicado, dejando src/alt en blanco. 1.1.2 lee src/alt explícitamente del nodo DOM clicado. Actualiza para arreglarlo.","docs.section.faq.vite-esm.q":'La API imperativa lanza "no compatible mount API" en el cliente de Vite / Next.js. ¿Por qué?',"docs.section.faq.vite-esm.a":"Antes de 1.1.2 se usaba `require('react-dom/client')` para la detección en runtime, pero el ESM del navegador no tiene `require` global. 1.1.2 pasa a un import estático: actualiza a >=1.1.2.","docs.section.faq.wrapper-dynamic.q":"El wrapper no engancha los manejadores de clic en imágenes que añadí después del montaje.","docs.section.faq.wrapper-dynamic.a":"El wrapper consulta `` solo en `componentDidMount` y `componentDidUpdate`. Si inyectas imgs DOM fuera del árbol de render de React (p. ej. un dangerouslySetInnerHTML que cambia sin re-render del padre), fuerza al wrapper a re-renderizarse o llama a `Zmage.browsing()` desde tu propio manejador de clic.","docs.section.faq.lazy-src.q":"Mi `` usa lazy-loading con `data-src` — al abrir Zmage veo el placeholder en vez de la imagen real. ¿Cómo lo arreglo?","docs.section.faq.lazy-src.a":"Zmage lee por defecto la `src` del `` de portada — el placeholder es todo lo que ve. Pasa la URL real explícitamente vía `set`: ``. La llamada imperativa funciona igual: `Zmage.browsing({ src: realUrl })`.","docs.section.faq.cover-vs-set.q":"Quiero mostrar un thumbnail en la página y la imagen a tamaño completo al hacer clic — ¿puedo omitir `set`?","docs.section.faq.cover-vs-set.a":'No. Sin `set`, la `src` de la portada también es lo que muestra el visor. Para "thumbnail como entrada + visor a tamaño completo" debes separarlos explícitamente: ``. El mismo patrón resuelve `data-src` con lazy-loading (FAQ anterior) y multi-resolución de CDN. Si lo que quieres es un UI de "grilla/galería + abrir visor", Zmage no lo proporciona — renderiza la galería tú mismo y llama a `Zmage.browsing({ src, set })` al hacer clic.',"docs.section.faq.controlled-mismatch.q":"Mi prop controlado `browsing` y el estado del modal se desincronizan.","docs.section.faq.controlled-mismatch.a":"El modo controlado requiere tanto `browsing` como `onBrowsing`. Si solo pasas `browsing` (sin callback), el estado interno se sincroniza una vez y luego diverge. Úsalos siempre en pareja.","docs.section.faq.ssr.q":"¿Cómo uso react-zmage en Next.js / Remix / frameworks SSR?","docs.section.faq.ssr.a":"Usa la entrada `react-zmage/ssr`: evita tocar `document` al importar. La `Zmage.browsing()` imperativa necesita una guarda `typeof window !== 'undefined'` si puede ejecutarse durante el render o en una ruta solo de servidor.","docs.section.faq.theme.q":"¿Cómo hago que el visor siga mi tema claro/oscuro?","docs.section.faq.theme.a":"Pasa `backdrop` siguiendo la sección de Tematización de arriba. La biblioteca es deliberadamente agnóstica al tema y no lee prefers-color-scheme: tu app es la que controla el mapeo.","playground.preset.aria":"Cambiar preset de datos","playground.preset.default.label":"Predeterminado","playground.preset.default.hint":"Childs Dream · 2 imágenes","playground.preset.testset.label":"Set de prueba","playground.preset.testset.hint":"6 imágenes · ratios + formatos"},Ex="zmage.lang",Rx={"zh-CN":yR,en:bR,ja:vR,ko:xR,fr:wR,de:SR,es:CR};function kR(){if(typeof window>"u")return"en";const e=localStorage.getItem(Ex);if(e&&e in Rx)return e;const a=(navigator.language||"en").toLowerCase();return a.startsWith("zh")?"zh-CN":a.startsWith("ja")?"ja":a.startsWith("ko")?"ko":a.startsWith("fr")?"fr":a.startsWith("de")?"de":a.startsWith("es")?"es":"en"}const jx=y.createContext(null);function TR({children:e}){const[a,r]=y.useState(kR),s=y.useCallback(d=>Rx[a][d]??d,[a]),l=y.useCallback(d=>{localStorage.setItem(Ex,d),r(d),document.documentElement.lang=d},[]);return y.useEffect(()=>{document.documentElement.lang=a},[a]),c.jsx(jx.Provider,{value:{lang:a,setLang:l,t:s},children:e})}function be(){const e=y.useContext(jx);if(!e)throw new Error("useT must be inside I18nProvider");return e}/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ER=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Ax=(...e)=>e.filter((a,r,s)=>!!a&&a.trim()!==""&&s.indexOf(a)===r).join(" ").trim();/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var RR={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jR=y.forwardRef(({color:e="currentColor",size:a=24,strokeWidth:r=2,absoluteStrokeWidth:s,className:l="",children:d,iconNode:u,...m},h)=>y.createElement("svg",{ref:h,...RR,width:a,height:a,stroke:e,strokeWidth:s?Number(r)*24/Number(a):r,className:Ax("lucide",l),...m},[...u.map(([g,b])=>y.createElement(g,b)),...Array.isArray(d)?d:[d]]));/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const je=(e,a)=>{const r=y.forwardRef(({className:s,...l},d)=>y.createElement(jR,{ref:d,iconNode:a,className:Ax(`lucide-${ER(e)}`,s),...l}));return r.displayName=`${e}`,r};/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Nx=je("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zx=je("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const AR=je("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ha=je("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mx=je("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const NR=je("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zR=je("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const MR=je("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const DR=je("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $s=je("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Dx=je("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _R=je("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const OR=je("GalleryHorizontal",[["path",{d:"M2 3v18",key:"pzttux"}],["rect",{width:"12",height:"18",x:"6",y:"3",rx:"2",key:"btr8bg"}],["path",{d:"M22 3v18",key:"6jf3v"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _x=je("Github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const LR=je("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const PR=je("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ZR=je("Keyboard",[["path",{d:"M10 8h.01",key:"1r9ogq"}],["path",{d:"M12 12h.01",key:"1mp3jc"}],["path",{d:"M14 8h.01",key:"1primd"}],["path",{d:"M16 12h.01",key:"1l6xoz"}],["path",{d:"M18 8h.01",key:"emo2bl"}],["path",{d:"M6 8h.01",key:"x9i8wu"}],["path",{d:"M7 16h10",key:"wp8him"}],["path",{d:"M8 12h.01",key:"czm47f"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const BR=je("Link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const IR=je("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qR=je("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const FR=je("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const KR=je("MousePointer2",[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const UR=je("MousePointerClick",[["path",{d:"M14 4.1 12 6",key:"ita8i4"}],["path",{d:"m5.1 8-2.9-.8",key:"1go3kf"}],["path",{d:"m6 12-1.9 2",key:"mnht97"}],["path",{d:"M7.2 2.2 8 5.1",key:"1cfko1"}],["path",{d:"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z",key:"s0h3yz"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const HR=je("Mouse",[["rect",{x:"5",y:"2",width:"14",height:"20",rx:"7",key:"11ol66"}],["path",{d:"M12 6v4",key:"16clxf"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const GR=je("Newspaper",[["path",{d:"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-2 2Zm0 0a2 2 0 0 1-2-2v-9c0-1.1.9-2 2-2h2",key:"7pis2x"}],["path",{d:"M18 14h-8",key:"sponae"}],["path",{d:"M15 18h-5",key:"95g1m2"}],["path",{d:"M10 6h8v4h-8V6Z",key:"smlsk5"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const VR=je("PanelsTopLeft",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const WR=je("Play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Hs=je("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $R=je("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $b=je("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ox=je("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const YR=je("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const XR=je("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Nm=je("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const QR=je("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const JR=je("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @license lucide-react v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lx=je("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Yb(e,a){if(typeof e=="function")return e(a);e!=null&&(e.current=a)}function oi(...e){return a=>{let r=!1;const s=e.map(l=>{const d=Yb(l,a);return!r&&typeof d=="function"&&(r=!0),d});if(r)return()=>{for(let l=0;l{let{children:d,...u}=s;Px(d)&&typeof tc=="function"&&(d=tc(d._payload));const m=y.Children.toArray(d),h=m.find(rj);if(h){const g=h.props.children,b=m.map(v=>v===h?y.Children.count(g)>1?y.Children.only(null):y.isValidElement(g)?g.props.children:null:v);return c.jsx(a,{...u,ref:l,children:y.isValidElement(g)?y.cloneElement(g,void 0,b):null})}return c.jsx(a,{...u,ref:l,children:d})});return r.displayName=`${e}.Slot`,r}var oj=Zx("Slot");function aj(e){const a=y.forwardRef((r,s)=>{let{children:l,...d}=r;if(Px(l)&&typeof tc=="function"&&(l=tc(l._payload)),y.isValidElement(l)){const u=ij(l),m=sj(d,l.props);return l.type!==y.Fragment&&(m.ref=s?oi(s,u):u),y.cloneElement(l,m)}return y.Children.count(l)>1?y.Children.only(null):null});return a.displayName=`${e}.SlotClone`,a}var nj=Symbol("radix.slottable");function rj(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===nj}function sj(e,a){const r={...a};for(const s in a){const l=e[s],d=a[s];/^on[A-Z]/.test(s)?l&&d?r[s]=(...m)=>{const h=d(...m);return l(...m),h}:l&&(r[s]=l):s==="style"?r[s]={...l,...d}:s==="className"&&(r[s]=[l,d].filter(Boolean).join(" "))}return{...e,...r}}function ij(e){var s,l;let a=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,r=a&&"isReactWarning"in a&&a.isReactWarning;return r?e.ref:(a=(l=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:l.get,r=a&&"isReactWarning"in a&&a.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function Bx(e){var a,r,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var l=e.length;for(a=0;atypeof e=="boolean"?`${e}`:e===0?"0":e,Qb=yc,bc=(e,a)=>r=>{var s;if((a==null?void 0:a.variants)==null)return Qb(e,r==null?void 0:r.class,r==null?void 0:r.className);const{variants:l,defaultVariants:d}=a,u=Object.keys(l).map(g=>{const b=r==null?void 0:r[g],v=d==null?void 0:d[g];if(b===null)return null;const S=Xb(b)||Xb(v);return l[g][S]}),m=r&&Object.entries(r).reduce((g,b)=>{let[v,S]=b;return S===void 0||(g[v]=S),g},{}),h=a==null||(s=a.compoundVariants)===null||s===void 0?void 0:s.reduce((g,b)=>{let{class:v,className:S,...T}=b;return Object.entries(T).every(C=>{let[x,k]=C;return Array.isArray(k)?k.includes({...d,...m}[x]):{...d,...m}[x]===k})?[...g,v,S]:g},[]);return Qb(e,u,h,r==null?void 0:r.class,r==null?void 0:r.className)},zm="-",lj=e=>{const a=dj(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:s}=e;return{getClassGroupId:u=>{const m=u.split(zm);return m[0]===""&&m.length!==1&&m.shift(),Ix(m,a)||cj(u)},getConflictingClassGroupIds:(u,m)=>{const h=r[u]||[];return m&&s[u]?[...h,...s[u]]:h}}},Ix=(e,a)=>{var u;if(e.length===0)return a.classGroupId;const r=e[0],s=a.nextPart.get(r),l=s?Ix(e.slice(1),s):void 0;if(l)return l;if(a.validators.length===0)return;const d=e.join(zm);return(u=a.validators.find(({validator:m})=>m(d)))==null?void 0:u.classGroupId},Jb=/^\[(.+)\]$/,cj=e=>{if(Jb.test(e)){const a=Jb.exec(e)[1],r=a==null?void 0:a.substring(0,a.indexOf(":"));if(r)return"arbitrary.."+r}},dj=e=>{const{theme:a,prefix:r}=e,s={nextPart:new Map,validators:[]};return pj(Object.entries(e.classGroups),r).forEach(([d,u])=>{tm(u,s,d,a)}),s},tm=(e,a,r,s)=>{e.forEach(l=>{if(typeof l=="string"){const d=l===""?a:ev(a,l);d.classGroupId=r;return}if(typeof l=="function"){if(uj(l)){tm(l(s),a,r,s);return}a.validators.push({validator:l,classGroupId:r});return}Object.entries(l).forEach(([d,u])=>{tm(u,ev(a,d),r,s)})})},ev=(e,a)=>{let r=e;return a.split(zm).forEach(s=>{r.nextPart.has(s)||r.nextPart.set(s,{nextPart:new Map,validators:[]}),r=r.nextPart.get(s)}),r},uj=e=>e.isThemeGetter,pj=(e,a)=>a?e.map(([r,s])=>{const l=s.map(d=>typeof d=="string"?a+d:typeof d=="object"?Object.fromEntries(Object.entries(d).map(([u,m])=>[a+u,m])):d);return[r,l]}):e,mj=e=>{if(e<1)return{get:()=>{},set:()=>{}};let a=0,r=new Map,s=new Map;const l=(d,u)=>{r.set(d,u),a++,a>e&&(a=0,s=r,r=new Map)};return{get(d){let u=r.get(d);if(u!==void 0)return u;if((u=s.get(d))!==void 0)return l(d,u),u},set(d,u){r.has(d)?r.set(d,u):l(d,u)}}},qx="!",fj=e=>{const{separator:a,experimentalParseClassName:r}=e,s=a.length===1,l=a[0],d=a.length,u=m=>{const h=[];let g=0,b=0,v;for(let k=0;kb?v-b:void 0;return{modifiers:h,hasImportantModifier:T,baseClassName:C,maybePostfixModifierPosition:x}};return r?m=>r({className:m,parseClassName:u}):u},hj=e=>{if(e.length<=1)return e;const a=[];let r=[];return e.forEach(s=>{s[0]==="["?(a.push(...r.sort(),s),r=[]):r.push(s)}),a.push(...r.sort()),a},gj=e=>({cache:mj(e.cacheSize),parseClassName:fj(e),...lj(e)}),yj=/\s+/,bj=(e,a)=>{const{parseClassName:r,getClassGroupId:s,getConflictingClassGroupIds:l}=a,d=[],u=e.trim().split(yj);let m="";for(let h=u.length-1;h>=0;h-=1){const g=u[h],{modifiers:b,hasImportantModifier:v,baseClassName:S,maybePostfixModifierPosition:T}=r(g);let C=!!T,x=s(C?S.substring(0,T):S);if(!x){if(!C){m=g+(m.length>0?" "+m:m);continue}if(x=s(S),!x){m=g+(m.length>0?" "+m:m);continue}C=!1}const k=hj(b).join(":"),R=v?k+qx:k,j=R+x;if(d.includes(j))continue;d.push(j);const A=l(x,C);for(let M=0;M0?" "+m:m)}return m};function vj(){let e=0,a,r,s="";for(;e{if(typeof e=="string")return e;let a,r="";for(let s=0;sv(b),e());return r=gj(g),s=r.cache.get,l=r.cache.set,d=m,m(h)}function m(h){const g=s(h);if(g)return g;const b=bj(h,r);return l(h,b),b}return function(){return d(vj.apply(null,arguments))}}const Ve=e=>{const a=r=>r[e]||[];return a.isThemeGetter=!0,a},Kx=/^\[(?:([a-z-]+):)?(.+)\]$/i,wj=/^\d+\/\d+$/,Sj=new Set(["px","full","screen"]),Cj=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,kj=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Tj=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ej=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Rj=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ta=e=>Rr(e)||Sj.has(e)||wj.test(e),Za=e=>Zr(e,"length",Oj),Rr=e=>!!e&&!Number.isNaN(Number(e)),Ep=e=>Zr(e,"number",Rr),qs=e=>!!e&&Number.isInteger(Number(e)),jj=e=>e.endsWith("%")&&Rr(e.slice(0,-1)),ke=e=>Kx.test(e),Ba=e=>Cj.test(e),Aj=new Set(["length","size","percentage"]),Nj=e=>Zr(e,Aj,Ux),zj=e=>Zr(e,"position",Ux),Mj=new Set(["image","url"]),Dj=e=>Zr(e,Mj,Pj),_j=e=>Zr(e,"",Lj),Fs=()=>!0,Zr=(e,a,r)=>{const s=Kx.exec(e);return s?s[1]?typeof a=="string"?s[1]===a:a.has(s[1]):r(s[2]):!1},Oj=e=>kj.test(e)&&!Tj.test(e),Ux=()=>!1,Lj=e=>Ej.test(e),Pj=e=>Rj.test(e),Zj=()=>{const e=Ve("colors"),a=Ve("spacing"),r=Ve("blur"),s=Ve("brightness"),l=Ve("borderColor"),d=Ve("borderRadius"),u=Ve("borderSpacing"),m=Ve("borderWidth"),h=Ve("contrast"),g=Ve("grayscale"),b=Ve("hueRotate"),v=Ve("invert"),S=Ve("gap"),T=Ve("gradientColorStops"),C=Ve("gradientColorStopPositions"),x=Ve("inset"),k=Ve("margin"),R=Ve("opacity"),j=Ve("padding"),A=Ve("saturate"),M=Ve("scale"),q=Ve("sepia"),Z=Ve("skew"),B=Ve("space"),X=Ve("translate"),ae=()=>["auto","contain","none"],ne=()=>["auto","hidden","clip","visible","scroll"],te=()=>["auto",ke,a],J=()=>[ke,a],pe=()=>["",ta,Za],re=()=>["auto",Rr,ke],ue=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],O=()=>["solid","dashed","dotted","double","none"],H=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],G=()=>["start","end","center","between","around","evenly","stretch"],Y=()=>["","0",ke],se=()=>["auto","avoid","all","avoid-page","page","left","right","column"],N=()=>[Rr,ke];return{cacheSize:500,separator:":",theme:{colors:[Fs],spacing:[ta,Za],blur:["none","",Ba,ke],brightness:N(),borderColor:[e],borderRadius:["none","","full",Ba,ke],borderSpacing:J(),borderWidth:pe(),contrast:N(),grayscale:Y(),hueRotate:N(),invert:Y(),gap:J(),gradientColorStops:[e],gradientColorStopPositions:[jj,Za],inset:te(),margin:te(),opacity:N(),padding:J(),saturate:N(),scale:N(),sepia:Y(),skew:N(),space:J(),translate:J()},classGroups:{aspect:[{aspect:["auto","square","video",ke]}],container:["container"],columns:[{columns:[Ba]}],"break-after":[{"break-after":se()}],"break-before":[{"break-before":se()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ue(),ke]}],overflow:[{overflow:ne()}],"overflow-x":[{"overflow-x":ne()}],"overflow-y":[{"overflow-y":ne()}],overscroll:[{overscroll:ae()}],"overscroll-x":[{"overscroll-x":ae()}],"overscroll-y":[{"overscroll-y":ae()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[x]}],"inset-x":[{"inset-x":[x]}],"inset-y":[{"inset-y":[x]}],start:[{start:[x]}],end:[{end:[x]}],top:[{top:[x]}],right:[{right:[x]}],bottom:[{bottom:[x]}],left:[{left:[x]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",qs,ke]}],basis:[{basis:te()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",ke]}],grow:[{grow:Y()}],shrink:[{shrink:Y()}],order:[{order:["first","last","none",qs,ke]}],"grid-cols":[{"grid-cols":[Fs]}],"col-start-end":[{col:["auto",{span:["full",qs,ke]},ke]}],"col-start":[{"col-start":re()}],"col-end":[{"col-end":re()}],"grid-rows":[{"grid-rows":[Fs]}],"row-start-end":[{row:["auto",{span:[qs,ke]},ke]}],"row-start":[{"row-start":re()}],"row-end":[{"row-end":re()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",ke]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",ke]}],gap:[{gap:[S]}],"gap-x":[{"gap-x":[S]}],"gap-y":[{"gap-y":[S]}],"justify-content":[{justify:["normal",...G()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...G(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...G(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[j]}],px:[{px:[j]}],py:[{py:[j]}],ps:[{ps:[j]}],pe:[{pe:[j]}],pt:[{pt:[j]}],pr:[{pr:[j]}],pb:[{pb:[j]}],pl:[{pl:[j]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],"space-x":[{"space-x":[B]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[B]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",ke,a]}],"min-w":[{"min-w":[ke,a,"min","max","fit"]}],"max-w":[{"max-w":[ke,a,"none","full","min","max","fit","prose",{screen:[Ba]},Ba]}],h:[{h:[ke,a,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[ke,a,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[ke,a,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[ke,a,"auto","min","max","fit"]}],"font-size":[{text:["base",Ba,Za]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Ep]}],"font-family":[{font:[Fs]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",ke]}],"line-clamp":[{"line-clamp":["none",Rr,Ep]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ta,ke]}],"list-image":[{"list-image":["none",ke]}],"list-style-type":[{list:["none","disc","decimal",ke]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[R]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[R]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...O(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ta,Za]}],"underline-offset":[{"underline-offset":["auto",ta,ke]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:J()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ke]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",ke]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[R]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ue(),zj]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Nj]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Dj]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[C]}],"gradient-via-pos":[{via:[C]}],"gradient-to-pos":[{to:[C]}],"gradient-from":[{from:[T]}],"gradient-via":[{via:[T]}],"gradient-to":[{to:[T]}],rounded:[{rounded:[d]}],"rounded-s":[{"rounded-s":[d]}],"rounded-e":[{"rounded-e":[d]}],"rounded-t":[{"rounded-t":[d]}],"rounded-r":[{"rounded-r":[d]}],"rounded-b":[{"rounded-b":[d]}],"rounded-l":[{"rounded-l":[d]}],"rounded-ss":[{"rounded-ss":[d]}],"rounded-se":[{"rounded-se":[d]}],"rounded-ee":[{"rounded-ee":[d]}],"rounded-es":[{"rounded-es":[d]}],"rounded-tl":[{"rounded-tl":[d]}],"rounded-tr":[{"rounded-tr":[d]}],"rounded-br":[{"rounded-br":[d]}],"rounded-bl":[{"rounded-bl":[d]}],"border-w":[{border:[m]}],"border-w-x":[{"border-x":[m]}],"border-w-y":[{"border-y":[m]}],"border-w-s":[{"border-s":[m]}],"border-w-e":[{"border-e":[m]}],"border-w-t":[{"border-t":[m]}],"border-w-r":[{"border-r":[m]}],"border-w-b":[{"border-b":[m]}],"border-w-l":[{"border-l":[m]}],"border-opacity":[{"border-opacity":[R]}],"border-style":[{border:[...O(),"hidden"]}],"divide-x":[{"divide-x":[m]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[m]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[R]}],"divide-style":[{divide:O()}],"border-color":[{border:[l]}],"border-color-x":[{"border-x":[l]}],"border-color-y":[{"border-y":[l]}],"border-color-s":[{"border-s":[l]}],"border-color-e":[{"border-e":[l]}],"border-color-t":[{"border-t":[l]}],"border-color-r":[{"border-r":[l]}],"border-color-b":[{"border-b":[l]}],"border-color-l":[{"border-l":[l]}],"divide-color":[{divide:[l]}],"outline-style":[{outline:["",...O()]}],"outline-offset":[{"outline-offset":[ta,ke]}],"outline-w":[{outline:[ta,Za]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[R]}],"ring-offset-w":[{"ring-offset":[ta,Za]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Ba,_j]}],"shadow-color":[{shadow:[Fs]}],opacity:[{opacity:[R]}],"mix-blend":[{"mix-blend":[...H(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":H()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[s]}],contrast:[{contrast:[h]}],"drop-shadow":[{"drop-shadow":["","none",Ba,ke]}],grayscale:[{grayscale:[g]}],"hue-rotate":[{"hue-rotate":[b]}],invert:[{invert:[v]}],saturate:[{saturate:[A]}],sepia:[{sepia:[q]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[s]}],"backdrop-contrast":[{"backdrop-contrast":[h]}],"backdrop-grayscale":[{"backdrop-grayscale":[g]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[b]}],"backdrop-invert":[{"backdrop-invert":[v]}],"backdrop-opacity":[{"backdrop-opacity":[R]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[q]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[u]}],"border-spacing-x":[{"border-spacing-x":[u]}],"border-spacing-y":[{"border-spacing-y":[u]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",ke]}],duration:[{duration:N()}],ease:[{ease:["linear","in","out","in-out",ke]}],delay:[{delay:N()}],animate:[{animate:["none","spin","ping","pulse","bounce",ke]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[M]}],"scale-x":[{"scale-x":[M]}],"scale-y":[{"scale-y":[M]}],rotate:[{rotate:[qs,ke]}],"translate-x":[{"translate-x":[X]}],"translate-y":[{"translate-y":[X]}],"skew-x":[{"skew-x":[Z]}],"skew-y":[{"skew-y":[Z]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",ke]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",ke]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":J()}],"scroll-mx":[{"scroll-mx":J()}],"scroll-my":[{"scroll-my":J()}],"scroll-ms":[{"scroll-ms":J()}],"scroll-me":[{"scroll-me":J()}],"scroll-mt":[{"scroll-mt":J()}],"scroll-mr":[{"scroll-mr":J()}],"scroll-mb":[{"scroll-mb":J()}],"scroll-ml":[{"scroll-ml":J()}],"scroll-p":[{"scroll-p":J()}],"scroll-px":[{"scroll-px":J()}],"scroll-py":[{"scroll-py":J()}],"scroll-ps":[{"scroll-ps":J()}],"scroll-pe":[{"scroll-pe":J()}],"scroll-pt":[{"scroll-pt":J()}],"scroll-pr":[{"scroll-pr":J()}],"scroll-pb":[{"scroll-pb":J()}],"scroll-pl":[{"scroll-pl":J()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",ke]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ta,Za,Ep]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Bj=xj(Zj);function ie(...e){return Bj(yc(e))}const Ij=bc("inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),it=y.forwardRef(({className:e,variant:a,size:r,asChild:s=!1,...l},d)=>{const u=s?oj:"button";return c.jsx(u,{className:ie(Ij({variant:a,size:r,className:e})),ref:d,...l})});it.displayName="Button";function ce(e,a,{checkForDefaultPrevented:r=!0}={}){return function(l){if(e==null||e(l),r===!1||!l.defaultPrevented)return a==null?void 0:a(l)}}function qj(e,a){const r=y.createContext(a),s=d=>{const{children:u,...m}=d,h=y.useMemo(()=>m,Object.values(m));return c.jsx(r.Provider,{value:h,children:u})};s.displayName=e+"Provider";function l(d){const u=y.useContext(r);if(u)return u;if(a!==void 0)return a;throw new Error(`\`${d}\` must be used within \`${e}\``)}return[s,l]}function Vt(e,a=[]){let r=[];function s(d,u){const m=y.createContext(u),h=r.length;r=[...r,u];const g=v=>{var R;const{scope:S,children:T,...C}=v,x=((R=S==null?void 0:S[e])==null?void 0:R[h])||m,k=y.useMemo(()=>C,Object.values(C));return c.jsx(x.Provider,{value:k,children:T})};g.displayName=d+"Provider";function b(v,S){var x;const T=((x=S==null?void 0:S[e])==null?void 0:x[h])||m,C=y.useContext(T);if(C)return C;if(u!==void 0)return u;throw new Error(`\`${v}\` must be used within \`${d}\``)}return[g,b]}const l=()=>{const d=r.map(u=>y.createContext(u));return function(m){const h=(m==null?void 0:m[e])||d;return y.useMemo(()=>({[`__scope${e}`]:{...m,[e]:h}}),[m,h])}};return l.scopeName=e,[s,Fj(l,...a)]}function Fj(...e){const a=e[0];if(e.length===1)return a;const r=()=>{const s=e.map(l=>({useScope:l(),scopeName:l.scopeName}));return function(d){const u=s.reduce((m,{useScope:h,scopeName:g})=>{const v=h(d)[`__scope${g}`];return{...m,...v}},{});return y.useMemo(()=>({[`__scope${a.scopeName}`]:u}),[u])}};return r.scopeName=a.scopeName,r}var ra=globalThis!=null&&globalThis.document?y.useLayoutEffect:()=>{},Kj=mc[" useId ".trim().toString()]||(()=>{}),Uj=0;function fo(e){const[a,r]=y.useState(Kj());return ra(()=>{r(s=>s??String(Uj++))},[e]),a?`radix-${a}`:""}var Hj=mc[" useInsertionEffect ".trim().toString()]||ra;function yo({prop:e,defaultProp:a,onChange:r=()=>{},caller:s}){const[l,d,u]=Gj({defaultProp:a,onChange:r}),m=e!==void 0,h=m?e:l;{const b=y.useRef(e!==void 0);y.useEffect(()=>{const v=b.current;v!==m&&console.warn(`${s} is changing from ${v?"controlled":"uncontrolled"} to ${m?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),b.current=m},[m,s])}const g=y.useCallback(b=>{var v;if(m){const S=Vj(b)?b(e):b;S!==e&&((v=u.current)==null||v.call(u,S))}else d(b)},[m,e,d,u]);return[h,g]}function Gj({defaultProp:e,onChange:a}){const[r,s]=y.useState(e),l=y.useRef(r),d=y.useRef(a);return Hj(()=>{d.current=a},[a]),y.useEffect(()=>{var u;l.current!==r&&((u=d.current)==null||u.call(d,r),l.current=r)},[r,l]),[r,s,d]}function Vj(e){return typeof e=="function"}function Dr(e){const a=Wj(e),r=y.forwardRef((s,l)=>{const{children:d,...u}=s,m=y.Children.toArray(d),h=m.find(Yj);if(h){const g=h.props.children,b=m.map(v=>v===h?y.Children.count(g)>1?y.Children.only(null):y.isValidElement(g)?g.props.children:null:v);return c.jsx(a,{...u,ref:l,children:y.isValidElement(g)?y.cloneElement(g,void 0,b):null})}return c.jsx(a,{...u,ref:l,children:d})});return r.displayName=`${e}.Slot`,r}function Wj(e){const a=y.forwardRef((r,s)=>{const{children:l,...d}=r;if(y.isValidElement(l)){const u=Qj(l),m=Xj(d,l.props);return l.type!==y.Fragment&&(m.ref=s?oi(s,u):u),y.cloneElement(l,m)}return y.Children.count(l)>1?y.Children.only(null):null});return a.displayName=`${e}.SlotClone`,a}var Hx=Symbol("radix.slottable");function $j(e){const a=({children:r})=>c.jsx(c.Fragment,{children:r});return a.displayName=`${e}.Slottable`,a.__radixId=Hx,a}function Yj(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Hx}function Xj(e,a){const r={...a};for(const s in a){const l=e[s],d=a[s];/^on[A-Z]/.test(s)?l&&d?r[s]=(...m)=>{const h=d(...m);return l(...m),h}:l&&(r[s]=l):s==="style"?r[s]={...l,...d}:s==="className"&&(r[s]=[l,d].filter(Boolean).join(" "))}return{...e,...r}}function Qj(e){var s,l;let a=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,r=a&&"isReactWarning"in a&&a.isReactWarning;return r?e.ref:(a=(l=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:l.get,r=a&&"isReactWarning"in a&&a.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}var Jj=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Te=Jj.reduce((e,a)=>{const r=Dr(`Primitive.${a}`),s=y.forwardRef((l,d)=>{const{asChild:u,...m}=l,h=u?r:a;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),c.jsx(h,{...m,ref:d})});return s.displayName=`Primitive.${a}`,{...e,[a]:s}},{});function Gx(e,a){e&&Em.flushSync(()=>e.dispatchEvent(a))}function sa(e){const a=y.useRef(e);return y.useEffect(()=>{a.current=e}),y.useMemo(()=>(...r)=>{var s;return(s=a.current)==null?void 0:s.call(a,...r)},[])}function eA(e,a=globalThis==null?void 0:globalThis.document){const r=sa(e);y.useEffect(()=>{const s=l=>{l.key==="Escape"&&r(l)};return a.addEventListener("keydown",s,{capture:!0}),()=>a.removeEventListener("keydown",s,{capture:!0})},[r,a])}var tA="DismissableLayer",om="dismissableLayer.update",oA="dismissableLayer.pointerDownOutside",aA="dismissableLayer.focusOutside",tv,Vx=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),ai=y.forwardRef((e,a)=>{const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:s,onPointerDownOutside:l,onFocusOutside:d,onInteractOutside:u,onDismiss:m,...h}=e,g=y.useContext(Vx),[b,v]=y.useState(null),S=(b==null?void 0:b.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,T]=y.useState({}),C=Pe(a,B=>v(B)),x=Array.from(g.layers),[k]=[...g.layersWithOutsidePointerEventsDisabled].slice(-1),R=x.indexOf(k),j=b?x.indexOf(b):-1,A=g.layersWithOutsidePointerEventsDisabled.size>0,M=j>=R,q=sA(B=>{const X=B.target,ae=[...g.branches].some(ne=>ne.contains(X));!M||ae||(l==null||l(B),u==null||u(B),B.defaultPrevented||m==null||m())},S),Z=iA(B=>{const X=B.target;[...g.branches].some(ne=>ne.contains(X))||(d==null||d(B),u==null||u(B),B.defaultPrevented||m==null||m())},S);return eA(B=>{j===g.layers.size-1&&(s==null||s(B),!B.defaultPrevented&&m&&(B.preventDefault(),m()))},S),y.useEffect(()=>{if(b)return r&&(g.layersWithOutsidePointerEventsDisabled.size===0&&(tv=S.body.style.pointerEvents,S.body.style.pointerEvents="none"),g.layersWithOutsidePointerEventsDisabled.add(b)),g.layers.add(b),ov(),()=>{r&&g.layersWithOutsidePointerEventsDisabled.size===1&&(S.body.style.pointerEvents=tv)}},[b,S,r,g]),y.useEffect(()=>()=>{b&&(g.layers.delete(b),g.layersWithOutsidePointerEventsDisabled.delete(b),ov())},[b,g]),y.useEffect(()=>{const B=()=>T({});return document.addEventListener(om,B),()=>document.removeEventListener(om,B)},[]),c.jsx(Te.div,{...h,ref:C,style:{pointerEvents:A?M?"auto":"none":void 0,...e.style},onFocusCapture:ce(e.onFocusCapture,Z.onFocusCapture),onBlurCapture:ce(e.onBlurCapture,Z.onBlurCapture),onPointerDownCapture:ce(e.onPointerDownCapture,q.onPointerDownCapture)})});ai.displayName=tA;var nA="DismissableLayerBranch",rA=y.forwardRef((e,a)=>{const r=y.useContext(Vx),s=y.useRef(null),l=Pe(a,s);return y.useEffect(()=>{const d=s.current;if(d)return r.branches.add(d),()=>{r.branches.delete(d)}},[r.branches]),c.jsx(Te.div,{...e,ref:l})});rA.displayName=nA;function sA(e,a=globalThis==null?void 0:globalThis.document){const r=sa(e),s=y.useRef(!1),l=y.useRef(()=>{});return y.useEffect(()=>{const d=m=>{if(m.target&&!s.current){let h=function(){Wx(oA,r,g,{discrete:!0})};const g={originalEvent:m};m.pointerType==="touch"?(a.removeEventListener("click",l.current),l.current=h,a.addEventListener("click",l.current,{once:!0})):h()}else a.removeEventListener("click",l.current);s.current=!1},u=window.setTimeout(()=>{a.addEventListener("pointerdown",d)},0);return()=>{window.clearTimeout(u),a.removeEventListener("pointerdown",d),a.removeEventListener("click",l.current)}},[a,r]),{onPointerDownCapture:()=>s.current=!0}}function iA(e,a=globalThis==null?void 0:globalThis.document){const r=sa(e),s=y.useRef(!1);return y.useEffect(()=>{const l=d=>{d.target&&!s.current&&Wx(aA,r,{originalEvent:d},{discrete:!1})};return a.addEventListener("focusin",l),()=>a.removeEventListener("focusin",l)},[a,r]),{onFocusCapture:()=>s.current=!0,onBlurCapture:()=>s.current=!1}}function ov(){const e=new CustomEvent(om);document.dispatchEvent(e)}function Wx(e,a,r,{discrete:s}){const l=r.originalEvent.target,d=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});a&&l.addEventListener(e,a,{once:!0}),s?Gx(l,d):l.dispatchEvent(d)}var Rp="focusScope.autoFocusOnMount",jp="focusScope.autoFocusOnUnmount",av={bubbles:!1,cancelable:!0},lA="FocusScope",vc=y.forwardRef((e,a)=>{const{loop:r=!1,trapped:s=!1,onMountAutoFocus:l,onUnmountAutoFocus:d,...u}=e,[m,h]=y.useState(null),g=sa(l),b=sa(d),v=y.useRef(null),S=Pe(a,x=>h(x)),T=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(s){let x=function(A){if(T.paused||!m)return;const M=A.target;m.contains(M)?v.current=M:Ia(v.current,{select:!0})},k=function(A){if(T.paused||!m)return;const M=A.relatedTarget;M!==null&&(m.contains(M)||Ia(v.current,{select:!0}))},R=function(A){if(document.activeElement===document.body)for(const q of A)q.removedNodes.length>0&&Ia(m)};document.addEventListener("focusin",x),document.addEventListener("focusout",k);const j=new MutationObserver(R);return m&&j.observe(m,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",x),document.removeEventListener("focusout",k),j.disconnect()}}},[s,m,T.paused]),y.useEffect(()=>{if(m){rv.add(T);const x=document.activeElement;if(!m.contains(x)){const R=new CustomEvent(Rp,av);m.addEventListener(Rp,g),m.dispatchEvent(R),R.defaultPrevented||(cA(fA($x(m)),{select:!0}),document.activeElement===x&&Ia(m))}return()=>{m.removeEventListener(Rp,g),setTimeout(()=>{const R=new CustomEvent(jp,av);m.addEventListener(jp,b),m.dispatchEvent(R),R.defaultPrevented||Ia(x??document.body,{select:!0}),m.removeEventListener(jp,b),rv.remove(T)},0)}}},[m,g,b,T]);const C=y.useCallback(x=>{if(!r&&!s||T.paused)return;const k=x.key==="Tab"&&!x.altKey&&!x.ctrlKey&&!x.metaKey,R=document.activeElement;if(k&&R){const j=x.currentTarget,[A,M]=dA(j);A&&M?!x.shiftKey&&R===M?(x.preventDefault(),r&&Ia(A,{select:!0})):x.shiftKey&&R===A&&(x.preventDefault(),r&&Ia(M,{select:!0})):R===j&&x.preventDefault()}},[r,s,T.paused]);return c.jsx(Te.div,{tabIndex:-1,...u,ref:S,onKeyDown:C})});vc.displayName=lA;function cA(e,{select:a=!1}={}){const r=document.activeElement;for(const s of e)if(Ia(s,{select:a}),document.activeElement!==r)return}function dA(e){const a=$x(e),r=nv(a,e),s=nv(a.reverse(),e);return[r,s]}function $x(e){const a=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>{const l=s.tagName==="INPUT"&&s.type==="hidden";return s.disabled||s.hidden||l?NodeFilter.FILTER_SKIP:s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)a.push(r.currentNode);return a}function nv(e,a){for(const r of e)if(!uA(r,{upTo:a}))return r}function uA(e,{upTo:a}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(a!==void 0&&e===a)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function pA(e){return e instanceof HTMLInputElement&&"select"in e}function Ia(e,{select:a=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&pA(e)&&a&&e.select()}}var rv=mA();function mA(){let e=[];return{add(a){const r=e[0];a!==r&&(r==null||r.pause()),e=sv(e,a),e.unshift(a)},remove(a){var r;e=sv(e,a),(r=e[0])==null||r.resume()}}}function sv(e,a){const r=[...e],s=r.indexOf(a);return s!==-1&&r.splice(s,1),r}function fA(e){return e.filter(a=>a.tagName!=="A")}var hA="Portal",ni=y.forwardRef((e,a)=>{var m;const{container:r,...s}=e,[l,d]=y.useState(!1);ra(()=>d(!0),[]);const u=r||l&&((m=globalThis==null?void 0:globalThis.document)==null?void 0:m.body);return u?Rm.createPortal(c.jsx(Te.div,{...s,ref:a}),u):null});ni.displayName=hA;function gA(e,a){return y.useReducer((r,s)=>a[r][s]??r,e)}var Mt=e=>{const{present:a,children:r}=e,s=yA(a),l=typeof r=="function"?r({present:s.isPresent}):y.Children.only(r),d=Pe(s.ref,bA(l));return typeof r=="function"||s.isPresent?y.cloneElement(l,{ref:d}):null};Mt.displayName="Presence";function yA(e){const[a,r]=y.useState(),s=y.useRef(null),l=y.useRef(e),d=y.useRef("none"),u=e?"mounted":"unmounted",[m,h]=gA(u,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const g=_l(s.current);d.current=m==="mounted"?g:"none"},[m]),ra(()=>{const g=s.current,b=l.current;if(b!==e){const S=d.current,T=_l(g);e?h("MOUNT"):T==="none"||(g==null?void 0:g.display)==="none"?h("UNMOUNT"):h(b&&S!==T?"ANIMATION_OUT":"UNMOUNT"),l.current=e}},[e,h]),ra(()=>{if(a){let g;const b=a.ownerDocument.defaultView??window,v=T=>{const x=_l(s.current).includes(CSS.escape(T.animationName));if(T.target===a&&x&&(h("ANIMATION_END"),!l.current)){const k=a.style.animationFillMode;a.style.animationFillMode="forwards",g=b.setTimeout(()=>{a.style.animationFillMode==="forwards"&&(a.style.animationFillMode=k)})}},S=T=>{T.target===a&&(d.current=_l(s.current))};return a.addEventListener("animationstart",S),a.addEventListener("animationcancel",v),a.addEventListener("animationend",v),()=>{b.clearTimeout(g),a.removeEventListener("animationstart",S),a.removeEventListener("animationcancel",v),a.removeEventListener("animationend",v)}}else h("ANIMATION_END")},[a,h]),{isPresent:["mounted","unmountSuspended"].includes(m),ref:y.useCallback(g=>{s.current=g?getComputedStyle(g):null,r(g)},[])}}function _l(e){return(e==null?void 0:e.animationName)||"none"}function bA(e){var s,l;let a=(s=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:s.get,r=a&&"isReactWarning"in a&&a.isReactWarning;return r?e.ref:(a=(l=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:l.get,r=a&&"isReactWarning"in a&&a.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}var Ap=0;function Mm(){y.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??iv()),document.body.insertAdjacentElement("beforeend",e[1]??iv()),Ap++,()=>{Ap===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(a=>a.remove()),Ap--}},[])}function iv(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var jo=function(){return jo=Object.assign||function(a){for(var r,s=1,l=arguments.length;s"u")return OA;var a=LA(e),r=document.documentElement.clientWidth,s=window.innerWidth;return{left:a[0],top:a[1],right:a[2],gap:Math.max(0,s-r+a[2]-a[0])}},ZA=Jx(),jr="data-scroll-locked",BA=function(e,a,r,s){var l=e.left,d=e.top,u=e.right,m=e.gap;return r===void 0&&(r="margin"),` + .`.concat(xA,` { + overflow: hidden `).concat(s,`; + padding-right: `).concat(m,"px ").concat(s,`; + } + body[`).concat(jr,`] { + overflow: hidden `).concat(s,`; + overscroll-behavior: contain; + `).concat([a&&"position: relative ".concat(s,";"),r==="margin"&&` + padding-left: `.concat(l,`px; + padding-top: `).concat(d,`px; + padding-right: `).concat(u,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(m,"px ").concat(s,`; + `),r==="padding"&&"padding-right: ".concat(m,"px ").concat(s,";")].filter(Boolean).join(""),` + } + + .`).concat(Vl,` { + right: `).concat(m,"px ").concat(s,`; + } + + .`).concat(Wl,` { + margin-right: `).concat(m,"px ").concat(s,`; + } + + .`).concat(Vl," .").concat(Vl,` { + right: 0 `).concat(s,`; + } + + .`).concat(Wl," .").concat(Wl,` { + margin-right: 0 `).concat(s,`; + } + + body[`).concat(jr,`] { + `).concat(wA,": ").concat(m,`px; + } +`)},cv=function(){var e=parseInt(document.body.getAttribute(jr)||"0",10);return isFinite(e)?e:0},IA=function(){y.useEffect(function(){return document.body.setAttribute(jr,(cv()+1).toString()),function(){var e=cv()-1;e<=0?document.body.removeAttribute(jr):document.body.setAttribute(jr,e.toString())}},[])},qA=function(e){var a=e.noRelative,r=e.noImportant,s=e.gapMode,l=s===void 0?"margin":s;IA();var d=y.useMemo(function(){return PA(l)},[l]);return y.createElement(ZA,{styles:BA(d,!a,l,r?"":"!important")})},am=!1;if(typeof window<"u")try{var Ol=Object.defineProperty({},"passive",{get:function(){return am=!0,!0}});window.addEventListener("test",Ol,Ol),window.removeEventListener("test",Ol,Ol)}catch{am=!1}var gr=am?{passive:!1}:!1,FA=function(e){return e.tagName==="TEXTAREA"},ew=function(e,a){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[a]!=="hidden"&&!(r.overflowY===r.overflowX&&!FA(e)&&r[a]==="visible")},KA=function(e){return ew(e,"overflowY")},UA=function(e){return ew(e,"overflowX")},dv=function(e,a){var r=a.ownerDocument,s=a;do{typeof ShadowRoot<"u"&&s instanceof ShadowRoot&&(s=s.host);var l=tw(e,s);if(l){var d=ow(e,s),u=d[1],m=d[2];if(u>m)return!0}s=s.parentNode}while(s&&s!==r.body);return!1},HA=function(e){var a=e.scrollTop,r=e.scrollHeight,s=e.clientHeight;return[a,r,s]},GA=function(e){var a=e.scrollLeft,r=e.scrollWidth,s=e.clientWidth;return[a,r,s]},tw=function(e,a){return e==="v"?KA(a):UA(a)},ow=function(e,a){return e==="v"?HA(a):GA(a)},VA=function(e,a){return e==="h"&&a==="rtl"?-1:1},WA=function(e,a,r,s,l){var d=VA(e,window.getComputedStyle(a).direction),u=d*s,m=r.target,h=a.contains(m),g=!1,b=u>0,v=0,S=0;do{if(!m)break;var T=ow(e,m),C=T[0],x=T[1],k=T[2],R=x-k-d*C;(C||R)&&tw(e,m)&&(v+=R,S+=C);var j=m.parentNode;m=j&&j.nodeType===Node.DOCUMENT_FRAGMENT_NODE?j.host:j}while(!h&&m!==document.body||h&&(a.contains(m)||a===m));return(b&&Math.abs(v)<1||!b&&Math.abs(S)<1)&&(g=!0),g},Ll=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},uv=function(e){return[e.deltaX,e.deltaY]},pv=function(e){return e&&"current"in e?e.current:e},$A=function(e,a){return e[0]===a[0]&&e[1]===a[1]},YA=function(e){return` + .block-interactivity-`.concat(e,` {pointer-events: none;} + .allow-interactivity-`).concat(e,` {pointer-events: all;} +`)},XA=0,yr=[];function QA(e){var a=y.useRef([]),r=y.useRef([0,0]),s=y.useRef(),l=y.useState(XA++)[0],d=y.useState(Jx)[0],u=y.useRef(e);y.useEffect(function(){u.current=e},[e]),y.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(l));var x=vA([e.lockRef.current],(e.shards||[]).map(pv),!0).filter(Boolean);return x.forEach(function(k){return k.classList.add("allow-interactivity-".concat(l))}),function(){document.body.classList.remove("block-interactivity-".concat(l)),x.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(l))})}}},[e.inert,e.lockRef.current,e.shards]);var m=y.useCallback(function(x,k){if("touches"in x&&x.touches.length===2||x.type==="wheel"&&x.ctrlKey)return!u.current.allowPinchZoom;var R=Ll(x),j=r.current,A="deltaX"in x?x.deltaX:j[0]-R[0],M="deltaY"in x?x.deltaY:j[1]-R[1],q,Z=x.target,B=Math.abs(A)>Math.abs(M)?"h":"v";if("touches"in x&&B==="h"&&Z.type==="range")return!1;var X=window.getSelection(),ae=X&&X.anchorNode,ne=ae?ae===Z||ae.contains(Z):!1;if(ne)return!1;var te=dv(B,Z);if(!te)return!0;if(te?q=B:(q=B==="v"?"h":"v",te=dv(B,Z)),!te)return!1;if(!s.current&&"changedTouches"in x&&(A||M)&&(s.current=q),!q)return!0;var J=s.current||q;return WA(J,k,x,J==="h"?A:M)},[]),h=y.useCallback(function(x){var k=x;if(!(!yr.length||yr[yr.length-1]!==d)){var R="deltaY"in k?uv(k):Ll(k),j=a.current.filter(function(q){return q.name===k.type&&(q.target===k.target||k.target===q.shadowParent)&&$A(q.delta,R)})[0];if(j&&j.should){k.cancelable&&k.preventDefault();return}if(!j){var A=(u.current.shards||[]).map(pv).filter(Boolean).filter(function(q){return q.contains(k.target)}),M=A.length>0?m(k,A[0]):!u.current.noIsolation;M&&k.cancelable&&k.preventDefault()}}},[]),g=y.useCallback(function(x,k,R,j){var A={name:x,delta:k,target:R,should:j,shadowParent:JA(R)};a.current.push(A),setTimeout(function(){a.current=a.current.filter(function(M){return M!==A})},1)},[]),b=y.useCallback(function(x){r.current=Ll(x),s.current=void 0},[]),v=y.useCallback(function(x){g(x.type,uv(x),x.target,m(x,e.lockRef.current))},[]),S=y.useCallback(function(x){g(x.type,Ll(x),x.target,m(x,e.lockRef.current))},[]);y.useEffect(function(){return yr.push(d),e.setCallbacks({onScrollCapture:v,onWheelCapture:v,onTouchMoveCapture:S}),document.addEventListener("wheel",h,gr),document.addEventListener("touchmove",h,gr),document.addEventListener("touchstart",b,gr),function(){yr=yr.filter(function(x){return x!==d}),document.removeEventListener("wheel",h,gr),document.removeEventListener("touchmove",h,gr),document.removeEventListener("touchstart",b,gr)}},[]);var T=e.removeScrollBar,C=e.inert;return y.createElement(y.Fragment,null,C?y.createElement(d,{styles:YA(l)}):null,T?y.createElement(qA,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function JA(e){for(var a=null;e!==null;)e instanceof ShadowRoot&&(a=e.host,e=e.host),e=e.parentNode;return a}const eN=jA(Qx,QA);var wc=y.forwardRef(function(e,a){return y.createElement(xc,jo({},e,{ref:a,sideCar:eN}))});wc.classNames=xc.classNames;var tN=function(e){if(typeof document>"u")return null;var a=Array.isArray(e)?e[0]:e;return a.ownerDocument.body},br=new WeakMap,Pl=new WeakMap,Zl={},Dp=0,aw=function(e){return e&&(e.host||aw(e.parentNode))},oN=function(e,a){return a.map(function(r){if(e.contains(r))return r;var s=aw(r);return s&&e.contains(s)?s:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},aN=function(e,a,r,s){var l=oN(a,Array.isArray(e)?e:[e]);Zl[r]||(Zl[r]=new WeakMap);var d=Zl[r],u=[],m=new Set,h=new Set(l),g=function(v){!v||m.has(v)||(m.add(v),g(v.parentNode))};l.forEach(g);var b=function(v){!v||h.has(v)||Array.prototype.forEach.call(v.children,function(S){if(m.has(S))b(S);else try{var T=S.getAttribute(s),C=T!==null&&T!=="false",x=(br.get(S)||0)+1,k=(d.get(S)||0)+1;br.set(S,x),d.set(S,k),u.push(S),x===1&&C&&Pl.set(S,!0),k===1&&S.setAttribute(r,"true"),C||S.setAttribute(s,"true")}catch(R){console.error("aria-hidden: cannot operate on ",S,R)}})};return b(a),m.clear(),Dp++,function(){u.forEach(function(v){var S=br.get(v)-1,T=d.get(v)-1;br.set(v,S),d.set(v,T),S||(Pl.has(v)||v.removeAttribute(s),Pl.delete(v)),T||v.removeAttribute(r)}),Dp--,Dp||(br=new WeakMap,br=new WeakMap,Pl=new WeakMap,Zl={})}},Dm=function(e,a,r){r===void 0&&(r="data-aria-hidden");var s=Array.from(Array.isArray(e)?e:[e]),l=tN(e);return l?(s.push.apply(s,Array.from(l.querySelectorAll("[aria-live], script"))),aN(s,l,r,"aria-hidden")):function(){return null}},Sc="Dialog",[nw]=Vt(Sc),[nN,bo]=nw(Sc),rw=e=>{const{__scopeDialog:a,children:r,open:s,defaultOpen:l,onOpenChange:d,modal:u=!0}=e,m=y.useRef(null),h=y.useRef(null),[g,b]=yo({prop:s,defaultProp:l??!1,onChange:d,caller:Sc});return c.jsx(nN,{scope:a,triggerRef:m,contentRef:h,contentId:fo(),titleId:fo(),descriptionId:fo(),open:g,onOpenChange:b,onOpenToggle:y.useCallback(()=>b(v=>!v),[b]),modal:u,children:r})};rw.displayName=Sc;var sw="DialogTrigger",iw=y.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=bo(sw,r),d=Pe(a,l.triggerRef);return c.jsx(Te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":l.open,"aria-controls":l.contentId,"data-state":Lm(l.open),...s,ref:d,onClick:ce(e.onClick,l.onOpenToggle)})});iw.displayName=sw;var _m="DialogPortal",[rN,lw]=nw(_m,{forceMount:void 0}),cw=e=>{const{__scopeDialog:a,forceMount:r,children:s,container:l}=e,d=bo(_m,a);return c.jsx(rN,{scope:a,forceMount:r,children:y.Children.map(s,u=>c.jsx(Mt,{present:r||d.open,children:c.jsx(ni,{asChild:!0,container:l,children:u})}))})};cw.displayName=_m;var oc="DialogOverlay",dw=y.forwardRef((e,a)=>{const r=lw(oc,e.__scopeDialog),{forceMount:s=r.forceMount,...l}=e,d=bo(oc,e.__scopeDialog);return d.modal?c.jsx(Mt,{present:s||d.open,children:c.jsx(iN,{...l,ref:a})}):null});dw.displayName=oc;var sN=Dr("DialogOverlay.RemoveScroll"),iN=y.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=bo(oc,r);return c.jsx(wc,{as:sN,allowPinchZoom:!0,shards:[l.contentRef],children:c.jsx(Te.div,{"data-state":Lm(l.open),...s,ref:a,style:{pointerEvents:"auto",...s.style}})})}),Tn="DialogContent",uw=y.forwardRef((e,a)=>{const r=lw(Tn,e.__scopeDialog),{forceMount:s=r.forceMount,...l}=e,d=bo(Tn,e.__scopeDialog);return c.jsx(Mt,{present:s||d.open,children:d.modal?c.jsx(lN,{...l,ref:a}):c.jsx(cN,{...l,ref:a})})});uw.displayName=Tn;var lN=y.forwardRef((e,a)=>{const r=bo(Tn,e.__scopeDialog),s=y.useRef(null),l=Pe(a,r.contentRef,s);return y.useEffect(()=>{const d=s.current;if(d)return Dm(d)},[]),c.jsx(pw,{...e,ref:l,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ce(e.onCloseAutoFocus,d=>{var u;d.preventDefault(),(u=r.triggerRef.current)==null||u.focus()}),onPointerDownOutside:ce(e.onPointerDownOutside,d=>{const u=d.detail.originalEvent,m=u.button===0&&u.ctrlKey===!0;(u.button===2||m)&&d.preventDefault()}),onFocusOutside:ce(e.onFocusOutside,d=>d.preventDefault())})}),cN=y.forwardRef((e,a)=>{const r=bo(Tn,e.__scopeDialog),s=y.useRef(!1),l=y.useRef(!1);return c.jsx(pw,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{var u,m;(u=e.onCloseAutoFocus)==null||u.call(e,d),d.defaultPrevented||(s.current||(m=r.triggerRef.current)==null||m.focus(),d.preventDefault()),s.current=!1,l.current=!1},onInteractOutside:d=>{var h,g;(h=e.onInteractOutside)==null||h.call(e,d),d.defaultPrevented||(s.current=!0,d.detail.originalEvent.type==="pointerdown"&&(l.current=!0));const u=d.target;((g=r.triggerRef.current)==null?void 0:g.contains(u))&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&l.current&&d.preventDefault()}})}),pw=y.forwardRef((e,a)=>{const{__scopeDialog:r,trapFocus:s,onOpenAutoFocus:l,onCloseAutoFocus:d,...u}=e,m=bo(Tn,r),h=y.useRef(null),g=Pe(a,h);return Mm(),c.jsxs(c.Fragment,{children:[c.jsx(vc,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:l,onUnmountAutoFocus:d,children:c.jsx(ai,{role:"dialog",id:m.contentId,"aria-describedby":m.descriptionId,"aria-labelledby":m.titleId,"data-state":Lm(m.open),...u,ref:g,onDismiss:()=>m.onOpenChange(!1)})}),c.jsxs(c.Fragment,{children:[c.jsx(dN,{titleId:m.titleId}),c.jsx(pN,{contentRef:h,descriptionId:m.descriptionId})]})]})}),Om="DialogTitle",mw=y.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=bo(Om,r);return c.jsx(Te.h2,{id:l.titleId,...s,ref:a})});mw.displayName=Om;var fw="DialogDescription",hw=y.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=bo(fw,r);return c.jsx(Te.p,{id:l.descriptionId,...s,ref:a})});hw.displayName=fw;var gw="DialogClose",yw=y.forwardRef((e,a)=>{const{__scopeDialog:r,...s}=e,l=bo(gw,r);return c.jsx(Te.button,{type:"button",...s,ref:a,onClick:ce(e.onClick,()=>l.onOpenChange(!1))})});yw.displayName=gw;function Lm(e){return e?"open":"closed"}var bw="DialogTitleWarning",[gZ,vw]=qj(bw,{contentName:Tn,titleName:Om,docsSlug:"dialog"}),dN=({titleId:e})=>{const a=vw(bw),r=`\`${a.contentName}\` requires a \`${a.titleName}\` for the component to be accessible for screen reader users. + +If you want to hide the \`${a.titleName}\`, you can wrap it with our VisuallyHidden component. + +For more information, see https://radix-ui.com/primitives/docs/components/${a.docsSlug}`;return y.useEffect(()=>{e&&(document.getElementById(e)||console.error(r))},[r,e]),null},uN="DialogDescriptionWarning",pN=({contentRef:e,descriptionId:a})=>{const s=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${vw(uN).contentName}}.`;return y.useEffect(()=>{var d;const l=(d=e.current)==null?void 0:d.getAttribute("aria-describedby");a&&l&&(document.getElementById(a)||console.warn(s))},[s,e,a]),null},xw=rw,ww=iw,Sw=cw,Cc=dw,kc=uw,Tc=mw,Ec=hw,Cw=yw;const mN=xw,fN=ww,hN=Sw,kw=y.forwardRef(({className:e,...a},r)=>c.jsx(Cc,{className:ie("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a,ref:r}));kw.displayName=Cc.displayName;const gN=bc("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),Tw=y.forwardRef(({side:e="right",className:a,children:r,...s},l)=>c.jsxs(hN,{children:[c.jsx(kw,{}),c.jsxs(kc,{ref:l,className:ie(gN({side:e}),a),...s,children:[c.jsxs(Cw,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[c.jsx(Lx,{className:"h-4 w-4"}),c.jsx("span",{className:"sr-only",children:"Close"})]}),r]})]}));Tw.displayName=kc.displayName;const yN=y.forwardRef(({className:e,...a},r)=>c.jsx(Tc,{ref:r,className:ie("text-lg font-semibold text-foreground",e),...a}));yN.displayName=Tc.displayName;const bN=y.forwardRef(({className:e,...a},r)=>c.jsx(Ec,{ref:r,className:ie("text-sm text-muted-foreground",e),...a}));bN.displayName=Ec.displayName;var vN=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Ew=vN.reduce((e,a)=>{const r=Zx(`Primitive.${a}`),s=y.forwardRef((l,d)=>{const{asChild:u,...m}=l,h=u?r:a;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),c.jsx(h,{...m,ref:d})});return s.displayName=`Primitive.${a}`,{...e,[a]:s}},{}),xN="Separator",mv="horizontal",wN=["horizontal","vertical"],Rw=y.forwardRef((e,a)=>{const{decorative:r,orientation:s=mv,...l}=e,d=SN(s)?s:mv,m=r?{role:"none"}:{"aria-orientation":d==="vertical"?d:void 0,role:"separator"};return c.jsx(Ew.div,{"data-orientation":d,...m,...l,ref:a})});Rw.displayName=xN;function SN(e){return wN.includes(e)}var jw=Rw;const Aw=y.forwardRef(({className:e,orientation:a="horizontal",decorative:r=!0,...s},l)=>c.jsx(jw,{ref:l,decorative:r,orientation:a,className:ie("shrink-0 bg-border",a==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...s}));Aw.displayName=jw.displayName;function CN(){const{resolved:e,setTheme:a}=Am(),r=e==="dark"?FR:QR,s=e==="dark"?"light":"dark";return c.jsx(it,{variant:"ghost",size:"icon","aria-label":`Switch to ${s} theme`,onClick:()=>a(s),children:c.jsx(r,{className:"h-4 w-4"})})}function Rc(e){const a=e+"CollectionProvider",[r,s]=Vt(a),[l,d]=r(a,{collectionRef:{current:null},itemMap:new Map}),u=x=>{const{scope:k,children:R}=x,j=Q.useRef(null),A=Q.useRef(new Map).current;return c.jsx(l,{scope:k,itemMap:A,collectionRef:j,children:R})};u.displayName=a;const m=e+"CollectionSlot",h=Dr(m),g=Q.forwardRef((x,k)=>{const{scope:R,children:j}=x,A=d(m,R),M=Pe(k,A.collectionRef);return c.jsx(h,{ref:M,children:j})});g.displayName=m;const b=e+"CollectionItemSlot",v="data-radix-collection-item",S=Dr(b),T=Q.forwardRef((x,k)=>{const{scope:R,children:j,...A}=x,M=Q.useRef(null),q=Pe(k,M),Z=d(b,R);return Q.useEffect(()=>(Z.itemMap.set(M,{ref:M,...A}),()=>void Z.itemMap.delete(M))),c.jsx(S,{[v]:"",ref:q,children:j})});T.displayName=b;function C(x){const k=d(e+"CollectionConsumer",x);return Q.useCallback(()=>{const j=k.collectionRef.current;if(!j)return[];const A=Array.from(j.querySelectorAll(`[${v}]`));return Array.from(k.itemMap.values()).sort((Z,B)=>A.indexOf(Z.ref.current)-A.indexOf(B.ref.current))},[k.collectionRef,k.itemMap])}return[{Provider:u,Slot:g,ItemSlot:T},C,s]}var kN=y.createContext(void 0);function ri(e){const a=y.useContext(kN);return e||a||"ltr"}const TN=["top","right","bottom","left"],Ga=Math.min,Ht=Math.max,ac=Math.round,Bl=Math.floor,Mo=e=>({x:e,y:e}),EN={left:"right",right:"left",bottom:"top",top:"bottom"};function nm(e,a,r){return Ht(e,Ga(a,r))}function ia(e,a){return typeof e=="function"?e(a):e}function la(e){return e.split("-")[0]}function Br(e){return e.split("-")[1]}function Pm(e){return e==="x"?"y":"x"}function Zm(e){return e==="y"?"height":"width"}function Ao(e){const a=e[0];return a==="t"||a==="b"?"y":"x"}function Bm(e){return Pm(Ao(e))}function RN(e,a,r){r===void 0&&(r=!1);const s=Br(e),l=Bm(e),d=Zm(l);let u=l==="x"?s===(r?"end":"start")?"right":"left":s==="start"?"bottom":"top";return a.reference[d]>a.floating[d]&&(u=nc(u)),[u,nc(u)]}function jN(e){const a=nc(e);return[rm(e),a,rm(a)]}function rm(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const fv=["left","right"],hv=["right","left"],AN=["top","bottom"],NN=["bottom","top"];function zN(e,a,r){switch(e){case"top":case"bottom":return r?a?hv:fv:a?fv:hv;case"left":case"right":return a?AN:NN;default:return[]}}function MN(e,a,r,s){const l=Br(e);let d=zN(la(e),r==="start",s);return l&&(d=d.map(u=>u+"-"+l),a&&(d=d.concat(d.map(rm)))),d}function nc(e){const a=la(e);return EN[a]+e.slice(a.length)}function DN(e){return{top:0,right:0,bottom:0,left:0,...e}}function Nw(e){return typeof e!="number"?DN(e):{top:e,right:e,bottom:e,left:e}}function rc(e){const{x:a,y:r,width:s,height:l}=e;return{width:s,height:l,top:r,left:a,right:a+s,bottom:r+l,x:a,y:r}}function gv(e,a,r){let{reference:s,floating:l}=e;const d=Ao(a),u=Bm(a),m=Zm(u),h=la(a),g=d==="y",b=s.x+s.width/2-l.width/2,v=s.y+s.height/2-l.height/2,S=s[m]/2-l[m]/2;let T;switch(h){case"top":T={x:b,y:s.y-l.height};break;case"bottom":T={x:b,y:s.y+s.height};break;case"right":T={x:s.x+s.width,y:v};break;case"left":T={x:s.x-l.width,y:v};break;default:T={x:s.x,y:s.y}}switch(Br(a)){case"start":T[u]-=S*(r&&g?-1:1);break;case"end":T[u]+=S*(r&&g?-1:1);break}return T}async function _N(e,a){var r;a===void 0&&(a={});const{x:s,y:l,platform:d,rects:u,elements:m,strategy:h}=e,{boundary:g="clippingAncestors",rootBoundary:b="viewport",elementContext:v="floating",altBoundary:S=!1,padding:T=0}=ia(a,e),C=Nw(T),k=m[S?v==="floating"?"reference":"floating":v],R=rc(await d.getClippingRect({element:(r=await(d.isElement==null?void 0:d.isElement(k)))==null||r?k:k.contextElement||await(d.getDocumentElement==null?void 0:d.getDocumentElement(m.floating)),boundary:g,rootBoundary:b,strategy:h})),j=v==="floating"?{x:s,y:l,width:u.floating.width,height:u.floating.height}:u.reference,A=await(d.getOffsetParent==null?void 0:d.getOffsetParent(m.floating)),M=await(d.isElement==null?void 0:d.isElement(A))?await(d.getScale==null?void 0:d.getScale(A))||{x:1,y:1}:{x:1,y:1},q=rc(d.convertOffsetParentRelativeRectToViewportRelativeRect?await d.convertOffsetParentRelativeRectToViewportRelativeRect({elements:m,rect:j,offsetParent:A,strategy:h}):j);return{top:(R.top-q.top+C.top)/M.y,bottom:(q.bottom-R.bottom+C.bottom)/M.y,left:(R.left-q.left+C.left)/M.x,right:(q.right-R.right+C.right)/M.x}}const ON=50,LN=async(e,a,r)=>{const{placement:s="bottom",strategy:l="absolute",middleware:d=[],platform:u}=r,m=u.detectOverflow?u:{...u,detectOverflow:_N},h=await(u.isRTL==null?void 0:u.isRTL(a));let g=await u.getElementRects({reference:e,floating:a,strategy:l}),{x:b,y:v}=gv(g,s,h),S=s,T=0;const C={};for(let x=0;x({name:"arrow",options:e,async fn(a){const{x:r,y:s,placement:l,rects:d,platform:u,elements:m,middlewareData:h}=a,{element:g,padding:b=0}=ia(e,a)||{};if(g==null)return{};const v=Nw(b),S={x:r,y:s},T=Bm(l),C=Zm(T),x=await u.getDimensions(g),k=T==="y",R=k?"top":"left",j=k?"bottom":"right",A=k?"clientHeight":"clientWidth",M=d.reference[C]+d.reference[T]-S[T]-d.floating[C],q=S[T]-d.reference[T],Z=await(u.getOffsetParent==null?void 0:u.getOffsetParent(g));let B=Z?Z[A]:0;(!B||!await(u.isElement==null?void 0:u.isElement(Z)))&&(B=m.floating[A]||d.floating[C]);const X=M/2-q/2,ae=B/2-x[C]/2-1,ne=Ga(v[R],ae),te=Ga(v[j],ae),J=ne,pe=B-x[C]-te,re=B/2-x[C]/2+X,ue=nm(J,re,pe),O=!h.arrow&&Br(l)!=null&&re!==ue&&d.reference[C]/2-(rere<=0)){var te,J;const re=(((te=d.flip)==null?void 0:te.index)||0)+1,ue=B[re];if(ue&&(!(v==="alignment"?j!==Ao(ue):!1)||ne.every(G=>Ao(G.placement)===j?G.overflows[0]>0:!0)))return{data:{index:re,overflows:ne},reset:{placement:ue}};let O=(J=ne.filter(H=>H.overflows[0]<=0).sort((H,G)=>H.overflows[1]-G.overflows[1])[0])==null?void 0:J.placement;if(!O)switch(T){case"bestFit":{var pe;const H=(pe=ne.filter(G=>{if(Z){const Y=Ao(G.placement);return Y===j||Y==="y"}return!0}).map(G=>[G.placement,G.overflows.filter(Y=>Y>0).reduce((Y,se)=>Y+se,0)]).sort((G,Y)=>G[1]-Y[1])[0])==null?void 0:pe[0];H&&(O=H);break}case"initialPlacement":O=m;break}if(l!==O)return{reset:{placement:O}}}return{}}}};function yv(e,a){return{top:e.top-a.height,right:e.right-a.width,bottom:e.bottom-a.height,left:e.left-a.width}}function bv(e){return TN.some(a=>e[a]>=0)}const BN=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(a){const{rects:r,platform:s}=a,{strategy:l="referenceHidden",...d}=ia(e,a);switch(l){case"referenceHidden":{const u=await s.detectOverflow(a,{...d,elementContext:"reference"}),m=yv(u,r.reference);return{data:{referenceHiddenOffsets:m,referenceHidden:bv(m)}}}case"escaped":{const u=await s.detectOverflow(a,{...d,altBoundary:!0}),m=yv(u,r.floating);return{data:{escapedOffsets:m,escaped:bv(m)}}}default:return{}}}}},zw=new Set(["left","top"]);async function IN(e,a){const{placement:r,platform:s,elements:l}=e,d=await(s.isRTL==null?void 0:s.isRTL(l.floating)),u=la(r),m=Br(r),h=Ao(r)==="y",g=zw.has(u)?-1:1,b=d&&h?-1:1,v=ia(a,e);let{mainAxis:S,crossAxis:T,alignmentAxis:C}=typeof v=="number"?{mainAxis:v,crossAxis:0,alignmentAxis:null}:{mainAxis:v.mainAxis||0,crossAxis:v.crossAxis||0,alignmentAxis:v.alignmentAxis};return m&&typeof C=="number"&&(T=m==="end"?C*-1:C),h?{x:T*b,y:S*g}:{x:S*g,y:T*b}}const qN=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(a){var r,s;const{x:l,y:d,placement:u,middlewareData:m}=a,h=await IN(a,e);return u===((r=m.offset)==null?void 0:r.placement)&&(s=m.arrow)!=null&&s.alignmentOffset?{}:{x:l+h.x,y:d+h.y,data:{...h,placement:u}}}}},FN=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(a){const{x:r,y:s,placement:l,platform:d}=a,{mainAxis:u=!0,crossAxis:m=!1,limiter:h={fn:R=>{let{x:j,y:A}=R;return{x:j,y:A}}},...g}=ia(e,a),b={x:r,y:s},v=await d.detectOverflow(a,g),S=Ao(la(l)),T=Pm(S);let C=b[T],x=b[S];if(u){const R=T==="y"?"top":"left",j=T==="y"?"bottom":"right",A=C+v[R],M=C-v[j];C=nm(A,C,M)}if(m){const R=S==="y"?"top":"left",j=S==="y"?"bottom":"right",A=x+v[R],M=x-v[j];x=nm(A,x,M)}const k=h.fn({...a,[T]:C,[S]:x});return{...k,data:{x:k.x-r,y:k.y-s,enabled:{[T]:u,[S]:m}}}}}},KN=function(e){return e===void 0&&(e={}),{options:e,fn(a){const{x:r,y:s,placement:l,rects:d,middlewareData:u}=a,{offset:m=0,mainAxis:h=!0,crossAxis:g=!0}=ia(e,a),b={x:r,y:s},v=Ao(l),S=Pm(v);let T=b[S],C=b[v];const x=ia(m,a),k=typeof x=="number"?{mainAxis:x,crossAxis:0}:{mainAxis:0,crossAxis:0,...x};if(h){const A=S==="y"?"height":"width",M=d.reference[S]-d.floating[A]+k.mainAxis,q=d.reference[S]+d.reference[A]-k.mainAxis;Tq&&(T=q)}if(g){var R,j;const A=S==="y"?"width":"height",M=zw.has(la(l)),q=d.reference[v]-d.floating[A]+(M&&((R=u.offset)==null?void 0:R[v])||0)+(M?0:k.crossAxis),Z=d.reference[v]+d.reference[A]+(M?0:((j=u.offset)==null?void 0:j[v])||0)-(M?k.crossAxis:0);CZ&&(C=Z)}return{[S]:T,[v]:C}}}},UN=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(a){var r,s;const{placement:l,rects:d,platform:u,elements:m}=a,{apply:h=()=>{},...g}=ia(e,a),b=await u.detectOverflow(a,g),v=la(l),S=Br(l),T=Ao(l)==="y",{width:C,height:x}=d.floating;let k,R;v==="top"||v==="bottom"?(k=v,R=S===(await(u.isRTL==null?void 0:u.isRTL(m.floating))?"start":"end")?"left":"right"):(R=v,k=S==="end"?"top":"bottom");const j=x-b.top-b.bottom,A=C-b.left-b.right,M=Ga(x-b[k],j),q=Ga(C-b[R],A),Z=!a.middlewareData.shift;let B=M,X=q;if((r=a.middlewareData.shift)!=null&&r.enabled.x&&(X=A),(s=a.middlewareData.shift)!=null&&s.enabled.y&&(B=j),Z&&!S){const ne=Ht(b.left,0),te=Ht(b.right,0),J=Ht(b.top,0),pe=Ht(b.bottom,0);T?X=C-2*(ne!==0||te!==0?ne+te:Ht(b.left,b.right)):B=x-2*(J!==0||pe!==0?J+pe:Ht(b.top,b.bottom))}await h({...a,availableWidth:X,availableHeight:B});const ae=await u.getDimensions(m.floating);return C!==ae.width||x!==ae.height?{reset:{rects:!0}}:{}}}};function jc(){return typeof window<"u"}function Ir(e){return Mw(e)?(e.nodeName||"").toLowerCase():"#document"}function Gt(e){var a;return(e==null||(a=e.ownerDocument)==null?void 0:a.defaultView)||window}function Oo(e){var a;return(a=(Mw(e)?e.ownerDocument:e.document)||window.document)==null?void 0:a.documentElement}function Mw(e){return jc()?e instanceof Node||e instanceof Gt(e).Node:!1}function ho(e){return jc()?e instanceof Element||e instanceof Gt(e).Element:!1}function ca(e){return jc()?e instanceof HTMLElement||e instanceof Gt(e).HTMLElement:!1}function vv(e){return!jc()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof Gt(e).ShadowRoot}function si(e){const{overflow:a,overflowX:r,overflowY:s,display:l}=go(e);return/auto|scroll|overlay|hidden|clip/.test(a+s+r)&&l!=="inline"&&l!=="contents"}function HN(e){return/^(table|td|th)$/.test(Ir(e))}function Ac(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const GN=/transform|translate|scale|rotate|perspective|filter/,VN=/paint|layout|strict|content/,yn=e=>!!e&&e!=="none";let _p;function Im(e){const a=ho(e)?go(e):e;return yn(a.transform)||yn(a.translate)||yn(a.scale)||yn(a.rotate)||yn(a.perspective)||!qm()&&(yn(a.backdropFilter)||yn(a.filter))||GN.test(a.willChange||"")||VN.test(a.contain||"")}function WN(e){let a=Va(e);for(;ca(a)&&!_r(a);){if(Im(a))return a;if(Ac(a))return null;a=Va(a)}return null}function qm(){return _p==null&&(_p=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),_p}function _r(e){return/^(html|body|#document)$/.test(Ir(e))}function go(e){return Gt(e).getComputedStyle(e)}function Nc(e){return ho(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Va(e){if(Ir(e)==="html")return e;const a=e.assignedSlot||e.parentNode||vv(e)&&e.host||Oo(e);return vv(a)?a.host:a}function Dw(e){const a=Va(e);return _r(a)?e.ownerDocument?e.ownerDocument.body:e.body:ca(a)&&si(a)?a:Dw(a)}function Ys(e,a,r){var s;a===void 0&&(a=[]),r===void 0&&(r=!0);const l=Dw(e),d=l===((s=e.ownerDocument)==null?void 0:s.body),u=Gt(l);if(d){const m=sm(u);return a.concat(u,u.visualViewport||[],si(l)?l:[],m&&r?Ys(m):[])}else return a.concat(l,Ys(l,[],r))}function sm(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function _w(e){const a=go(e);let r=parseFloat(a.width)||0,s=parseFloat(a.height)||0;const l=ca(e),d=l?e.offsetWidth:r,u=l?e.offsetHeight:s,m=ac(r)!==d||ac(s)!==u;return m&&(r=d,s=u),{width:r,height:s,$:m}}function Fm(e){return ho(e)?e:e.contextElement}function Ar(e){const a=Fm(e);if(!ca(a))return Mo(1);const r=a.getBoundingClientRect(),{width:s,height:l,$:d}=_w(a);let u=(d?ac(r.width):r.width)/s,m=(d?ac(r.height):r.height)/l;return(!u||!Number.isFinite(u))&&(u=1),(!m||!Number.isFinite(m))&&(m=1),{x:u,y:m}}const $N=Mo(0);function Ow(e){const a=Gt(e);return!qm()||!a.visualViewport?$N:{x:a.visualViewport.offsetLeft,y:a.visualViewport.offsetTop}}function YN(e,a,r){return a===void 0&&(a=!1),!r||a&&r!==Gt(e)?!1:a}function En(e,a,r,s){a===void 0&&(a=!1),r===void 0&&(r=!1);const l=e.getBoundingClientRect(),d=Fm(e);let u=Mo(1);a&&(s?ho(s)&&(u=Ar(s)):u=Ar(e));const m=YN(d,r,s)?Ow(d):Mo(0);let h=(l.left+m.x)/u.x,g=(l.top+m.y)/u.y,b=l.width/u.x,v=l.height/u.y;if(d){const S=Gt(d),T=s&&ho(s)?Gt(s):s;let C=S,x=sm(C);for(;x&&s&&T!==C;){const k=Ar(x),R=x.getBoundingClientRect(),j=go(x),A=R.left+(x.clientLeft+parseFloat(j.paddingLeft))*k.x,M=R.top+(x.clientTop+parseFloat(j.paddingTop))*k.y;h*=k.x,g*=k.y,b*=k.x,v*=k.y,h+=A,g+=M,C=Gt(x),x=sm(C)}}return rc({width:b,height:v,x:h,y:g})}function zc(e,a){const r=Nc(e).scrollLeft;return a?a.left+r:En(Oo(e)).left+r}function Lw(e,a){const r=e.getBoundingClientRect(),s=r.left+a.scrollLeft-zc(e,r),l=r.top+a.scrollTop;return{x:s,y:l}}function XN(e){let{elements:a,rect:r,offsetParent:s,strategy:l}=e;const d=l==="fixed",u=Oo(s),m=a?Ac(a.floating):!1;if(s===u||m&&d)return r;let h={scrollLeft:0,scrollTop:0},g=Mo(1);const b=Mo(0),v=ca(s);if((v||!v&&!d)&&((Ir(s)!=="body"||si(u))&&(h=Nc(s)),v)){const T=En(s);g=Ar(s),b.x=T.x+s.clientLeft,b.y=T.y+s.clientTop}const S=u&&!v&&!d?Lw(u,h):Mo(0);return{width:r.width*g.x,height:r.height*g.y,x:r.x*g.x-h.scrollLeft*g.x+b.x+S.x,y:r.y*g.y-h.scrollTop*g.y+b.y+S.y}}function QN(e){return Array.from(e.getClientRects())}function JN(e){const a=Oo(e),r=Nc(e),s=e.ownerDocument.body,l=Ht(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),d=Ht(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight);let u=-r.scrollLeft+zc(e);const m=-r.scrollTop;return go(s).direction==="rtl"&&(u+=Ht(a.clientWidth,s.clientWidth)-l),{width:l,height:d,x:u,y:m}}const xv=25;function ez(e,a){const r=Gt(e),s=Oo(e),l=r.visualViewport;let d=s.clientWidth,u=s.clientHeight,m=0,h=0;if(l){d=l.width,u=l.height;const b=qm();(!b||b&&a==="fixed")&&(m=l.offsetLeft,h=l.offsetTop)}const g=zc(s);if(g<=0){const b=s.ownerDocument,v=b.body,S=getComputedStyle(v),T=b.compatMode==="CSS1Compat"&&parseFloat(S.marginLeft)+parseFloat(S.marginRight)||0,C=Math.abs(s.clientWidth-v.clientWidth-T);C<=xv&&(d-=C)}else g<=xv&&(d+=g);return{width:d,height:u,x:m,y:h}}function tz(e,a){const r=En(e,!0,a==="fixed"),s=r.top+e.clientTop,l=r.left+e.clientLeft,d=ca(e)?Ar(e):Mo(1),u=e.clientWidth*d.x,m=e.clientHeight*d.y,h=l*d.x,g=s*d.y;return{width:u,height:m,x:h,y:g}}function wv(e,a,r){let s;if(a==="viewport")s=ez(e,r);else if(a==="document")s=JN(Oo(e));else if(ho(a))s=tz(a,r);else{const l=Ow(e);s={x:a.x-l.x,y:a.y-l.y,width:a.width,height:a.height}}return rc(s)}function Pw(e,a){const r=Va(e);return r===a||!ho(r)||_r(r)?!1:go(r).position==="fixed"||Pw(r,a)}function oz(e,a){const r=a.get(e);if(r)return r;let s=Ys(e,[],!1).filter(m=>ho(m)&&Ir(m)!=="body"),l=null;const d=go(e).position==="fixed";let u=d?Va(e):e;for(;ho(u)&&!_r(u);){const m=go(u),h=Im(u);!h&&m.position==="fixed"&&(l=null),(d?!h&&!l:!h&&m.position==="static"&&!!l&&(l.position==="absolute"||l.position==="fixed")||si(u)&&!h&&Pw(e,u))?s=s.filter(b=>b!==u):l=m,u=Va(u)}return a.set(e,s),s}function az(e){let{element:a,boundary:r,rootBoundary:s,strategy:l}=e;const u=[...r==="clippingAncestors"?Ac(a)?[]:oz(a,this._c):[].concat(r),s],m=wv(a,u[0],l);let h=m.top,g=m.right,b=m.bottom,v=m.left;for(let S=1;S{u(!1,1e-7)},1e3)}B===1&&!Bw(g,e.getBoundingClientRect())&&u(),M=!1}try{r=new IntersectionObserver(q,{...A,root:l.ownerDocument})}catch{r=new IntersectionObserver(q,A)}r.observe(e)}return u(!0),d}function dz(e,a,r,s){s===void 0&&(s={});const{ancestorScroll:l=!0,ancestorResize:d=!0,elementResize:u=typeof ResizeObserver=="function",layoutShift:m=typeof IntersectionObserver=="function",animationFrame:h=!1}=s,g=Fm(e),b=l||d?[...g?Ys(g):[],...a?Ys(a):[]]:[];b.forEach(R=>{l&&R.addEventListener("scroll",r,{passive:!0}),d&&R.addEventListener("resize",r)});const v=g&&m?cz(g,r):null;let S=-1,T=null;u&&(T=new ResizeObserver(R=>{let[j]=R;j&&j.target===g&&T&&a&&(T.unobserve(a),cancelAnimationFrame(S),S=requestAnimationFrame(()=>{var A;(A=T)==null||A.observe(a)})),r()}),g&&!h&&T.observe(g),a&&T.observe(a));let C,x=h?En(e):null;h&&k();function k(){const R=En(e);x&&!Bw(x,R)&&r(),x=R,C=requestAnimationFrame(k)}return r(),()=>{var R;b.forEach(j=>{l&&j.removeEventListener("scroll",r),d&&j.removeEventListener("resize",r)}),v==null||v(),(R=T)==null||R.disconnect(),T=null,h&&cancelAnimationFrame(C)}}const uz=qN,pz=FN,mz=ZN,fz=UN,hz=BN,Cv=PN,gz=KN,yz=(e,a,r)=>{const s=new Map,l={platform:lz,...r},d={...l.platform,_c:s};return LN(e,a,{...l,platform:d})};var bz=typeof document<"u",vz=function(){},$l=bz?y.useLayoutEffect:vz;function sc(e,a){if(e===a)return!0;if(typeof e!=typeof a)return!1;if(typeof e=="function"&&e.toString()===a.toString())return!0;let r,s,l;if(e&&a&&typeof e=="object"){if(Array.isArray(e)){if(r=e.length,r!==a.length)return!1;for(s=r;s--!==0;)if(!sc(e[s],a[s]))return!1;return!0}if(l=Object.keys(e),r=l.length,r!==Object.keys(a).length)return!1;for(s=r;s--!==0;)if(!{}.hasOwnProperty.call(a,l[s]))return!1;for(s=r;s--!==0;){const d=l[s];if(!(d==="_owner"&&e.$$typeof)&&!sc(e[d],a[d]))return!1}return!0}return e!==e&&a!==a}function Iw(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function kv(e,a){const r=Iw(e);return Math.round(a*r)/r}function Lp(e){const a=y.useRef(e);return $l(()=>{a.current=e}),a}function xz(e){e===void 0&&(e={});const{placement:a="bottom",strategy:r="absolute",middleware:s=[],platform:l,elements:{reference:d,floating:u}={},transform:m=!0,whileElementsMounted:h,open:g}=e,[b,v]=y.useState({x:0,y:0,strategy:r,placement:a,middlewareData:{},isPositioned:!1}),[S,T]=y.useState(s);sc(S,s)||T(s);const[C,x]=y.useState(null),[k,R]=y.useState(null),j=y.useCallback(G=>{G!==Z.current&&(Z.current=G,x(G))},[]),A=y.useCallback(G=>{G!==B.current&&(B.current=G,R(G))},[]),M=d||C,q=u||k,Z=y.useRef(null),B=y.useRef(null),X=y.useRef(b),ae=h!=null,ne=Lp(h),te=Lp(l),J=Lp(g),pe=y.useCallback(()=>{if(!Z.current||!B.current)return;const G={placement:a,strategy:r,middleware:S};te.current&&(G.platform=te.current),yz(Z.current,B.current,G).then(Y=>{const se={...Y,isPositioned:J.current!==!1};re.current&&!sc(X.current,se)&&(X.current=se,Em.flushSync(()=>{v(se)}))})},[S,a,r,te,J]);$l(()=>{g===!1&&X.current.isPositioned&&(X.current.isPositioned=!1,v(G=>({...G,isPositioned:!1})))},[g]);const re=y.useRef(!1);$l(()=>(re.current=!0,()=>{re.current=!1}),[]),$l(()=>{if(M&&(Z.current=M),q&&(B.current=q),M&&q){if(ne.current)return ne.current(M,q,pe);pe()}},[M,q,pe,ne,ae]);const ue=y.useMemo(()=>({reference:Z,floating:B,setReference:j,setFloating:A}),[j,A]),O=y.useMemo(()=>({reference:M,floating:q}),[M,q]),H=y.useMemo(()=>{const G={position:r,left:0,top:0};if(!O.floating)return G;const Y=kv(O.floating,b.x),se=kv(O.floating,b.y);return m?{...G,transform:"translate("+Y+"px, "+se+"px)",...Iw(O.floating)>=1.5&&{willChange:"transform"}}:{position:r,left:Y,top:se}},[r,m,O.floating,b.x,b.y]);return y.useMemo(()=>({...b,update:pe,refs:ue,elements:O,floatingStyles:H}),[b,pe,ue,O,H])}const wz=e=>{function a(r){return{}.hasOwnProperty.call(r,"current")}return{name:"arrow",options:e,fn(r){const{element:s,padding:l}=typeof e=="function"?e(r):e;return s&&a(s)?s.current!=null?Cv({element:s.current,padding:l}).fn(r):{}:s?Cv({element:s,padding:l}).fn(r):{}}}},Sz=(e,a)=>{const r=uz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Cz=(e,a)=>{const r=pz(e);return{name:r.name,fn:r.fn,options:[e,a]}},kz=(e,a)=>({fn:gz(e).fn,options:[e,a]}),Tz=(e,a)=>{const r=mz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Ez=(e,a)=>{const r=fz(e);return{name:r.name,fn:r.fn,options:[e,a]}},Rz=(e,a)=>{const r=hz(e);return{name:r.name,fn:r.fn,options:[e,a]}},jz=(e,a)=>{const r=wz(e);return{name:r.name,fn:r.fn,options:[e,a]}};var Az="Arrow",qw=y.forwardRef((e,a)=>{const{children:r,width:s=10,height:l=5,...d}=e;return c.jsx(Te.svg,{...d,ref:a,width:s,height:l,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?r:c.jsx("polygon",{points:"0,0 30,0 15,10"})})});qw.displayName=Az;var Nz=qw;function Km(e){const[a,r]=y.useState(void 0);return ra(()=>{if(e){r({width:e.offsetWidth,height:e.offsetHeight});const s=new ResizeObserver(l=>{if(!Array.isArray(l)||!l.length)return;const d=l[0];let u,m;if("borderBoxSize"in d){const h=d.borderBoxSize,g=Array.isArray(h)?h[0]:h;u=g.inlineSize,m=g.blockSize}else u=e.offsetWidth,m=e.offsetHeight;r({width:u,height:m})});return s.observe(e,{box:"border-box"}),()=>s.unobserve(e)}else r(void 0)},[e]),a}var Um="Popper",[Fw,qr]=Vt(Um),[zz,Kw]=Fw(Um),Uw=e=>{const{__scopePopper:a,children:r}=e,[s,l]=y.useState(null);return c.jsx(zz,{scope:a,anchor:s,onAnchorChange:l,children:r})};Uw.displayName=Um;var Hw="PopperAnchor",Gw=y.forwardRef((e,a)=>{const{__scopePopper:r,virtualRef:s,...l}=e,d=Kw(Hw,r),u=y.useRef(null),m=Pe(a,u),h=y.useRef(null);return y.useEffect(()=>{const g=h.current;h.current=(s==null?void 0:s.current)||u.current,g!==h.current&&d.onAnchorChange(h.current)}),s?null:c.jsx(Te.div,{...l,ref:m})});Gw.displayName=Hw;var Hm="PopperContent",[Mz,Dz]=Fw(Hm),Vw=y.forwardRef((e,a)=>{var ye,Ke,we,vt,xo,Lo;const{__scopePopper:r,side:s="bottom",sideOffset:l=0,align:d="center",alignOffset:u=0,arrowPadding:m=0,avoidCollisions:h=!0,collisionBoundary:g=[],collisionPadding:b=0,sticky:v="partial",hideWhenDetached:S=!1,updatePositionStrategy:T="optimized",onPlaced:C,...x}=e,k=Kw(Hm,r),[R,j]=y.useState(null),A=Pe(a,so=>j(so)),[M,q]=y.useState(null),Z=Km(M),B=(Z==null?void 0:Z.width)??0,X=(Z==null?void 0:Z.height)??0,ae=s+(d!=="center"?"-"+d:""),ne=typeof b=="number"?b:{top:0,right:0,bottom:0,left:0,...b},te=Array.isArray(g)?g:[g],J=te.length>0,pe={padding:ne,boundary:te.filter(Oz),altBoundary:J},{refs:re,floatingStyles:ue,placement:O,isPositioned:H,middlewareData:G}=xz({strategy:"fixed",placement:ae,whileElementsMounted:(...so)=>dz(...so,{animationFrame:T==="always"}),elements:{reference:k.anchor},middleware:[Sz({mainAxis:l+X,alignmentAxis:u}),h&&Cz({mainAxis:!0,crossAxis:!1,limiter:v==="partial"?kz():void 0,...pe}),h&&Tz({...pe}),Ez({...pe,apply:({elements:so,rects:Dt,availableWidth:ua,availableHeight:Xa})=>{const{width:Gr,height:zn}=Dt.reference,wo=so.floating.style;wo.setProperty("--radix-popper-available-width",`${ua}px`),wo.setProperty("--radix-popper-available-height",`${Xa}px`),wo.setProperty("--radix-popper-anchor-width",`${Gr}px`),wo.setProperty("--radix-popper-anchor-height",`${zn}px`)}}),M&&jz({element:M,padding:m}),Lz({arrowWidth:B,arrowHeight:X}),S&&Rz({strategy:"referenceHidden",...pe})]}),[Y,se]=Yw(O),N=sa(C);ra(()=>{H&&(N==null||N())},[H,N]);const K=(ye=G.arrow)==null?void 0:ye.x,ee=(Ke=G.arrow)==null?void 0:Ke.y,oe=((we=G.arrow)==null?void 0:we.centerOffset)!==0,[fe,he]=y.useState();return ra(()=>{R&&he(window.getComputedStyle(R).zIndex)},[R]),c.jsx("div",{ref:re.setFloating,"data-radix-popper-content-wrapper":"",style:{...ue,transform:H?ue.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:fe,"--radix-popper-transform-origin":[(vt=G.transformOrigin)==null?void 0:vt.x,(xo=G.transformOrigin)==null?void 0:xo.y].join(" "),...((Lo=G.hide)==null?void 0:Lo.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:c.jsx(Mz,{scope:r,placedSide:Y,onArrowChange:q,arrowX:K,arrowY:ee,shouldHideArrow:oe,children:c.jsx(Te.div,{"data-side":Y,"data-align":se,...x,ref:A,style:{...x.style,animation:H?void 0:"none"}})})})});Vw.displayName=Hm;var Ww="PopperArrow",_z={top:"bottom",right:"left",bottom:"top",left:"right"},$w=y.forwardRef(function(a,r){const{__scopePopper:s,...l}=a,d=Dz(Ww,s),u=_z[d.placedSide];return c.jsx("span",{ref:d.onArrowChange,style:{position:"absolute",left:d.arrowX,top:d.arrowY,[u]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[d.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[d.placedSide],visibility:d.shouldHideArrow?"hidden":void 0},children:c.jsx(Nz,{...l,ref:r,style:{...l.style,display:"block"}})})});$w.displayName=Ww;function Oz(e){return e!==null}var Lz=e=>({name:"transformOrigin",options:e,fn(a){var k,R,j;const{placement:r,rects:s,middlewareData:l}=a,u=((k=l.arrow)==null?void 0:k.centerOffset)!==0,m=u?0:e.arrowWidth,h=u?0:e.arrowHeight,[g,b]=Yw(r),v={start:"0%",center:"50%",end:"100%"}[b],S=(((R=l.arrow)==null?void 0:R.x)??0)+m/2,T=(((j=l.arrow)==null?void 0:j.y)??0)+h/2;let C="",x="";return g==="bottom"?(C=u?v:`${S}px`,x=`${-h}px`):g==="top"?(C=u?v:`${S}px`,x=`${s.floating.height+h}px`):g==="right"?(C=`${-h}px`,x=u?v:`${T}px`):g==="left"&&(C=`${s.floating.width+h}px`,x=u?v:`${T}px`),{data:{x:C,y:x}}}});function Yw(e){const[a,r="center"]=e.split("-");return[a,r]}var Gm=Uw,Mc=Gw,Vm=Vw,Wm=$w,Pp="rovingFocusGroup.onEntryFocus",Pz={bubbles:!1,cancelable:!0},ii="RovingFocusGroup",[im,Xw,Zz]=Rc(ii),[Bz,Dc]=Vt(ii,[Zz]),[Iz,qz]=Bz(ii),Qw=y.forwardRef((e,a)=>c.jsx(im.Provider,{scope:e.__scopeRovingFocusGroup,children:c.jsx(im.Slot,{scope:e.__scopeRovingFocusGroup,children:c.jsx(Fz,{...e,ref:a})})}));Qw.displayName=ii;var Fz=y.forwardRef((e,a)=>{const{__scopeRovingFocusGroup:r,orientation:s,loop:l=!1,dir:d,currentTabStopId:u,defaultCurrentTabStopId:m,onCurrentTabStopIdChange:h,onEntryFocus:g,preventScrollOnEntryFocus:b=!1,...v}=e,S=y.useRef(null),T=Pe(a,S),C=ri(d),[x,k]=yo({prop:u,defaultProp:m??null,onChange:h,caller:ii}),[R,j]=y.useState(!1),A=sa(g),M=Xw(r),q=y.useRef(!1),[Z,B]=y.useState(0);return y.useEffect(()=>{const X=S.current;if(X)return X.addEventListener(Pp,A),()=>X.removeEventListener(Pp,A)},[A]),c.jsx(Iz,{scope:r,orientation:s,dir:C,loop:l,currentTabStopId:x,onItemFocus:y.useCallback(X=>k(X),[k]),onItemShiftTab:y.useCallback(()=>j(!0),[]),onFocusableItemAdd:y.useCallback(()=>B(X=>X+1),[]),onFocusableItemRemove:y.useCallback(()=>B(X=>X-1),[]),children:c.jsx(Te.div,{tabIndex:R||Z===0?-1:0,"data-orientation":s,...v,ref:T,style:{outline:"none",...e.style},onMouseDown:ce(e.onMouseDown,()=>{q.current=!0}),onFocus:ce(e.onFocus,X=>{const ae=!q.current;if(X.target===X.currentTarget&&ae&&!R){const ne=new CustomEvent(Pp,Pz);if(X.currentTarget.dispatchEvent(ne),!ne.defaultPrevented){const te=M().filter(O=>O.focusable),J=te.find(O=>O.active),pe=te.find(O=>O.id===x),ue=[J,pe,...te].filter(Boolean).map(O=>O.ref.current);t0(ue,b)}}q.current=!1}),onBlur:ce(e.onBlur,()=>j(!1))})})}),Jw="RovingFocusGroupItem",e0=y.forwardRef((e,a)=>{const{__scopeRovingFocusGroup:r,focusable:s=!0,active:l=!1,tabStopId:d,children:u,...m}=e,h=fo(),g=d||h,b=qz(Jw,r),v=b.currentTabStopId===g,S=Xw(r),{onFocusableItemAdd:T,onFocusableItemRemove:C,currentTabStopId:x}=b;return y.useEffect(()=>{if(s)return T(),()=>C()},[s,T,C]),c.jsx(im.ItemSlot,{scope:r,id:g,focusable:s,active:l,children:c.jsx(Te.span,{tabIndex:v?0:-1,"data-orientation":b.orientation,...m,ref:a,onMouseDown:ce(e.onMouseDown,k=>{s?b.onItemFocus(g):k.preventDefault()}),onFocus:ce(e.onFocus,()=>b.onItemFocus(g)),onKeyDown:ce(e.onKeyDown,k=>{if(k.key==="Tab"&&k.shiftKey){b.onItemShiftTab();return}if(k.target!==k.currentTarget)return;const R=Hz(k,b.orientation,b.dir);if(R!==void 0){if(k.metaKey||k.ctrlKey||k.altKey||k.shiftKey)return;k.preventDefault();let A=S().filter(M=>M.focusable).map(M=>M.ref.current);if(R==="last")A.reverse();else if(R==="prev"||R==="next"){R==="prev"&&A.reverse();const M=A.indexOf(k.currentTarget);A=b.loop?Gz(A,M+1):A.slice(M+1)}setTimeout(()=>t0(A))}}),children:typeof u=="function"?u({isCurrentTabStop:v,hasTabStop:x!=null}):u})})});e0.displayName=Jw;var Kz={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Uz(e,a){return a!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function Hz(e,a,r){const s=Uz(e.key,r);if(!(a==="vertical"&&["ArrowLeft","ArrowRight"].includes(s))&&!(a==="horizontal"&&["ArrowUp","ArrowDown"].includes(s)))return Kz[s]}function t0(e,a=!1){const r=document.activeElement;for(const s of e)if(s===r||(s.focus({preventScroll:a}),document.activeElement!==r))return}function Gz(e,a){return e.map((r,s)=>e[(a+s)%e.length])}var o0=Qw,a0=e0,lm=["Enter"," "],Vz=["ArrowDown","PageUp","Home"],n0=["ArrowUp","PageDown","End"],Wz=[...Vz,...n0],$z={ltr:[...lm,"ArrowRight"],rtl:[...lm,"ArrowLeft"]},Yz={ltr:["ArrowLeft"],rtl:["ArrowRight"]},li="Menu",[Xs,Xz,Qz]=Rc(li),[An,r0]=Vt(li,[Qz,qr,Dc]),_c=qr(),s0=Dc(),[Jz,Nn]=An(li),[e2,ci]=An(li),i0=e=>{const{__scopeMenu:a,open:r=!1,children:s,dir:l,onOpenChange:d,modal:u=!0}=e,m=_c(a),[h,g]=y.useState(null),b=y.useRef(!1),v=sa(d),S=ri(l);return y.useEffect(()=>{const T=()=>{b.current=!0,document.addEventListener("pointerdown",C,{capture:!0,once:!0}),document.addEventListener("pointermove",C,{capture:!0,once:!0})},C=()=>b.current=!1;return document.addEventListener("keydown",T,{capture:!0}),()=>{document.removeEventListener("keydown",T,{capture:!0}),document.removeEventListener("pointerdown",C,{capture:!0}),document.removeEventListener("pointermove",C,{capture:!0})}},[]),c.jsx(Gm,{...m,children:c.jsx(Jz,{scope:a,open:r,onOpenChange:v,content:h,onContentChange:g,children:c.jsx(e2,{scope:a,onClose:y.useCallback(()=>v(!1),[v]),isUsingKeyboardRef:b,dir:S,modal:u,children:s})})})};i0.displayName=li;var t2="MenuAnchor",$m=y.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e,l=_c(r);return c.jsx(Mc,{...l,...s,ref:a})});$m.displayName=t2;var Ym="MenuPortal",[o2,l0]=An(Ym,{forceMount:void 0}),c0=e=>{const{__scopeMenu:a,forceMount:r,children:s,container:l}=e,d=Nn(Ym,a);return c.jsx(o2,{scope:a,forceMount:r,children:c.jsx(Mt,{present:r||d.open,children:c.jsx(ni,{asChild:!0,container:l,children:s})})})};c0.displayName=Ym;var ro="MenuContent",[a2,Xm]=An(ro),d0=y.forwardRef((e,a)=>{const r=l0(ro,e.__scopeMenu),{forceMount:s=r.forceMount,...l}=e,d=Nn(ro,e.__scopeMenu),u=ci(ro,e.__scopeMenu);return c.jsx(Xs.Provider,{scope:e.__scopeMenu,children:c.jsx(Mt,{present:s||d.open,children:c.jsx(Xs.Slot,{scope:e.__scopeMenu,children:u.modal?c.jsx(n2,{...l,ref:a}):c.jsx(r2,{...l,ref:a})})})})}),n2=y.forwardRef((e,a)=>{const r=Nn(ro,e.__scopeMenu),s=y.useRef(null),l=Pe(a,s);return y.useEffect(()=>{const d=s.current;if(d)return Dm(d)},[]),c.jsx(Qm,{...e,ref:l,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:ce(e.onFocusOutside,d=>d.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)})}),r2=y.forwardRef((e,a)=>{const r=Nn(ro,e.__scopeMenu);return c.jsx(Qm,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)})}),s2=Dr("MenuContent.ScrollLock"),Qm=y.forwardRef((e,a)=>{const{__scopeMenu:r,loop:s=!1,trapFocus:l,onOpenAutoFocus:d,onCloseAutoFocus:u,disableOutsidePointerEvents:m,onEntryFocus:h,onEscapeKeyDown:g,onPointerDownOutside:b,onFocusOutside:v,onInteractOutside:S,onDismiss:T,disableOutsideScroll:C,...x}=e,k=Nn(ro,r),R=ci(ro,r),j=_c(r),A=s0(r),M=Xz(r),[q,Z]=y.useState(null),B=y.useRef(null),X=Pe(a,B,k.onContentChange),ae=y.useRef(0),ne=y.useRef(""),te=y.useRef(0),J=y.useRef(null),pe=y.useRef("right"),re=y.useRef(0),ue=C?wc:y.Fragment,O=C?{as:s2,allowPinchZoom:!0}:void 0,H=Y=>{var ye,Ke;const se=ne.current+Y,N=M().filter(we=>!we.disabled),K=document.activeElement,ee=(ye=N.find(we=>we.ref.current===K))==null?void 0:ye.textValue,oe=N.map(we=>we.textValue),fe=b2(oe,se,ee),he=(Ke=N.find(we=>we.textValue===fe))==null?void 0:Ke.ref.current;(function we(vt){ne.current=vt,window.clearTimeout(ae.current),vt!==""&&(ae.current=window.setTimeout(()=>we(""),1e3))})(se),he&&setTimeout(()=>he.focus())};y.useEffect(()=>()=>window.clearTimeout(ae.current),[]),Mm();const G=y.useCallback(Y=>{var N,K;return pe.current===((N=J.current)==null?void 0:N.side)&&x2(Y,(K=J.current)==null?void 0:K.area)},[]);return c.jsx(a2,{scope:r,searchRef:ne,onItemEnter:y.useCallback(Y=>{G(Y)&&Y.preventDefault()},[G]),onItemLeave:y.useCallback(Y=>{var se;G(Y)||((se=B.current)==null||se.focus(),Z(null))},[G]),onTriggerLeave:y.useCallback(Y=>{G(Y)&&Y.preventDefault()},[G]),pointerGraceTimerRef:te,onPointerGraceIntentChange:y.useCallback(Y=>{J.current=Y},[]),children:c.jsx(ue,{...O,children:c.jsx(vc,{asChild:!0,trapped:l,onMountAutoFocus:ce(d,Y=>{var se;Y.preventDefault(),(se=B.current)==null||se.focus({preventScroll:!0})}),onUnmountAutoFocus:u,children:c.jsx(ai,{asChild:!0,disableOutsidePointerEvents:m,onEscapeKeyDown:g,onPointerDownOutside:b,onFocusOutside:v,onInteractOutside:S,onDismiss:T,children:c.jsx(o0,{asChild:!0,...A,dir:R.dir,orientation:"vertical",loop:s,currentTabStopId:q,onCurrentTabStopIdChange:Z,onEntryFocus:ce(h,Y=>{R.isUsingKeyboardRef.current||Y.preventDefault()}),preventScrollOnEntryFocus:!0,children:c.jsx(Vm,{role:"menu","aria-orientation":"vertical","data-state":E0(k.open),"data-radix-menu-content":"",dir:R.dir,...j,...x,ref:X,style:{outline:"none",...x.style},onKeyDown:ce(x.onKeyDown,Y=>{const N=Y.target.closest("[data-radix-menu-content]")===Y.currentTarget,K=Y.ctrlKey||Y.altKey||Y.metaKey,ee=Y.key.length===1;N&&(Y.key==="Tab"&&Y.preventDefault(),!K&&ee&&H(Y.key));const oe=B.current;if(Y.target!==oe||!Wz.includes(Y.key))return;Y.preventDefault();const he=M().filter(ye=>!ye.disabled).map(ye=>ye.ref.current);n0.includes(Y.key)&&he.reverse(),g2(he)}),onBlur:ce(e.onBlur,Y=>{Y.currentTarget.contains(Y.target)||(window.clearTimeout(ae.current),ne.current="")}),onPointerMove:ce(e.onPointerMove,Qs(Y=>{const se=Y.target,N=re.current!==Y.clientX;if(Y.currentTarget.contains(se)&&N){const K=Y.clientX>re.current?"right":"left";pe.current=K,re.current=Y.clientX}}))})})})})})})});d0.displayName=ro;var i2="MenuGroup",Jm=y.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e;return c.jsx(Te.div,{role:"group",...s,ref:a})});Jm.displayName=i2;var l2="MenuLabel",u0=y.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e;return c.jsx(Te.div,{...s,ref:a})});u0.displayName=l2;var ic="MenuItem",Tv="menu.itemSelect",Oc=y.forwardRef((e,a)=>{const{disabled:r=!1,onSelect:s,...l}=e,d=y.useRef(null),u=ci(ic,e.__scopeMenu),m=Xm(ic,e.__scopeMenu),h=Pe(a,d),g=y.useRef(!1),b=()=>{const v=d.current;if(!r&&v){const S=new CustomEvent(Tv,{bubbles:!0,cancelable:!0});v.addEventListener(Tv,T=>s==null?void 0:s(T),{once:!0}),Gx(v,S),S.defaultPrevented?g.current=!1:u.onClose()}};return c.jsx(p0,{...l,ref:h,disabled:r,onClick:ce(e.onClick,b),onPointerDown:v=>{var S;(S=e.onPointerDown)==null||S.call(e,v),g.current=!0},onPointerUp:ce(e.onPointerUp,v=>{var S;g.current||(S=v.currentTarget)==null||S.click()}),onKeyDown:ce(e.onKeyDown,v=>{const S=m.searchRef.current!=="";r||S&&v.key===" "||lm.includes(v.key)&&(v.currentTarget.click(),v.preventDefault())})})});Oc.displayName=ic;var p0=y.forwardRef((e,a)=>{const{__scopeMenu:r,disabled:s=!1,textValue:l,...d}=e,u=Xm(ic,r),m=s0(r),h=y.useRef(null),g=Pe(a,h),[b,v]=y.useState(!1),[S,T]=y.useState("");return y.useEffect(()=>{const C=h.current;C&&T((C.textContent??"").trim())},[d.children]),c.jsx(Xs.ItemSlot,{scope:r,disabled:s,textValue:l??S,children:c.jsx(a0,{asChild:!0,...m,focusable:!s,children:c.jsx(Te.div,{role:"menuitem","data-highlighted":b?"":void 0,"aria-disabled":s||void 0,"data-disabled":s?"":void 0,...d,ref:g,onPointerMove:ce(e.onPointerMove,Qs(C=>{s?u.onItemLeave(C):(u.onItemEnter(C),C.defaultPrevented||C.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:ce(e.onPointerLeave,Qs(C=>u.onItemLeave(C))),onFocus:ce(e.onFocus,()=>v(!0)),onBlur:ce(e.onBlur,()=>v(!1))})})})}),c2="MenuCheckboxItem",m0=y.forwardRef((e,a)=>{const{checked:r=!1,onCheckedChange:s,...l}=e;return c.jsx(b0,{scope:e.__scopeMenu,checked:r,children:c.jsx(Oc,{role:"menuitemcheckbox","aria-checked":lc(r)?"mixed":r,...l,ref:a,"data-state":tf(r),onSelect:ce(l.onSelect,()=>s==null?void 0:s(lc(r)?!0:!r),{checkForDefaultPrevented:!1})})})});m0.displayName=c2;var f0="MenuRadioGroup",[d2,u2]=An(f0,{value:void 0,onValueChange:()=>{}}),h0=y.forwardRef((e,a)=>{const{value:r,onValueChange:s,...l}=e,d=sa(s);return c.jsx(d2,{scope:e.__scopeMenu,value:r,onValueChange:d,children:c.jsx(Jm,{...l,ref:a})})});h0.displayName=f0;var g0="MenuRadioItem",y0=y.forwardRef((e,a)=>{const{value:r,...s}=e,l=u2(g0,e.__scopeMenu),d=r===l.value;return c.jsx(b0,{scope:e.__scopeMenu,checked:d,children:c.jsx(Oc,{role:"menuitemradio","aria-checked":d,...s,ref:a,"data-state":tf(d),onSelect:ce(s.onSelect,()=>{var u;return(u=l.onValueChange)==null?void 0:u.call(l,r)},{checkForDefaultPrevented:!1})})})});y0.displayName=g0;var ef="MenuItemIndicator",[b0,p2]=An(ef,{checked:!1}),v0=y.forwardRef((e,a)=>{const{__scopeMenu:r,forceMount:s,...l}=e,d=p2(ef,r);return c.jsx(Mt,{present:s||lc(d.checked)||d.checked===!0,children:c.jsx(Te.span,{...l,ref:a,"data-state":tf(d.checked)})})});v0.displayName=ef;var m2="MenuSeparator",x0=y.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e;return c.jsx(Te.div,{role:"separator","aria-orientation":"horizontal",...s,ref:a})});x0.displayName=m2;var f2="MenuArrow",w0=y.forwardRef((e,a)=>{const{__scopeMenu:r,...s}=e,l=_c(r);return c.jsx(Wm,{...l,...s,ref:a})});w0.displayName=f2;var h2="MenuSub",[yZ,S0]=An(h2),Gs="MenuSubTrigger",C0=y.forwardRef((e,a)=>{const r=Nn(Gs,e.__scopeMenu),s=ci(Gs,e.__scopeMenu),l=S0(Gs,e.__scopeMenu),d=Xm(Gs,e.__scopeMenu),u=y.useRef(null),{pointerGraceTimerRef:m,onPointerGraceIntentChange:h}=d,g={__scopeMenu:e.__scopeMenu},b=y.useCallback(()=>{u.current&&window.clearTimeout(u.current),u.current=null},[]);return y.useEffect(()=>b,[b]),y.useEffect(()=>{const v=m.current;return()=>{window.clearTimeout(v),h(null)}},[m,h]),c.jsx($m,{asChild:!0,...g,children:c.jsx(p0,{id:l.triggerId,"aria-haspopup":"menu","aria-expanded":r.open,"aria-controls":l.contentId,"data-state":E0(r.open),...e,ref:oi(a,l.onTriggerChange),onClick:v=>{var S;(S=e.onClick)==null||S.call(e,v),!(e.disabled||v.defaultPrevented)&&(v.currentTarget.focus(),r.open||r.onOpenChange(!0))},onPointerMove:ce(e.onPointerMove,Qs(v=>{d.onItemEnter(v),!v.defaultPrevented&&!e.disabled&&!r.open&&!u.current&&(d.onPointerGraceIntentChange(null),u.current=window.setTimeout(()=>{r.onOpenChange(!0),b()},100))})),onPointerLeave:ce(e.onPointerLeave,Qs(v=>{var T,C;b();const S=(T=r.content)==null?void 0:T.getBoundingClientRect();if(S){const x=(C=r.content)==null?void 0:C.dataset.side,k=x==="right",R=k?-5:5,j=S[k?"left":"right"],A=S[k?"right":"left"];d.onPointerGraceIntentChange({area:[{x:v.clientX+R,y:v.clientY},{x:j,y:S.top},{x:A,y:S.top},{x:A,y:S.bottom},{x:j,y:S.bottom}],side:x}),window.clearTimeout(m.current),m.current=window.setTimeout(()=>d.onPointerGraceIntentChange(null),300)}else{if(d.onTriggerLeave(v),v.defaultPrevented)return;d.onPointerGraceIntentChange(null)}})),onKeyDown:ce(e.onKeyDown,v=>{var T;const S=d.searchRef.current!=="";e.disabled||S&&v.key===" "||$z[s.dir].includes(v.key)&&(r.onOpenChange(!0),(T=r.content)==null||T.focus(),v.preventDefault())})})})});C0.displayName=Gs;var k0="MenuSubContent",T0=y.forwardRef((e,a)=>{const r=l0(ro,e.__scopeMenu),{forceMount:s=r.forceMount,...l}=e,d=Nn(ro,e.__scopeMenu),u=ci(ro,e.__scopeMenu),m=S0(k0,e.__scopeMenu),h=y.useRef(null),g=Pe(a,h);return c.jsx(Xs.Provider,{scope:e.__scopeMenu,children:c.jsx(Mt,{present:s||d.open,children:c.jsx(Xs.Slot,{scope:e.__scopeMenu,children:c.jsx(Qm,{id:m.contentId,"aria-labelledby":m.triggerId,...l,ref:g,align:"start",side:u.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:b=>{var v;u.isUsingKeyboardRef.current&&((v=h.current)==null||v.focus()),b.preventDefault()},onCloseAutoFocus:b=>b.preventDefault(),onFocusOutside:ce(e.onFocusOutside,b=>{b.target!==m.trigger&&d.onOpenChange(!1)}),onEscapeKeyDown:ce(e.onEscapeKeyDown,b=>{u.onClose(),b.preventDefault()}),onKeyDown:ce(e.onKeyDown,b=>{var T;const v=b.currentTarget.contains(b.target),S=Yz[u.dir].includes(b.key);v&&S&&(d.onOpenChange(!1),(T=m.trigger)==null||T.focus(),b.preventDefault())})})})})})});T0.displayName=k0;function E0(e){return e?"open":"closed"}function lc(e){return e==="indeterminate"}function tf(e){return lc(e)?"indeterminate":e?"checked":"unchecked"}function g2(e){const a=document.activeElement;for(const r of e)if(r===a||(r.focus(),document.activeElement!==a))return}function y2(e,a){return e.map((r,s)=>e[(a+s)%e.length])}function b2(e,a,r){const l=a.length>1&&Array.from(a).every(g=>g===a[0])?a[0]:a,d=r?e.indexOf(r):-1;let u=y2(e,Math.max(d,0));l.length===1&&(u=u.filter(g=>g!==r));const h=u.find(g=>g.toLowerCase().startsWith(l.toLowerCase()));return h!==r?h:void 0}function v2(e,a){const{x:r,y:s}=e;let l=!1;for(let d=0,u=a.length-1;ds!=S>s&&r<(v-g)*(s-b)/(S-b)+g&&(l=!l)}return l}function x2(e,a){if(!a)return!1;const r={x:e.clientX,y:e.clientY};return v2(r,a)}function Qs(e){return a=>a.pointerType==="mouse"?e(a):void 0}var w2=i0,S2=$m,C2=c0,k2=d0,T2=Jm,E2=u0,R2=Oc,j2=m0,A2=h0,N2=y0,z2=v0,M2=x0,D2=w0,_2=C0,O2=T0,Lc="DropdownMenu",[L2]=Vt(Lc,[r0]),kt=r0(),[P2,R0]=L2(Lc),j0=e=>{const{__scopeDropdownMenu:a,children:r,dir:s,open:l,defaultOpen:d,onOpenChange:u,modal:m=!0}=e,h=kt(a),g=y.useRef(null),[b,v]=yo({prop:l,defaultProp:d??!1,onChange:u,caller:Lc});return c.jsx(P2,{scope:a,triggerId:fo(),triggerRef:g,contentId:fo(),open:b,onOpenChange:v,onOpenToggle:y.useCallback(()=>v(S=>!S),[v]),modal:m,children:c.jsx(w2,{...h,open:b,onOpenChange:v,dir:s,modal:m,children:r})})};j0.displayName=Lc;var A0="DropdownMenuTrigger",N0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,disabled:s=!1,...l}=e,d=R0(A0,r),u=kt(r);return c.jsx(S2,{asChild:!0,...u,children:c.jsx(Te.button,{type:"button",id:d.triggerId,"aria-haspopup":"menu","aria-expanded":d.open,"aria-controls":d.open?d.contentId:void 0,"data-state":d.open?"open":"closed","data-disabled":s?"":void 0,disabled:s,...l,ref:oi(a,d.triggerRef),onPointerDown:ce(e.onPointerDown,m=>{!s&&m.button===0&&m.ctrlKey===!1&&(d.onOpenToggle(),d.open||m.preventDefault())}),onKeyDown:ce(e.onKeyDown,m=>{s||(["Enter"," "].includes(m.key)&&d.onOpenToggle(),m.key==="ArrowDown"&&d.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(m.key)&&m.preventDefault())})})})});N0.displayName=A0;var Z2="DropdownMenuPortal",z0=e=>{const{__scopeDropdownMenu:a,...r}=e,s=kt(a);return c.jsx(C2,{...s,...r})};z0.displayName=Z2;var M0="DropdownMenuContent",D0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=R0(M0,r),d=kt(r),u=y.useRef(!1);return c.jsx(k2,{id:l.contentId,"aria-labelledby":l.triggerId,...d,...s,ref:a,onCloseAutoFocus:ce(e.onCloseAutoFocus,m=>{var h;u.current||(h=l.triggerRef.current)==null||h.focus(),u.current=!1,m.preventDefault()}),onInteractOutside:ce(e.onInteractOutside,m=>{const h=m.detail.originalEvent,g=h.button===0&&h.ctrlKey===!0,b=h.button===2||g;(!l.modal||b)&&(u.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});D0.displayName=M0;var B2="DropdownMenuGroup",I2=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(T2,{...l,...s,ref:a})});I2.displayName=B2;var q2="DropdownMenuLabel",_0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(E2,{...l,...s,ref:a})});_0.displayName=q2;var F2="DropdownMenuItem",O0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(R2,{...l,...s,ref:a})});O0.displayName=F2;var K2="DropdownMenuCheckboxItem",L0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(j2,{...l,...s,ref:a})});L0.displayName=K2;var U2="DropdownMenuRadioGroup",H2=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(A2,{...l,...s,ref:a})});H2.displayName=U2;var G2="DropdownMenuRadioItem",P0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(N2,{...l,...s,ref:a})});P0.displayName=G2;var V2="DropdownMenuItemIndicator",Z0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(z2,{...l,...s,ref:a})});Z0.displayName=V2;var W2="DropdownMenuSeparator",B0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(M2,{...l,...s,ref:a})});B0.displayName=W2;var $2="DropdownMenuArrow",Y2=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(D2,{...l,...s,ref:a})});Y2.displayName=$2;var X2="DropdownMenuSubTrigger",I0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(_2,{...l,...s,ref:a})});I0.displayName=X2;var Q2="DropdownMenuSubContent",q0=y.forwardRef((e,a)=>{const{__scopeDropdownMenu:r,...s}=e,l=kt(r);return c.jsx(O2,{...l,...s,ref:a,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});q0.displayName=Q2;var J2=j0,eM=N0,tM=z0,F0=D0,K0=_0,U0=O0,H0=L0,G0=P0,V0=Z0,W0=B0,$0=I0,Y0=q0;const X0=({modal:e=!1,...a})=>c.jsx(J2,{modal:e,...a}),Q0=eM,oM=y.forwardRef(({className:e,inset:a,children:r,...s},l)=>c.jsxs($0,{ref:l,className:ie("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",a&&"pl-8",e),...s,children:[r,c.jsx(NR,{className:"ml-auto"})]}));oM.displayName=$0.displayName;const aM=y.forwardRef(({className:e,...a},r)=>c.jsx(Y0,{ref:r,className:ie("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",e),...a}));aM.displayName=Y0.displayName;const of=y.forwardRef(({className:e,sideOffset:a=4,...r},s)=>c.jsx(tM,{children:c.jsx(F0,{ref:s,sideOffset:a,className:ie("z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md","data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",e),...r})}));of.displayName=F0.displayName;const af=y.forwardRef(({className:e,inset:a,...r},s)=>c.jsx(U0,{ref:s,className:ie("relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",a&&"pl-8",e),...r}));af.displayName=U0.displayName;const nM=y.forwardRef(({className:e,children:a,checked:r,...s},l)=>c.jsxs(H0,{ref:l,className:ie("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:r,...s,children:[c.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:c.jsx(V0,{children:c.jsx(Ha,{className:"h-4 w-4"})})}),a]}));nM.displayName=H0.displayName;const rM=y.forwardRef(({className:e,children:a,...r},s)=>c.jsxs(G0,{ref:s,className:ie("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[c.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:c.jsx(V0,{children:c.jsx(MR,{className:"h-2 w-2 fill-current"})})}),a]}));rM.displayName=G0.displayName;const sM=y.forwardRef(({className:e,inset:a,...r},s)=>c.jsx(K0,{ref:s,className:ie("px-2 py-1.5 text-sm font-semibold",a&&"pl-8",e),...r}));sM.displayName=K0.displayName;const iM=y.forwardRef(({className:e,...a},r)=>c.jsx(W0,{ref:r,className:ie("-mx-1 my-1 h-px bg-muted",e),...a}));iM.displayName=W0.displayName;function lM({trigger:e,children:a,align:r="end",sideOffset:s,contentClassName:l,openDelay:d=60,closeDelay:u=140}){const[m,h]=y.useState(!1),g=y.useRef(void 0),b=()=>{g.current!==void 0&&(window.clearTimeout(g.current),g.current=void 0)},v=(C,x)=>{b(),g.current=window.setTimeout(()=>h(C),x)},S=()=>v(!0,d),T=()=>v(!1,u);return y.useEffect(()=>()=>b(),[]),c.jsxs(X0,{open:m,onOpenChange:h,children:[c.jsx(Q0,{asChild:!0,onMouseEnter:S,onMouseLeave:T,children:e}),c.jsx(of,{align:r,sideOffset:s,onMouseEnter:S,onMouseLeave:T,className:ie("nav-menu-anim",l),children:a})]})}const cM=[{value:"zh-CN",label:"中文"},{value:"en",label:"English"},{value:"ja",label:"日本語"},{value:"ko",label:"한국어"},{value:"fr",label:"Français"},{value:"de",label:"Deutsch"},{value:"es",label:"Español"}];function dM(){const{lang:e,setLang:a}=be();return c.jsx(lM,{contentClassName:"w-36",trigger:c.jsx(it,{variant:"ghost",size:"icon","aria-label":"Language",children:c.jsx(LR,{className:"h-4 w-4"})}),children:cM.map(({value:r,label:s})=>c.jsx(af,{onClick:()=>a(r),"data-active":e===r,children:s},r))})}const J0=xw,eS=ww,uM=Sw,tS=y.forwardRef(({className:e,...a},r)=>c.jsx(Cc,{ref:r,className:ie("fixed inset-0 z-50 bg-black/80 dialog-overlay-anim",e),...a}));tS.displayName=Cc.displayName;const nf=y.forwardRef(({className:e,children:a,...r},s)=>c.jsxs(uM,{children:[c.jsx(tS,{}),c.jsxs(kc,{ref:s,className:ie("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg dialog-content-anim sm:rounded-lg",e),...r,children:[a,c.jsxs(Cw,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[c.jsx(Lx,{className:"h-4 w-4"}),c.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));nf.displayName=kc.displayName;const oS=({className:e,...a})=>c.jsx("div",{className:ie("flex flex-col space-y-1.5 text-center sm:text-left",e),...a});oS.displayName="DialogHeader";const rf=y.forwardRef(({className:e,...a},r)=>c.jsx(Tc,{ref:r,className:ie("text-lg font-semibold leading-none tracking-tight",e),...a}));rf.displayName=Tc.displayName;const sf=y.forwardRef(({className:e,...a},r)=>c.jsx(Ec,{ref:r,className:ie("text-sm text-muted-foreground",e),...a}));sf.displayName=Ec.displayName;const po=y.forwardRef(({className:e,type:a,...r},s)=>c.jsx("input",{type:a,className:ie("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),ref:s,...r}));po.displayName="Input";const aS=[{titleKey:"docs.sidebar.gettingStarted",items:[{id:"installation",labelKey:"docs.sidebar.quickstart"},{id:"ssr",labelKey:"docs.sidebar.ssr"}]},{titleKey:"docs.sidebar.concepts",items:[{id:"modes",labelKey:"docs.sidebar.modes",items:[{id:"modes-component",labelKey:"docs.section.modes.componentTitle"},{id:"modes-imperative",labelKey:"docs.section.modes.imperativeTitle"},{id:"modes-wrapper",labelKey:"docs.section.modes.wrapperTitle"}]},{id:"theming",labelKey:"docs.sidebar.theming",items:[{id:"theming-default",labelKey:"docs.section.theming.defaultTitle"},{id:"theming-pattern",labelKey:"docs.section.theming.patternTitle"},{id:"theming-imperative",labelKey:"docs.section.theming.imperativeTitle"},{id:"theming-icons",labelKey:"docs.section.theming.iconsTitle"},{id:"theming-toolbar",labelKey:"docs.section.theming.toolbarTitle"}]}]},{titleKey:"docs.sidebar.props",items:[{id:"props",labelKey:"docs.section.props.title"},{id:"props-data",labelKey:"group.data"},{id:"props-preset",labelKey:"group.preset"},{id:"props-preset-bundles",labelKey:"docs.section.props.preset.title"},{id:"props-interface",labelKey:"group.interface"},{id:"props-controller",labelKey:"group.controller"},{id:"props-hotkey",labelKey:"group.hotkey"},{id:"props-animate",labelKey:"group.animate"},{id:"props-gesture",labelKey:"group.gesture"},{id:"props-lifecycle",labelKey:"group.lifecycle"},{id:"props-controlled",labelKey:"group.controlled"}]},{titleKey:"docs.sidebar.recipes",items:[{id:"examples",labelKey:"docs.sidebar.examples",items:[{id:"examples-single",labelKey:"docs.section.examples.singleTitle"},{id:"examples-gallery",labelKey:"docs.section.examples.galleryTitle"},{id:"examples-mobile",labelKey:"docs.section.examples.mobileTitle"},{id:"examples-controller",labelKey:"docs.section.examples.controllerTitle"},{id:"examples-cover",labelKey:"docs.section.examples.coverTitle"}]}]},{titleKey:"docs.sidebar.reference",items:[{id:"typescript",labelKey:"docs.sidebar.typescript"},{id:"migration",labelKey:"docs.sidebar.migration"},{id:"faq",labelKey:"docs.sidebar.faq",items:[{id:"faq-tailwind-shrink",labelKey:"docs.section.faq.tailwind-shrink.q"},{id:"faq-r19-imperative",labelKey:"docs.section.faq.r19-imperative.q"},{id:"faq-wrapper-empty",labelKey:"docs.section.faq.wrapper-empty.q"},{id:"faq-vite-esm",labelKey:"docs.section.faq.vite-esm.q"},{id:"faq-wrapper-dynamic",labelKey:"docs.section.faq.wrapper-dynamic.q"},{id:"faq-lazy-src",labelKey:"docs.section.faq.lazy-src.q"},{id:"faq-cover-vs-set",labelKey:"docs.section.faq.cover-vs-set.q"},{id:"faq-controlled-mismatch",labelKey:"docs.section.faq.controlled-mismatch.q"},{id:"faq-ssr",labelKey:"docs.section.faq.ssr.q"},{id:"faq-theme",labelKey:"docs.section.faq.theme.q"}]}]}];function nS(e,a){var r;return e.id===a||!!((r=e.items)!=null&&r.some(s=>nS(s,a)))}function rS({items:e,activeId:a,t:r,depth:s=0}){return c.jsx("ul",{className:ie(s===0?"space-y-1 border-l border-border/60":"mt-1 space-y-1"),children:e.map(l=>{const d=l.id===a,u=!d&&nS(l,a);return c.jsxs("li",{children:[c.jsx("a",{href:`#${l.id}`,className:ie("-ml-px block border-l-2 py-1 transition-colors",s===0?"px-3":"px-5 text-xs",d?"border-foreground text-foreground":u?"border-border text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),children:r(l.labelKey)}),l.items&&c.jsx(rS,{items:l.items,activeId:a,t:r,depth:s+1})]},l.id)})})}function pM({activeId:e}){const{t:a}=be();return c.jsx("nav",{className:"space-y-6 text-sm",children:aS.map(r=>c.jsxs("div",{children:[c.jsx("div",{className:"mb-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:a(r.titleKey)}),c.jsx(rS,{items:r.items,activeId:e,t:a})]},r.titleKey))})}function xe({id:e,level:a=2,children:r}){const s=`h${a}`;return c.jsxs(s,{id:e,className:"group scroll-mt-24 flex items-baseline gap-2",children:[c.jsx("span",{children:r}),c.jsx("a",{href:`#${e}`,"aria-label":"Anchor",className:"opacity-0 transition-opacity group-hover:opacity-60 hover:opacity-100",onClick:l=>{var d;l.preventDefault(),window.history.replaceState(null,"",`#${e}`),(d=document.getElementById(e))==null||d.scrollIntoView({behavior:"smooth",block:"start"})},children:c.jsx(BR,{className:"h-3.5 w-3.5"})})]})}var mM=Object.create,Pc=Object.defineProperty,fM=Object.defineProperties,hM=Object.getOwnPropertyDescriptor,gM=Object.getOwnPropertyDescriptors,sS=Object.getOwnPropertyNames,cc=Object.getOwnPropertySymbols,yM=Object.getPrototypeOf,lf=Object.prototype.hasOwnProperty,iS=Object.prototype.propertyIsEnumerable,Ev=(e,a,r)=>a in e?Pc(e,a,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[a]=r,Do=(e,a)=>{for(var r in a||(a={}))lf.call(a,r)&&Ev(e,r,a[r]);if(cc)for(var r of cc(a))iS.call(a,r)&&Ev(e,r,a[r]);return e},Zc=(e,a)=>fM(e,gM(a)),lS=(e,a)=>{var r={};for(var s in e)lf.call(e,s)&&a.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&cc)for(var s of cc(e))a.indexOf(s)<0&&iS.call(e,s)&&(r[s]=e[s]);return r},bM=(e,a)=>function(){return a||(0,e[sS(e)[0]])((a={exports:{}}).exports,a),a.exports},vM=(e,a)=>{for(var r in a)Pc(e,r,{get:a[r],enumerable:!0})},xM=(e,a,r,s)=>{if(a&&typeof a=="object"||typeof a=="function")for(let l of sS(a))!lf.call(e,l)&&l!==r&&Pc(e,l,{get:()=>a[l],enumerable:!(s=hM(a,l))||s.enumerable});return e},wM=(e,a,r)=>(r=e!=null?mM(yM(e)):{},xM(!e||!e.__esModule?Pc(r,"default",{value:e,enumerable:!0}):r,e)),SM=bM({"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,a){var r=(function(){var s=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,l=0,d={},u={util:{encode:function C(x){return x instanceof m?new m(x.type,C(x.content),x.alias):Array.isArray(x)?x.map(C):x.replace(/&/g,"&").replace(/"+j.content+""};function h(C,x,k,R){C.lastIndex=x;var j=C.exec(k);if(j&&R&&j[1]){var A=j[1].length;j.index+=A,j[0]=j[0].slice(A)}return j}function g(C,x,k,R,j,A){for(var M in k)if(!(!k.hasOwnProperty(M)||!k[M])){var q=k[M];q=Array.isArray(q)?q:[q];for(var Z=0;Z=A.reach);ue+=re.value.length,re=re.next){var O=re.value;if(x.length>C.length)return;if(!(O instanceof m)){var H=1,G;if(ne){if(G=h(pe,ue,C,ae),!G||G.index>=C.length)break;var K=G.index,Y=G.index+G[0].length,se=ue;for(se+=re.value.length;K>=se;)re=re.next,se+=re.value.length;if(se-=re.value.length,ue=se,re.value instanceof m)continue;for(var N=re;N!==x.tail&&(seA.reach&&(A.reach=he);var ye=re.prev;oe&&(ye=v(x,ye,oe),ue+=oe.length),S(x,ye,H);var Ke=new m(M,X?u.tokenize(ee,X):ee,te,ee);if(re=v(x,ye,Ke),fe&&v(x,re,fe),H>1){var we={cause:M+","+Z,reach:he};g(C,x,k,re.prev,ue,we),A&&we.reach>A.reach&&(A.reach=we.reach)}}}}}}function b(){var C={value:null,prev:null,next:null},x={value:null,prev:C,next:null};C.next=x,this.head=C,this.tail=x,this.length=0}function v(C,x,k){var R=x.next,j={value:k,prev:x,next:R};return x.next=j,R.prev=j,C.length++,j}function S(C,x,k){for(var R=x.next,j=0;j/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},$.languages.markup.tag.inside["attr-value"].inside.entity=$.languages.markup.entity,$.languages.markup.doctype.inside["internal-subset"].inside=$.languages.markup,$.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty($.languages.markup.tag,"addInlined",{value:function(e,s){var r={},r=(r["language-"+s]={pattern:/(^$)/i,lookbehind:!0,inside:$.languages[s]},r.cdata=/^$/i,{"included-cdata":{pattern://i,inside:r}}),s=(r["language-"+s]={pattern:/[\s\S]+/,inside:$.languages[s]},{});s[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:r},$.languages.insertBefore("markup","cdata",s)}}),Object.defineProperty($.languages.markup.tag,"addAttribute",{value:function(e,a){$.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[a,"language-"+a],inside:$.languages[a]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),$.languages.html=$.languages.markup,$.languages.mathml=$.languages.markup,$.languages.svg=$.languages.markup,$.languages.xml=$.languages.extend("markup",{}),$.languages.ssml=$.languages.xml,$.languages.atom=$.languages.xml,$.languages.rss=$.languages.xml,(function(e){var a={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},r=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,s="(?:[^\\\\-]|"+r.source+")",s=RegExp(s+"-"+s),l={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:r,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":a,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:r}},"special-escape":a,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":l}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:r,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},$.languages.javascript=$.languages.extend("clike",{"class-name":[$.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),$.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,$.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:$.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:$.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:$.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:$.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:$.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),$.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:$.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),$.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),$.languages.markup&&($.languages.markup.tag.addInlined("script","javascript"),$.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),$.languages.js=$.languages.javascript,$.languages.actionscript=$.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),$.languages.actionscript["class-name"].alias="function",delete $.languages.actionscript.parameter,delete $.languages.actionscript["literal-property"],$.languages.markup&&$.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:$.languages.markup}}),(function(e){var a=/#(?!\{).+/,r={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:a,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:r}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:a,interpolation:r}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:r}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript})($),(function(e){var a=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(r,s){(r=typeof r=="string"?[r]:r).forEach(function(l){var d=function(v){v.inside||(v.inside={}),v.inside.rest=s},u="doc-comment";if(m=e.languages[l]){var m,h=m[u];if((h=h||(m=e.languages.insertBefore(l,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[u])instanceof RegExp&&(h=m[u]={pattern:h}),Array.isArray(h))for(var g=0,b=h.length;g|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})})($),(function(e){var a=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,s="(?:"+r.source+"(?:[ ]+"+a.source+")?|"+a.source+"(?:[ ]+"+r.source+")?)",l=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),d=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function u(m,h){h=(h||"").replace(/m/g,"")+"m";var g=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return s}).replace(/<>/g,function(){return m});return RegExp(g,h)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return s})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return s}).replace(/<>/g,function(){return"(?:"+l+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:u(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:u(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:u(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:u(d),lookbehind:!0,greedy:!0},number:{pattern:u(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:r,important:a,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml})($),(function(e){var a=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function r(g){return g=g.replace(//g,function(){return a}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+g+")")}var s=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,l=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return s}),d=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,u=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+l+d+"(?:"+l+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+l+d+")(?:"+l+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(s),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+l+")"+d+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+l+"$"),inside:{"table-header":{pattern:RegExp(s),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:r(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:r(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:r(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:r(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(g){["url","bold","italic","strike","code-snippet"].forEach(function(b){g!==b&&(e.languages.markdown[g].inside.content.inside[b]=e.languages.markdown[b])})}),e.hooks.add("after-tokenize",function(g){g.language!=="markdown"&&g.language!=="md"||(function b(v){if(v&&typeof v!="string")for(var S=0,T=v.length;S",quot:'"'},h=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown})($),$.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:$.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},$.hooks.add("after-tokenize",function(e){if(e.language==="graphql")for(var a=e.tokens.filter(function(C){return typeof C!="string"&&C.type!=="comment"&&C.type!=="scalar"}),r=0;r?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},(function(e){var a=e.languages.javascript["template-string"],r=a.pattern.source,s=a.inside.interpolation,l=s.inside["interpolation-punctuation"],d=s.pattern.source;function u(v,S){if(e.languages[v])return{pattern:RegExp("((?:"+S+")\\s*)"+r),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:v}}}}function m(v,S,T){return v={code:v,grammar:S,language:T},e.hooks.run("before-tokenize",v),v.tokens=e.tokenize(v.code,v.grammar),e.hooks.run("after-tokenize",v),v.tokens}function h(v,S,T){var k=e.tokenize(v,{interpolation:{pattern:RegExp(d),lookbehind:!0}}),C=0,x={},k=m(k.map(function(j){if(typeof j=="string")return j;for(var A,M,j=j.content;v.indexOf((M=C++,A="___"+T.toUpperCase()+"_"+M+"___"))!==-1;);return x[A]=j,A}).join(""),S,T),R=Object.keys(x);return C=0,(function j(A){for(var M=0;M=R.length)return;var q,Z,B,X,ae,ne,te,J=A[M];typeof J=="string"||typeof J.content=="string"?(q=R[C],(te=(ne=typeof J=="string"?J:J.content).indexOf(q))!==-1&&(++C,Z=ne.substring(0,te),ae=x[q],B=void 0,(X={})["interpolation-punctuation"]=l,(X=e.tokenize(ae,X)).length===3&&((B=[1,1]).push.apply(B,m(X[1],e.languages.javascript,"javascript")),X.splice.apply(X,B)),B=new e.Token("interpolation",X,s.alias,ae),X=ne.substring(te+q.length),ae=[],Z&&ae.push(Z),ae.push(B),X&&(j(ne=[X]),ae.push.apply(ae,ne)),typeof J=="string"?(A.splice.apply(A,[M,1].concat(ae)),M+=ae.length-1):J.content=ae)):(te=J.content,Array.isArray(te)?j(te):j([te]))}})(k),new e.Token(T,k,"language-"+T,v)}e.languages.javascript["template-string"]=[u("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),u("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),u("svg",/\bsvg/.source),u("markdown",/\b(?:markdown|md)/.source),u("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),u("sql",/\bsql/.source),a].filter(Boolean);var g={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function b(v){return typeof v=="string"?v:Array.isArray(v)?v.map(b).join(""):b(v.content)}e.hooks.add("after-tokenize",function(v){v.language in g&&(function S(T){for(var C=0,x=T.length;C]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var a=e.languages.extend("typescript",{});delete a["class-name"],e.languages.typescript["class-name"].inside=a,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:a}}}}),e.languages.ts=e.languages.typescript})($),(function(e){var a=e.languages.javascript,r=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,s="(@(?:arg|argument|param|property)\\s+(?:"+r+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(s+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(s+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(//g,function(){return r})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+r),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)})($),(function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})})($),$.languages.n4js=$.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),$.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),$.languages.n4jsd=$.languages.n4js,(function(e){function a(u,m){return RegExp(u.replace(//g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),m)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:a(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:a(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:a(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var r=["function","function-variable","method","method-variable","property-access"],s=0;s*\.{3}(?:[^{}]|)*\})/.source;function d(h,g){return h=h.replace(//g,function(){return r}).replace(//g,function(){return s}).replace(//g,function(){return l}),RegExp(h,g)}l=d(l).source,e.languages.jsx=e.languages.extend("markup",a),e.languages.jsx.tag.pattern=d(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=a.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:d(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:d(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);function u(h){for(var g=[],b=0;b"&&g.push({tagName:m(v.content[0].content[1]),openedBraces:0}):0]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},$.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=$.languages.swift}),(function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var a={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:a},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:a},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin})($),$.languages.c=$.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),$.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),$.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},$.languages.c.string],char:$.languages.c.char,comment:$.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:$.languages.c}}}}),$.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete $.languages.c.boolean,$.languages.objectivec=$.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete $.languages.objectivec["class-name"],$.languages.objc=$.languages.objectivec,$.languages.reason=$.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),$.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete $.languages.reason.function,(function(e){for(var a=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,r=0;r<2;r++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return/[^\s\S]/.source}),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string})($),$.languages.go=$.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),$.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete $.languages.go["class-name"],(function(e){var a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return r})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])})($),$.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},$.languages.python["string-interpolation"].inside.interpolation.inside.rest=$.languages.python,$.languages.py=$.languages.python,$.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},$.languages.webmanifest=$.languages.json;var cm={};vM(cm,{dracula:()=>kM,duotoneDark:()=>EM,duotoneLight:()=>jM,github:()=>NM,gruvboxMaterialDark:()=>rD,gruvboxMaterialLight:()=>iD,jettwaveDark:()=>XM,jettwaveLight:()=>JM,nightOwl:()=>MM,nightOwlLight:()=>_M,oceanicNext:()=>LM,okaidia:()=>ZM,oneDark:()=>tD,oneLight:()=>aD,palenight:()=>IM,shadesOfPurple:()=>FM,synthwave84:()=>UM,ultramin:()=>GM,vsDark:()=>cS,vsLight:()=>$M});var CM={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},kM=CM,TM={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},EM=TM,RM={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},jM=RM,AM={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},NM=AM,zM={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},MM=zM,DM={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},_M=DM,Ut={char:"#D8DEE9",comment:"#999999",keyword:"#c5a5c5",primitive:"#5a9bcf",string:"#8dc891",variable:"#d7deea",boolean:"#ff8b50",tag:"#fc929e",function:"#79b6f2",className:"#FAC863"},OM={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:Ut.keyword}},{types:["attr-value"],style:{color:Ut.string}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:Ut.comment}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:Ut.primitive}},{types:["boolean"],style:{color:Ut.boolean}},{types:["tag"],style:{color:Ut.tag}},{types:["string"],style:{color:Ut.string}},{types:["punctuation"],style:{color:Ut.string}},{types:["selector","char","builtin","inserted"],style:{color:Ut.char}},{types:["function"],style:{color:Ut.function}},{types:["operator","entity","url","variable"],style:{color:Ut.variable}},{types:["keyword"],style:{color:Ut.keyword}},{types:["atrule","class-name"],style:{color:Ut.className}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},LM=OM,PM={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},ZM=PM,BM={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},IM=BM,qM={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},FM=qM,KM={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},UM=KM,HM={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},GM=HM,VM={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},cS=VM,WM={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},$M=WM,YM={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},XM=YM,QM={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},JM=QM,eD={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},tD=eD,oD={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},aD=oD,nD={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},rD=nD,sD={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},iD=sD,lD=e=>y.useCallback(a=>{var r=a,{className:s,style:l,line:d}=r,u=lS(r,["className","style","line"]);const m=Zc(Do({},u),{className:yc("token-line",s)});return typeof e=="object"&&"plain"in e&&(m.style=e.plain),typeof l=="object"&&(m.style=Do(Do({},m.style||{}),l)),m},[e]),cD=e=>{const a=y.useCallback(({types:r,empty:s})=>{if(e!=null){{if(r.length===1&&r[0]==="plain")return s!=null?{display:"inline-block"}:void 0;if(r.length===1&&s!=null)return e[r[0]]}return Object.assign(s!=null?{display:"inline-block"}:{},...r.map(l=>e[l]))}},[e]);return y.useCallback(r=>{var s=r,{token:l,className:d,style:u}=s,m=lS(s,["token","className","style"]);const h=Zc(Do({},m),{className:yc("token",...l.types,d),children:l.content,style:a(l)});return u!=null&&(h.style=Do(Do({},h.style||{}),u)),h},[a])},dD=/\r\n|\r|\n/,Rv=e=>{e.length===0?e.push({types:["plain"],content:` +`,empty:!0}):e.length===1&&e[0].content===""&&(e[0].content=` +`,e[0].empty=!0)},jv=(e,a)=>{const r=e.length;return r>0&&e[r-1]===a?e:e.concat(a)},uD=e=>{const a=[[]],r=[e],s=[0],l=[e.length];let d=0,u=0,m=[];const h=[m];for(;u>-1;){for(;(d=s[u]++)0?b:["plain"],g=S):(b=jv(b,S.type),S.alias&&(b=jv(b,S.alias)),g=S.content),typeof g!="string"){u++,a.push(b),r.push(g),s.push(0),l.push(g.length);continue}const T=g.split(dD),C=T.length;m.push({types:b,content:T[0]});for(let x=1;xy.useMemo(()=>{if(r==null)return Av([a]);const l={code:a,grammar:r,language:s,tokens:[]};return e.hooks.run("before-tokenize",l),l.tokens=e.tokenize(a,r),e.hooks.run("after-tokenize",l),Av(l.tokens)},[a,r,s,e]),mD=(e,a)=>{const{plain:r}=e,s=e.styles.reduce((l,d)=>{const{languages:u,style:m}=d;return u&&!u.includes(a)||d.types.forEach(h=>{const g=Do(Do({},l[h]),m);l[h]=g}),l},{});return s.root=r,s.plain=Zc(Do({},r),{backgroundColor:void 0}),s},fD=mD,hD=({children:e,language:a,code:r,theme:s,prism:l})=>{const d=a.toLowerCase(),u=fD(s,d),m=lD(u),h=cD(u),g=l.languages[d],b=pD({prism:l,language:d,code:r,grammar:g});return e({tokens:b,className:`prism-code language-${d}`,style:u!=null?u.root:{},getLineProps:m,getTokenProps:h})},gD=e=>y.createElement(hD,Zc(Do({},e),{prism:e.prism||$,theme:e.theme||cS,code:e.code,language:e.language}));/*! Bundled license information: + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + *) +*/function Bc(e=1500){const[a,r]=y.useState(!1),[s,l]=y.useState(""),d=y.useRef(void 0),u=y.useCallback(()=>{d.current!==void 0&&(window.clearTimeout(d.current),d.current=void 0)},[]),m=y.useCallback(()=>{u(),r(!1),l("")},[u]),h=y.useCallback(async g=>{try{return await navigator.clipboard.writeText(g),r(!0),l(""),u(),d.current=window.setTimeout(()=>r(!1),e),!0}catch(b){return r(!1),l(b instanceof Error?b.message:"Clipboard write failed"),!1}},[u,e]);return y.useEffect(()=>u,[u]),{copied:a,error:s,copy:h,reset:m}}function Me({code:e,language:a="tsx",showCopy:r=!0,actions:s,className:l,preClassName:d}){const{resolved:u}=Am(),{copied:m,copy:h}=Bc(),g=()=>{h(e)},b=u==="dark"?cm.vsDark:cm.vsLight;return c.jsxs("div",{className:ie("relative flex min-w-0 max-w-full flex-col overflow-hidden rounded-lg border border-border bg-muted/40",l),children:[(s||r)&&c.jsxs("div",{className:"absolute right-2 top-2 z-10 flex items-center gap-2",children:[s,r&&c.jsx(it,{size:"icon",variant:"ghost",onClick:g,className:"h-7 w-7 opacity-70 hover:opacity-100","aria-label":"Copy code",children:m?c.jsx(Ha,{className:"h-3.5 w-3.5"}):c.jsx($s,{className:"h-3.5 w-3.5"})})]}),c.jsx(gD,{code:e.trim(),language:a,theme:b,children:({className:v,style:S,tokens:T,getLineProps:C,getTokenProps:x})=>c.jsx("pre",{className:ie(v,"code-block-scroll m-0 min-w-0 max-w-full flex-1 overflow-auto p-4 font-mono text-sm leading-6",d),style:{...S,backgroundColor:"transparent",background:"transparent"},children:T.map((k,R)=>c.jsx("div",{...C({line:k}),children:k.map((j,A)=>c.jsx("span",{...x({token:j})},A))},R))})})]})}const dS=["tailwind-shrink","r19-imperative","wrapper-empty","vite-esm","wrapper-dynamic","lazy-src","cover-vs-set","controlled-mismatch","ssr","theme"];function yD(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"faq",children:e("docs.section.faq.title")}),c.jsxs("div",{className:"space-y-6",children:[c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-tailwind-shrink",level:3,children:e("docs.section.faq.tailwind-shrink.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.tailwind-shrink.a")}),c.jsx(Me,{code:`/* The culprit, often shipped by Tailwind preflight / normalize.css */ +img { max-width: 100%; height: auto; }`,language:"css"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-r19-imperative",level:3,children:e("docs.section.faq.r19-imperative.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.r19-imperative.a")}),c.jsx(Me,{code:`// 1.1.2+ — browsing() returns a stable destructor +const close = Zmage.browsing({ src: 'hero.jpg' }) +// later: +close?.()`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-wrapper-empty",level:3,children:e("docs.section.faq.wrapper-empty.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.wrapper-empty.a")})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-vite-esm",level:3,children:e("docs.section.faq.vite-esm.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.vite-esm.a")})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-wrapper-dynamic",level:3,children:e("docs.section.faq.wrapper-dynamic.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.wrapper-dynamic.a")}),c.jsx(Me,{code:`// Bind imperatively from your own click handler instead of relying on Wrapper +function onImgClick (e: React.MouseEvent) { + const img = e.currentTarget + Zmage.browsing({ src: img.src, alt: img.alt }) +}`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-lazy-src",level:3,children:e("docs.section.faq.lazy-src.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.lazy-src.a")}),c.jsx(Me,{code:`// Pass the real URL via set; the cover src can stay as the placeholder. + + +// Or imperatively, from your own click handler: +Zmage.browsing({ src: realUrl })`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-cover-vs-set",level:3,children:e("docs.section.faq.cover-vs-set.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.cover-vs-set.a")}),c.jsx(Me,{code:`// Cover stays as the thumbnail; set carries the high-resolution viewer image. +`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-controlled-mismatch",level:3,children:e("docs.section.faq.controlled-mismatch.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.controlled-mismatch.a")}),c.jsx(Me,{code:`const [open, setOpen] = React.useState(false) +// Always pair browsing with onBrowsing — internal state otherwise drifts. +`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-ssr",level:3,children:e("docs.section.faq.ssr.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.ssr.a")}),c.jsx(Me,{code:`import Zmage from 'react-zmage/ssr' +import 'react-zmage/style.css' + +// If you need the imperative API in shared code: +if (typeof window !== 'undefined') { + Zmage.browsing({ src: 'hero.jpg' }) +}`,language:"tsx"})]}),c.jsxs("div",{className:"space-y-2",children:[c.jsx(xe,{id:"faq-theme",level:3,children:e("docs.section.faq.theme.q")}),c.jsx("p",{className:"text-muted-foreground",children:e("docs.section.faq.theme.a")})]})]}),c.jsx("span",{className:"hidden",children:dS.join(",")})]})}const uS="auto",aa={preset:uS,hideOnScroll:!0,coverVisible:!1,backdrop:"#FFFFFF",zIndex:1e3,loop:!0,hideOnDblClick:!1,loadingDelay:200},pS={desktop:{radius:8,edge:16,controller:{pagination:!0,rotate:!0,zoom:!0,download:!1,close:!0,flip:!0,placement:"top-right",layout:{pagination:{inset:24},caption:{inset:60}}},hotKey:{close:!0,zoom:!0,flip:!0,rotate:!0,download:!1},animate:{browsing:!0,flip:"crossFade",cover:{objectFit:!0,clip:!0,radius:!0},slowMotion:!1},gesture:{swipe:!1,dragExit:!1,wheelZoom:{step:.12,smooth:!0,minScale:"fit",maxScale:4,center:"pointer",reverse:!1,exitGuardDuration:1e3},pinchZoom:!1,doubleTapZoom:!1,touchAction:"managed"}},mobile:{radius:0,edge:0,controller:{pagination:!0,rotate:!1,zoom:!1,download:!1,close:!0,flip:!1,placement:"top-right"},hotKey:{close:!1,zoom:!1,flip:!1,rotate:!1,download:!1},animate:{browsing:!0,flip:"swipe",cover:{objectFit:!0,clip:!0,radius:!0},slowMotion:!1},gesture:{swipe:{threshold:120,velocity:.35,axisLock:1.2,resistance:.35},dragExit:{threshold:80,velocity:.35,axisLock:1.2,opacity:!0},wheelZoom:!1,pinchZoom:{minScale:"fit",maxScale:4,resetBelowFit:!0,center:"gesture"},doubleTapZoom:{scale:1,minScale:"fit",maxScale:4,center:"tap",interval:300,distance:32},touchAction:"managed"}}},bD=e=>{const a=e||uS;return a==="mobile"?"mobile":a==="desktop"||typeof window>"u"||typeof window.matchMedia!="function"?"desktop":window.matchMedia("(pointer: coarse) and (hover: none)").matches?"mobile":"desktop"},cf=e=>pS[bD(e)],vr=cf(aa.preset),da=[{name:"src",group:"data",default:"",required:!0,control:{kind:"text"},i18n:{labelKey:"param.src.label",descKey:"param.src.desc"}},{name:"alt",group:"data",default:"",control:{kind:"text"},i18n:{labelKey:"param.alt.label",descKey:"param.alt.desc"}},{name:"caption",group:"data",default:"",control:{kind:"text"},i18n:{labelKey:"param.caption.label",descKey:"param.caption.desc"}},{name:"set",group:"data",default:[],control:{kind:"object",component:"set"},i18n:{labelKey:"param.set.label",descKey:"param.set.desc"}},{name:"defaultPage",group:"data",default:0,control:{kind:"number"},i18n:{labelKey:"param.defaultPage.label",descKey:"param.defaultPage.desc"}},{name:"preset",group:"preset",default:aa.preset,control:{kind:"segmented",options:[{value:"auto",labelKey:"preset.auto"},{value:"desktop",labelKey:"preset.desktop"},{value:"mobile",labelKey:"preset.mobile"}]},i18n:{labelKey:"param.preset.label",descKey:"param.preset.desc"}},{name:"backdrop",group:"interface",default:aa.backdrop,control:{kind:"color"},i18n:{labelKey:"param.backdrop.label",descKey:"param.backdrop.desc"}},{name:"zIndex",group:"interface",default:aa.zIndex,control:{kind:"number"},i18n:{labelKey:"param.zIndex.label",descKey:"param.zIndex.desc"}},{name:"portalTarget",group:"interface",default:void 0,defaultDisplay:"document.body",docsOnly:!0,control:{kind:"readonly",type:"HTMLElement | null"},i18n:{labelKey:"param.portalTarget.label",descKey:"param.portalTarget.desc"}},{name:"radius",group:"interface",default:vr.radius,control:{kind:"slider",min:0,max:32,step:1},i18n:{labelKey:"param.radius.label",descKey:"param.radius.desc"}},{name:"edge",group:"interface",default:vr.edge,control:{kind:"slider",min:0,max:64,step:1},i18n:{labelKey:"param.edge.label",descKey:"param.edge.desc"}},{name:"loop",group:"interface",default:aa.loop,control:{kind:"switch"},i18n:{labelKey:"param.loop.label",descKey:"param.loop.desc"}},{name:"hideOnScroll",group:"interface",default:aa.hideOnScroll,presetScope:"desktop",control:{kind:"switch"},i18n:{labelKey:"param.hideOnScroll.label",descKey:"param.hideOnScroll.desc"}},{name:"hideOnDblClick",group:"interface",default:aa.hideOnDblClick,control:{kind:"switch"},i18n:{labelKey:"param.hideOnDblClick.label",descKey:"param.hideOnDblClick.desc"}},{name:"coverVisible",group:"interface",default:aa.coverVisible,presetScope:"desktop",control:{kind:"switch"},i18n:{labelKey:"param.coverVisible.label",descKey:"param.coverVisible.desc"}},{name:"loadingDelay",group:"interface",default:aa.loadingDelay,control:{kind:"slider",min:0,max:1e3,step:50},i18n:{labelKey:"param.loadingDelay.label",descKey:"param.loadingDelay.desc"}},{name:"controller",group:"controller",default:vr.controller,control:{kind:"object",component:"controller"},i18n:{labelKey:"param.controller.label",descKey:"param.controller.desc"}},{name:"hotKey",group:"hotkey",default:vr.hotKey,control:{kind:"object",component:"hotkey"},i18n:{labelKey:"param.hotKey.label",descKey:"param.hotKey.desc"}},{name:"animate",group:"animate",default:vr.animate,control:{kind:"object",component:"animate"},i18n:{labelKey:"param.animate.label",descKey:"param.animate.desc"}},{name:"gesture",group:"gesture",default:vr.gesture,control:{kind:"object",component:"gesture"},i18n:{labelKey:"param.gesture.label",descKey:"param.gesture.desc"}},{name:"onBrowsing",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onBrowsing"]},i18n:{labelKey:"param.onBrowsing.label",descKey:"param.onBrowsing.desc"}},{name:"onZooming",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onZooming"]},i18n:{labelKey:"param.onZooming.label",descKey:"param.onZooming.desc"}},{name:"onSwitching",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onSwitching"]},i18n:{labelKey:"param.onSwitching.label",descKey:"param.onSwitching.desc"}},{name:"onRotating",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onRotating"]},i18n:{labelKey:"param.onRotating.label",descKey:"param.onRotating.desc"}},{name:"onError",group:"lifecycle",default:void 0,control:{kind:"callback",events:["onError"]},i18n:{labelKey:"param.onError.label",descKey:"param.onError.desc"}},{name:"browsing",group:"controlled",default:void 0,control:{kind:"switch"},i18n:{labelKey:"param.browsing.label",descKey:"param.browsing.desc"}}],vD=typeof navigator<"u"&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent||""),xD=vD?"⌘K":"Ctrl+K",wD=[{parent:"controller",leaf:"pagination",labelKey:"controller.pagination",descKey:"controller.pagination.desc"},{parent:"controller",leaf:"rotate",labelKey:"controller.rotate",descKey:"controller.rotate.desc"},{parent:"controller",leaf:"rotateLeft",labelKey:"controller.rotateLeft",descKey:"controller.rotateLeft.desc"},{parent:"controller",leaf:"rotateRight",labelKey:"controller.rotateRight",descKey:"controller.rotateRight.desc"},{parent:"controller",leaf:"zoom",labelKey:"controller.zoom",descKey:"controller.zoom.desc"},{parent:"controller",leaf:"download",labelKey:"controller.download",descKey:"controller.download.desc"},{parent:"controller",leaf:"close",labelKey:"controller.close",descKey:"controller.close.desc"},{parent:"controller",leaf:"flip",labelKey:"controller.flip",descKey:"controller.flip.desc"},{parent:"controller",leaf:"flipLeft",labelKey:"controller.flipLeft",descKey:"controller.flipLeft.desc"},{parent:"controller",leaf:"flipRight",labelKey:"controller.flipRight",descKey:"controller.flipRight.desc"},{parent:"controller",leaf:"backdrop",labelKey:"controller.backdrop",descKey:"controller.backdrop.desc"},{parent:"controller",leaf:"color",labelKey:"controller.color",descKey:"controller.color.desc"},{parent:"controller",leaf:"placement",labelKey:"controller.placement",descKey:"controller.placement.desc"},{parent:"controller",leaf:"render",labelKey:"controller.render",descKey:"controller.render.desc"},{parent:"hotkey",leaf:"close",labelKey:"hotkey.close",descKey:"hotkey.close.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"zoom",labelKey:"hotkey.zoom",descKey:"hotkey.zoom.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"flip",labelKey:"hotkey.flip",descKey:"hotkey.flip.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"flipLeft",labelKey:"hotkey.flipLeft",descKey:"hotkey.flipLeft.desc",parentDisplay:"hotKey"},{parent:"hotkey",leaf:"flipRight",labelKey:"hotkey.flipRight",descKey:"hotkey.flipRight.desc",parentDisplay:"hotKey"},{parent:"animate",leaf:"browsing",labelKey:"animate.browsing.desc",descKey:"animate.browsing.desc"},{parent:"animate",leaf:"flip",labelKey:"animate.flip.desc",descKey:"animate.flip.desc"},{parent:"animate",leaf:"cover",labelKey:"animate.cover.desc",descKey:"animate.cover.desc"},{parent:"animate",leaf:"fade",labelKey:"animate.flip.fade",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"crossFade",labelKey:"animate.flip.crossFade",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"swipe",labelKey:"animate.flip.swipe",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"zoom",labelKey:"animate.flip.zoom",descKey:"animate.flip.desc",isValue:!0},{parent:"animate",leaf:"blur",labelKey:"animate.flip.blur",descKey:"animate.flip.desc",isValue:!0},{parent:"gesture",leaf:"swipe",labelKey:"gesture.swipe",descKey:"gesture.swipe.desc"},{parent:"gesture",leaf:"dragExit",labelKey:"gesture.dragExit",descKey:"gesture.dragExit.desc"},{parent:"gesture",leaf:"wheelZoom",labelKey:"gesture.wheelZoom",descKey:"gesture.wheelZoom.desc"},{parent:"gesture",leaf:"pinchZoom",labelKey:"gesture.pinchZoom",descKey:"gesture.pinchZoom.desc"},{parent:"gesture",leaf:"doubleTapZoom",labelKey:"gesture.doubleTapZoom",descKey:"gesture.doubleTapZoom.desc"},{parent:"gesture",leaf:"touchAction",labelKey:"gesture.touchAction",descKey:"gesture.touchAction.desc"},{parent:"gesture",leaf:"threshold",labelKey:"gesture.threshold",descKey:"gesture.threshold.desc"},{parent:"gesture",leaf:"velocity",labelKey:"gesture.velocity",descKey:"gesture.velocity.desc"},{parent:"gesture",leaf:"axisLock",labelKey:"gesture.axisLock",descKey:"gesture.axisLock.desc"},{parent:"gesture",leaf:"resistance",labelKey:"gesture.resistance",descKey:"gesture.resistance.desc"},{parent:"gesture",leaf:"opacity",labelKey:"gesture.opacity",descKey:"gesture.opacity.desc"},{parent:"gesture",leaf:"step",labelKey:"gesture.wheelZoom.step",descKey:"gesture.wheelZoom.step.desc"},{parent:"gesture",leaf:"smooth",labelKey:"gesture.wheelZoom.smooth",descKey:"gesture.wheelZoom.smooth.desc"},{parent:"gesture",leaf:"minScale",labelKey:"gesture.wheelZoom.minScale",descKey:"gesture.wheelZoom.minScale.desc"},{parent:"gesture",leaf:"maxScale",labelKey:"gesture.wheelZoom.maxScale",descKey:"gesture.wheelZoom.maxScale.desc"},{parent:"gesture",leaf:"center",labelKey:"gesture.wheelZoom.center",descKey:"gesture.wheelZoom.center.desc"},{parent:"gesture",leaf:"reverse",labelKey:"gesture.wheelZoom.reverse",descKey:"gesture.wheelZoom.reverse.desc"},{parent:"gesture",leaf:"exitGuardDuration",labelKey:"gesture.wheelZoom.exitGuardDuration",descKey:"gesture.wheelZoom.exitGuardDuration.desc"},{parent:"gesture",leaf:"resetBelowFit",labelKey:"gesture.pinchZoom.resetBelowFit",descKey:"gesture.pinchZoom.resetBelowFit.desc"},{parent:"gesture",leaf:"scale",labelKey:"gesture.doubleTapZoom.scale",descKey:"gesture.doubleTapZoom.scale.desc"},{parent:"gesture",leaf:"interval",labelKey:"gesture.doubleTapZoom.interval",descKey:"gesture.doubleTapZoom.interval.desc"},{parent:"gesture",leaf:"distance",labelKey:"gesture.doubleTapZoom.distance",descKey:"gesture.doubleTapZoom.distance.desc"}],SD={installation:"docs.search.desc.installation",ssr:"docs.search.desc.ssr",modes:"docs.search.desc.modes","modes-component":"modes.component.desc","modes-imperative":"modes.imperative.desc","modes-wrapper":"modes.wrapper.desc",theming:"docs.search.desc.theming","props-data":"docs.search.desc.propsData","props-preset":"docs.search.desc.propsPreset","props-preset-bundles":"docs.search.desc.propsPresetBundles","props-interface":"docs.search.desc.propsInterface","props-controller":"docs.search.desc.propsController","props-hotkey":"docs.search.desc.propsHotkey","props-animate":"docs.search.desc.propsAnimate","props-gesture":"docs.search.desc.propsGesture","props-lifecycle":"docs.search.desc.propsLifecycle","props-controlled":"docs.search.desc.propsControlled",examples:"docs.search.desc.examples",typescript:"docs.search.desc.typescript",migration:"docs.search.desc.migration",faq:"docs.search.desc.faq"};function CD(e){const a=[];for(const l of aS)mS(a,l.items,e,e(l.titleKey));const r=e("docs.sidebar.props");for(const l of da)a.push({id:`prop-${l.name}`,label:l.name,desc:e(l.i18n.descKey),href:`/docs#props-${l.group}`,group:r});for(const l of wD){const d=l.parentDisplay??l.parent,u=e(l.labelKey),m=l.descKey?e(l.descKey):"",h=l.isValue?`${d}.flip = "${l.leaf}"`:`${d}.${l.leaf}`,g=m&&m!==u?`${u} — ${m}`:u;a.push({id:`sub-${l.parent}-${l.leaf}${l.isValue?"-value":""}`,label:h,desc:g,href:`/docs#props-${l.parent}`,group:r})}const s=e("docs.sidebar.faq");for(const l of dS)a.push({id:`faq-${l}`,label:e(`docs.section.faq.${l}.q`),desc:e(`docs.section.faq.${l}.a`),href:`/docs#faq-${l}`,group:s});return a}function kD(e,a,r){const s=e.toLowerCase(),l=a.toLowerCase(),d=r.toLowerCase();if(l.includes(s))return 200-l.indexOf(s);if(d&&d.includes(s))return 100-Math.min(d.indexOf(s),99);let u=0,m=0;for(const h of l)if(h===s[m]&&(u+=1,m+=1,m>=s.length))break;return m===s.length?u:0}function mS(e,a,r,s){for(const l of a){const d=SD[l.id];e.push({id:l.id,label:r(l.labelKey),desc:d?r(d):"",href:`/docs#${l.id}`,group:s}),l.items&&mS(e,l.items,r,s)}}function TD(){const{t:e}=be(),[a,r]=y.useState(!1),[s,l]=y.useState(""),d=bx(),u=y.useMemo(()=>CD(e),[e]),m=y.useMemo(()=>s.trim()?u.map(h=>({it:h,s:kD(s,h.label,h.desc)})).filter(h=>h.s>0).sort((h,g)=>g.s-h.s).slice(0,12).map(h=>h.it):u.slice(0,12),[s,u]);return y.useEffect(()=>{const h=g=>{(g.metaKey||g.ctrlKey)&&g.key.toLowerCase()==="k"&&(g.preventDefault(),r(b=>!b))};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[]),c.jsxs(J0,{open:a,onOpenChange:r,children:[c.jsx(eS,{asChild:!0,children:c.jsxs(it,{variant:"outline",size:"sm",className:"hidden gap-2 text-muted-foreground sm:inline-flex",children:[c.jsx($b,{className:"h-3.5 w-3.5"}),c.jsx("span",{children:e("docs.search.placeholder")}),c.jsx("span",{className:"ml-auto rounded border border-border bg-background px-1.5 font-mono text-[10px]",children:xD})]})}),c.jsxs(nf,{className:"max-w-xl gap-0 p-0",children:[c.jsx(rf,{className:"sr-only",children:e("docs.search.placeholder")}),c.jsx(sf,{className:"sr-only",children:e("docs.search.placeholder")}),c.jsxs("div",{className:"flex h-12 items-center gap-2 border-b border-border px-4 pr-12",children:[c.jsx($b,{className:"h-4 w-4 shrink-0 text-muted-foreground"}),c.jsx(po,{autoFocus:!0,value:s,onChange:h=>l(h.target.value),placeholder:e("docs.search.placeholder"),className:"border-0 bg-transparent px-0 shadow-none focus-visible:outline-none focus-visible:ring-0"})]}),c.jsx("ul",{className:"max-h-96 overflow-y-auto p-2",children:m.length===0?c.jsx("li",{className:"p-3 text-sm text-muted-foreground",children:e("docs.search.empty")}):m.map(h=>c.jsx("li",{children:c.jsxs("button",{className:"group flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left transition-colors hover:bg-accent",onClick:()=>{r(!1),d(h.href)},children:[c.jsxs("div",{className:"min-w-0 flex-1",children:[c.jsx("div",{className:"text-sm font-medium text-foreground",children:h.label}),h.desc&&c.jsx("div",{className:"mt-0.5 truncate text-xs text-muted-foreground",children:h.desc})]}),c.jsx("span",{className:"shrink-0 self-center rounded border border-border bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground",children:h.group})]})},h.id))})]})]})}const Nv=[{to:"/playground",key:"nav.playground"},{to:"/docs",key:"nav.docs"},{to:"/ai",key:"nav.ai"}];function ED(){const{t:e}=be();return c.jsx("header",{className:"fixed inset-x-0 top-0 z-50 h-14 border-b border-border/60 bg-background/70 backdrop-blur-md",children:c.jsxs("div",{className:"mx-auto flex h-full max-w-7xl items-center gap-4 px-4 sm:px-6",children:[c.jsxs(st,{to:"/",className:"flex items-center gap-2.5",children:[c.jsx("img",{src:"/logo.png",alt:"",className:"h-7 w-7"}),c.jsx("span",{className:"text-lg font-bold tracking-tight font-sans",children:"react-zmage"})]}),c.jsx(Aw,{orientation:"vertical",className:"hidden h-5 md:block ml-2 sm:ml-3"}),c.jsx("nav",{className:"hidden flex-1 items-center gap-1 md:flex",children:Nv.map(({to:a,key:r})=>c.jsx(Jp,{to:a,className:({isActive:s})=>ie("rounded-md px-3 py-1.5 text-sm transition-colors",s?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e(r)},a))}),c.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[c.jsx(TD,{}),c.jsx(dM,{}),c.jsx(CN,{}),c.jsx(it,{variant:"ghost",size:"icon",asChild:!0,"aria-label":e("nav.github"),children:c.jsx("a",{href:"https://github.com/Caldis/react-zmage",target:"_blank",rel:"noreferrer",children:c.jsx(_x,{className:"h-4 w-4"})})}),c.jsxs(mN,{children:[c.jsx(fN,{asChild:!0,children:c.jsx(it,{variant:"ghost",size:"icon",className:"md:hidden","aria-label":"Menu",children:c.jsx(qR,{className:"h-4 w-4"})})}),c.jsx(Tw,{side:"right",className:"w-72",children:c.jsx("nav",{className:"mt-8 flex flex-col gap-1",children:Nv.map(({to:a,key:r})=>c.jsx(Jp,{to:a,className:({isActive:s})=>ie("rounded-md px-3 py-2 text-base transition-colors",s?"bg-accent text-foreground":"text-muted-foreground hover:bg-accent/60"),children:e(r)},a))})})]})]})]})})}var RD=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),jD="VisuallyHidden",fS=y.forwardRef((e,a)=>c.jsx(Te.span,{...e,ref:a,style:{...RD,...e.style}}));fS.displayName=jD;var AD=fS,[Ic]=Vt("Tooltip",[qr]),qc=qr(),hS="TooltipProvider",ND=700,dm="tooltip.open",[zD,df]=Ic(hS),gS=e=>{const{__scopeTooltip:a,delayDuration:r=ND,skipDelayDuration:s=300,disableHoverableContent:l=!1,children:d}=e,u=y.useRef(!0),m=y.useRef(!1),h=y.useRef(0);return y.useEffect(()=>{const g=h.current;return()=>window.clearTimeout(g)},[]),c.jsx(zD,{scope:a,isOpenDelayedRef:u,delayDuration:r,onOpen:y.useCallback(()=>{window.clearTimeout(h.current),u.current=!1},[]),onClose:y.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>u.current=!0,s)},[s]),isPointerInTransitRef:m,onPointerInTransitChange:y.useCallback(g=>{m.current=g},[]),disableHoverableContent:l,children:d})};gS.displayName=hS;var Js="Tooltip",[MD,di]=Ic(Js),yS=e=>{const{__scopeTooltip:a,children:r,open:s,defaultOpen:l,onOpenChange:d,disableHoverableContent:u,delayDuration:m}=e,h=df(Js,e.__scopeTooltip),g=qc(a),[b,v]=y.useState(null),S=fo(),T=y.useRef(0),C=u??h.disableHoverableContent,x=m??h.delayDuration,k=y.useRef(!1),[R,j]=yo({prop:s,defaultProp:l??!1,onChange:B=>{B?(h.onOpen(),document.dispatchEvent(new CustomEvent(dm))):h.onClose(),d==null||d(B)},caller:Js}),A=y.useMemo(()=>R?k.current?"delayed-open":"instant-open":"closed",[R]),M=y.useCallback(()=>{window.clearTimeout(T.current),T.current=0,k.current=!1,j(!0)},[j]),q=y.useCallback(()=>{window.clearTimeout(T.current),T.current=0,j(!1)},[j]),Z=y.useCallback(()=>{window.clearTimeout(T.current),T.current=window.setTimeout(()=>{k.current=!0,j(!0),T.current=0},x)},[x,j]);return y.useEffect(()=>()=>{T.current&&(window.clearTimeout(T.current),T.current=0)},[]),c.jsx(Gm,{...g,children:c.jsx(MD,{scope:a,contentId:S,open:R,stateAttribute:A,trigger:b,onTriggerChange:v,onTriggerEnter:y.useCallback(()=>{h.isOpenDelayedRef.current?Z():M()},[h.isOpenDelayedRef,Z,M]),onTriggerLeave:y.useCallback(()=>{C?q():(window.clearTimeout(T.current),T.current=0)},[q,C]),onOpen:M,onClose:q,disableHoverableContent:C,children:r})})};yS.displayName=Js;var um="TooltipTrigger",bS=y.forwardRef((e,a)=>{const{__scopeTooltip:r,...s}=e,l=di(um,r),d=df(um,r),u=qc(r),m=y.useRef(null),h=Pe(a,m,l.onTriggerChange),g=y.useRef(!1),b=y.useRef(!1),v=y.useCallback(()=>g.current=!1,[]);return y.useEffect(()=>()=>document.removeEventListener("pointerup",v),[v]),c.jsx(Mc,{asChild:!0,...u,children:c.jsx(Te.button,{"aria-describedby":l.open?l.contentId:void 0,"data-state":l.stateAttribute,...s,ref:h,onPointerMove:ce(e.onPointerMove,S=>{S.pointerType!=="touch"&&!b.current&&!d.isPointerInTransitRef.current&&(l.onTriggerEnter(),b.current=!0)}),onPointerLeave:ce(e.onPointerLeave,()=>{l.onTriggerLeave(),b.current=!1}),onPointerDown:ce(e.onPointerDown,()=>{l.open&&l.onClose(),g.current=!0,document.addEventListener("pointerup",v,{once:!0})}),onFocus:ce(e.onFocus,()=>{g.current||l.onOpen()}),onBlur:ce(e.onBlur,l.onClose),onClick:ce(e.onClick,l.onClose)})})});bS.displayName=um;var uf="TooltipPortal",[DD,_D]=Ic(uf,{forceMount:void 0}),vS=e=>{const{__scopeTooltip:a,forceMount:r,children:s,container:l}=e,d=di(uf,a);return c.jsx(DD,{scope:a,forceMount:r,children:c.jsx(Mt,{present:r||d.open,children:c.jsx(ni,{asChild:!0,container:l,children:s})})})};vS.displayName=uf;var Or="TooltipContent",xS=y.forwardRef((e,a)=>{const r=_D(Or,e.__scopeTooltip),{forceMount:s=r.forceMount,side:l="top",...d}=e,u=di(Or,e.__scopeTooltip);return c.jsx(Mt,{present:s||u.open,children:u.disableHoverableContent?c.jsx(wS,{side:l,...d,ref:a}):c.jsx(OD,{side:l,...d,ref:a})})}),OD=y.forwardRef((e,a)=>{const r=di(Or,e.__scopeTooltip),s=df(Or,e.__scopeTooltip),l=y.useRef(null),d=Pe(a,l),[u,m]=y.useState(null),{trigger:h,onClose:g}=r,b=l.current,{onPointerInTransitChange:v}=s,S=y.useCallback(()=>{m(null),v(!1)},[v]),T=y.useCallback((C,x)=>{const k=C.currentTarget,R={x:C.clientX,y:C.clientY},j=ID(R,k.getBoundingClientRect()),A=qD(R,j),M=FD(x.getBoundingClientRect()),q=UD([...A,...M]);m(q),v(!0)},[v]);return y.useEffect(()=>()=>S(),[S]),y.useEffect(()=>{if(h&&b){const C=k=>T(k,b),x=k=>T(k,h);return h.addEventListener("pointerleave",C),b.addEventListener("pointerleave",x),()=>{h.removeEventListener("pointerleave",C),b.removeEventListener("pointerleave",x)}}},[h,b,T,S]),y.useEffect(()=>{if(u){const C=x=>{const k=x.target,R={x:x.clientX,y:x.clientY},j=(h==null?void 0:h.contains(k))||(b==null?void 0:b.contains(k)),A=!KD(R,u);j?S():A&&(S(),g())};return document.addEventListener("pointermove",C),()=>document.removeEventListener("pointermove",C)}},[h,b,u,g,S]),c.jsx(wS,{...e,ref:d})}),[LD,PD]=Ic(Js,{isInside:!1}),ZD=$j("TooltipContent"),wS=y.forwardRef((e,a)=>{const{__scopeTooltip:r,children:s,"aria-label":l,onEscapeKeyDown:d,onPointerDownOutside:u,...m}=e,h=di(Or,r),g=qc(r),{onClose:b}=h;return y.useEffect(()=>(document.addEventListener(dm,b),()=>document.removeEventListener(dm,b)),[b]),y.useEffect(()=>{if(h.trigger){const v=S=>{const T=S.target;T!=null&&T.contains(h.trigger)&&b()};return window.addEventListener("scroll",v,{capture:!0}),()=>window.removeEventListener("scroll",v,{capture:!0})}},[h.trigger,b]),c.jsx(ai,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:v=>v.preventDefault(),onDismiss:b,children:c.jsxs(Vm,{"data-state":h.stateAttribute,...g,...m,ref:a,style:{...m.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[c.jsx(ZD,{children:s}),c.jsx(LD,{scope:r,isInside:!0,children:c.jsx(AD,{id:h.contentId,role:"tooltip",children:l||s})})]})})});xS.displayName=Or;var SS="TooltipArrow",BD=y.forwardRef((e,a)=>{const{__scopeTooltip:r,...s}=e,l=qc(r);return PD(SS,r).isInside?null:c.jsx(Wm,{...l,...s,ref:a})});BD.displayName=SS;function ID(e,a){const r=Math.abs(a.top-e.y),s=Math.abs(a.bottom-e.y),l=Math.abs(a.right-e.x),d=Math.abs(a.left-e.x);switch(Math.min(r,s,l,d)){case d:return"left";case l:return"right";case r:return"top";case s:return"bottom";default:throw new Error("unreachable")}}function qD(e,a,r=5){const s=[];switch(a){case"top":s.push({x:e.x-r,y:e.y+r},{x:e.x+r,y:e.y+r});break;case"bottom":s.push({x:e.x-r,y:e.y-r},{x:e.x+r,y:e.y-r});break;case"left":s.push({x:e.x+r,y:e.y-r},{x:e.x+r,y:e.y+r});break;case"right":s.push({x:e.x-r,y:e.y-r},{x:e.x-r,y:e.y+r});break}return s}function FD(e){const{top:a,right:r,bottom:s,left:l}=e;return[{x:l,y:a},{x:r,y:a},{x:r,y:s},{x:l,y:s}]}function KD(e,a){const{x:r,y:s}=e;let l=!1;for(let d=0,u=a.length-1;ds!=S>s&&r<(v-g)*(s-b)/(S-b)+g&&(l=!l)}return l}function UD(e){const a=e.slice();return a.sort((r,s)=>r.xs.x?1:r.ys.y?1:0),HD(a)}function HD(e){if(e.length<=1)return e.slice();const a=[];for(let s=0;s=2;){const d=a[a.length-1],u=a[a.length-2];if((d.x-u.x)*(l.y-u.y)>=(d.y-u.y)*(l.x-u.x))a.pop();else break}a.push(l)}a.pop();const r=[];for(let s=e.length-1;s>=0;s--){const l=e[s];for(;r.length>=2;){const d=r[r.length-1],u=r[r.length-2];if((d.x-u.x)*(l.y-u.y)>=(d.y-u.y)*(l.x-u.x))r.pop();else break}r.push(l)}return r.pop(),a.length===1&&r.length===1&&a[0].x===r[0].x&&a[0].y===r[0].y?a:a.concat(r)}var GD=gS,VD=yS,WD=bS,$D=vS,CS=xS;const kS=GD,No=VD,zo=WD,mo=y.forwardRef(({className:e,sideOffset:a=4,...r},s)=>c.jsx($D,{children:c.jsx(CS,{ref:s,sideOffset:a,className:ie("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",e),...r})}));mo.displayName=CS.displayName;function YD(){const{pathname:e,hash:a}=$a();y.useEffect(()=>{typeof window.gtag=="function"&&window.gtag("event","page_view",{page_path:e+a,page_location:window.location.href,page_title:document.title})},[e,a])}var zv={wrapperLayer:"wrapperLayer__Br2mJ",viewportLayer:"viewportLayer__c6flH"};function XD({id:e,target:a,zIndex:r,className:s,style:l,children:d}){if(typeof document>"u")return null;const u=a||document.body,m=y.useMemo(()=>document.createElement("figure"),[]),[h,g]=y.useState(!1),b=y.useRef([]);return y.useLayoutEffect(()=>{e?m.id=e:m.removeAttribute("id"),typeof s=="string"?m.className=s:m.removeAttribute("class"),typeof r=="number"?m.style.zIndex=String(r):m.style.removeProperty("z-index"),b.current.forEach(S=>m.style.removeProperty(S)),b.current=[];const v=l||{};Object.keys(v).forEach(S=>{const T=v[S];T!=null&&(m.style.setProperty(S,String(T)),b.current.push(S))})},[e,s,r,l,m]),y.useLayoutEffect(()=>(u.appendChild(m),g(!0),()=>{u.removeChild(m)}),[u,m]),h?Rm.createPortal(d,m):null}var ze={controls:"controls__9U729",topRight:"topRight__bDRMJ",topLeft:"topLeft__BodEu",bottomRight:"bottomRight__Hd0jy",bottomLeft:"bottomLeft__762V9",topCenter:"topCenter__jexvO",bottomCenter:"bottomCenter__DEEUV",leftCenter:"leftCenter__8PTu3",rightCenter:"rightCenter__mHTFQ",show:"show__GPCB-",rotateLeft:"rotateLeft__xjHZr",rotateRight:"rotateRight__Q71ZR",download:"download__z6NFZ",zoom:"zoom__VWyU-",disabled:"disabled__l7PPn",shake:"shake__ul2tL",close:"close__N7GMd",flipLeft:"flipLeft__OgnvQ",detachedSideButton:"detachedSideButton__SKxNE",flipRight:"flipRight__wywuu",pages:"pages__5GsnL",mobile:"mobile__6jMYl",blackDot:"blackDot__bhplt",whiteDot:"whiteDot__P7lUz"},QD=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"m15 18-6-6 6-6"})),JD=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"m9 18 6-6-6-6"})),e_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M20 4 4 20"}),Q.createElement("path",{d:"m4 4 16 16"})),t_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),Q.createElement("path",{d:"M7 10l5 5 5-5"}),Q.createElement("path",{d:"M12 15V3"})),o_=({color:e})=>Q.createElement("svg",{fill:e,width:"24",height:"24",viewBox:"0 0 200 200"},Q.createElement("defs",null,Q.createElement("linearGradient",{id:"spinner-1552570621916",x1:"0%",y1:"0%",x2:"65%",y2:"0%"},Q.createElement("stop",{offset:"0%",className:"Spinner-blue-3_W"}),Q.createElement("stop",{offset:"100%",stopOpacity:"0"}))),Q.createElement("circle",{cx:"100",cy:"100",r:"90",fill:"transparent",stroke:"url(#spinner-1552570621916)",strokeWidth:"20"})),a_=({color:e})=>Q.createElement("svg",{fill:e,width:"24",height:"24",viewBox:"0 0 24 24"},Q.createElement("path",{d:"M12 6v1.79c0 .45.54.67.85.35l2.79-2.79c.2-.2.2-.51 0-.71l-2.79-2.79c-.31-.31-.85-.09-.85.36V4c-4.42 0-8 3.58-8 8 0 1.04.2 2.04.57 2.95.27.67 1.13.85 1.64.34.27-.27.38-.68.23-1.04C6.15 13.56 6 12.79 6 12c0-3.31 2.69-6 6-6zm5.79 2.71c-.27.27-.38.69-.23 1.04.28.7.44 1.46.44 2.25 0 3.31-2.69 6-6 6v-1.79c0-.45-.54-.67-.85-.35l-2.79 2.79c-.2.2-.2.51 0 .71l2.79 2.79c.31.31.85.09.85-.35V20c4.42 0 8-3.58 8-8 0-1.04-.2-2.04-.57-2.95-.27-.67-1.13-.85-1.64-.34z"})),n_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}),Q.createElement("path",{d:"M3 3v5h5"})),r_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"}),Q.createElement("path",{d:"M21 3v5h-5"})),s_=({color:e})=>Q.createElement("svg",{width:"23",height:"23",viewBox:"0 0 23 23",fill:"none",stroke:e||"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Q.createElement("path",{d:"M8 3H5a2 2 0 0 0-2 2v3"}),Q.createElement("path",{d:"M21 8V5a2 2 0 0 0-2-2h-3"}),Q.createElement("path",{d:"M3 16v3a2 2 0 0 0 2 2h3"}),Q.createElement("path",{d:"M16 21h3a2 2 0 0 0 2-2v-3"})),Fr=y.createContext({}),i_=1e-4,Rn=e=>Number.isFinite(e)&&(e??0)>0?e:0,pf=(e=0)=>Rn(e),l_=(e=0)=>{const a=(e%360+360)%360;return a===90||a===270},TS=(e,a,r=0)=>{const s=Rn(e),l=Rn(a);return l_(r)?{width:l,height:s}:{width:s,height:l}},ES=({naturalWidth:e,naturalHeight:a,edge:r=0,viewport:s,rotate:l=0})=>{const d=Rn(s.width),u=Rn(s.height),m=pf(r),{width:h,height:g}=TS(e,a,l);if(!d||!u||!h||!g)return{scale:1,canZoom:!1,visualWidth:h,visualHeight:g,fittedWidth:h,fittedHeight:g,marginX:Math.max(0,(d-h)/2),marginY:Math.max(0,(u-g)/2)};const b=Math.max(1,d-m*2),v=Math.max(1,u-m*2),S=h>b?b/h:1,T=g>v?v/g:1,C=Math.min(S,T),x=h*C,k=g*C;return{scale:C,canZoom:C<1-i_,visualWidth:h,visualHeight:g,fittedWidth:x,fittedHeight:k,marginX:(d-x)/2,marginY:(u-k)/2}},c_=(e,a,r=0,s,l=0)=>ES({naturalWidth:e,naturalHeight:a,edge:r,viewport:s,rotate:l}).scale,RS=({naturalWidth:e,naturalHeight:a,viewport:r,scale:s=1,edge:l=0,rotate:d=0})=>{const u=Number.isFinite(s)&&s>0?s:1,m=pf(l),h=Rn(r.width),g=Rn(r.height),{width:b,height:v}=TS(e,a,d),S=b*u,T=v*u,C=S>h?(S-h)/2+m:0,x=T>g?(T-g)/2+m:0;return{minX:-C,maxX:C,minY:-x,maxY:x}},ei=typeof window<"u",Fc=typeof document<"u",Kc=()=>Fc?document.documentElement:void 0,mf=()=>Fc?document.body:void 0,no=(...e)=>e.reduce((a,r)=>r?typeof r=="string"?r?a.concat(r):a:a.concat(Object.keys(r).filter(s=>!!r[s])):a,[]).join(" "),d_=()=>{const e=Kc();return e?e.clientWidth:0},u_=()=>{const e=Kc();return e?e.clientHeight:0},Nr={documentOverflow:"",bodyOverflow:"",bodyPosition:""},p_=()=>{const e=Kc(),a=mf();!e||!a||(Nr.documentOverflow=e.style.overflow,Nr.bodyOverflow=a.style.overflow,Nr.bodyPosition=a.style.position,e.style.overflow="hidden",a.style.overflow="hidden",a.style.position="relative")},m_=()=>{const e=Kc(),a=mf();!e||!a||(e.style.overflow=Nr.documentOverflow,a.style.overflow=Nr.bodyOverflow,a.style.position=Nr.bodyPosition)},f_=(e,a)=>{const r=setInterval(()=>{(!e||e.complete)&&(clearInterval(r),a())},500);return r},h_=(e,a={})=>{const r=Object.keys(a).reduce((s,l="")=>a[l]?s.concat(`${l}=${a[l]}`):s,[]).join("&");return r?`${e}${e.includes("?")?"&":"?"}${r}`:e},g_=(e,a={ref:100})=>e?e.includes("%")?a.ref*Number(e.substring(0,e.length-1))/100:Number(e.substring(0,e.length-2)):Number(e),pm=(e,a)=>{const r=mf();if(!Fc||!r)return;const s=document.createElement("a");s.href=e,s.download=e.split("/")[e.split("/").length-1],r.appendChild(s),s.click(),r.removeChild(s)},y_=e=>e.charAt(0).toUpperCase()+e.slice(1),Mv=e=>{const a=["Webkit","Moz","Ms","O"];return Object.keys(e).reduce((r,s)=>{const l=a.reduce((d,u)=>({...d,[`${u}${y_(s)}`]:e[s]}),{});return{...r,...l}},e)},mm=e=>typeof e=="number"&&(e^0)===e,fm=(e,a,r,s={loop:!0})=>{if(a===0)return 0;if(r===0)return e;if(!(e<0||e>a-1))return s.loop?Math.abs(a+r+e)%a:e+r<0||e+r>a-1?void 0:e+r},b_={0:[0],1:[-1,0,1],2:[-2,-1,0,1,2],3:[-3,-2,-1,0,1,2,3]},v_=e=>b_[e],jS=(e,a)=>{if(a<=1)return e;const r=(e%a+a)%a,s=r-a;return Math.abs(r)<=Math.abs(s)?r:s},x_=(e,a,r,s)=>{const l=a-e;return!s||r<=1?Math.abs(l):Math.abs(jS(l,r))},AS=(e,a)=>{let r;const s=((...l)=>{r!==void 0&&clearTimeout(r),r=setTimeout(()=>{r=void 0,e(...l)},a)});return s.cancel=()=>{r!==void 0&&(clearTimeout(r),r=void 0)},s},NS=class wn{constructor({position:a}={position:wn.CENTER_POSITION}){if(this.currentPosition=wn.CENTER_POSITION,this.debounceInterval=200,this.debounceResetPosition=AS(()=>{this.currentPosition=wn.CENTER_POSITION},this.debounceInterval),this.update=r=>{this.currentPosition={x:r.clientX,y:r.clientY},this.debounceResetPosition()},!ei)return wn.createFallback();if(window.__ZMAGE_GLOBAL_CLICK_MONITOR__)return window.__ZMAGE_GLOBAL_CLICK_MONITOR__;try{this.currentPosition=a,window.addEventListener("click",this.update),window.__ZMAGE_GLOBAL_CLICK_MONITOR__=this}catch{return wn.createFallback()}}static createFallback(){return{currentPosition:wn.CENTER_POSITION,destructor:()=>{}}}destructor(){if(ei)try{window.removeEventListener("click",this.update),window.__ZMAGE_GLOBAL_CLICK_MONITOR__=void 0}catch{}}};NS.CENTER_POSITION={x:0,y:0};var w_=NS,S_={38:!0,40:!0,33:!0,34:!0,35:!0,36:!0};function kn(e){e.preventDefault()}function zS(e){if(e.keyCode in S_)return kn(e),!1}var MS=!1;if(ei)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){MS=!0}}))}catch{}var Dv=MS?{passive:!1}:!1,DS=Fc?"onwheel"in document.createElement("div")?"wheel":"mousewheel":"wheel";function C_(){ei&&(window.addEventListener("DOMMouseScroll",kn,!1),window.addEventListener(DS,kn,Dv),window.addEventListener("touchmove",kn,Dv),window.addEventListener("keydown",zS,!1))}function k_(){ei&&(window.removeEventListener("DOMMouseScroll",kn,!1),window.removeEventListener(DS,kn),window.removeEventListener("touchmove",kn),window.removeEventListener("keydown",zS,!1))}var T_=(e,a)=>mm(e)&&e{var s,l;return((s=e==null?void 0:e.current)==null?void 0:s.getAttribute("src"))===((l=a[r])==null?void 0:l.src)},_v=(e,a,r)=>{const s=T_(a,r);return{page:s,pageIsCover:_S(e,r,s)}},E_=e=>{e!=null&&e.current&&(e.current.style.visibility="visible")},R_=(e,a)=>{if(e!=null&&e.current)return setTimeout(()=>{e!=null&&e.current&&(e.current.style.visibility="hidden"),a==null||a()},100)},OS=["top","right","bottom","left"],LS=["toolbar","pagination","caption","flip"],Ov=e=>{if(typeof e=="number"&&Number.isFinite(e))return`${e}px`;if(typeof e=="string"&&e.trim())return e.trim()},j_=(e,a)=>{if(typeof e=="number"||typeof e=="string"){const s=Ov(e);if(!s)return;const l={};return a.forEach(d=>{l[d]=s}),l}if(!e||typeof e!="object")return;const r={};return OS.forEach(s=>{const l=Ov(e[s]);l&&(r[s]=l)}),Object.keys(r).length>0?r:void 0},Lv=e=>!!e&&typeof e=="object",A_=(e,a)=>{const r={};return LS.forEach(s=>{const l=e==null?void 0:e[s],d=a==null?void 0:a[s];if(l||d){const u={...l,...d};Lv(l==null?void 0:l.inset)&&Lv(d==null?void 0:d.inset)&&(u.inset={...l.inset,...d.inset}),r[s]=u}}),r},PS=(e,a)=>e?A_(e,a?e.mobile:void 0):{},N_=e=>{switch(e){case"top-left":return["top","left"];case"top-center":return["top"];case"bottom-right":return["bottom","right"];case"bottom-left":return["bottom","left"];case"bottom-center":return["bottom"];case"left-center":return["left"];case"right-center":return["right"];case"top-right":default:return["top","right"]}},z_=(e,a)=>e==="toolbar"?N_(a):e==="flip"?["left","right"]:["bottom"],M_=(e,a,r,s)=>{const l=j_(r,s);l&&(OS.forEach(d=>{const u=l[d];u&&(e[`--zmage-${a}-${d}-offset`]=u)}),a!=="flip"&&(l.top&&!l.bottom&&(e[`--zmage-${a}-bottom-offset`]="auto"),l.bottom&&!l.top&&(e[`--zmage-${a}-top-offset`]="auto"),l.right&&!l.left&&(e[`--zmage-${a}-left-offset`]="auto",e[`--zmage-${a}-translate-x`]="0"),l.left&&!l.right&&(e[`--zmage-${a}-right-offset`]="auto",e[`--zmage-${a}-translate-x`]="0")))},D_=(e,a)=>{const r=e==null?void 0:e.layout;if(!r)return;const s=PS(r,a),l={};return LS.forEach(d=>{var u;M_(l,d,(u=s[d])==null?void 0:u.inset,z_(d,e.placement))}),Object.keys(l).length>0?l:void 0},ZS=[.6,0,.1,1],Ro=`cubic-bezier(${ZS.join(", ")})`,pt=350,Il="cubic-bezier(0, 0.1, 0.1, 1)",BS=(e,a=1)=>pt*a,IS=(e=1)=>`transform ${pt*e}ms ${Ro}, opacity ${pt*e}ms ${Ro}, filter ${pt*e}ms ${Ro}, clip-path ${pt*e}ms ${Ro}`,qS="auto",FS={threshold:120,velocity:.35,axisLock:1.2,resistance:.35},KS={threshold:80,velocity:.35,axisLock:1.2,opacity:!0},Uc={step:.12,smooth:!0,minScale:"fit",maxScale:4,center:"pointer",reverse:!1,exitGuardDuration:1e3},US={minScale:"fit",maxScale:4,resetBelowFit:!0,center:"gesture"},HS={scale:1,minScale:"fit",maxScale:4,center:"tap",interval:300,distance:32},dc={objectFit:!0,clip:!0,radius:!0},ff={src:"",alt:"",caption:"",set:[],defaultPage:0,preset:qS,controller:{},hotKey:{},animate:{},gesture:{},hideOnScroll:!0,hideOnDblClick:!1,coverVisible:!1,backdrop:"#FFFFFF",zIndex:1e3,radius:0,edge:0,loop:!0,loadingDelay:200,onBrowsing:()=>{},onZooming:()=>{},onSwitching:()=>{},onRotating:()=>{}},hf={...ff,radius:void 0,edge:void 0},GS={desktop:{radius:8,edge:16,controller:{pagination:!0,rotate:!0,zoom:!0,download:!1,close:!0,flip:!0,placement:"top-right",layout:{pagination:{inset:24},caption:{inset:60}}},hotKey:{close:!0,zoom:!0,flip:!0,rotate:!0,download:!1},animate:{browsing:!0,flip:"crossFade",cover:{...dc},slowMotion:!1},gesture:{swipe:!1,dragExit:!1,wheelZoom:{...Uc},pinchZoom:!1,doubleTapZoom:!1,touchAction:"managed"}},mobile:{radius:0,edge:0,controller:{pagination:!0,rotate:!1,zoom:!1,download:!1,close:!0,flip:!1,placement:"top-right"},hotKey:{close:!1,zoom:!1,flip:!1,rotate:!1,download:!1},animate:{browsing:!0,flip:"swipe",cover:{...dc},slowMotion:!1},gesture:{swipe:{...FS},dragExit:{...KS},wheelZoom:!1,pinchZoom:{...US},doubleTapZoom:{...HS},touchAction:"managed"}}},__={...ff,...GS.desktop},O_={...ff,...GS.mobile},VS=e=>{const a=e||qS;return a==="mobile"?"mobile":a==="desktop"?"desktop":a==="auto"?typeof window>"u"||typeof window.matchMedia!="function"?"desktop":window.matchMedia("(pointer: coarse) and (hover: none)").matches?"mobile":"desktop":"desktop"},L_=e=>VS(e)==="mobile"?O_:__,WS=e=>{const{className:a,style:r,onClick:s,forwardedRef:l,coverRef:d,destructor:u,src:m,alt:h,caption:g,set:b,defaultPage:v,preset:S,controller:T,hotKey:C,animate:x,gesture:k,hideOnScroll:R,coverVisible:j,backdrop:A,zIndex:M,radius:q,edge:Z,loop:B,hideOnDblClick:X,loadingDelay:ae,portalTarget:ne,onBrowsing:te,onZooming:J,onSwitching:pe,onRotating:re,onError:ue,browsing:O,...H}=e;return{coverProps:{className:a,style:r,onClick:s,forwardedRef:l,src:m,alt:h,onError:ue},calleeProps:{coverRef:d,destructor:u},controlledProps:{browsing:O},configProps:{defaultPage:v,set:Array.isArray(b)&&b.length>0?b:[{src:m,alt:h,caption:g,...H}],preset:S,controller:T,hotKey:C,animate:x,gesture:k,hideOnScroll:R,coverVisible:j,backdrop:A,zIndex:M,radius:q,edge:Z,loop:B,hideOnDblClick:X,loadingDelay:ae,portalTarget:ne,onBrowsing:te,onZooming:J,onSwitching:pe,onRotating:re,onError:ue},restProps:H}},P_=`transform ${pt}ms ${Il}, opacity ${pt}ms ${Il}, clip-path ${pt}ms ${Il}, border-radius ${pt}ms ${Il}`,Ct=e=>{var a,r;const s=(r=(a=e==null?void 0:e.viewportRef)==null?void 0:a.current)==null?void 0:r.getBoundingClientRect();return s&&s.width>0&&s.height>0?{left:s.left,top:s.top,width:s.width,height:s.height}:{left:0,top:0,width:d_(),height:u_()}},gf=(e,a,r=0,s=Ct(),l=0)=>c_(e,a,r,s,l),Pv={top:0,right:0,bottom:0,left:0},Z_=e=>{if(e===!1)return!1;const a=e&&typeof e=="object"?e.cover:void 0;return a===!1?!1:a&&typeof a=="object"?{...dc,...a}:{...dc}},B_=e=>e.top||e.right||e.bottom||e.left?e:void 0,Zv=(e,a,r)=>{const s=e||"50%";if(s==="center")return a*.5;if(r==="x"){if(s==="left")return 0;if(s==="right")return a}else{if(s==="top")return 0;if(s==="bottom")return a}if(s.endsWith("%")){const l=Number.parseFloat(s);return Number.isFinite(l)?a*(l/100):a*.5}if(s.endsWith("px")){const l=Number.parseFloat(s);return Number.isFinite(l)?l:a*.5}return a*.5},I_=(e,a,r)=>{const s=(e||"50% 50%").trim().split(/\s+/),[l,d="50%"]=s.length>0?s:["50%","50%"];return{x:Zv(l,a,"x"),y:Zv(d,r,"y")}},q_=(e,a,r,s,l)=>{if(!a||!r||!s||!l)return null;const d=e||"fill",u=s/a,m=l/r;return d==="cover"?Math.max(u,m):d==="contain"?Math.min(u,m):d==="none"?1:d==="scale-down"?Math.min(1,Math.min(u,m)):null},F_=e=>Math.max(0,Math.abs(e)<1e-4?0:e),ql=(e,a)=>F_(e/a),K_=({context:e,borderRadius:a,width:r,coverOptions:s})=>{var l;return s&&s.radius?g_(a,{ref:r}):(l=e.radius)!=null?l:0},hm=(e=0,a=1)=>{const r=Number.isFinite(a)&&a>0?a:1;return e/r},Bv=(e,a=0,r=1)=>{if(!e)return;const s=hm(a,r);return`inset(${e.top}px ${e.right}px ${e.bottom}px ${e.left}px round ${s}px)`},U_=e=>e==="zoom-enter"||e==="zoom-follow",H_=({role:e,motionPhase:a,touchTransition:r,flip:s,imageType:l})=>{if(r==="none"||a==="browsing-instant")return"none";if(e==="center"){if(l==="cover"||a==="browsing-follow")return"none";if(a==="zoom-enter")return P_;if(a==="zoom-follow"||a==="closing-follow")return"none"}return s===!1&&l!=="zooming"?"none":r},Iv=(e,a,r)=>{const{show:s,zoom:l}=e;return s?l?qa(e,a):$S(e,a):gm(e,a,r)},gm=(e,a,r)=>{const{coverRef:s,coverPos:l,rotate:d,pageIsCover:u}=e,m=Ct(e),h=Z_(e.animate);if(r&&r.state==="ended"&&r.lastResult.kind==="dragExit"&&r.lastResult.accepted)return{_type:"cover",_behavior:"merge",y:r.getOffset().y>0?m.height:-m.height};if(s.current){const{naturalWidth:g,naturalHeight:b}=s.current,{top:v,left:S,width:T,height:C}=s.current.getBoundingClientRect(),x=window.getComputedStyle(s.current),{opacity:k,borderRadius:R,objectFit:j,objectPosition:A}=x,M=K_({context:e,borderRadius:R,width:T,coverOptions:h}),q=u?{_type:"cover",x:S+T/2-(m.left+m.width/2),y:v+C/2-(m.top+m.height/2),opacity:Number(k)||1,scale:g?T/g:1,rotate:d-d%360,radius:M}:{_type:"cover",x:0,y:-m.height,opacity:0,scale:g?T/g:1,rotate:d-d%360,radius:M};if(!u||h===!1||!h.objectFit)return q;const Z=q_(j,g,b,T,C);if(Z==null)return q;const B=g*Z,X=b*Z,ae=T-B,ne=C-X,te=I_(A,ae,ne),J=S+te.x,pe=v+te.y,re=h.clip?B_({top:ql(v-pe,Z),right:ql(J+B-(S+T),Z),bottom:ql(pe+X-(v+C),Z),left:ql(S-J,Z)}):void 0;return{_type:"cover",x:J+B/2-(m.left+m.width/2),y:pe+X/2-(m.top+m.height/2),opacity:Number(k)||1,scale:Z,rotate:d-d%360,radius:M,clip:re}}else return l?{_type:"cover",x:l.x?l.x-(m.left+m.width/2):0,y:l.y?l.y-(m.top+m.height/2):0,opacity:0,scale:0,rotate:0,radius:0}:{_type:"cover",x:0,y:0,opacity:0,scale:0,rotate:0,radius:0}},G_=(e,a,r)=>{var s,l,d,u,m,h,g,b,v,S,T,C;const x=(R,j)=>R+(j-R)*r,k=(R,j)=>{if(!R&&!j)return;const A=R||Pv,M=j||Pv;return{top:x(A.top,M.top),right:x(A.right,M.right),bottom:x(A.bottom,M.bottom),left:x(A.left,M.left)}};return{_type:"cover",x:x((s=e.x)!=null?s:0,(l=a.x)!=null?l:0),y:x((d=e.y)!=null?d:0,(u=a.y)!=null?u:0),scale:x((m=e.scale)!=null?m:0,(h=a.scale)!=null?h:0),rotate:x((g=e.rotate)!=null?g:0,(b=a.rotate)!=null?b:0),opacity:x((v=e.opacity)!=null?v:1,(S=a.opacity)!=null?S:1),radius:x((T=e.radius)!=null?T:0,(C=a.radius)!=null?C:0),clip:k(e.clip,a.clip)}},V_=(e,a,r,s)=>{const l=(u,m,h)=>3*(1-u)**2*u*m+3*(1-u)*u**2*h+u**3,d=(u,m,h)=>3*(1-u)**2*m+6*(1-u)*u*(h-m)+3*u**2*(1-h);return u=>{if(u<=0)return 0;if(u>=1)return 1;let m=u;for(let h=0;h<8;h++){const g=l(m,e,r)-u,b=d(m,e,r);if(Math.abs(b)<1e-6)break;m=Math.max(0,Math.min(1,m-g/b))}return l(m,a,s)}},W_=V_(...ZS),$S=(e,a)=>{var r,s,l,d,u;const{coverRef:m,edge:h,page:g,radius:b,rotate:v,set:S}=e,T=((r=a.current)==null?void 0:r.naturalWidth)||0,C=((s=a.current)==null?void 0:s.naturalHeight)||0,x=!!m.current&&m.current.getAttribute("src")===((l=S==null?void 0:S[g])==null?void 0:l.src),k=T||(x?(d=m.current)==null?void 0:d.naturalWidth:0)||0,R=C||(x?(u=m.current)==null?void 0:u.naturalHeight:0)||0;return{_type:"browsing",x:0,y:0,opacity:1,scale:gf(k,R,h,Ct(e),v),rotate:v,radius:b}},qa=(e,a,r={},s={})=>{var l,d,u;const{radius:m,rotate:h}=e,{naturalWidth:g=0,naturalHeight:b=0}=a.current||{},v=Number.isFinite(s.scale)&&((l=s.scale)!=null?l:0)>0?s.scale:1,S=Ct(e),T=S.width,C=S.height,x=(d=r.clientX)!=null?d:S.left+T/2,k=(u=r.clientY)!=null?u:S.top+C/2,R=x-S.left,j=k-S.top,A=RS({naturalWidth:g,naturalHeight:b,viewport:S,scale:v,edge:YS(e),rotate:h}),M=T>0?R/T:.5,q=C>0?j/C:.5,Z=A.maxX>0?A.maxX-(A.maxX-A.minX)*M:0,B=A.maxY>0?A.maxY-(A.maxY-A.minY)*q:0;return{_type:"zooming",x:Z,y:B,opacity:1,scale:v,rotate:h,radius:m}},$_=16,uc=(e,a,r)=>Math.min(Math.max(e,a),r),YS=e=>{var a;return pf((a=e.edge)!=null?a:0)},Y_=.35,qv=(e,a,r,s=Y_)=>er?r+(e-r)*s:e,XS=(e,a,r=1)=>{const{naturalWidth:s=0,naturalHeight:l=0}=a.current||{},d=Ct(e);return RS({naturalWidth:s,naturalHeight:l,viewport:d,scale:r,edge:YS(e),rotate:e.rotate})},Fv=(e,a,r)=>{var s,l;const d=Number.isFinite(r.scale)&&((s=r.scale)!=null?s:0)>0?r.scale:1,u=XS(e,a,d);return{...r,_type:"zooming",scale:d,x:uc((l=r.x)!=null?l:0,u.minX,u.maxX),y:uc(r.y,u.minY,u.maxY)}},X_=(e,a,r)=>{var s,l;const d=Number.isFinite(r.scale)&&((s=r.scale)!=null?s:0)>0?r.scale:1,u=XS(e,a,d);return{...r,_type:"zooming",scale:d,x:qv((l=r.x)!=null?l:0,u.minX,u.maxX),y:qv(r.y,u.minY,u.maxY)}},ym=(e,a,r)=>{var s,l,d;const{naturalWidth:u=0,naturalHeight:m=0}=a.current||{},h=gf(u,m,(s=e.edge)!=null?s:0,Ct(e),(l=e.rotate)!=null?l:0),g=r.minScale==="fit"||r.minScale==null?h:r.minScale,b=Number.isFinite(g)&&g>0?g:h||1,v=Number.isFinite(r.maxScale)&&((d=r.maxScale)!=null?d:0)>=b?r.maxScale:b;return{minScale:b,maxScale:v,fitScale:h}},Q_=(e,a=Ct())=>{const r=Number.isFinite(e.deltaY)?e.deltaY:0;return e.deltaMode===1?r*$_:e.deltaMode===2?r*a.height:r},J_=({currentScale:e,pixelDeltaY:a,step:r,minScale:s,maxScale:l})=>{const d=Number.isFinite(s)&&s>0?s:.01,u=Number.isFinite(l)&&l>=d?l:d,m=Number.isFinite(e)&&e>0?e:d,h=Number.isFinite(r)&&r>0?r:Uc.step,g=Number.isFinite(a)?a:0,b=m*Math.exp(-g/100*h);return uc(b,d,u)},eO=(e,a,r)=>{const{minScale:s,maxScale:l}=ym(e,a,r);return{minScale:s,maxScale:l}},Kv=e=>{if(e.length<2)return 0;const a=e[0],r=e[1];return Math.hypot(r.clientX-a.clientX,r.clientY-a.clientY)},tO=e=>{if(e.length<2)return{clientX:0,clientY:0};const a=e[0],r=e[1];return{clientX:(a.clientX+r.clientX)/2,clientY:(a.clientY+r.clientY)/2}},oO=({baseScale:e,startDistance:a,currentDistance:r,minScale:s,maxScale:l})=>{const d=Number.isFinite(a)&&a>0?a:1,u=Number.isFinite(e)&&e>0?e:1,m=Number.isFinite(r)&&r>0?r:d,h=Number.isFinite(s)&&s>0?s:.01,g=Number.isFinite(l)&&l>=h?l:h;return uc(u*(m/d),h,g)},aO=30,QS=10,nO=.08,JS={fade:{offset:0,overflow:0,opacity:0},crossFade:{offset:aO,overflow:0,opacity:0},swipe:{offset:0,overflow:0,opacity:1},zoom:{offset:0,overflow:nO,opacity:0},blur:{offset:0,overflow:.018,opacity:0,blur:14},none:{offset:0,overflow:0,opacity:0}},rO={offset:0,overflow:0,opacity:0},sO=e=>Ct(e).width+QS,iO=({flipKind:e,baseOffset:a,ownScale:r,dims:s,viewport:l})=>{if(e!=="swipe"||r==null||!s)return a;const d=r+JS.swipe.overflow,u=s.w*d/2;return Math.max(a,l.width/2+u+QS)};function Uv(e,a){const r=typeof e=="object"&&e!==null?e:void 0,s=r?a:e;if(!s)return rO;const l=JS[s];return s==="swipe"?{...l,offset:sO(r)}:l}var Er=5,Ks=(e,a,r)=>a===!1?!1:a===!0?{...r}:a&&typeof a=="object"?{...r,...e&&typeof e=="object"?e:r,...a}:e===!1?!1:e===!0?{...r}:e&&typeof e=="object"?{...r,...e}:!1,lO=(e,a={})=>{if(e===!1)return{swipe:!1,dragExit:!1,wheelZoom:!1,pinchZoom:!1,doubleTapZoom:!1,touchAction:"auto"};const r=e&&typeof e=="object"?e:{},s=cO(r.touchAction,a.touchAction);return{swipe:Ks(a.swipe,r.swipe,FS),dragExit:Ks(a.dragExit,r.dragExit,KS),wheelZoom:Ks(a.wheelZoom,r.wheelZoom,Uc),pinchZoom:Ks(a.pinchZoom,r.pinchZoom,US),doubleTapZoom:Ks(a.doubleTapZoom,r.doubleTapZoom,HS),touchAction:s}},Hv=e=>e==="managed"||e==="auto"||e==="manipulation"||e==="none",cO=(e,a)=>Hv(e)?e:Hv(a)?a:"managed",dO=e=>{const a=e==null?void 0:e.touchAction;return a==="auto"||a==="manipulation"||a==="none"?a:e!=null&&e.pinchZoom&&typeof e.pinchZoom=="object"?"none":e!=null&&e.doubleTapZoom&&typeof e.doubleTapZoom=="object"?"manipulation":"auto"},uO=class{constructor(e,a={}){this.options=e,this.tap=r=>{const s=this.now(),l=this.lastTap;if(l){const d=s-l.time,u=Math.hypot(r.x-l.point.x,r.y-l.point.y);if(d>=0&&d<=this.options.interval&&u<=this.options.distance)return this.lastTap=void 0,!0}return this.lastTap={point:r,time:s},!1},this.cancel=()=>{this.lastTap=void 0},this.now=a.now||(()=>Date.now())}},Gv=()=>({kind:"none",accepted:!1,offset:{x:0,y:0},distance:{x:0,y:0},velocity:{x:0,y:0}}),xr=class{constructor(e={},a={}){this.gesture=e,this.state="idle",this.lastResult=Gv(),this.startPoint={x:0,y:0},this.currentPoint={x:0,y:0},this.startTime=0,this.start=r=>(this.startPoint=r,this.currentPoint=r,this.startTime=this.now(),this.state="detecting",this.lastResult=Gv(),this),this.move=r=>this.state==="idle"||this.state==="ended"?this:(this.currentPoint=r,this.state==="detecting"&&this.lockGesture(),this),this.end=()=>{const r=this.getOffset(),s=this.getDistance(),l=Math.max(this.now()-this.startTime,1),d={x:s.x/l,y:s.y/l},u={kind:"none",accepted:!1,offset:r,distance:s,velocity:d};return this.state==="swiping"&&this.swipeOptions?(u.kind="swipe",u.accepted=s.x>=this.swipeOptions.threshold||d.x>=this.swipeOptions.velocity):this.state==="dragExiting"&&this.dragExitOptions&&(u.kind="dragExit",u.accepted=s.y>=this.dragExitOptions.threshold||d.y>=this.dragExitOptions.velocity),this.state="ended",this.lastResult=u,u},this.getOffset=()=>({x:this.currentPoint.x-this.startPoint.x,y:this.currentPoint.y-this.startPoint.y}),this.getDistance=()=>{const r=this.getOffset();return{x:Math.abs(r.x),y:Math.abs(r.y)}},this.getVisualOffset=()=>{const r=this.getOffset();return this.state==="swiping"?{x:r.x,y:0}:this.state==="dragExiting"?{x:0,y:r.y}:this.isAcceptedDragExitEnd()?{x:0,y:this.lastResult.offset.y}:{x:0,y:0}},this.getTouchConfig=(r={})=>{const s=this.getVisualOffset(),l=this.getVisualOpacity();this.state==="swiping"&&typeof r.resistance=="number"&&(s.x*=r.resistance);const d=this.state==="swiping"||this.state==="dragExiting";return{touch:s,opacity:l,transition:d||this.isAcceptedDragExitEnd()?"none":this.state==="ended"?IS():void 0}},this.ownsGesture=()=>this.state==="swiping"||this.state==="dragExiting",this.getVisualOpacity=()=>{const r=this.dragExitOptions;if(!(this.state==="dragExiting"||this.isAcceptedDragExitEnd())||!r||r.opacity===!1)return;const l=this.isAcceptedDragExitEnd()?this.lastResult.distance.y:this.getDistance().y,d=Math.min(l/(r.threshold*2),1);return Math.max(.35,1-d)},this.isAcceptedDragExitEnd=()=>this.state==="ended"&&this.lastResult.kind==="dragExit"&&this.lastResult.accepted,this.lockGesture=()=>{const r=this.getDistance();if(r.x=Er&&r.x>=r.y*s.axisLock){this.state="swiping";return}l&&r.y>=Er&&r.y>=r.x*l.axisLock&&(this.state="dragExiting")},this.now=a.now||(()=>Date.now())}get swipeOptions(){return this.gesture.swipe&&typeof this.gesture.swipe=="object"?this.gesture.swipe:null}get dragExitOptions(){return this.gesture.dragExit&&typeof this.gesture.dragExit=="object"?this.gesture.dragExit:null}},na=e=>{if(e===!1)return!1;if(e&&typeof e=="object")return e.flip},pO=new Set(["top-right","top-left","bottom-right","bottom-left","top-center","bottom-center","left-center","right-center"]),mO=/^([+-]?(?:\d+|\d*\.\d+))(?:[a-z%]*)$/i;function fO(e){return typeof e=="string"&&pO.has(e)?e:"top-right"}var hO={"top-right":ze.topRight,"top-left":ze.topLeft,"bottom-right":ze.bottomRight,"bottom-left":ze.bottomLeft,"top-center":ze.topCenter,"bottom-center":ze.bottomCenter,"left-center":ze.leftCenter,"right-center":ze.rightCenter},gO=e=>!!e&&typeof e=="object",Vv=e=>{if(typeof e=="number")return Number.isFinite(e)&&e!==0;if(typeof e!="string")return!1;const a=e.trim();if(!a)return!1;const r=a.match(mO);return r?Number(r[1])!==0:!0},Wv=(e,a)=>gO(e)?Vv(e[a]):Vv(e);function bn(e,a,r,s,l,d,u,m,h,g,b,v){return typeof e=="boolean"||typeof e=="string"?!!e&&Q.createElement("div",{ref:b,id:r,className:s,style:h,onClick:g?void 0:l},Q.createElement(a,{color:typeof e=="string"?e:v||""})):Q.isValidElement(e)?Q.cloneElement(e,{show:d,zoom:u,onClick:l,disabled:g,color:v}):null}function yO(){var e;const{set:a,presetIsMobile:r,controller:s,animate:l,backdrop:d,loop:u,show:m,zoom:h,page:g,canZoom:b,zoomShakeKey:v,flipReadyPrev:S,flipReadyNext:T,motion:C,outBrowsing:x,toPage:k,toPrevPage:R,toNextPage:j,toggleZoom:A,toggleRotate:M}=y.useContext(Fr),q=!r&&!b,Z=s||{},B=(e=Z.backdrop)!=null?e:d,X=Z.color,ae=y.useRef(null);y.useEffect(()=>{if(v===0)return;const xt=ae.current;xt&&(xt.classList.remove(ze.shake),xt.offsetWidth,xt.classList.add(ze.shake))},[v]);const ne=(l==null?void 0:l.browsing)===!1?{transition:"none"}:C.controlTransition?{transition:C.controlTransition}:void 0,te=(l==null?void 0:l.browsing)===!1?{transition:"none"}:C.controlItemTransition?{transition:C.controlItemTransition}:void 0,J={backgroundColor:B,color:X,...ne},pe={backgroundColor:B,color:X,...te},re=fO(Z.placement),ue=PS(Z.layout,r).flip,O=Wv(ue==null?void 0:ue.inset,"left"),H=Wv(ue==null?void 0:ue.inset,"right"),G=()=>{const xt=Array.isArray(a)?a[g]:void 0;xt&&(typeof window<"u"&&typeof window.open=="function"?window.open(xt.src):A())},Y=Z.rotateLeft||Z.rotate,se=Z.rotateRight||Z.rotate,K=!!(Y||se||Z.download||Z.zoom||Z.close)?Q.createElement("div",{id:"zmageControl","data-placement":re,className:no(ze.controls,hO[re],{[ze.show]:!h&&m}),style:J},bn(Y,n_,"zmageControlRotateLeft",no(ze.rotateLeft,{[ze.show]:!h&&m}),M("left"),m,h,void 0,te,void 0,void 0,X),bn(se,r_,"zmageControlRotateRight",no(ze.rotateRight,{[ze.show]:!h&&m}),M("right"),m,h,void 0,te,void 0,void 0,X),bn(Z.download,t_,"zmageControlDownload",no(ze.download,{[ze.show]:!h&&m}),()=>{var xt;return((xt=a[g])==null?void 0:xt.src)&&pm(a[g].src)},m,h,void 0,te,void 0,void 0,X),bn(Z.zoom,s_,"zmageControlZoom",no(ze.zoom,{[ze.show]:!h&&m,[ze.disabled]:q}),r?G:()=>A(),m,h,void 0,te,q,ae,X),bn(Z.close,e_,"zmageControlClose",no(ze.close,{[ze.show]:!h&&m}),h?()=>A():x,m,h,void 0,te,void 0,void 0,X)):null,ee=a.length,oe=a[g],fe=na(l),he=ee>1&&fe!=="none"&&fe!==!1,ye=ee>1&&(u||g>0),Ke=ee>1&&(u||g1?Q.isValidElement(Z.pagination)?Q.cloneElement(Z.pagination,{show:m,zoom:h,onClick:k}):!!Z.pagination&&Q.createElement("div",{id:"zmageControlPagination",className:no(ze.pages,{[ze.show]:!h&&m,[ze.mobile]:r}),style:J},a.map((xt,pa)=>pa===g?Q.createElement("span",{key:pa,id:"zmageControlPaginationActive",className:ze.blackDot}):Q.createElement("span",{key:pa,className:ze.whiteDot,onClick:()=>k(pa)}))):null,Xa=typeof(oe==null?void 0:oe.src)=="string"&&oe.src.length>0,Gr={close:x,zoom:()=>{!h&&!b||A()},rotateLeft:M("left"),rotateRight:M("right"),prev:()=>{we&&R()},next:()=>{vt&&j()},toPage:k,download:()=>{oe!=null&&oe.src&&pm(oe.src)}},zn={show:m,zoom:h,page:g,total:ee,canZoom:b,canPrev:we,canNext:vt,canDownload:Xa,preset:r?"mobile":"desktop",placement:re,current:oe},wo={Toolbar:K,Pagination:ua,FlipLeft:so,FlipRight:Dt};return typeof Z.render=="function"?Q.createElement(y.Fragment,null,Z.render({state:zn,actions:Gr,slots:wo})):Q.createElement(y.Fragment,null,K,so,Dt,ua)}var Fl={caption:"caption__JgbQx",show:"show__tlkZ3",mobile:"mobile__5qSC9",switchFade:"switchFade__T69y8",capFade:"capFade__x70-f",switchCrossFade:"switchCrossFade__X9cH8",capCrossFade:"capCrossFade__7nIUY",switchSwipe:"switchSwipe__1UDK0",capSwipe:"capSwipe__4eDDl",switchZoom:"switchZoom__27vZs",capZoom:"capZoom__-hpdF",switchBlur:"switchBlur__DwX02",capBlur:"capBlur__6kymE"},bO={fade:"switchFade",crossFade:"switchCrossFade",swipe:"switchSwipe",zoom:"switchZoom",blur:"switchBlur"},Zp=e=>!!e&&typeof e=="object"&&typeof e.text=="string";function vO(){var e;const{set:a,page:r,show:s,zoom:l,presetIsMobile:d,animate:u,motion:m}=y.useContext(Fr),h=Array.isArray(a)?(e=a[r])==null?void 0:e.caption:void 0,g=Zp(h)?h.text:typeof h=="string"?h:"",b=`${r}:${g}`,v=y.useRef(b),S=y.useRef(void 0),[T,C]=y.useState(!1),x=na(u),k=x!==!1?x:void 0;if(y.useEffect(()=>{v.current!==b&&(v.current=b,s&&!l&&k&&k!=="none"&&(C(!0),S.current!==void 0&&clearTimeout(S.current),S.current=setTimeout(()=>{S.current=void 0,C(!1)},pt)))},[k,b,s,l]),y.useEffect(()=>()=>{S.current!==void 0&&clearTimeout(S.current)},[]),!g)return null;const R=Zp(h)?h.style:void 0,j=Zp(h)?h.className:void 0,A=T?void 0:(u==null?void 0:u.browsing)===!1?{transition:"none"}:m.captionTransition?{transition:m.captionTransition}:void 0,M=T&&k&&k!=="none"?Fl[bO[k]]:void 0;return Q.createElement("div",{id:"zmageCaption",className:no(Fl.caption,{[Fl.show]:!l&&s,[Fl.mobile]:d},M,j),style:{...R,...A}},g)}var Kl={imageLayer:"imageLayer__yjPf3",zooming:"zooming__3mMU7",invalidate:"invalidate__MJYkk",jumpFadeIn:"jumpFadeIn__4wa75"},Ul={loadingContainer:"loadingContainer__-joiS",show:"show__-FZiR",reload:"reload__bc5Ze",loading:"loading__I-J4i"};function xO({show:e,load:a,invalidate:r,onReload:s,backdrop:l}){return Q.createElement(y.Fragment,null,(a||r)&&Q.createElement("div",{id:"zmageLoading",className:no(Ul.loadingContainer,{[Ul.show]:e})},a&&Q.createElement("div",{className:Ul.loading},Q.createElement(o_,null)),r&&Q.createElement("button",{className:Ul.reload,onClick:s,style:{background:l}},Q.createElement(a_,null))))}var _o=1,wO=10,Hc=e=>e!==!1&&typeof e=="object"&&e.slowMotion===!0,eC=e=>e&&e>_o?e:_o,Gc=(e,a=!1)=>e!=null&&e.shiftKey&&a?wO:_o,Bp=e=>{const a=eC(e),r=BS(!0,a);return a===_o?{durationMultiplier:a,browsingDuration:r,backgroundShowDelay:".15s"}:{durationMultiplier:a,browsingDuration:r,browsingTransition:IS(a),controlTransition:`transform ${pt*a}ms ${Ro}, opacity ${pt*a}ms ${Ro}`,controlItemTransition:`transform ${pt/2*a}ms ${Ro}, opacity ${pt*a}ms ${Ro}`,backgroundTransition:`opacity ${200*a}ms`,backgroundShowDelay:`${150*a}ms`,captionTransition:`transform ${pt*a}ms ${Ro}, opacity ${pt*a}ms ${Ro}`}},SO=(e,a)=>e??a.browsingTransition,Hl=.05,$v=.35,Ip={passive:!0},CO={passive:!1},kO={passive:!1},Yv=.001,TO=450,tC=class extends Q.Component{constructor(){super(...arguments),this.imageRef=Q.createRef(),this.sideImageAbortCleanups=new Map,this.initialPageOffset=typeof window<"u"?window.pageYOffset:0,this.pendingRafHandles=[],this.motionPhase="idle",this.pinchSequenceLocked=!1,this.suppressSyntheticClickUntil=0,this.wheelZoomExitGuardUntil=0,this.pendingDimCalibration=null,this.touchGesture=new xr,this.state={isFetching:!0,invalidate:!1,currentStyle:gm(this.context),animateConfig:Uv(this.context,na(this.context.animate)),touchGesture:this.touchGesture,timestamp:{},imageDimensions:{}},this.updateZoomEventListenerWithState=()=>{const{show:e,zoom:a}=this.context;e&&a&&!this.listeningMouseMove?(window.addEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!0):(window.removeEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!1);const r=e&&!!this.getWheelZoomOptions()&&(a||this.isWheelZoomExitGuardActive());r&&!this.listeningWheelZoom?(window.addEventListener("wheel",this.handleWheel,kO),this.listeningWheelZoom=!0):!r&&this.listeningWheelZoom&&(window.removeEventListener("wheel",this.handleWheel),this.listeningWheelZoom=!1)},this.updateCurrentImageStyle=()=>{const{touchGesture:e}=this.state,a=this.context.zoom&&(this.context.zoomTrigger==="keyboard"||this.context.zoomTrigger==="doubleTap")?this.getZoomingStyleFromStoredPosition():Iv(this.context,this.imageRef,e);this.setCurrentStyle(a,()=>{a._type==="zooming"&&(this.motionPhase==="zoom-enter"?this.scheduleZoomEnterComplete():this.consumePendingZoomMousePosition())})},this.updateCurrentImageStyleWithoutBrowsingTransition=()=>{const{touchGesture:e}=this.state,a=Iv(this.context,this.imageRef,e);this.motionPhase="browsing-instant",this.setCurrentStyle(a,this.scheduleBrowsingInstantReset)},this.startBrowsingInTransition=()=>{this.debounceUpdateCurrentImageStyle.cancel();const e=this.getCoverTargetStyle(this.getCurrentVisualStyle());this.startCoverFollow({phase:"browsing-follow",from:e,getTarget:()=>$S(this.context,this.imageRef),fallback:this.debounceUpdateCurrentImageStyle})},this.scheduleBrowsingInstantReset=({refreshStyle:e=!1}={})=>{this.cancelBrowsingTransitionFrame(),this.browsingTransitionRaf=window.requestAnimationFrame(()=>{this.browsingTransitionRaf=void 0,this.motionPhase==="browsing-instant"&&(this.motionPhase="idle",e&&this.setCurrentStyle(this.state.currentStyle),this.maybeStartFlipPreload())})},this.cancelBrowsingTransitionFrame=()=>{this.browsingTransitionRaf!==void 0&&(window.cancelAnimationFrame(this.browsingTransitionRaf),this.browsingTransitionRaf=void 0)},this.updateCurrentImageStyleForKeyboardZoom=()=>{const e=this.getZoomingStyleFromStoredPosition();this.setCurrentStyle(e,this.scheduleZoomEnterComplete)},this.updateCurrentImageStyleForStoredZoom=()=>{const e=this.getZoomingStyleFromStoredPosition();this.setCurrentStyle(e,this.scheduleZoomEnterComplete)},this.debounceUpdateCurrentImageStyle=AS(this.updateCurrentImageStyle,50),this.handleResize=()=>{const{show:e,zoom:a}=this.context;e&&!a?(this.debounceUpdateCurrentImageStyle.cancel(),this.motionPhase==="browsing-follow"?this.syncBrowsingFollowTarget():this.updateCurrentImageStyleWithoutBrowsingTransition()):this.debounceUpdateCurrentImageStyle(),this.reportCanZoom()},this.handleScroll=()=>{if(this.imageRef.current){const{show:e}=this.context;if(this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")return;this.imageRef.current.style.top=`calc(50% + ${e?0:this.initialPageOffset-window.pageYOffset}px)`}},this.handleClick=e=>{if(this.shouldSuppressSyntheticClick()){this.suppressSyntheticClickUntil=0,e.preventDefault(),e.stopPropagation();return}const{zoom:a,toggleZoom:r}=this.context;a&&r()},this.handleRecordImageDimensions=(e,a)=>{const r=a.currentTarget,s=r.naturalWidth,l=r.naturalHeight;!s||!l||this.setState(d=>{const u=d.imageDimensions[e];return u&&u.w===s&&u.h===l?null:{imageDimensions:{...d.imageDimensions,[e]:{w:s,h:l}}}})},this.markFlipReadyFromStep=e=>{Math.abs(e)===1&&this.context.setFlipReady(e<0?-1:1)},this.handleSideImageLoad=(e,a,r)=>{this.handleRecordImageDimensions(a,r),this.markFlipReadyFromStep(e)},this.handleSideImageTerminal=e=>{this.markFlipReadyFromStep(e)},this.setCenterImageRef=e=>{var a;(a=this.detachCenterImageAbort)==null||a.call(this),this.detachCenterImageAbort=void 0,this.imageRef.current=e,e&&(e.addEventListener("abort",this.handleImageAbort),this.detachCenterImageAbort=()=>e.removeEventListener("abort",this.handleImageAbort))},this.setSideImageAbortRef=(e,a)=>r=>{const s=this.sideImageAbortCleanups.get(e);if(s&&(s(),this.sideImageAbortCleanups.delete(e)),!r)return;const l=()=>this.handleSideImageTerminal(a);r.addEventListener("abort",l),this.sideImageAbortCleanups.set(e,()=>r.removeEventListener("abort",l))},this.shouldDeferFlipPreload=()=>{const{set:e,animate:a}=this.context,r=na(a);return Array.isArray(e)&&e.length>1&&r!=="none"&&r!==!1},this.syncFlipReadyFromLoadedDimensions=()=>{const{flipPreloadStarted:e,loop:a=!1,page:r,set:s,setFlipReady:l}=this.context;!e||!this.shouldDeferFlipPreload()||[-1,1].forEach(d=>{const u=fm(r,s.length,d,{loop:a});mm(u)&&this.state.imageDimensions[u]&&l(d)})},this.maybeStartFlipPreload=()=>{const{show:e,zoom:a,flipPreloadStarted:r,startFlipPreload:s}=this.context;if(!(!e||a||!this.shouldDeferFlipPreload())&&!(this.motionPhase==="browsing-follow"||this.motionPhase==="closing-follow")&&this.state.currentStyle._type==="browsing"){if(!r){s();return}this.syncFlipReadyFromLoadedDimensions()}},this.handleDoubleClick=()=>{const{hideOnDblClick:e,outBrowsing:a}=this.context;e&&a()},this.handleTouchStart=e=>{if(this.completeBrowsingFollow({startFlipPreload:!1}),this.tryStartPinchGesture(e)||e.touches.length>1||this.pinchSequenceLocked)return;const a=this.getTouchPoint(e);a&&(this.tryStartZoomTouchPan(a)||(this.touchGesture=new xr(this.getActiveGesture()).start(a),this.setTouchGesture(this.touchGesture)))},this.handleTouchMove=e=>{if(this.pinchGestureSession){this.updatePinchGesture(e);return}if(this.tryStartPinchGesture(e)||e.touches.length>1||this.pinchSequenceLocked||this.updateZoomTouchPan(e))return;const a=this.getTouchPoint(e);if(!a)return;const r=this.touchGesture.move(a);r.ownsGesture()&&e.preventDefault(),this.setTouchGesture(r)},this.handleTouchEnd=e=>{if(this.pinchGestureSession||this.pinchSequenceLocked){this.endPinchGesture(e);return}if(this.endZoomTouchPan()||this.tryHandleDoubleTapGesture(e))return;const a=this.touchGesture.end();this.setTouchGesture(this.touchGesture,()=>this.commitTouchGestureResult(a))},this.handleTouchCancel=()=>{this.clearPinchGesture(),this.clearZoomTouchPan(),this.touchGesture=new xr,this.setTouchGesture(this.touchGesture)},this.handleMouseMove=e=>{const{zoom:a}=this.context;if(!a)return;const r={x:e.clientX,y:e.clientY};if(this.zoomPointerPosition=r,this.motionPhase==="zoom-enter"||this.state.currentStyle._type!=="zooming"){this.pendingZoomMousePosition=r;return}const s=qa(this.context,this.imageRef,e,{scale:this.getCurrentZoomTargetScale()});this.startZoomFollow(s)},this.handleWheel=e=>{const a=this.getWheelZoomOptions();if(!this.context.show||!a)return;if(!this.context.zoom){this.isWheelZoomExitGuardActive()&&e.preventDefault();return}e.preventDefault();const r=Ct(this.context),s=Q_(e,r),l=a.reverse?-s:s;if(l===0)return;const{minScale:d,maxScale:u}=eO(this.context,this.imageRef,a),m=J_({currentScale:this.getCurrentZoomTargetScale(),pixelDeltaY:l,step:a.step,minScale:d,maxScale:u});this.zoomTargetScale=m;const h=this.getWheelZoomFocus(e,a,r);this.zoomPointerPosition={x:h.clientX,y:h.clientY};const g=qa(this.context,this.imageRef,h,{scale:m});if(l>0&&m<=d+Yv){this.startWheelZoomExitGuard(a.exitGuardDuration),this.context.toggleZoom("wheel");return}if(a.smooth===!1){this.applyZoomStyleImmediately(g);return}this.startZoomFollow(g)},this.handleImageLoadStart=()=>{var e;this.setState({invalidate:!1}),this.handleDetectImageLoadComplete(),this.loadingShowDelayTimer!==void 0&&clearTimeout(this.loadingShowDelayTimer);const a=(e=this.context.loadingDelay)!=null?e:200;this.loadingShowDelayTimer=setTimeout(()=>{this.loadingShowDelayTimer=void 0,this.setState({isFetching:!0})},a)},this.handleDetectImageLoadComplete=()=>{clearInterval(this.imageLoadingTimer),this.imageLoadingTimer=f_(this.imageRef.current,this.handleImageLoadEnd)},this.handleImageLoadEnd=({invalidate:e}={invalidate:!1})=>{this.loadingShowDelayTimer!==void 0&&(clearTimeout(this.loadingShowDelayTimer),this.loadingShowDelayTimer=void 0),clearInterval(this.imageLoadingTimer),this.setState({isFetching:!1,invalidate:e===void 0?this.state.invalidate:e})},this.handleImageLoad=()=>{const{animate:e,show:a,zoom:r}=this.context;this.motionPhase==="browsing-follow"?this.syncBrowsingFollowTarget():(e==null?void 0:e.browsing)===!1&&a&&!r?this.updateCurrentImageStyleWithoutBrowsingTransition():this.debounceUpdateCurrentImageStyle(),this.reportCanZoom(),this.handleImageLoadEnd()},this.reportCanZoom=()=>{var e,a;const{setCanZoom:r}=this.context;if(typeof r!="function")return;const s=this.imageRef.current;if(!s)return;const{naturalWidth:l,naturalHeight:d}=s;if(!l||!d)return;const u=Ct(this.context);if(!u.width||!u.height)return;const m=ES({naturalWidth:l,naturalHeight:d,edge:(e=this.context.edge)!=null?e:0,viewport:u,rotate:(a=this.context.rotate)!=null?a:0});r(m.canZoom)},this.handleImageError=e=>{this.handleImageLoadEnd({invalidate:!0});const{onError:a}=this.context;typeof a=="function"&&a(e)},this.handleImageAbort=()=>{this.handleImageLoadEnd({invalidate:!0})},this.handleImageReload=()=>{const{page:e}=this.context;this.handleSetTimestamp(e)},this.handleSetTimestamp=e=>{const{set:a}=this.context,{timestamp:r}=this.state;this.setState({timestamp:{...r,[a[e].src]:new Date().getTime()}})},this.handleGetTimestamp=e=>{const{set:a}=this.context,{timestamp:r}=this.state;return r[a[e].src]},this.setCurrentStyle=(e,a)=>{const{animate:r}=this.context,{currentStyle:s}=this.state;this.setState({currentStyle:e._behavior==="merge"?{...s,...e}:e,animateConfig:Uv(this.context,na(r))},a)},this.startZoomEnter=()=>{this.debounceUpdateCurrentImageStyle.cancel(),this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.zoomPointerPosition=void 0,this.zoomTargetScale=1,this.clearWheelZoomExitGuard(),this.motionPhase="zoom-enter"},this.startStoredZoomEnter=()=>{this.debounceUpdateCurrentImageStyle.cancel(),this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.clearWheelZoomExitGuard(),this.motionPhase="zoom-enter"},this.startKeyboardZoomEnter=()=>{this.debounceUpdateCurrentImageStyle.cancel(),this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.zoomPointerPosition=this.context.zoomPosition,this.zoomTargetScale=1,this.clearWheelZoomExitGuard(),this.motionPhase="zoom-enter"},this.resetZoomMotionState=()=>{this.cancelZoomEnterTimer(),this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.pendingZoomMousePosition=void 0,this.zoomPointerPosition=void 0,this.zoomTargetScale=void 0,this.clearPinchGesture(),this.clearZoomTouchPan(),U_(this.motionPhase)&&(this.motionPhase="idle")},this.cancelZoomEnterTimer=()=>{this.zoomEnterTimer!==void 0&&(clearTimeout(this.zoomEnterTimer),this.zoomEnterTimer=void 0)},this.cancelZoomFollowFrame=()=>{this.zoomFollowRaf!==void 0&&(window.cancelAnimationFrame(this.zoomFollowRaf),this.zoomFollowRaf=void 0)},this.getCenterImageTransform=e=>{const a=e.x||0,r=e.y||0,s=e.scale||0,l=e.rotate||0;return`translate3d(-50%, -50%, 0) translate3d(${a}px, ${r}px, 0px) scale3d(${s}, ${s}, 1) rotate3d(0, 0, 1, ${l}deg)`},this.setNodeTransform=(e,a)=>{e.style.transform=a,e.style.setProperty("-webkit-transform",a)},this.setNodeTransitionNone=e=>{e.style.transition="none",e.style.setProperty("-webkit-transition","none")},this.writeImageStyleToNode=(e,a)=>{var r;this.setNodeTransitionNone(e),this.setNodeTransform(e,this.getCenterImageTransform(a)),e.style.opacity=String((r=a.opacity)!=null?r:1),this.setNodeClipAndRadius(e,a)},this.setNodeClipAndRadius=(e,a)=>{var r,s;const l=(r=a.scale)!=null?r:1,d=Bv(a.clip,(s=a.radius)!=null?s:0,l);d?(e.style.clipPath=d,e.style.setProperty("-webkit-clip-path",d)):(e.style.clipPath="",e.style.removeProperty("-webkit-clip-path")),typeof a.radius=="number"?e.style.borderRadius=`${hm(a.radius,l)}px`:e.style.borderRadius=""},this.getWheelZoomOptions=()=>{var e;const a=(e=this.context.gesture)==null?void 0:e.wheelZoom;return a&&typeof a=="object"?a:null},this.getWheelZoomExitGuardDuration=e=>Number.isFinite(e)&&e>=0?e:Uc.exitGuardDuration,this.startWheelZoomExitGuard=e=>{this.clearWheelZoomExitGuard();const a=this.getWheelZoomExitGuardDuration(e);a<=0||(this.wheelZoomExitGuardUntil=Date.now()+a,this.wheelZoomExitGuardTimer=setTimeout(()=>{this.wheelZoomExitGuardTimer=void 0,this.wheelZoomExitGuardUntil=0,this.updateZoomEventListenerWithState()},a))},this.clearWheelZoomExitGuard=()=>{this.wheelZoomExitGuardTimer!==void 0&&(clearTimeout(this.wheelZoomExitGuardTimer),this.wheelZoomExitGuardTimer=void 0),this.wheelZoomExitGuardUntil=0},this.isWheelZoomExitGuardActive=()=>Date.now(){var e,a;const s=[(e=this.zoomFollowTargetStyle)==null?void 0:e.scale,this.zoomTargetScale,(a=this.zoomFollowCurrentStyle)==null?void 0:a.scale,this.state.currentStyle._type==="zooming"?this.state.currentStyle.scale:void 0,1].find(l=>Number.isFinite(l)&&(l??0)>0);return s??1},this.getWheelZoomFocus=(e,a,r=Ct(this.context))=>a.center==="viewport"?{clientX:r.left+r.width/2,clientY:r.top+r.height/2}:{clientX:e.clientX,clientY:e.clientY},this.writeZoomStyleToNode=e=>{const a=this.imageRef.current;this.cancelZoomFollowFrame(),this.motionPhase="zoom-follow",this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.zoomTargetScale=e.scale,a&&this.writeImageStyleToNode(a,e)},this.applyZoomStyleImmediately=e=>{this.writeZoomStyleToNode(e),this.setCurrentStyle(e)},this.getPinchZoomOptions=()=>{var e;const a=(e=this.context.gesture)==null?void 0:e.pinchZoom;return a&&typeof a=="object"?a:null},this.canStartPinchZoom=()=>{const{canZoom:e,zoom:a}=this.context;return a||e},this.getPinchFocus=(e,a,r=Ct(this.context))=>a.center==="viewport"?{clientX:r.left+r.width/2,clientY:r.top+r.height/2}:tO(e),this.tryStartPinchGesture=e=>{if(e.touches.length<2||this.pinchGestureSession)return!1;const a=this.getPinchZoomOptions();if(!a||!this.canStartPinchZoom())return!1;const r=Kv(e.touches);if(r<=0)return!1;const{minScale:s,maxScale:l,fitScale:d}=ym(this.context,this.imageRef,a),u=this.context.zoom?this.getCurrentZoomTargetScale():this.state.currentStyle.scale,m=Number.isFinite(u)&&(u??0)>0?u:d,h=this.getPinchFocus(e.touches,a),g=qa(this.context,this.imageRef,h,{scale:m});return this.pinchGestureSession={startDistance:r,baseScale:m,minScale:s,maxScale:l,fitScale:d,options:a},this.pinchTargetStyle=g,this.pinchSequenceLocked=!0,this.zoomPointerPosition={x:h.clientX,y:h.clientY},this.zoomTargetScale=m,this.clearZoomTouchPan(),this.touchGesture=new xr,this.setTouchGesture(this.touchGesture),this.context.zoom?this.writeZoomStyleToNode(g):this.context.toggleZoom("pinch"),!0},this.updatePinchGesture=e=>{const a=this.pinchGestureSession;if(!a||e.touches.length<2)return;e.preventDefault();const r=Kv(e.touches),s=oO({baseScale:a.baseScale,startDistance:a.startDistance,currentDistance:r,minScale:a.minScale,maxScale:a.maxScale}),l=this.getPinchFocus(e.touches,a.options),d=qa(this.context,this.imageRef,l,{scale:s});this.pinchTargetStyle=d,this.zoomPointerPosition={x:l.clientX,y:l.clientY},this.zoomTargetScale=s,this.writeZoomStyleToNode(d)},this.endPinchGesture=e=>{var a;const r=this.pinchGestureSession,s=this.pinchTargetStyle,l=e.touches.length>0,d=!!r&&!!s&&r.options.resetBelowFit!==!1&&((a=s.scale)!=null?a:r.fitScale)<=r.minScale+Yv;s&&this.setCurrentStyle(s),this.pinchGestureSession=void 0,this.pinchTargetStyle=s,this.pinchSequenceLocked=l,d&&this.context.zoom&&this.context.toggleZoom("pinch"),l||(this.pinchSequenceLocked=!1,this.pinchTargetStyle=void 0)},this.clearPinchGesture=()=>{this.pinchGestureSession=void 0,this.pinchTargetStyle=void 0,this.pinchSequenceLocked=!1},this.getZoomTouchPanStartStyle=()=>{const e=this.zoomFollowCurrentStyle||this.zoomFollowTargetStyle||(this.state.currentStyle._type==="zooming"?this.state.currentStyle:void 0)||this.getZoomingStyleFromStoredPosition();return Fv(this.context,this.imageRef,e)},this.tryStartZoomTouchPan=e=>!this.context.zoom||this.state.currentStyle._type!=="zooming"?!1:(this.zoomTouchPanSession={startPoint:e,startStyle:this.getZoomTouchPanStartStyle(),active:!1},this.touchGesture=new xr().start(e),this.setTouchGesture(this.touchGesture),!0),this.updateZoomTouchPan=e=>{var a,r;const s=this.zoomTouchPanSession;if(!s)return!1;const l=this.getTouchPoint(e);if(!l)return!0;this.touchGesture=this.touchGesture.move(l);const d=l.x-s.startPoint.x,u=l.y-s.startPoint.y;if(!s.active&&Math.abs(d){const e=this.zoomTouchPanSession;if(!e||(this.zoomTouchPanSession=void 0,!e.active))return!1;const a=Fv(this.context,this.imageRef,e.targetStyle||e.startStyle);return this.cancelZoomFollowFrame(),this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.motionPhase="idle",this.zoomTargetScale=a.scale,this.setCurrentStyle(a),!0},this.clearZoomTouchPan=()=>{this.zoomTouchPanSession=void 0},this.getZoomingStyleFromStoredPosition=()=>{const e=this.zoomPointerPosition||this.context.zoomPosition,a=this.getCurrentZoomTargetScale();return e?qa(this.context,this.imageRef,{clientX:e.x,clientY:e.y},{scale:a}):qa(this.context,this.imageRef,{},{scale:a})},this.getDoubleTapZoomOptions=()=>{var e;const a=(e=this.context.gesture)==null?void 0:e.doubleTapZoom;return a&&typeof a=="object"?a:null},this.getDoubleTapGesture=e=>{const a=`${e.interval}:${e.distance}`;return(!this.doubleTapGesture||this.doubleTapGestureKey!==a)&&(this.doubleTapGesture=new uO(e),this.doubleTapGestureKey=a),this.doubleTapGesture},this.getDoubleTapFocus=(e,a,r=Ct(this.context))=>a.center==="viewport"?{clientX:r.left+r.width/2,clientY:r.top+r.height/2}:{clientX:e.x,clientY:e.y},this.getDoubleTapTargetScale=e=>{const{minScale:a,maxScale:r}=ym(this.context,this.imageRef,e),s=Number.isFinite(e.scale)&&e.scale>0?e.scale:r;return Math.min(Math.max(s,a),r)},this.suppressNextSyntheticClick=()=>{this.suppressSyntheticClickUntil=Date.now()+TO},this.shouldSuppressSyntheticClick=()=>this.suppressSyntheticClickUntil>0&&Date.now()<=this.suppressSyntheticClickUntil,this.tryHandleDoubleTapGesture=e=>{var a;const r=this.getDoubleTapZoomOptions();if(!r||e.touches.length>0||e.changedTouches.length!==1)return!1;const s=this.getChangedTouchPoint(e);if(!s)return!1;const l=this.touchGesture.getDistance();if(l.x>r.distance||l.y>r.distance)return(a=this.doubleTapGesture)==null||a.cancel(),!1;if(!this.getDoubleTapGesture(r).tap(s))return!1;if(this.touchGesture=new xr,this.setTouchGesture(this.touchGesture),this.suppressNextSyntheticClick(),this.context.zoom)return this.context.toggleZoom("doubleTap"),!0;if(!this.canStartPinchZoom())return!0;const d=this.getDoubleTapFocus(s,r),u=this.getDoubleTapTargetScale(r);return this.zoomPointerPosition={x:d.clientX,y:d.clientY},this.zoomTargetScale=u,this.context.toggleZoom("doubleTap"),!0},this.scheduleZoomEnterComplete=()=>{this.cancelZoomEnterTimer(),this.zoomEnterTimer=setTimeout(()=>{this.zoomEnterTimer=void 0,!(!this.context.zoom||this.motionPhase!=="zoom-enter")&&(this.motionPhase="zoom-follow",this.consumePendingZoomMousePosition())},pt)},this.getNextZoomFollowStyle=(e,a)=>({...a,x:(e.x||0)+((a.x||0)-(e.x||0))*Hl,y:(e.y||0)+((a.y||0)-(e.y||0))*Hl,scale:(e.scale||0)+((a.scale||0)-(e.scale||0))*Hl,rotate:(e.rotate||0)+((a.rotate||0)-(e.rotate||0))*Hl}),this.zoomFollowHasSettled=(e,a)=>Math.abs((e.x||0)-(a.x||0))<$v&&Math.abs((e.y||0)-(a.y||0))<$v&&Math.abs((e.scale||0)-(a.scale||0))<.001&&Math.abs((e.rotate||0)-(a.rotate||0))<.001,this.startZoomFollow=e=>{const a=this.imageRef.current;this.motionPhase="zoom-follow",this.zoomFollowTargetStyle=e,this.zoomTargetScale=e.scale,this.zoomFollowCurrentStyle=this.zoomFollowCurrentStyle||(this.state.currentStyle._type==="zooming"?this.state.currentStyle:e),a&&this.setNodeTransitionNone(a),this.zoomFollowRaf===void 0&&(this.zoomFollowRaf=window.requestAnimationFrame(this.stepZoomFollow))},this.stepZoomFollow=()=>{var e;this.zoomFollowRaf=void 0;const a=this.imageRef.current,r=this.zoomFollowTargetStyle,s=this.zoomFollowCurrentStyle;if(!a||!r||!s||!this.context.zoom){this.resetZoomMotionState();return}const l=this.getNextZoomFollowStyle(s,r),d=this.zoomFollowHasSettled(l,r),u=d?r:l;if(this.zoomFollowCurrentStyle=u,this.setNodeTransitionNone(a),this.setNodeTransform(a,this.getCenterImageTransform(u)),a.style.opacity=String((e=u.opacity)!=null?e:1),this.setNodeClipAndRadius(a,u),d){this.zoomFollowCurrentStyle=void 0,this.zoomFollowTargetStyle=void 0,this.setCurrentStyle(r);return}this.zoomFollowRaf=window.requestAnimationFrame(this.stepZoomFollow)},this.startClosingFollow=()=>{this.startCoverFollow({phase:"closing-follow",from:this.getCurrentVisualStyle(),getTarget:this.getCoverTargetStyle,fallback:this.debounceUpdateCurrentImageStyle})},this.startCoverFollow=({phase:e,from:a,getTarget:r,fallback:s})=>{this.cancelCoverFollow(),this.debounceUpdateCurrentImageStyle.cancel();const l=this.imageRef.current;if(!l){s();return}this.coverFollowStartTime=performance.now(),this.coverFollowDuration=this.context.motion.browsingDuration,this.coverFollowFromStyle=a,this.coverFollowCurrentStyle=a,this.coverFollowTargetGetter=r,this.motionPhase=e,l.style.top="50%",this.writeImageStyleToNode(l,a);const d=()=>{const u=this.imageRef.current;!u||this.motionPhase!==e||this.coverFollowFromStyle!==a||(u.style.top="50%",this.writeImageStyleToNode(u,this.coverFollowCurrentStyle||a),this.coverFollowRaf===void 0&&(this.coverFollowRaf=window.requestAnimationFrame(this.stepCoverFollow)))};if(e==="browsing-follow"){this.setCurrentStyle(r(a),d);return}this.setCurrentStyle(a),d()},this.stepCoverFollow=()=>{this.coverFollowRaf=void 0;const e=this.imageRef.current,a=this.coverFollowFromStyle,r=this.coverFollowStartTime,s=this.coverFollowDuration,l=this.coverFollowTargetGetter;if(!e||!a||r===void 0||s===void 0||!l){this.cancelCoverFollow();return}const d=Math.min(1,(performance.now()-r)/s),u=W_(d),m=l(a),h=G_(a,m,u);if(this.coverFollowCurrentStyle=h,this.writeImageStyleToNode(e,h),d>=1){this.coverFollowFromStyle=void 0,this.coverFollowCurrentStyle=void 0,this.coverFollowStartTime=void 0,this.coverFollowDuration=void 0,this.coverFollowTargetGetter=void 0,this.motionPhase="idle",this.writeImageStyleToNode(e,m),this.setCurrentStyle(m,this.maybeStartFlipPreload);return}this.coverFollowRaf=window.requestAnimationFrame(this.stepCoverFollow)},this.syncBrowsingFollowTarget=()=>{if(this.motionPhase!=="browsing-follow")return;const e=this.coverFollowFromStyle,a=this.coverFollowTargetGetter;if(!e||!a)return;const r=this.coverFollowCurrentStyle||e;this.setCurrentStyle(a(e),()=>{const s=this.imageRef.current;!s||this.motionPhase!=="browsing-follow"||this.writeImageStyleToNode(s,this.coverFollowCurrentStyle||r)})},this.completeBrowsingFollow=({startFlipPreload:e=!0}={})=>{if(this.motionPhase!=="browsing-follow")return;const a=this.coverFollowFromStyle,r=this.coverFollowTargetGetter;if(!a||!r){this.cancelCoverFollow();return}const s=r(a);this.cancelCoverFollow();const l=this.imageRef.current;l&&(l.style.top="50%",this.writeImageStyleToNode(l,s)),this.setCurrentStyle(s,e?this.maybeStartFlipPreload:void 0)},this.cancelCoverFollow=()=>{this.coverFollowRaf!==void 0&&(window.cancelAnimationFrame(this.coverFollowRaf),this.coverFollowRaf=void 0),this.coverFollowFromStyle=void 0,this.coverFollowCurrentStyle=void 0,this.coverFollowStartTime=void 0,this.coverFollowDuration=void 0,this.coverFollowTargetGetter=void 0,(this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")&&(this.motionPhase="idle")},this.cancelClosingFollow=()=>{this.cancelCoverFollow()},this.getCurrentVisualStyle=()=>{var e,a;const{touchGesture:r}=this.state,{touch:s,opacity:l}=r.getTouchConfig();if((this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")&&this.coverFollowCurrentStyle)return{...this.coverFollowCurrentStyle,x:((e=this.coverFollowCurrentStyle.x)!=null?e:0)+s.x,y:this.coverFollowCurrentStyle.y+s.y,opacity:l??this.coverFollowCurrentStyle.opacity};const{currentStyle:d}=this.state;return{...d,x:((a=d.x)!=null?a:0)+s.x,y:d.y+s.y,opacity:l??d.opacity}},this.getRenderCurrentStyle=()=>(this.motionPhase==="closing-follow"||this.motionPhase==="browsing-follow")&&this.coverFollowCurrentStyle?this.coverFollowCurrentStyle:this.state.currentStyle,this.getCoverTargetStyle=e=>{const a=gm(this.context,this.imageRef,this.state.touchGesture);return a._behavior==="merge"?{...e,...a}:a},this.cancelScaleCalibrationAnimation=()=>{const e=this.imageRef.current;e&&(this.debounceUpdateCurrentImageStyle.cancel(),this.setNodeTransitionNone(e),this.calibrationRestoreRaf!==void 0&&window.cancelAnimationFrame(this.calibrationRestoreRaf),this.calibrationRestoreRaf=window.requestAnimationFrame(()=>{this.calibrationRestoreRaf=void 0,e&&(e.style.transition="",e.style.removeProperty("-webkit-transition"))}))},this.applyJumpFadeIn=()=>{const e=this.imageRef.current;if(!e)return;const a=Kl.jumpFadeIn;e.classList.remove(a),e.offsetWidth,e.classList.add(a),this.jumpFadeTimer!==void 0&&clearTimeout(this.jumpFadeTimer),this.jumpFadeTimer=setTimeout(()=>{this.jumpFadeTimer=void 0,e&&e.classList.remove(a)},pt+10)},this.consumePendingZoomMousePosition=()=>{const e=this.pendingZoomMousePosition;if(!e||!this.context.zoom||this.state.currentStyle._type!=="zooming")return;this.pendingZoomMousePosition=void 0;const a=qa(this.context,this.imageRef,{clientX:e.x,clientY:e.y},{scale:this.getCurrentZoomTargetScale()});this.startZoomFollow(a)},this.getTouchPoint=e=>{const a=e.touches[0]||e.changedTouches[0];return a?{x:a.clientX,y:a.clientY}:null},this.getChangedTouchPoint=e=>{const a=e.changedTouches[0];return a?{x:a.clientX,y:a.clientY}:null},this.getActiveGesture=()=>{const{gesture:e,set:a,zoom:r}=this.context;if(r)return{swipe:!1,dragExit:!1};const s=e==null?void 0:e.swipe,l=e==null?void 0:e.dragExit;return{swipe:Array.isArray(a)&&a.length>1&&s&&typeof s=="object"?s:!1,dragExit:l&&typeof l=="object"?l:!1}},this.getSwipeBoundaryResistance=e=>{const{gesture:a,loop:r,page:s,set:l}=this.context;if(r||e.state!=="swiping"||!Array.isArray(l)||l.length<=1)return;const d=a==null?void 0:a.swipe;if(!d||typeof d!="object")return;const u=e.getOffset(),m=s===0&&u.x>0,h=s===l.length-1&&u.x<0;return m||h?d.resistance:void 0},this.commitTouchGestureResult=e=>{if(!e.accepted)return;const{outBrowsing:a,toPrevPage:r,toNextPage:s}=this.context;e.kind==="swipe"?e.offset.x<0?s():r():e.kind==="dragExit"&&a()},this.setTouchGesture=(e,a)=>{e&&(this.touchGesture=e,this.setState({touchGesture:e},a))},this.getOwnFitScale=(e,a=0)=>{const r=this.state.imageDimensions[e];if(!r)return null;const{edge:s}=this.context;return gf(r.w,r.h,s??0,Ct(this.context),a)},this.getStyle=(e,a,r,s)=>{var l,d,u,m,h;const{animate:g,set:b,zoom:v,page:S}=this.context,{invalidate:T,currentStyle:C,touchGesture:x,animateConfig:k}=this.state,R=r?C:this.getRenderCurrentStyle(),j=na(g);let A,M,q,Z,{offset:B,overflow:X,opacity:ae,blur:ne}=k;const{touch:te,opacity:J,transition:pe}=x.getTouchConfig({resistance:this.getSwipeBoundaryResistance(x)});if(r){const Y=C._type==="browsing"?this.getOwnFitScale(s):null,se=(Y??(C.scale||0))+X;Z=se;const N=iO({flipKind:j,baseOffset:B,ownScale:Y,dims:this.state.imageDimensions[s],viewport:Ct(this.context)}),K=a===1?(C.x||0)+te.x+N*e:(C.x||0)+N*e,ee=C.y;A=`translate3d(-50%, -50%, 0) translate3d(${K}px, ${ee}px, 0px) scale3d(${se}, ${se}, 1) rotate3d(0, 0, 1, 0deg)`,M=10*a,q="none"}else{const Y=R._type==="browsing"?this.getOwnFitScale(S,(d=(l=R.rotate)!=null?l:this.context.rotate)!=null?d:0):null,se=Y??((u=R.scale)!=null?u:0);Z=se;const N=(R.x||0)+te.x,K=R.y+te.y;A=`translate3d(-50%, -50%, 0) translate3d(${N}px, ${K}px, 0px) scale3d(${se}, ${se}, 1) rotate3d(0, 0, 1, ${R.rotate}deg)`,M=10,ae=(m=J??R.opacity)!=null?m:1}const re=r?C:R,ue=(h=re.radius)!=null?h:0,O=hm(ue,Z||1),H=Bv(re.clip,ue,Z||1),G=typeof ne=="number"?r?`blur(${ne}px)`:"blur(0px)":void 0;return{...Mv({transform:A}),...H?Mv({clipPath:H}):{},...G?{filter:G}:{},...typeof re.radius=="number"?{borderRadius:`${O}px`}:{},cursor:v?"zoom-out":"initial",zIndex:M,opacity:T?0:ae,transition:SO(H_({role:r?"side":"center",motionPhase:this.motionPhase,touchTransition:pe,flip:j,imageType:re._type}),this.context.motion),pointerEvents:q,...b[S].style}},this.buildImageSeries=e=>{const{flipPreloadStarted:a,loop:r=!1,set:s,page:l,animate:d}=this.context,u=na(d);if(s.length>1&&u!=="none"&&u!==!1&&a)return v_(e).reduce((g,b)=>{const v=fm(l,s.length,b,{loop:r});if(mm(v)){const S=this.buildImage({step:b,imageIndex:v});S&&g.push(S)}return g},[]);const m=this.buildImage({step:0,imageIndex:l});return m?[m]:[]},this.buildImage=({step:e=0,imageIndex:a=0}={})=>{const{set:r,show:s,zoom:l,page:d,pageWithStep:u}=this.context,{invalidate:m,currentStyle:h}=this.state,g=Math.abs(e),b=g>0,v=u+e,S=this.getStyle(e,g,b,a),T=no(Kl.imageLayer,r[a].className,{[Kl.zooming]:l,[Kl.invalidate]:m}),C=`${v}-${r[a].src}`,x=A=>this.handleSideImageLoad(e,a,A),k=A=>{this.handleRecordImageDimensions(a,A),this.handleImageLoad()},R={style:S,className:T,src:h_(r[a].src,{t:this.handleGetTimestamp(d)}),alt:r[a].alt,onLoad:x},j={id:"zmageImage",ref:this.setCenterImageRef,onLoad:k,onError:this.handleImageError,onClick:this.handleClick,onDoubleClick:this.handleDoubleClick};return b?s&&!l&&h._type!=="zooming"&&Q.createElement("img",{key:C,...R,ref:this.setSideImageAbortRef(C,e),onError:()=>this.handleSideImageTerminal(e)}):Q.createElement("img",{key:C,...R,...j})}}componentDidMount(){const{presetIsMobile:e,presetIsDesktop:a,hideOnScroll:r}=this.context;window.addEventListener("resize",this.handleResize),e&&this.pendingRafHandles.push(window.requestAnimationFrame(()=>{window.addEventListener("touchstart",this.handleTouchStart,Ip),window.addEventListener("touchmove",this.handleTouchMove,CO),window.addEventListener("touchend",this.handleTouchEnd,Ip),window.addEventListener("touchcancel",this.handleTouchCancel,Ip)})),a&&r&&this.pendingRafHandles.push(window.requestAnimationFrame(()=>{window.addEventListener("scroll",this.handleScroll)}))}componentDidUpdate(e,a){var r;const{show:s,zoom:l,rotate:d,page:u}=e,{show:m,zoom:h,rotate:g,page:b}=this.props,{animate:v,presetIsMobile:S}=this.context,T=!l&&h&&this.context.zoomTrigger==="keyboard",C=!l&&h&&this.context.zoomTrigger==="pinch",x=!l&&h&&this.context.zoomTrigger==="doubleTap";if((s!==m||u!==b||l&&!h)&&this.resetZoomMotionState(),!s&&m&&this.cancelClosingFollow(),d!==g&&m&&(this.completeBrowsingFollow(),this.reportCanZoom()),!l&&h&&(this.cancelCoverFollow(),T?this.startKeyboardZoomEnter():C&&this.pinchTargetStyle?this.applyZoomStyleImmediately(this.pinchTargetStyle):x?this.startStoredZoomEnter():this.startZoomEnter()),s!==m||l!==h||d!==g){const k=()=>{T?this.updateCurrentImageStyleForKeyboardZoom():C&&this.pinchTargetStyle?this.setCurrentStyle(this.pinchTargetStyle):x?this.updateCurrentImageStyleForStoredZoom():s!==m&&(v==null?void 0:v.browsing)===!1?this.updateCurrentImageStyleWithoutBrowsingTransition():!s&&m?this.startBrowsingInTransition():s&&!m?this.startClosingFollow():l&&!h?this.updateCurrentImageStyle():this.debounceUpdateCurrentImageStyle()};s?k():(k(),this.handleDetectImageLoadComplete(),S&&p_()),this.updateZoomEventListenerWithState()}if(u!==b){this.cancelCoverFollow();const k=this.imageRef.current;k&&k.complete&&k.naturalWidth>0?(this.handleImageLoadEnd(),this.debounceUpdateCurrentImageStyle(),this.reportCanZoom()):this.handleImageLoadStart(),this.pendingDimCalibration=this.state.imageDimensions[b]==null?b:null}if(this.pendingDimCalibration===b&&a.imageDimensions[b]==null&&this.state.imageDimensions[b]!=null&&this.props.show&&(this.pendingDimCalibration=null,this.cancelScaleCalibrationAnimation()),this.motionPhase==="browsing-follow"&&a.imageDimensions[b]!==this.state.imageDimensions[b]&&this.syncBrowsingFollowTarget(),u!==b&&this.props.show){const k=na(this.context.animate),R=this.context.set,j=(r=this.context.loop)!=null?r:!1;x_(u,b,R.length,j)>2&&k!=="none"&&this.applyJumpFadeIn()}this.maybeStartFlipPreload()}componentWillUnmount(){var e;const{presetIsMobile:a,presetIsDesktop:r}=this.context;this.pendingRafHandles.forEach(s=>window.cancelAnimationFrame(s)),this.pendingRafHandles=[],this.cancelBrowsingTransitionFrame(),this.calibrationRestoreRaf!==void 0&&(window.cancelAnimationFrame(this.calibrationRestoreRaf),this.calibrationRestoreRaf=void 0),this.jumpFadeTimer!==void 0&&(clearTimeout(this.jumpFadeTimer),this.jumpFadeTimer=void 0),this.loadingShowDelayTimer!==void 0&&(clearTimeout(this.loadingShowDelayTimer),this.loadingShowDelayTimer=void 0),this.clearWheelZoomExitGuard(),this.cancelClosingFollow(),this.resetZoomMotionState(),this.debounceUpdateCurrentImageStyle.cancel(),a&&(window.removeEventListener("touchstart",this.handleTouchStart),window.removeEventListener("touchmove",this.handleTouchMove),window.removeEventListener("touchend",this.handleTouchEnd),window.removeEventListener("touchcancel",this.handleTouchCancel)),r&&window.removeEventListener("scroll",this.handleScroll),window.removeEventListener("resize",this.handleResize),window.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("wheel",this.handleWheel),(e=this.detachCenterImageAbort)==null||e.call(this),this.detachCenterImageAbort=void 0,this.sideImageAbortCleanups.forEach(s=>s()),this.sideImageAbortCleanups.clear(),clearInterval(this.imageLoadingTimer)}render(){const{show:e,pageIsCover:a}=this.context,{isFetching:r,invalidate:s}=this.state;return Q.createElement(y.Fragment,null,Q.createElement(xO,{show:e&&(!a||s),load:r,invalidate:s,onReload:this.handleImageReload}),this.buildImageSeries(2))}};tC.contextType=Fr;var EO={backgroundLayer:"backgroundLayer__CGbNW"};function RO({show:e,zoom:a}){const{animate:r,backdrop:s,outBrowsing:l,toggleZoom:d,presetIsDesktop:u,motion:m}=y.useContext(Fr),h=(r==null?void 0:r.browsing)===!1,g=h?"0s":e&&u?m.backgroundShowDelay:"0s";return Q.createElement("div",{id:"zmageBackground",className:EO.backgroundLayer,onClick:a?()=>d():l,style:{opacity:e?1:0,background:s||"",transition:h?"none":m.backgroundTransition,transitionDelay:g}})}var jO=e=>{if(e.length===1){if(/[A-Za-z]/.test(e))return`Key${e.toUpperCase()}`;if(/[0-9]/.test(e))return`Digit${e}`}return e},Yl=e=>{var a;const r=e.split("+").map(d=>d.trim()).filter(Boolean),s=(a=r.pop())!=null?a:"",l=new Set(r.map(d=>d.toLowerCase()));return{code:jO(s),needsMod:l.has("mod"),needsCmd:l.has("cmd")||l.has("meta"),needsCtrl:l.has("ctrl")||l.has("control"),needsShift:l.has("shift"),needsAlt:l.has("alt")||l.has("option")}},Xl=(e,a)=>e==null||e===!1?[]:e===!0?[Yl(a)]:typeof e=="string"?[Yl(e)]:Array.isArray(e)?e.map(Yl):[],Gl=(e,a,r)=>typeof e=="string"||Array.isArray(e)?Xl(e,r):!!e||!!a?[Yl(r)]:[],AO=(e,a)=>{if(e.code!==a.code)return!1;if(a.needsMod){if(!(e.metaKey||e.ctrlKey))return!1}else if(a.needsCmd!==e.metaKey||a.needsCtrl!==e.ctrlKey)return!1;return!(a.needsShift!==e.shiftKey||a.needsAlt!==e.altKey)},vn=(e,a)=>{for(let r=0;r!!e&&typeof e=="object",zO=(e,a)=>{if(!e&&!a)return;const r={...e,...a};return Xv(e==null?void 0:e.inset)&&Xv(a==null?void 0:a.inset)&&(r.inset={...e.inset,...a.inset}),r},Qv=(e,a)=>{const r={};return NO.forEach(s=>{const l=zO(e==null?void 0:e[s],a==null?void 0:a[s]);l&&(r[s]=l)}),Object.keys(r).length>0?r:void 0},MO=(e,a)=>{const r=Qv(e,a),s=Qv(e==null?void 0:e.mobile,a==null?void 0:a.mobile);if(!(!r&&!s))return{...r,...s?{mobile:s}:{}}},Vc=class extends Q.Component{constructor(){super(...arguments),this.listeningMouseMove=!1,this.shiftKeyActive=!1,this.viewportRef=Q.createRef(),this.getControllerConfig=(e,a)=>{if(e===!1)return{};const r=typeof e=="object"?e:{},s={...a,...r},l=MO(a.layout,r.layout);return l?s.layout=l:delete s.layout,s},this.getHotKeyConfig=(e,a)=>e===!1?{}:{...a,...typeof e=="object"?e:{}},this.getAnimateCoverConfig=(e,a)=>{const r=a.cover;if(e===!1)return!1;const s=e&&typeof e=="object"?e.cover:void 0;return s===!1?!1:s===!0||s===void 0?r:{...r&&typeof r=="object"?r:{},...s}},this.getAnimateConfig=(e,a)=>e===!1?{browsing:!1,flip:!1,cover:!1}:{...a,...typeof e=="object"?e:{},cover:this.getAnimateCoverConfig(e,a)},this.getGestureConfig=(e,a)=>lO(e,a),this.getClosingRotate=()=>{const{rotate:e}=this.state;return Math.round(e/360)*360},this.state=(()=>{const{coverRef:e,defaultPage:a,set:r}=this.props,{page:s,pageIsCover:l}=_v(e,a,r);return{mounted:!1,viewportReady:!1,show:!1,zoom:!1,canZoom:!0,zoomShakeKey:0,rotate:0,motionDurationMultiplier:_o,page:s,pageIsCover:l,pageWithStep:s,flipPreloadStarted:!1,flipReadyPrev:!1,flipReadyNext:!1}})(),this.getPropsWithEnv=()=>{const{preset:e,controller:a,hotKey:r,animate:s,gesture:l,radius:d,edge:u}=this.props,m=L_(e),h=VS(e);return{...this.props,presetIsMobile:h==="mobile",presetIsDesktop:h==="desktop",radius:d??m.radius,edge:u??m.edge,controller:this.getControllerConfig(a,m.controller),hotKey:this.getHotKeyConfig(r,m.hotKey),animate:this.getAnimateConfig(s,m.animate),gesture:this.getGestureConfig(l,m.gesture)}},this.cancelInitRaf=()=>{this.initRaf!==void 0&&(cancelAnimationFrame(this.initRaf),this.initRaf=void 0)},this.cancelUnInitTimer=()=>{this.unInitTimer!==void 0&&(clearTimeout(this.unInitTimer),this.unInitTimer=void 0)},this.clearCoverHideTimer=()=>{this.coverHideTimer!==void 0&&(clearTimeout(this.coverHideTimer),this.coverHideTimer=void 0)},this.clearFlipPreloadTimer=()=>{this.flipPreloadTimer!==void 0&&(clearTimeout(this.flipPreloadTimer),this.flipPreloadTimer=void 0)},this.showCoverNow=e=>{this.clearCoverHideTimer(),E_(e)},this.hideCoverAfterDelay=e=>{this.clearCoverHideTimer(),this.coverHideTimer=R_(e,()=>{this.coverHideTimer=void 0})},this.init=()=>{this.cancelInitRaf(),this.cancelUnInitTimer(),this.clearFlipPreloadTimer();const{isBrowsingControlled:e,coverRef:a,coverPos:r,onBrowsing:s,hideOnScroll:l,coverVisible:d,presetIsDesktop:u}=this.getPropsWithEnv(),{show:m,pageIsCover:h}=this.state;if(!m){u&&(window.addEventListener("keydown",this.handleKeyDown,!0),window.addEventListener("keyup",this.handleKeyUp,!0),this.startMouseMoveListener(),l?window.addEventListener("scroll",this.handleScroll):C_()),this.lastPointerPosition=r||this.lastPointerPosition;const g=eC(this.props.motionDurationMultiplier);this.initRaf=window.requestAnimationFrame(()=>{this.initRaf=void 0,this.setState({show:!0,zoom:!1,rotate:0,motionDurationMultiplier:g,zoomTrigger:void 0,zoomPosition:void 0,canZoom:!0,flipPreloadStarted:!1,flipReadyPrev:!1,flipReadyNext:!1},()=>{u&&h&&!d&&this.hideCoverAfterDelay(a),this.scheduleFlipPreloadAfterBrowsing(),!e&&typeof s=="function"&&s(!0)})})}},this.unInit=({force:e}={force:!1})=>{this.cancelInitRaf(),this.cancelUnInitTimer(),this.clearFlipPreloadTimer();const{isBrowsingControlled:a,coverRef:r,onBrowsing:s,hideOnScroll:l,coverVisible:d,presetIsMobile:u,presetIsDesktop:m,animate:h}=this.getPropsWithEnv(),{show:g,pageIsCover:b}=this.state;if(g||e){m&&(window.removeEventListener("keydown",this.handleKeyDown,!0),window.removeEventListener("keyup",this.handleKeyUp,!0),this.stopMouseMoveListener(),l?window.removeEventListener("scroll",this.handleScroll):k_()),!b&&!d&&this.showCoverNow(r),this.shiftKeyActive=!1;const v=()=>{u&&m_(),m&&b&&!d&&this.showCoverNow(r),!a&&typeof s=="function"&&s(!1)};if(e)v();else{const S=this.getClosingRotate(),T=Bp(this.state.motionDurationMultiplier),C=h.browsing===!1?0:T.browsingDuration-10;this.setState({show:!1,zoom:!1,rotate:S,zoomTrigger:void 0,zoomPosition:void 0,flipPreloadStarted:!1,flipReadyPrev:!1,flipReadyNext:!1},()=>{const x=()=>{this.unInitTimer=void 0,this.setState({mounted:!1,viewportReady:!1,rotate:0,motionDurationMultiplier:_o},v)};C===0?x():this.unInitTimer=setTimeout(x,C)})}}},this.handleViewportRef=e=>{this.viewportRef.current=e,e&&this.state.mounted&&!this.state.viewportReady&&this.setState({viewportReady:!0})},this.handleOutBrowsing=e=>{const{animate:a}=this.getPropsWithEnv(),r={shiftKey:!!(e!=null&&e.shiftKey||this.shiftKeyActive)},s=Gc(r,Hc(a)),l=()=>this.props.outBrowsing(r);s!==this.state.motionDurationMultiplier?this.setState({motionDurationMultiplier:s},l):l()},this.handleKeyDown=e=>{this.shiftKeyActive=e.shiftKey;const{set:a,hotKey:r}=this.getPropsWithEnv(),{zoom:s,page:l,canZoom:d}=this.state,u=()=>{e.preventDefault(),e.stopImmediatePropagation()};if(vn(e,Xl(r.close,"Escape"))){u(),s?this.handleToggleZoom():this.handleOutBrowsing(e);return}if(vn(e,Xl(r.zoom,"Space"))){if(u(),!s&&!d){this.handleTriggerZoomShake();return}this.handleToggleZoom("keyboard");return}if(vn(e,Gl(r.flipLeft,r.flip,"ArrowLeft"))){if(u(),s||!this.canFlipToDirection(-1))return;this.handleToPrevPage();return}if(vn(e,Gl(r.flipRight,r.flip,"ArrowRight"))){if(u(),s||!this.canFlipToDirection(1))return;this.handleToNextPage();return}if(vn(e,Gl(r.rotateLeft,r.rotate,"BracketLeft"))){if(u(),s)return;this.handleToggleRotate("left")();return}if(vn(e,Gl(r.rotateRight,r.rotate,"BracketRight"))){if(u(),s)return;this.handleToggleRotate("right")();return}if(vn(e,Xl(r.download,"Mod+S"))){u();const m=a[l];m!=null&&m.src&&pm(m.src);return}},this.handleKeyUp=e=>{this.shiftKeyActive=e.shiftKey},this.handleScroll=()=>{const{show:e}=this.state;e&&this.handleOutBrowsing()},this.handleMouseMove=e=>{this.lastPointerPosition={x:e.clientX,y:e.clientY}},this.startMouseMoveListener=()=>{this.listeningMouseMove||(window.addEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!0)},this.stopMouseMoveListener=()=>{this.listeningMouseMove&&(window.removeEventListener("mousemove",this.handleMouseMove),this.listeningMouseMove=!1)},this.requiresFlipPreload=()=>{const{set:e,animate:a}=this.getPropsWithEnv(),r=na(a);return Array.isArray(e)&&e.length>1&&r!=="none"&&r!==!1},this.canFlipToDirection=e=>{const{set:a,loop:r=!1}=this.getPropsWithEnv(),{page:s,flipReadyPrev:l,flipReadyNext:d}=this.state;return!Array.isArray(a)||a.length<=1||!r&&e<0&&s===0||!r&&e>0&&s===a.length-1?!1:this.requiresFlipPreload()?e<0?l:d:!0},this.handleStartFlipPreload=()=>{!this.requiresFlipPreload()||this.state.flipPreloadStarted||this.setState({flipPreloadStarted:!0})},this.scheduleFlipPreloadAfterBrowsing=()=>{if(this.clearFlipPreloadTimer(),!this.requiresFlipPreload())return;const{animate:e}=this.getPropsWithEnv(),a=Bp(this.state.motionDurationMultiplier),r=e.browsing===!1?0:a.browsingDuration;this.flipPreloadTimer=setTimeout(()=>{this.flipPreloadTimer=void 0,!(!this.state.show||this.state.zoom)&&this.handleStartFlipPreload()},r)},this.handleSetFlipReady=(e,a=!0)=>{const r=e<0?"flipReadyPrev":"flipReadyNext";this.state[r]!==a&&this.setState({[r]:a})},this.handleToPage=e=>{const{page:a}=this.state,{set:r,loop:s=!1}=this.props,l=e-a,d=s&&r.length>1?jS(l,r.length):l;this.handleSwitchPages(d)()},this.handleSwitchPages=e=>{const{coverRef:a,onSwitching:r,loop:s=!1}=this.props;return()=>{const{set:l}=this.props;if(l.length>1){const{page:d,pageWithStep:u}=this.state;if(Math.abs(e)===1&&!this.canFlipToDirection(e<0?-1:1))return;const m=fm(d,l.length,e,{loop:s});if(typeof m=="number"){const h=Math.abs(e)>2?Math.sign(e):e;this.setState({page:m,pageIsCover:_S(a,l,m),pageWithStep:u+h,zoom:!1,zoomTrigger:void 0,zoomPosition:void 0,canZoom:!0,flipReadyPrev:!1,flipReadyNext:!1,rotate:0},()=>{typeof r=="function"&&r(m)})}}}},this.handleToPrevPage=this.handleSwitchPages(-1),this.handleToNextPage=this.handleSwitchPages(1),this.handleToggleZoom=(e="control")=>{const{onZooming:a}=this.props,r=!this.state.zoom;this.setState({zoom:r,zoomTrigger:r?e:void 0,zoomPosition:r&&e==="keyboard"?this.lastPointerPosition:void 0},()=>{typeof a=="function"&&a(this.state.zoom)})},this.handleSetCanZoom=e=>{this.state.canZoom!==e&&this.setState({canZoom:e})},this.handleTriggerZoomShake=()=>{this.setState(({zoomShakeKey:e})=>({zoomShakeKey:e+1}))},this.handleViewportClick=e=>{e.target===e.currentTarget&&(this.state.zoom?this.handleToggleZoom():this.handleOutBrowsing(e))},this.handleToggleRotate=e=>{const{onRotating:a}=this.props;switch(e){case"left":return()=>this.setState(({rotate:r})=>({rotate:r-90}),()=>{typeof a=="function"&&a(this.state.rotate)});case"right":return()=>this.setState(({rotate:r})=>({rotate:r+90}),()=>{typeof a=="function"&&a(this.state.rotate)});default:return()=>this.setState({rotate:0},()=>{typeof a=="function"&&a(0)})}}}componentDidMount(){this.props.browsing&&this.init()}static getDerivedStateFromProps(e,a){return e.browsing?{mounted:!0,...a.show?{}:_v(e.coverRef,e.defaultPage,e.set)}:null}componentDidUpdate(e){e.browsing!==this.props.browsing&&(this.props.browsing?this.init():this.unInit())}componentWillUnmount(){this.cancelInitRaf(),this.cancelUnInitTimer(),this.clearCoverHideTimer(),this.clearFlipPreloadTimer(),this.stopMouseMoveListener(),this.unInit({force:!0})}render(){const{coverRef:e,coverPos:a,set:r,preset:s,presetIsMobile:l,presetIsDesktop:d,controller:u,hotKey:m,animate:h,gesture:g,hideOnScroll:b,coverVisible:v,backdrop:S,zIndex:T,radius:C,edge:x,loop:k,hideOnDblClick:R,loadingDelay:j,portalTarget:A,onError:M}=this.getPropsWithEnv(),{mounted:q,viewportReady:Z}=this.state,B={...this.state},X=Bp(this.state.motionDurationMultiplier),ae=D_(u,l),ne={coverRef:e,coverPos:a,outBrowsing:this.handleOutBrowsing,viewportRef:this.viewportRef,motion:X,set:r,preset:s,presetIsMobile:l,presetIsDesktop:d,controller:u,hotKey:m,animate:h,gesture:g,hideOnScroll:b,coverVisible:v,backdrop:S,radius:C,edge:x,loop:k,hideOnDblClick:R,loadingDelay:j,onError:M,...B,toPage:this.handleToPage,toPrevPage:this.handleToPrevPage,toNextPage:this.handleToNextPage,toggleZoom:this.handleToggleZoom,toggleRotate:this.handleToggleRotate,setCanZoom:this.handleSetCanZoom,startFlipPreload:this.handleStartFlipPreload,setFlipReady:this.handleSetFlipReady};return Q.createElement(Fr.Provider,{value:ne},q&&Q.createElement(XD,{id:"zmage",zIndex:T,className:zv.wrapperLayer,style:ae,target:A},Q.createElement(RO,{...B}),Q.createElement("div",{id:"zmageViewport",ref:this.handleViewportRef,className:zv.viewportLayer,style:{touchAction:dO(g)},onClick:this.handleViewportClick},Q.createElement(yO,null),Q.createElement(vO,null),Z&&Q.createElement(tC,{...B}))))}};Vc.defaultProps={isBrowsingControlled:!1,browsing:!1,coverRef:Q.createRef(),outBrowsing:()=>{},motionDurationMultiplier:_o,defaultPage:0,set:[]};Vc.contextType=Fr;var Jv=new w_,wr,DO=()=>{var e;if(wr)return wr;const a=cx.createRoot;if(typeof a=="function")return wr={mount:(s,l)=>{const d=a(l);return d.render(s),()=>d.unmount()}},wr;const r=Rm;if(typeof r.render!="function")throw new Error(`react-zmage: no compatible mount API found (react-dom version ${(e=r.version)!=null?e:"unknown"}). Ensure react-dom@16.8+ is installed.`);return wr={mount:(s,l)=>(r.render(s,l),()=>{r.unmountComponentAtNode(l)})},wr},oC=class extends Q.Component{constructor(){super(...arguments),this.showPosition=Jv.currentPosition,this.state={browsing:!1},this.inBrowsing=()=>{this.inBrowsingRaf=requestAnimationFrame(()=>{this.inBrowsingRaf=void 0,this.setState({browsing:!0})})},this.outBrowsing=e=>{const{destructor:a}=this.props,r=Gc(e,Hc(this.props.animate));this.setState({browsing:!1},()=>{a&&(this.outBrowsingTimer=setTimeout(()=>{this.outBrowsingTimer=void 0,a()},BS(!0,r)))})}}componentDidMount(){this.inBrowsing()}componentWillUnmount(){this.inBrowsingRaf!==void 0&&(cancelAnimationFrame(this.inBrowsingRaf),this.inBrowsingRaf=void 0),this.outBrowsingTimer!==void 0&&(clearTimeout(this.outBrowsingTimer),this.outBrowsingTimer=void 0)}render(){const{calleeProps:e,configProps:a}=WS(this.props),{browsing:r}=this.state;return r&&(this.showPosition=Jv.currentPosition),Q.createElement(Vc,{browsing:r,coverRef:e.coverRef,coverPos:this.showPosition,outBrowsing:this.outBrowsing,motionDurationMultiplier:this.props.motionDurationMultiplier,...a})}};oC.defaultProps=hf;var _O=(({coverRef:e,...a})=>{var r;const s=DO(),l=document.createElement("div");l.id="zmagePortal";const d=(r=a.portalTarget)!=null?r:document.body;d.appendChild(l);const u=Q.createRef();let m,h=!1;const g=()=>{if(!h){if(h=!0,m){const b=m;m=void 0,b()}l.parentNode===d&&d.removeChild(l)}};return m=s.mount(Q.createElement(oC,{ref:u,coverRef:e,destructor:g,...a}),l),g}),ui=_O,OO=e=>{var a,r,s;const l=(a=e.getAttribute("data-zmage-caption"))==null?void 0:a.trim();if(l)return l;const d=e.closest("figure");return((s=(r=d==null?void 0:d.querySelector("figcaption"))==null?void 0:r.textContent)==null?void 0:s.trim())||void 0},LO=(e,a)=>!Array.isArray(e)||e.length===0?-1:e.findIndex(r=>r.src===a),pi=class extends Q.Component{constructor(){super(...arguments),this.wrapperRef=Q.createRef(),this.tryAttachBrowserToImage=()=>{const{children:e,...a}=this.props;this.wrapperRef.current&&this.wrapperRef.current.querySelectorAll("img").forEach(r=>{if(!r.getAttribute("zmage")&&r.getAttribute("src")){r.setAttribute("zmage",String(Date.now())),r.style.cursor="zoom-in";const s=r.getAttribute("src")||"",l=r.getAttribute("alt")||void 0,d=OO(r),u=LO(a.set,s);r.addEventListener("click",m=>ui({...a,coverRef:{current:r},src:s,alt:l,caption:d??a.caption,defaultPage:u>=0?u:a.defaultPage,motionDurationMultiplier:Gc(m,Hc(a.animate))}))}})}}componentDidMount(){this.tryAttachBrowserToImage()}componentDidUpdate(){this.tryAttachBrowserToImage()}render(){const{children:e}=this.props;return Q.createElement("div",{ref:this.wrapperRef},e)}};pi.defaultProps=hf;var Kr=class extends Q.Component{constructor(){super(...arguments),this.coverRef={current:null},this.motionDurationMultiplier=_o,this.isBrowsingControlled="browsing"in this.props,this.state={browsing:!1},this.inBrowsing=()=>{var e,a;this.isBrowsingControlled?(a=(e=this.props).onBrowsing)==null||a.call(e,!0):this.setState({browsing:!0})},this.outBrowsing=()=>{var e,a;this.browsingPosition=void 0,this.motionDurationMultiplier=_o,this.isBrowsingControlled?(a=(e=this.props).onBrowsing)==null||a.call(e,!1):this.setState({browsing:!1})}}componentDidUpdate(e){this.isBrowsingControlled&&e.browsing&&!this.props.browsing&&(this.browsingPosition=void 0,this.motionDurationMultiplier=_o)}render(){const{coverProps:e,controlledProps:a,configProps:r,restProps:s}=WS(this.props),{browsing:l}=this.state;return Q.createElement(y.Fragment,null,Q.createElement("img",{className:e.className,style:{cursor:"zoom-in",...e.style},src:e.src,alt:e.alt,onClick:d=>{this.browsingPosition={x:d.clientX,y:d.clientY},this.motionDurationMultiplier=Gc(d,Hc(r.animate)),this.inBrowsing(),typeof e.onClick=="function"&&e.onClick(d)},onError:e.onError,ref:d=>{typeof e.forwardedRef=="function"?e.forwardedRef(d):e.forwardedRef&&typeof e.forwardedRef=="object"&&(e.forwardedRef.current=d),this.coverRef&&(this.coverRef.current=d)},...s}),Q.createElement(Vc,{isBrowsingControlled:this.isBrowsingControlled,browsing:this.isBrowsingControlled?a.browsing:l,coverRef:this.coverRef,coverPos:this.browsingPosition,outBrowsing:this.outBrowsing,motionDurationMultiplier:this.motionDurationMultiplier,...r}))}};Kr.defaultProps=hf;Kr.browsing=ui;Kr.Browsing=ui;Kr.wrapper=pi;Kr.Wrapper=pi;var mi=Q.forwardRef((e,a)=>Q.createElement(Kr,{...e,forwardedRef:a}));mi.browsing=ui;mi.Browsing=ui;mi.wrapper=pi;mi.Wrapper=pi;var uo=mi;const PO="1.8.4",aC={version:PO},ZO=bc("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function Wc({className:e,variant:a,...r}){return c.jsx("div",{className:ie(ZO({variant:a}),e),...r})}const Ua=y.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("rounded-xl border bg-card text-card-foreground shadow",e),...a}));Ua.displayName="Card";const BO=y.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("flex flex-col space-y-1.5 p-6",e),...a}));BO.displayName="CardHeader";const IO=y.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("font-semibold leading-none tracking-tight",e),...a}));IO.displayName="CardTitle";const qO=y.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("text-sm text-muted-foreground",e),...a}));qO.displayName="CardDescription";const FO=y.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("p-6 pt-0",e),...a}));FO.displayName="CardContent";const KO=y.forwardRef(({className:e,...a},r)=>c.jsx("div",{ref:r,className:ie("flex items-center p-6 pt-0",e),...a}));KO.displayName="CardFooter";function fi(){const{t:e}=be();return c.jsxs("footer",{className:"mt-32 border-t border-border/60 bg-muted/20",children:[c.jsxs("div",{className:"mx-auto grid max-w-7xl gap-10 px-4 py-12 sm:px-6 md:grid-cols-2",children:[c.jsxs("div",{children:[c.jsx("h4",{className:"text-sm font-medium",children:e("footer.project")}),c.jsxs("ul",{className:"mt-3 space-y-2 text-sm text-muted-foreground",children:[c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis/react-zmage",children:e("footer.repo")})}),c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis/react-zmage/issues",children:e("footer.issues")})}),c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis/react-zmage/releases",children:e("footer.changelog")})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/use-cases",children:e("footer.useCases")})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/compare",children:"Compare"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/status",children:"Status"})})]})]}),c.jsxs("div",{children:[c.jsx("h4",{className:"text-sm font-medium",children:e("footer.madeby")}),c.jsxs("ul",{className:"mt-3 space-y-2 text-sm text-muted-foreground",children:[c.jsx("li",{children:c.jsx("a",{className:"hover:text-foreground",href:"https://github.com/Caldis",children:"Caldis"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/about",children:"About"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/contact",children:"Contact"})}),c.jsx("li",{children:c.jsx(st,{className:"hover:text-foreground",to:"/privacy",children:"Privacy"})}),c.jsxs("li",{children:[c.jsxs("span",{children:[e("footer.illustrator"),": "]}),c.jsx("a",{className:"hover:text-foreground",href:"https://www.behance.net/gallery/56119387/_",children:"sslololss Guihuahuzi"})]})]})]})]}),c.jsx("div",{className:"border-t border-border/60",children:c.jsxs("div",{className:"mx-auto flex max-w-7xl items-center justify-between gap-4 px-4 py-4 text-xs text-muted-foreground sm:px-6",children:[c.jsx("span",{children:e("footer.license")}),c.jsxs("span",{className:"font-mono",children:["react-zmage v",aC.version," · React ",y.version]}),c.jsx("a",{href:"https://github.com/Caldis/react-zmage","aria-label":"GitHub",className:"hover:text-foreground",children:c.jsx(_x,{className:"h-4 w-4"})})]})})]})}function Ur(){const{resolved:e}=Am();return e==="dark"?"#0a0a0a":"#fafafa"}const Cn={slowMotion:!0},UO={layout:{pagination:{inset:"1.35rem"},caption:{inset:"4rem"},mobile:{pagination:{inset:"2.75rem"},caption:{inset:"5.25rem"}}}};function nC(e){return e===!1?!1:{...typeof e=="object"&&e?e:{},slowMotion:!0}}const HO="https://www.behance.net/gallery/56119387/_";function GO(){const e="npm install react-zmage",{copied:a,copy:r}=Bc();return c.jsxs("button",{onClick:()=>void r(e),className:"group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md border border-border bg-muted/40 px-3 py-1.5 font-mono text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",children:[c.jsxs("span",{className:"min-w-0 truncate",children:["$ ",e]}),a?c.jsx(Ha,{className:"h-3.5 w-3.5 text-foreground"}):c.jsx($s,{className:"h-3.5 w-3.5 opacity-50 group-hover:opacity-100"})]})}function VO(){const{t:e}=be();return c.jsxs("section",{className:"relative isolate flex h-screen flex-col items-center justify-center overflow-hidden pb-28",children:[c.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 -z-20",style:{backgroundImage:"linear-gradient(to right, hsl(var(--foreground) / 0.06) 1px, transparent 1px), linear-gradient(to bottom, hsl(var(--foreground) / 0.06) 1px, transparent 1px)",backgroundSize:"48px 48px",maskImage:"linear-gradient(to bottom, black 50%, transparent 100%)",WebkitMaskImage:"linear-gradient(to bottom, black 50%, transparent 100%)"}}),c.jsx("div",{className:"pointer-events-none absolute left-1/2 top-1/2 -z-10 h-[min(600px,150vw)] w-[min(900px,190vw)] -translate-x-1/2 -translate-y-1/2 rounded-full bg-[radial-gradient(closest-side,hsl(var(--foreground)/0.08),transparent)]","aria-hidden":!0}),c.jsx(Hs,{"aria-hidden":!0,className:"absolute top-3 left-3 h-3.5 w-3.5 text-foreground/40"}),c.jsx(Hs,{"aria-hidden":!0,className:"absolute top-3 right-3 h-3.5 w-3.5 text-foreground/40"}),c.jsx(Hs,{"aria-hidden":!0,className:"absolute bottom-3 left-3 h-3.5 w-3.5 text-foreground/40"}),c.jsx(Hs,{"aria-hidden":!0,className:"absolute bottom-3 right-3 h-3.5 w-3.5 text-foreground/40"}),c.jsxs("div",{className:"relative flex w-full max-w-5xl min-w-0 flex-col items-center gap-8 px-4 text-center sm:px-6",children:[c.jsx("img",{src:"/logo.png",alt:"react-zmage",className:"h-20 w-20 opacity-90 drop-shadow-[0_0_30px_hsl(var(--foreground)/0.18)]"}),c.jsxs(Wc,{variant:"secondary",className:"font-mono",children:["v",aC.version," · ",e("hero.pill")]}),c.jsx("div",{children:c.jsxs("h1",{className:"font-sans font-semibold tracking-tight",children:[c.jsx("span",{className:ie("block","text-[clamp(2.5rem,7vw,5.5rem)] leading-[1.15]"),children:e("hero.title.line1")}),c.jsx("span",{className:ie("mt-2 block bg-clip-text pb-2","text-[clamp(2rem,5.5vw,4rem)] leading-[1.2]","bg-gradient-to-br from-foreground to-foreground/40 text-transparent"),children:e("hero.title.line2")})]})}),c.jsx("p",{className:"max-w-2xl text-base text-muted-foreground sm:text-lg",children:e("hero.subtitle")}),c.jsxs("div",{className:"flex max-w-full flex-wrap items-center justify-center gap-3",children:[c.jsx(it,{size:"lg",asChild:!0,children:c.jsxs(st,{to:"/docs",className:"group",children:[e("hero.cta.start"),c.jsx(Nx,{className:"ml-1.5 h-4 w-4 transition-transform duration-200 group-hover:translate-x-1"})]})}),c.jsx(it,{size:"lg",variant:"outline",asChild:!0,children:c.jsx(st,{to:"/playground",children:e("hero.cta.playground")})}),c.jsx(GO,{})]}),c.jsx(WO,{})]})]})}function WO(){const{t:e}=be(),a=e("hero.ai.directive"),{copied:r,copy:s}=Bc();return c.jsxs("div",{className:"mt-4 flex flex-col items-center gap-1.5",children:[c.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs font-medium tracking-wide text-muted-foreground/80",children:[c.jsx(Nm,{"aria-hidden":!0,className:"h-3.5 w-3.5"}),e("hero.ai.label")]}),c.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2 text-[11px]",children:[c.jsxs("button",{onClick:()=>void s(a),"aria-label":e("hero.ai.copyLabel"),className:"group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md border border-border/60 bg-muted/30 px-3 py-1.5 font-mono text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",children:[c.jsx(AR,{"aria-hidden":!0,className:"h-3.5 w-3.5 opacity-70"}),c.jsx("span",{className:"min-w-0 break-words text-left",children:a}),r?c.jsx(Ha,{className:"h-3.5 w-3.5 text-foreground"}):c.jsx($s,{className:"h-3.5 w-3.5 opacity-50 group-hover:opacity-100"})]}),c.jsx("a",{href:"/llms.txt",target:"_blank",rel:"noreferrer",className:"text-muted-foreground/70 underline-offset-4 hover:text-foreground hover:underline",children:e("hero.ai.viewLlms")})]})]})}function $O(){const{t:e}=be(),a=Ur(),r=[{src:"/imgSet/childsDream/demo.jpg",alt:e("demo.scene.portal.alt"),caption:e("demo.scene.portal.caption")},{src:"/imgSet/childsDream/2.jpg",alt:e("demo.scene.forest.alt"),caption:e("demo.scene.forest.caption")},{src:"/imgSet/childsDream/3.jpg",alt:e("demo.scene.tide.alt"),caption:e("demo.scene.tide.caption")},{src:"/imgSet/childsDream/4.jpg",alt:e("demo.scene.canopy.alt"),caption:e("demo.scene.canopy.caption")},{src:"/imgSet/childsDream/5.jpg",alt:e("demo.scene.flamingo.alt"),caption:e("demo.scene.flamingo.caption")},{src:"/imgSet/childsDream/6.jpg",alt:e("demo.scene.lamp.alt"),caption:e("demo.scene.lamp.caption")},{src:"/imgSet/childsDream/7.jpg",alt:e("demo.scene.crystal.alt"),caption:e("demo.scene.crystal.caption")},{src:"/imgSet/childsDream/8.jpg",alt:e("demo.scene.rescue.alt"),caption:e("demo.scene.rescue.caption")}],s=[{icon:UR,label:e("demo.feature.cover")},{icon:KR,label:e("demo.feature.space")},{icon:HR,label:e("demo.feature.wheel")}],l=({page:d,labelKey:u,className:m,imageClassName:h,labelClassName:g,objectPosition:b="center"})=>{const v=r[d];return c.jsxs("figure",{className:ie("group relative min-w-0 overflow-hidden rounded-lg bg-muted/30",m),children:[c.jsx(uo,{className:ie("block h-full w-full rounded-lg object-cover transition duration-300 group-hover:scale-[1.012]",h),style:{objectPosition:b},src:v.src,alt:v.alt,caption:v.caption,backdrop:a,set:r,defaultPage:d,radius:10,edge:12,animate:Cn,controller:UO}),c.jsxs("figcaption",{className:ie("pointer-events-none absolute inset-x-0 bottom-0 flex items-end justify-between gap-3 bg-gradient-to-t from-black/70 via-black/15 to-transparent p-3 text-xs text-white",g),children:[c.jsx("span",{className:"font-medium",children:e(u)}),c.jsx("span",{className:"font-mono opacity-75",children:String(d+1).padStart(2,"0")})]})]})};return c.jsxs("section",{className:"mx-auto max-w-7xl px-4 py-24 sm:px-6",children:[c.jsxs("div",{className:"mb-8 flex flex-col gap-5 md:flex-row md:items-end md:justify-between",children:[c.jsxs("div",{className:"max-w-2xl",children:[c.jsxs("p",{className:"mb-3 inline-flex items-center gap-2 rounded-md border border-border bg-muted/40 px-2.5 py-1 text-xs font-medium text-muted-foreground",children:[c.jsx(Nm,{"aria-hidden":!0,className:"h-3.5 w-3.5"}),e("demo.eyebrow")]}),c.jsx("h2",{className:"text-3xl font-semibold tracking-tight sm:text-4xl",children:e("demo.title")}),c.jsx("p",{className:"mt-3 text-sm leading-6 text-muted-foreground sm:text-base",children:e("demo.body")})]}),c.jsx("div",{className:"hidden w-fit max-w-full flex-col gap-2 text-sm md:flex",children:c.jsxs("div",{className:"inline-flex items-center gap-2 rounded-md border border-amber-400/30 bg-amber-400/10 px-3 py-2 text-amber-950 shadow-sm dark:text-amber-100",children:[c.jsx(ZR,{"aria-hidden":!0,className:"h-4 w-4 shrink-0"}),c.jsx("span",{children:e("demo.shiftHint")})]})})]}),c.jsxs("article",{className:"grid gap-4 lg:grid-cols-[minmax(0,1.05fr)_minmax(260px,0.58fr)_minmax(260px,0.72fr)] lg:grid-rows-[13rem_14rem_12rem]",children:[c.jsx(l,{page:0,labelKey:"demo.tile.cover",className:"aspect-[5/4] border border-border lg:col-span-2 lg:row-span-2 lg:aspect-auto",imageClassName:"",objectPosition:"52% 48%"}),c.jsxs("div",{className:"flex min-w-0 flex-col justify-between gap-6 border-y border-border py-5 lg:row-span-1",children:[c.jsxs("div",{children:[c.jsxs("p",{className:"text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground",children:[c.jsx("a",{href:HO,target:"_blank",rel:"noreferrer",className:"underline-offset-4 transition-colors hover:text-foreground hover:underline",children:e("demo.story.project")}),c.jsxs("span",{children:[" · ",e("demo.story.author")]})]}),c.jsx("p",{className:"mt-3 text-xl font-medium leading-8 tracking-normal",children:e("demo.story.title")})]}),c.jsx("p",{className:"text-sm leading-7 text-muted-foreground",children:e("demo.story.lead")})]}),c.jsx(l,{page:1,labelKey:"demo.tile.gallery",className:"aspect-[4/3] border border-border lg:row-span-1 lg:aspect-auto",imageClassName:"",objectPosition:"50% 42%"}),c.jsx("div",{className:"flex min-w-0 flex-col justify-end border-y border-border py-5 text-sm leading-7 text-muted-foreground lg:col-start-2 lg:row-start-3",children:c.jsx("p",{children:e("demo.story.middle")})}),c.jsx(l,{page:6,labelKey:"demo.tile.controller",className:"aspect-[16/10] border border-border lg:col-start-1 lg:row-start-3 lg:aspect-auto",imageClassName:"",objectPosition:"50% 45%"}),c.jsx(l,{page:4,labelKey:"demo.tile.zoom",className:"aspect-[16/10] border border-border lg:col-start-3 lg:row-start-3 lg:aspect-auto",imageClassName:"",objectPosition:"50% 42%"})]}),c.jsxs("div",{className:"mt-4 grid gap-4 md:grid-cols-[minmax(0,1fr)_minmax(0,0.82fr)_minmax(0,1.18fr)]",children:[c.jsx(l,{page:2,labelKey:"demo.tile.ratio",className:"aspect-[16/10] border border-border",imageClassName:"",objectPosition:"50% 46%"}),c.jsx(l,{page:5,labelKey:"demo.tile.lamp",className:"aspect-[4/3] border border-border md:aspect-[5/4]",imageClassName:"",objectPosition:"50% 48%"}),c.jsx(l,{page:7,labelKey:"demo.tile.rescue",className:"aspect-[16/9] border border-border",imageClassName:"",objectPosition:"52% 45%"})]}),c.jsx("div",{className:"mt-5 grid gap-2 lg:grid-cols-3",children:s.map(({icon:d,label:u})=>c.jsxs("div",{className:"flex min-h-11 min-w-0 items-center gap-2 rounded-md border border-border bg-background px-3 py-2 text-sm leading-5 text-muted-foreground",children:[c.jsx(d,{"aria-hidden":!0,className:"h-4 w-4 shrink-0 text-foreground"}),c.jsx("span",{className:"min-w-0",children:u})]},u))}),c.jsx("p",{className:"mt-5 text-sm text-muted-foreground",children:e("demo.caption")})]})}const YO=[{icon:PR,titleKey:"feature.dropin.title",hintKey:"feature.dropin.hint",code:''},{icon:XR,titleKey:"feature.mobile.title",hintKey:"feature.mobile.hint",code:''},{icon:OR,titleKey:"feature.set.title",hintKey:"feature.set.hint",code:''},{icon:Ox,titleKey:"feature.ssr.title",hintKey:"feature.ssr.hint",code:"import Zmage from 'react-zmage/ssr'"}];function XO(){const{t:e}=be();return c.jsx("section",{className:"mx-auto max-w-6xl px-4 py-24 sm:px-6",children:c.jsx("div",{className:"grid gap-4 md:grid-cols-2",children:YO.map(({icon:a,titleKey:r,hintKey:s,code:l})=>c.jsxs(Ua,{className:"group relative min-w-0 overflow-hidden border-border/60 bg-card/40 p-6 transition-colors hover:bg-card/70",children:[c.jsx(a,{className:"h-5 w-5 text-muted-foreground"}),c.jsx("h3",{className:"mt-4 text-lg font-medium",children:e(r)}),c.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e(s)}),c.jsx("div",{className:"mt-5",children:c.jsx(Me,{code:l,language:"tsx",showCopy:!1})})]},r))})})}function QO(){return c.jsxs("section",{"aria-hidden":"true","data-agent-facts":!0,className:"sr-only",children:[c.jsxs("div",{className:"max-w-3xl",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:"Agent facts"}),c.jsx("h2",{className:"mt-3 text-3xl font-semibold tracking-tight",children:"Install, cost, and alternatives"}),c.jsx("p",{className:"mt-3 text-sm leading-6 text-muted-foreground sm:text-base",children:"react-zmage is a free MIT-licensed open-source package on npm. It is a client-side React component library, not a hosted API service, so there is no OAuth flow, API key, webhook endpoint, MCP server, account, or product rate limit."})]}),c.jsxs("div",{className:"mt-8 grid gap-4 lg:grid-cols-3",children:[c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h3",{className:"text-base font-medium",children:"Quick start"}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:"Install the package, import the stylesheet once, then choose Component, Wrapper, or Imperative mode for the image surface."}),c.jsx("div",{className:"mt-4",children:c.jsx(Me,{code:"npm install react-zmage",language:"bash",showCopy:!1})})]}),c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h3",{className:"text-base font-medium",children:"react-zmage vs alternatives"}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:"react-zmage is an alternative to react-medium-image-zoom, Lightbox.js, and react-photoswipe when a React page needs fullscreen image preview from existing img elements. Unlike gallery-first tools, it can start as a drop-in image replacement."}),c.jsx(st,{to:"/compare",className:"mt-4 inline-flex text-sm text-foreground underline-offset-4 hover:underline",children:"Compare packages"})]}),c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h3",{className:"text-base font-medium",children:"Trust and recovery"}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:"Agents can use the status, about, contact, and privacy pages to avoid guessing about unsupported hosted APIs or private access paths."}),c.jsxs("div",{className:"mt-4 flex flex-wrap gap-x-4 gap-y-2 text-sm",children:[c.jsx(st,{to:"/status",className:"text-foreground underline-offset-4 hover:underline",children:"Status"}),c.jsx(st,{to:"/about",className:"text-foreground underline-offset-4 hover:underline",children:"About"}),c.jsx(st,{to:"/contact",className:"text-foreground underline-offset-4 hover:underline",children:"Contact"}),c.jsx(st,{to:"/privacy",className:"text-foreground underline-offset-4 hover:underline",children:"Privacy"})]})]})]})]})}const qp={component:'',imperative:`import Zmage from 'react-zmage' + +button.onclick = () => Zmage.browsing({ + src: 'hero.jpg' +})`,wrapper:` +
+`};function JO(){const{t:e}=be(),a=[{code:qp.component,labelKey:"modes.component.label",descKey:"modes.component.desc",link:"/playground"},{code:qp.imperative,labelKey:"modes.imperative.label",descKey:"modes.imperative.desc",link:"/playground/imperative"},{code:qp.wrapper,labelKey:"modes.wrapper.label",descKey:"modes.wrapper.desc",link:"/playground/wrapper"}];return c.jsxs("section",{className:"mx-auto max-w-6xl px-4 py-24 sm:px-6",children:[c.jsx("h2",{className:"text-3xl font-semibold tracking-tight",children:e("modes.title")}),c.jsx("div",{className:"mt-10 grid min-w-0 gap-6 md:grid-cols-3",children:a.map(r=>c.jsxs("div",{className:"flex min-w-0 flex-col",children:[c.jsx("span",{className:"text-xs font-mono text-muted-foreground",children:e(r.labelKey)}),c.jsx(Me,{code:r.code,className:"mt-2 flex-1"}),c.jsx("p",{className:"mt-4 text-sm text-muted-foreground",children:e(r.descKey)}),c.jsx(st,{to:r.link,className:"mt-3 text-sm text-foreground hover:opacity-70",children:e("modes.try")})]},r.labelKey))})]})}function ex(){return c.jsxs(c.Fragment,{children:[c.jsx(VO,{}),c.jsx($O,{}),c.jsx(XO,{}),c.jsx(QO,{}),c.jsx(JO,{}),c.jsx(fi,{})]})}var $c="Collapsible",[eL,rC]=Vt($c),[tL,yf]=eL($c),sC=y.forwardRef((e,a)=>{const{__scopeCollapsible:r,open:s,defaultOpen:l,disabled:d,onOpenChange:u,...m}=e,[h,g]=yo({prop:s,defaultProp:l??!1,onChange:u,caller:$c});return c.jsx(tL,{scope:r,disabled:d,contentId:fo(),open:h,onOpenToggle:y.useCallback(()=>g(b=>!b),[g]),children:c.jsx(Te.div,{"data-state":vf(h),"data-disabled":d?"":void 0,...m,ref:a})})});sC.displayName=$c;var iC="CollapsibleTrigger",lC=y.forwardRef((e,a)=>{const{__scopeCollapsible:r,...s}=e,l=yf(iC,r);return c.jsx(Te.button,{type:"button","aria-controls":l.contentId,"aria-expanded":l.open||!1,"data-state":vf(l.open),"data-disabled":l.disabled?"":void 0,disabled:l.disabled,...s,ref:a,onClick:ce(e.onClick,l.onOpenToggle)})});lC.displayName=iC;var bf="CollapsibleContent",cC=y.forwardRef((e,a)=>{const{forceMount:r,...s}=e,l=yf(bf,e.__scopeCollapsible);return c.jsx(Mt,{present:r||l.open,children:({present:d})=>c.jsx(oL,{...s,ref:a,present:d})})});cC.displayName=bf;var oL=y.forwardRef((e,a)=>{const{__scopeCollapsible:r,present:s,children:l,...d}=e,u=yf(bf,r),[m,h]=y.useState(s),g=y.useRef(null),b=Pe(a,g),v=y.useRef(0),S=v.current,T=y.useRef(0),C=T.current,x=u.open||m,k=y.useRef(x),R=y.useRef(void 0);return y.useEffect(()=>{const j=requestAnimationFrame(()=>k.current=!1);return()=>cancelAnimationFrame(j)},[]),ra(()=>{const j=g.current;if(j){R.current=R.current||{transitionDuration:j.style.transitionDuration,animationName:j.style.animationName},j.style.transitionDuration="0s",j.style.animationName="none";const A=j.getBoundingClientRect();v.current=A.height,T.current=A.width,k.current||(j.style.transitionDuration=R.current.transitionDuration,j.style.animationName=R.current.animationName),h(s)}},[u.open,s]),c.jsx(Te.div,{"data-state":vf(u.open),"data-disabled":u.disabled?"":void 0,id:u.contentId,hidden:!x,...d,ref:b,style:{"--radix-collapsible-content-height":S?`${S}px`:void 0,"--radix-collapsible-content-width":C?`${C}px`:void 0,...e.style},children:x&&l})});function vf(e){return e?"open":"closed"}var aL=sC,nL=lC,rL=cC,vo="Accordion",sL=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[xf,iL,lL]=Rc(vo),[Yc]=Vt(vo,[lL,rC]),wf=rC(),dC=Q.forwardRef((e,a)=>{const{type:r,...s}=e,l=s,d=s;return c.jsx(xf.Provider,{scope:e.__scopeAccordion,children:r==="multiple"?c.jsx(pL,{...d,ref:a}):c.jsx(uL,{...l,ref:a})})});dC.displayName=vo;var[uC,cL]=Yc(vo),[pC,dL]=Yc(vo,{collapsible:!1}),uL=Q.forwardRef((e,a)=>{const{value:r,defaultValue:s,onValueChange:l=()=>{},collapsible:d=!1,...u}=e,[m,h]=yo({prop:r,defaultProp:s??"",onChange:l,caller:vo});return c.jsx(uC,{scope:e.__scopeAccordion,value:Q.useMemo(()=>m?[m]:[],[m]),onItemOpen:h,onItemClose:Q.useCallback(()=>d&&h(""),[d,h]),children:c.jsx(pC,{scope:e.__scopeAccordion,collapsible:d,children:c.jsx(mC,{...u,ref:a})})})}),pL=Q.forwardRef((e,a)=>{const{value:r,defaultValue:s,onValueChange:l=()=>{},...d}=e,[u,m]=yo({prop:r,defaultProp:s??[],onChange:l,caller:vo}),h=Q.useCallback(b=>m((v=[])=>[...v,b]),[m]),g=Q.useCallback(b=>m((v=[])=>v.filter(S=>S!==b)),[m]);return c.jsx(uC,{scope:e.__scopeAccordion,value:u,onItemOpen:h,onItemClose:g,children:c.jsx(pC,{scope:e.__scopeAccordion,collapsible:!0,children:c.jsx(mC,{...d,ref:a})})})}),[mL,Xc]=Yc(vo),mC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,disabled:s,dir:l,orientation:d="vertical",...u}=e,m=Q.useRef(null),h=Pe(m,a),g=iL(r),v=ri(l)==="ltr",S=ce(e.onKeyDown,T=>{var X;if(!sL.includes(T.key))return;const C=T.target,x=g().filter(ae=>{var ne;return!((ne=ae.ref.current)!=null&&ne.disabled)}),k=x.findIndex(ae=>ae.ref.current===C),R=x.length;if(k===-1)return;T.preventDefault();let j=k;const A=0,M=R-1,q=()=>{j=k+1,j>M&&(j=A)},Z=()=>{j=k-1,j{const{__scopeAccordion:r,value:s,...l}=e,d=Xc(pc,r),u=cL(pc,r),m=wf(r),h=fo(),g=s&&u.value.includes(s)||!1,b=d.disabled||e.disabled;return c.jsx(fL,{scope:r,open:g,disabled:b,triggerId:h,children:c.jsx(aL,{"data-orientation":d.orientation,"data-state":xC(g),...m,...l,ref:a,disabled:b,open:g,onOpenChange:v=>{v?u.onItemOpen(s):u.onItemClose(s)}})})});fC.displayName=pc;var hC="AccordionHeader",gC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,...s}=e,l=Xc(vo,r),d=Sf(hC,r);return c.jsx(Te.h3,{"data-orientation":l.orientation,"data-state":xC(d.open),"data-disabled":d.disabled?"":void 0,...s,ref:a})});gC.displayName=hC;var bm="AccordionTrigger",yC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,...s}=e,l=Xc(vo,r),d=Sf(bm,r),u=dL(bm,r),m=wf(r);return c.jsx(xf.ItemSlot,{scope:r,children:c.jsx(nL,{"aria-disabled":d.open&&!u.collapsible||void 0,"data-orientation":l.orientation,id:d.triggerId,...m,...s,ref:a})})});yC.displayName=bm;var bC="AccordionContent",vC=Q.forwardRef((e,a)=>{const{__scopeAccordion:r,...s}=e,l=Xc(vo,r),d=Sf(bC,r),u=wf(r);return c.jsx(rL,{role:"region","aria-labelledby":d.triggerId,"data-orientation":l.orientation,...u,...s,ref:a,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});vC.displayName=bC;function xC(e){return e?"open":"closed"}var hL=dC,gL=fC,yL=gC,wC=yC,SC=vC;const bL=hL,CC=y.forwardRef(({className:e,...a},r)=>c.jsx(gL,{ref:r,className:ie("border-b",e),...a}));CC.displayName="AccordionItem";const kC=y.forwardRef(({className:e,children:a,...r},s)=>c.jsx(yL,{className:"flex",children:c.jsxs(wC,{ref:s,className:ie("flex flex-1 cursor-pointer items-center justify-between py-4 text-sm font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180",e),...r,children:[a,c.jsx(Mx,{className:"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"})]})}));kC.displayName=wC.displayName;const TC=y.forwardRef(({className:e,children:a,...r},s)=>c.jsx(SC,{ref:s,className:"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...r,children:c.jsx("div",{className:ie("pb-4 pt-0",e),children:a})}));TC.displayName=SC.displayName;const vL={desktop:{short:"common.presetScope.desktop.short",title:"common.presetScope.desktop.title",desc:"common.presetScope.desktop.desc"},mobile:{short:"common.presetScope.mobile.short",title:"common.presetScope.mobile.title",desc:"common.presetScope.mobile.desc"}},xL={desktop:"border-sky-500/30 bg-sky-500/10 text-sky-700 dark:text-sky-300",mobile:"border-emerald-500/30 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300"};function Qc({scope:e,className:a}){const{t:r}=be(),s=vL[e];return c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"inline-flex cursor-help",children:c.jsx(Wc,{variant:"outline","aria-label":r(s.title),className:ie("h-4 rounded px-1 text-[9px] leading-none",xL[e],a),children:r(s.short)})})}),c.jsxs(mo,{side:"right",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r(s.title)}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r(s.desc)})]})]})}function EC(e){const a=y.useRef({value:e,previous:e});return y.useMemo(()=>(a.current.value!==e&&(a.current.previous=a.current.value,a.current.value=e),a.current.previous),[e])}var Jc="Switch",[wL]=Vt(Jc),[SL,CL]=wL(Jc),RC=y.forwardRef((e,a)=>{const{__scopeSwitch:r,name:s,checked:l,defaultChecked:d,required:u,disabled:m,value:h="on",onCheckedChange:g,form:b,...v}=e,[S,T]=y.useState(null),C=Pe(a,A=>T(A)),x=y.useRef(!1),k=S?b||!!S.closest("form"):!0,[R,j]=yo({prop:l,defaultProp:d??!1,onChange:g,caller:Jc});return c.jsxs(SL,{scope:r,checked:R,disabled:m,children:[c.jsx(Te.button,{type:"button",role:"switch","aria-checked":R,"aria-required":u,"data-state":zC(R),"data-disabled":m?"":void 0,disabled:m,value:h,...v,ref:C,onClick:ce(e.onClick,A=>{j(M=>!M),k&&(x.current=A.isPropagationStopped(),x.current||A.stopPropagation())})}),k&&c.jsx(NC,{control:S,bubbles:!x.current,name:s,value:h,checked:R,required:u,disabled:m,form:b,style:{transform:"translateX(-100%)"}})]})});RC.displayName=Jc;var jC="SwitchThumb",AC=y.forwardRef((e,a)=>{const{__scopeSwitch:r,...s}=e,l=CL(jC,r);return c.jsx(Te.span,{"data-state":zC(l.checked),"data-disabled":l.disabled?"":void 0,...s,ref:a})});AC.displayName=jC;var kL="SwitchBubbleInput",NC=y.forwardRef(({__scopeSwitch:e,control:a,checked:r,bubbles:s=!0,...l},d)=>{const u=y.useRef(null),m=Pe(u,d),h=EC(r),g=Km(a);return y.useEffect(()=>{const b=u.current;if(!b)return;const v=window.HTMLInputElement.prototype,T=Object.getOwnPropertyDescriptor(v,"checked").set;if(h!==r&&T){const C=new Event("click",{bubbles:s});T.call(b,r),b.dispatchEvent(C)}},[h,r,s]),c.jsx("input",{type:"checkbox","aria-hidden":!0,defaultChecked:r,...l,tabIndex:-1,ref:m,style:{...l.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});NC.displayName=kL;function zC(e){return e?"checked":"unchecked"}var MC=RC,TL=AC;const Xe=y.forwardRef(({className:e,...a},r)=>c.jsx(MC,{className:ie("peer group inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input hover:data-[state=checked]:bg-primary/85 hover:data-[state=unchecked]:bg-input/70 hover:ring-2 hover:ring-foreground/15",e),...a,ref:r,children:c.jsx(TL,{className:ie("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0")})}));Xe.displayName=MC.displayName;function DC(e,[a,r]){return Math.min(r,Math.max(a,e))}var _C=["PageUp","PageDown"],OC=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],LC={"from-left":["Home","PageDown","ArrowDown","ArrowLeft"],"from-right":["Home","PageDown","ArrowDown","ArrowRight"],"from-bottom":["Home","PageDown","ArrowDown","ArrowLeft"],"from-top":["Home","PageDown","ArrowUp","ArrowLeft"]},Hr="Slider",[vm,EL,RL]=Rc(Hr),[PC]=Vt(Hr,[RL]),[jL,ed]=PC(Hr),ZC=y.forwardRef((e,a)=>{const{name:r,min:s=0,max:l=100,step:d=1,orientation:u="horizontal",disabled:m=!1,minStepsBetweenThumbs:h=0,defaultValue:g=[s],value:b,onValueChange:v=()=>{},onValueCommit:S=()=>{},inverted:T=!1,form:C,...x}=e,k=y.useRef(new Set),R=y.useRef(0),A=u==="horizontal"?AL:NL,[M=[],q]=yo({prop:b,defaultProp:g,onChange:te=>{var pe;(pe=[...k.current][R.current])==null||pe.focus(),v(te)}}),Z=y.useRef(M);function B(te){const J=OL(M,te);ne(te,J)}function X(te){ne(te,R.current)}function ae(){const te=Z.current[R.current];M[R.current]!==te&&S(M)}function ne(te,J,{commit:pe}={commit:!1}){const re=BL(d),ue=IL(Math.round((te-s)/d)*d+s,re),O=DC(ue,[s,l]);q((H=[])=>{const G=DL(H,O,J);if(ZL(G,h*d)){R.current=G.indexOf(O);const Y=String(G)!==String(H);return Y&&pe&&S(G),Y?G:H}else return H})}return c.jsx(jL,{scope:e.__scopeSlider,name:r,disabled:m,min:s,max:l,valueIndexToChangeRef:R,thumbs:k.current,values:M,orientation:u,form:C,children:c.jsx(vm.Provider,{scope:e.__scopeSlider,children:c.jsx(vm.Slot,{scope:e.__scopeSlider,children:c.jsx(A,{"aria-disabled":m,"data-disabled":m?"":void 0,...x,ref:a,onPointerDown:ce(x.onPointerDown,()=>{m||(Z.current=M)}),min:s,max:l,inverted:T,onSlideStart:m?void 0:B,onSlideMove:m?void 0:X,onSlideEnd:m?void 0:ae,onHomeKeyDown:()=>!m&&ne(s,0,{commit:!0}),onEndKeyDown:()=>!m&&ne(l,M.length-1,{commit:!0}),onStepKeyDown:({event:te,direction:J})=>{if(!m){const ue=_C.includes(te.key)||te.shiftKey&&OC.includes(te.key)?10:1,O=R.current,H=M[O],G=d*ue*J;ne(H+G,O,{commit:!0})}}})})})})});ZC.displayName=Hr;var[BC,IC]=PC(Hr,{startEdge:"left",endEdge:"right",size:"width",direction:1}),AL=y.forwardRef((e,a)=>{const{min:r,max:s,dir:l,inverted:d,onSlideStart:u,onSlideMove:m,onSlideEnd:h,onStepKeyDown:g,...b}=e,[v,S]=y.useState(null),T=Pe(a,A=>S(A)),C=y.useRef(void 0),x=ri(l),k=x==="ltr",R=k&&!d||!k&&d;function j(A){const M=C.current||v.getBoundingClientRect(),q=[0,M.width],B=Cf(q,R?[r,s]:[s,r]);return C.current=M,B(A-M.left)}return c.jsx(BC,{scope:e.__scopeSlider,startEdge:R?"left":"right",endEdge:R?"right":"left",direction:R?1:-1,size:"width",children:c.jsx(qC,{dir:x,"data-orientation":"horizontal",...b,ref:T,style:{...b.style,"--radix-slider-thumb-transform":"translateX(-50%)"},onSlideStart:A=>{const M=j(A.clientX);u==null||u(M)},onSlideMove:A=>{const M=j(A.clientX);m==null||m(M)},onSlideEnd:()=>{C.current=void 0,h==null||h()},onStepKeyDown:A=>{const q=LC[R?"from-left":"from-right"].includes(A.key);g==null||g({event:A,direction:q?-1:1})}})})}),NL=y.forwardRef((e,a)=>{const{min:r,max:s,inverted:l,onSlideStart:d,onSlideMove:u,onSlideEnd:m,onStepKeyDown:h,...g}=e,b=y.useRef(null),v=Pe(a,b),S=y.useRef(void 0),T=!l;function C(x){const k=S.current||b.current.getBoundingClientRect(),R=[0,k.height],A=Cf(R,T?[s,r]:[r,s]);return S.current=k,A(x-k.top)}return c.jsx(BC,{scope:e.__scopeSlider,startEdge:T?"bottom":"top",endEdge:T?"top":"bottom",size:"height",direction:T?1:-1,children:c.jsx(qC,{"data-orientation":"vertical",...g,ref:v,style:{...g.style,"--radix-slider-thumb-transform":"translateY(50%)"},onSlideStart:x=>{const k=C(x.clientY);d==null||d(k)},onSlideMove:x=>{const k=C(x.clientY);u==null||u(k)},onSlideEnd:()=>{S.current=void 0,m==null||m()},onStepKeyDown:x=>{const R=LC[T?"from-bottom":"from-top"].includes(x.key);h==null||h({event:x,direction:R?-1:1})}})})}),qC=y.forwardRef((e,a)=>{const{__scopeSlider:r,onSlideStart:s,onSlideMove:l,onSlideEnd:d,onHomeKeyDown:u,onEndKeyDown:m,onStepKeyDown:h,...g}=e,b=ed(Hr,r);return c.jsx(Te.span,{...g,ref:a,onKeyDown:ce(e.onKeyDown,v=>{v.key==="Home"?(u(v),v.preventDefault()):v.key==="End"?(m(v),v.preventDefault()):_C.concat(OC).includes(v.key)&&(h(v),v.preventDefault())}),onPointerDown:ce(e.onPointerDown,v=>{const S=v.target;S.setPointerCapture(v.pointerId),v.preventDefault(),b.thumbs.has(S)?S.focus():s(v)}),onPointerMove:ce(e.onPointerMove,v=>{v.target.hasPointerCapture(v.pointerId)&&l(v)}),onPointerUp:ce(e.onPointerUp,v=>{const S=v.target;S.hasPointerCapture(v.pointerId)&&(S.releasePointerCapture(v.pointerId),d(v))})})}),FC="SliderTrack",KC=y.forwardRef((e,a)=>{const{__scopeSlider:r,...s}=e,l=ed(FC,r);return c.jsx(Te.span,{"data-disabled":l.disabled?"":void 0,"data-orientation":l.orientation,...s,ref:a})});KC.displayName=FC;var xm="SliderRange",UC=y.forwardRef((e,a)=>{const{__scopeSlider:r,...s}=e,l=ed(xm,r),d=IC(xm,r),u=y.useRef(null),m=Pe(a,u),h=l.values.length,g=l.values.map(S=>VC(S,l.min,l.max)),b=h>1?Math.min(...g):0,v=100-Math.max(...g);return c.jsx(Te.span,{"data-orientation":l.orientation,"data-disabled":l.disabled?"":void 0,...s,ref:m,style:{...e.style,[d.startEdge]:b+"%",[d.endEdge]:v+"%"}})});UC.displayName=xm;var wm="SliderThumb",HC=y.forwardRef((e,a)=>{const r=EL(e.__scopeSlider),[s,l]=y.useState(null),d=Pe(a,m=>l(m)),u=y.useMemo(()=>s?r().findIndex(m=>m.ref.current===s):-1,[r,s]);return c.jsx(zL,{...e,ref:d,index:u})}),zL=y.forwardRef((e,a)=>{const{__scopeSlider:r,index:s,name:l,...d}=e,u=ed(wm,r),m=IC(wm,r),[h,g]=y.useState(null),b=Pe(a,j=>g(j)),v=h?u.form||!!h.closest("form"):!0,S=Km(h),T=u.values[s],C=T===void 0?0:VC(T,u.min,u.max),x=_L(s,u.values.length),k=S==null?void 0:S[m.size],R=k?LL(k,C,m.direction):0;return y.useEffect(()=>{if(h)return u.thumbs.add(h),()=>{u.thumbs.delete(h)}},[h,u.thumbs]),c.jsxs("span",{style:{transform:"var(--radix-slider-thumb-transform)",position:"absolute",[m.startEdge]:`calc(${C}% + ${R}px)`},children:[c.jsx(vm.ItemSlot,{scope:e.__scopeSlider,children:c.jsx(Te.span,{role:"slider","aria-label":e["aria-label"]||x,"aria-valuemin":u.min,"aria-valuenow":T,"aria-valuemax":u.max,"aria-orientation":u.orientation,"data-orientation":u.orientation,"data-disabled":u.disabled?"":void 0,tabIndex:u.disabled?void 0:0,...d,ref:b,style:T===void 0?{display:"none"}:e.style,onFocus:ce(e.onFocus,()=>{u.valueIndexToChangeRef.current=s})})}),v&&c.jsx(GC,{name:l??(u.name?u.name+(u.values.length>1?"[]":""):void 0),form:u.form,value:T},s)]})});HC.displayName=wm;var ML="RadioBubbleInput",GC=y.forwardRef(({__scopeSlider:e,value:a,...r},s)=>{const l=y.useRef(null),d=Pe(l,s),u=EC(a);return y.useEffect(()=>{const m=l.current;if(!m)return;const h=window.HTMLInputElement.prototype,b=Object.getOwnPropertyDescriptor(h,"value").set;if(u!==a&&b){const v=new Event("input",{bubbles:!0});b.call(m,a),m.dispatchEvent(v)}},[u,a]),c.jsx(Te.input,{style:{display:"none"},...r,ref:d,defaultValue:a})});GC.displayName=ML;function DL(e=[],a,r){const s=[...e];return s[r]=a,s.sort((l,d)=>l-d)}function VC(e,a,r){const d=100/(r-a)*(e-a);return DC(d,[0,100])}function _L(e,a){return a>2?`Value ${e+1} of ${a}`:a===2?["Minimum","Maximum"][e]:void 0}function OL(e,a){if(e.length===1)return 0;const r=e.map(l=>Math.abs(l-a)),s=Math.min(...r);return r.indexOf(s)}function LL(e,a,r){const s=e/2,d=Cf([0,50],[0,s]);return(s-d(a)*r)*r}function PL(e){return e.slice(0,-1).map((a,r)=>e[r+1]-a)}function ZL(e,a){if(a>0){const r=PL(e);return Math.min(...r)>=a}return!0}function Cf(e,a){return r=>{if(e[0]===e[1]||a[0]===a[1])return a[0];const s=(a[1]-a[0])/(e[1]-e[0]);return a[0]+s*(r-e[0])}}function BL(e){return(String(e).split(".")[1]||"").length}function IL(e,a){const r=Math.pow(10,a);return Math.round(e*r)/r}var WC=ZC,qL=KC,FL=UC,KL=HC;const td=y.forwardRef(({className:e,...a},r)=>c.jsxs(WC,{ref:r,className:ie("relative flex w-full touch-none select-none items-center",e),...a,children:[c.jsx(qL,{className:"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20",children:c.jsx(FL,{className:"absolute h-full bg-primary"})}),c.jsx(KL,{className:"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"})]}));td.displayName=WC.displayName;function UL({openDelay:e=60,closeDelay:a=140}={}){const[r,s]=y.useState(!1),l=y.useRef(void 0),d=()=>{l.current!==void 0&&(window.clearTimeout(l.current),l.current=void 0)},u=y.useCallback((g,b)=>{d(),l.current=window.setTimeout(()=>s(g),b)},[]);y.useEffect(()=>()=>d(),[]);const m=y.useCallback(()=>u(!0,e),[u,e]),h=y.useCallback(()=>u(!1,a),[u,a]);return{open:r,setOpen:s,hoverProps:{onMouseEnter:m,onMouseLeave:h}}}function Eo({value:e,onValueChange:a,options:r,placeholder:s,triggerClassName:l,contentClassName:d}){const{open:u,setOpen:m,hoverProps:h}=UL(),g=r.find(b=>b.value===e);return c.jsxs(X0,{open:u,onOpenChange:m,children:[c.jsx(Q0,{asChild:!0,...h,children:c.jsxs("button",{type:"button",className:ie("flex h-9 w-full cursor-pointer items-center justify-between gap-2 whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background hover:bg-accent/40 focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",l),children:[c.jsx("span",{className:ie("truncate",!g&&"text-muted-foreground"),children:g?g.label:s}),c.jsx(Mx,{className:"h-4 w-4 shrink-0 opacity-50 transition-transform data-[state=open]:rotate-180"})]})}),c.jsx(of,{align:"start",sideOffset:4,className:ie("nav-menu-anim min-w-[var(--radix-dropdown-menu-trigger-width)]",d),...h,children:r.map(b=>{const v=b.value===e;return c.jsxs(af,{onSelect:()=>a(b.value),className:ie("flex items-center justify-between gap-2 pr-2",v&&"font-medium"),children:[c.jsx("span",{className:"truncate",children:b.label}),v&&c.jsx(Ha,{className:"h-3.5 w-3.5 shrink-0 opacity-80"})]},b.value)})})]})}var od="Tabs",[HL]=Vt(od,[Dc]),$C=Dc(),[GL,kf]=HL(od),YC=y.forwardRef((e,a)=>{const{__scopeTabs:r,value:s,onValueChange:l,defaultValue:d,orientation:u="horizontal",dir:m,activationMode:h="automatic",...g}=e,b=ri(m),[v,S]=yo({prop:s,onChange:l,defaultProp:d??"",caller:od});return c.jsx(GL,{scope:r,baseId:fo(),value:v,onValueChange:S,orientation:u,dir:b,activationMode:h,children:c.jsx(Te.div,{dir:b,"data-orientation":u,...g,ref:a})})});YC.displayName=od;var XC="TabsList",QC=y.forwardRef((e,a)=>{const{__scopeTabs:r,loop:s=!0,...l}=e,d=kf(XC,r),u=$C(r);return c.jsx(o0,{asChild:!0,...u,orientation:d.orientation,dir:d.dir,loop:s,children:c.jsx(Te.div,{role:"tablist","aria-orientation":d.orientation,...l,ref:a})})});QC.displayName=XC;var JC="TabsTrigger",e1=y.forwardRef((e,a)=>{const{__scopeTabs:r,value:s,disabled:l=!1,...d}=e,u=kf(JC,r),m=$C(r),h=a1(u.baseId,s),g=n1(u.baseId,s),b=s===u.value;return c.jsx(a0,{asChild:!0,...m,focusable:!l,active:b,children:c.jsx(Te.button,{type:"button",role:"tab","aria-selected":b,"aria-controls":g,"data-state":b?"active":"inactive","data-disabled":l?"":void 0,disabled:l,id:h,...d,ref:a,onMouseDown:ce(e.onMouseDown,v=>{!l&&v.button===0&&v.ctrlKey===!1?u.onValueChange(s):v.preventDefault()}),onKeyDown:ce(e.onKeyDown,v=>{[" ","Enter"].includes(v.key)&&u.onValueChange(s)}),onFocus:ce(e.onFocus,()=>{const v=u.activationMode!=="manual";!b&&!l&&v&&u.onValueChange(s)})})})});e1.displayName=JC;var t1="TabsContent",o1=y.forwardRef((e,a)=>{const{__scopeTabs:r,value:s,forceMount:l,children:d,...u}=e,m=kf(t1,r),h=a1(m.baseId,s),g=n1(m.baseId,s),b=s===m.value,v=y.useRef(b);return y.useEffect(()=>{const S=requestAnimationFrame(()=>v.current=!1);return()=>cancelAnimationFrame(S)},[]),c.jsx(Mt,{present:l||b,children:({present:S})=>c.jsx(Te.div,{"data-state":b?"active":"inactive","data-orientation":m.orientation,role:"tabpanel","aria-labelledby":h,hidden:!S,id:g,tabIndex:0,...u,ref:a,style:{...e.style,animationDuration:v.current?"0s":void 0},children:S&&d})})});o1.displayName=t1;function a1(e,a){return`${e}-trigger-${a}`}function n1(e,a){return`${e}-content-${a}`}var VL=YC,r1=QC,s1=e1,i1=o1;function l1({activeSelector:e='[data-state="active"], [aria-current="page"]',className:a}){const r=y.useRef(null),[s,l]=y.useState(null),[d,u]=y.useState(!1);return y.useLayoutEffect(()=>{const m=r.current;if(!m)return;const h=m.parentElement;if(!h)return;const g=()=>{const T=h.querySelector(e);if(!T){l(null);return}l({left:T.offsetLeft,top:T.offsetTop,width:T.offsetWidth,height:T.offsetHeight})};g();const b=requestAnimationFrame(()=>u(!0)),v=new MutationObserver(g);v.observe(h,{attributes:!0,subtree:!0,attributeFilter:["data-state","aria-current","class"]});const S=new ResizeObserver(g);return S.observe(h),h.querySelectorAll('[data-state], [role="tab"], a').forEach(T=>S.observe(T)),()=>{cancelAnimationFrame(b),v.disconnect(),S.disconnect()}},[e]),c.jsx("span",{ref:r,"aria-hidden":!0,className:ie("pointer-events-none absolute rounded-md bg-background shadow",d?"opacity-100":"opacity-0",d&&"transition-[transform,width,height,opacity] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)]",a),style:s?{top:0,left:0,transform:`translate(${s.left}px, ${s.top}px)`,width:s.width,height:s.height}:void 0})}const Tf=VL,ad=y.forwardRef(({className:e,children:a,...r},s)=>c.jsxs(r1,{ref:s,className:ie("relative inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",e),...r,children:[c.jsx(l1,{}),a]}));ad.displayName=r1.displayName;const nd=y.forwardRef(({className:e,...a},r)=>c.jsx(s1,{ref:r,className:ie("relative z-10 inline-flex cursor-pointer items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-foreground",e),...a}));nd.displayName=s1.displayName;const WL=y.forwardRef(({className:e,...a},r)=>c.jsx(i1,{ref:r,className:ie("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",e),...a}));WL.displayName=i1.displayName;var rd="Popover",[c1]=Vt(rd,[qr]),hi=qr(),[$L,Ya]=c1(rd),d1=e=>{const{__scopePopover:a,children:r,open:s,defaultOpen:l,onOpenChange:d,modal:u=!1}=e,m=hi(a),h=y.useRef(null),[g,b]=y.useState(!1),[v,S]=yo({prop:s,defaultProp:l??!1,onChange:d,caller:rd});return c.jsx(Gm,{...m,children:c.jsx($L,{scope:a,contentId:fo(),triggerRef:h,open:v,onOpenChange:S,onOpenToggle:y.useCallback(()=>S(T=>!T),[S]),hasCustomAnchor:g,onCustomAnchorAdd:y.useCallback(()=>b(!0),[]),onCustomAnchorRemove:y.useCallback(()=>b(!1),[]),modal:u,children:r})})};d1.displayName=rd;var u1="PopoverAnchor",YL=y.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=Ya(u1,r),d=hi(r),{onCustomAnchorAdd:u,onCustomAnchorRemove:m}=l;return y.useEffect(()=>(u(),()=>m()),[u,m]),c.jsx(Mc,{...d,...s,ref:a})});YL.displayName=u1;var p1="PopoverTrigger",m1=y.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=Ya(p1,r),d=hi(r),u=Pe(a,l.triggerRef),m=c.jsx(Te.button,{type:"button","aria-haspopup":"dialog","aria-expanded":l.open,"aria-controls":l.contentId,"data-state":b1(l.open),...s,ref:u,onClick:ce(e.onClick,l.onOpenToggle)});return l.hasCustomAnchor?m:c.jsx(Mc,{asChild:!0,...d,children:m})});m1.displayName=p1;var Ef="PopoverPortal",[XL,QL]=c1(Ef,{forceMount:void 0}),f1=e=>{const{__scopePopover:a,forceMount:r,children:s,container:l}=e,d=Ya(Ef,a);return c.jsx(XL,{scope:a,forceMount:r,children:c.jsx(Mt,{present:r||d.open,children:c.jsx(ni,{asChild:!0,container:l,children:s})})})};f1.displayName=Ef;var Lr="PopoverContent",h1=y.forwardRef((e,a)=>{const r=QL(Lr,e.__scopePopover),{forceMount:s=r.forceMount,...l}=e,d=Ya(Lr,e.__scopePopover);return c.jsx(Mt,{present:s||d.open,children:d.modal?c.jsx(e3,{...l,ref:a}):c.jsx(t3,{...l,ref:a})})});h1.displayName=Lr;var JL=Dr("PopoverContent.RemoveScroll"),e3=y.forwardRef((e,a)=>{const r=Ya(Lr,e.__scopePopover),s=y.useRef(null),l=Pe(a,s),d=y.useRef(!1);return y.useEffect(()=>{const u=s.current;if(u)return Dm(u)},[]),c.jsx(wc,{as:JL,allowPinchZoom:!0,children:c.jsx(g1,{...e,ref:l,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ce(e.onCloseAutoFocus,u=>{var m;u.preventDefault(),d.current||(m=r.triggerRef.current)==null||m.focus()}),onPointerDownOutside:ce(e.onPointerDownOutside,u=>{const m=u.detail.originalEvent,h=m.button===0&&m.ctrlKey===!0,g=m.button===2||h;d.current=g},{checkForDefaultPrevented:!1}),onFocusOutside:ce(e.onFocusOutside,u=>u.preventDefault(),{checkForDefaultPrevented:!1})})})}),t3=y.forwardRef((e,a)=>{const r=Ya(Lr,e.__scopePopover),s=y.useRef(!1),l=y.useRef(!1);return c.jsx(g1,{...e,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{var u,m;(u=e.onCloseAutoFocus)==null||u.call(e,d),d.defaultPrevented||(s.current||(m=r.triggerRef.current)==null||m.focus(),d.preventDefault()),s.current=!1,l.current=!1},onInteractOutside:d=>{var h,g;(h=e.onInteractOutside)==null||h.call(e,d),d.defaultPrevented||(s.current=!0,d.detail.originalEvent.type==="pointerdown"&&(l.current=!0));const u=d.target;((g=r.triggerRef.current)==null?void 0:g.contains(u))&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&l.current&&d.preventDefault()}})}),g1=y.forwardRef((e,a)=>{const{__scopePopover:r,trapFocus:s,onOpenAutoFocus:l,onCloseAutoFocus:d,disableOutsidePointerEvents:u,onEscapeKeyDown:m,onPointerDownOutside:h,onFocusOutside:g,onInteractOutside:b,...v}=e,S=Ya(Lr,r),T=hi(r);return Mm(),c.jsx(vc,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:l,onUnmountAutoFocus:d,children:c.jsx(ai,{asChild:!0,disableOutsidePointerEvents:u,onInteractOutside:b,onEscapeKeyDown:m,onPointerDownOutside:h,onFocusOutside:g,onDismiss:()=>S.onOpenChange(!1),children:c.jsx(Vm,{"data-state":b1(S.open),role:"dialog",id:S.contentId,...T,...v,ref:a,style:{...v.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),y1="PopoverClose",o3=y.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=Ya(y1,r);return c.jsx(Te.button,{type:"button",...s,ref:a,onClick:ce(e.onClick,()=>l.onOpenChange(!1))})});o3.displayName=y1;var a3="PopoverArrow",n3=y.forwardRef((e,a)=>{const{__scopePopover:r,...s}=e,l=hi(r);return c.jsx(Wm,{...l,...s,ref:a})});n3.displayName=a3;function b1(e){return e?"open":"closed"}var r3=d1,s3=m1,i3=f1,v1=h1;const l3=r3,c3=s3,x1=y.forwardRef(({className:e,align:a="center",sideOffset:r=4,...s},l)=>c.jsx(i3,{children:c.jsx(v1,{ref:l,align:a,sideOffset:r,className:ie("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",e),...s})}));x1.displayName=v1.displayName;function d3({def:e,value:a,onChange:r}){const{t:s}=be(),l=e.control;if(l.kind==="switch")return c.jsx(Xe,{checked:!!a,onCheckedChange:r});if(l.kind==="number")return c.jsx(po,{type:"number",value:a??"",onChange:d=>r(d.target.value===""?void 0:Number(d.target.value)),className:"h-7 w-24 px-2 text-xs md:text-xs"});if(l.kind==="text")return c.jsx(po,{value:a??"",onChange:d=>r(d.target.value),className:"h-7 px-2 text-xs md:text-xs"});if(l.kind==="slider")return c.jsxs("div",{className:"flex items-center gap-3",children:[c.jsx(td,{min:l.min,max:l.max,step:l.step??1,value:[Number(a??0)],onValueChange:d=>r(d[0]),className:"flex-1"}),c.jsx(po,{type:"number",value:a??0,onChange:d=>r(Number(d.target.value)),className:"h-7 w-14 px-2 text-xs md:text-xs"})]});if(l.kind==="select")return c.jsx(Eo,{value:String(a??""),onValueChange:r,triggerClassName:"h-7 text-xs",options:l.options.map(d=>({value:d.value,label:s(d.labelKey)}))});if(l.kind==="segmented")return c.jsx("div",{className:"flex justify-start overflow-x-auto",children:c.jsx(Tf,{value:String(a??""),onValueChange:r,children:c.jsx(ad,{className:"h-7 w-fit p-0.5",children:l.options.map(d=>c.jsx(nd,{value:d.value,className:"h-6 px-2 text-[11px]",children:s(d.labelKey)},d.value))})})});if(l.kind==="color"){const d=["#0a0a0a","#fafafa","rgba(0,0,0,0.85)","rgba(255,255,255,0.9)"];return c.jsxs(l3,{children:[c.jsx(c3,{asChild:!0,children:c.jsxs("button",{className:"flex h-7 items-center gap-2 rounded-md border border-input px-2 text-xs",children:[c.jsx("span",{className:"h-3.5 w-3.5 rounded border",style:{backgroundColor:a||"#fff"}}),c.jsx("span",{className:"font-mono",children:a||""})]})}),c.jsxs(x1,{className:"w-56 space-y-2 p-3",children:[c.jsx(po,{value:a??"",onChange:u=>r(u.target.value),className:"h-7 px-2 text-xs md:text-xs"}),c.jsx("div",{className:"flex gap-1.5",children:d.map(u=>c.jsx("button",{onClick:()=>r(u),className:"h-6 w-6 rounded border",style:{backgroundColor:u},"aria-label":u},u))})]})]})}return null}const u3=[{key:"pagination",labelKey:"controller.pagination",descKey:"controller.pagination.desc"},{key:"rotate",labelKey:"controller.rotate",descKey:"controller.rotate.desc"},{key:"rotateLeft",labelKey:"controller.rotateLeft",descKey:"controller.rotateLeft.desc"},{key:"rotateRight",labelKey:"controller.rotateRight",descKey:"controller.rotateRight.desc"},{key:"zoom",labelKey:"controller.zoom",descKey:"controller.zoom.desc"},{key:"download",labelKey:"controller.download",descKey:"controller.download.desc"},{key:"close",labelKey:"controller.close",descKey:"controller.close.desc"},{key:"flip",labelKey:"controller.flip",descKey:"controller.flip.desc"},{key:"flipLeft",labelKey:"controller.flipLeft",descKey:"controller.flipLeft.desc"},{key:"flipRight",labelKey:"controller.flipRight",descKey:"controller.flipRight.desc"}],p3=["top-right","top-left","bottom-right","bottom-left","top-center","bottom-center","left-center","right-center"],m3=p3.map(e=>({value:e,label:e})),w1={toolbar:{inset:12},flip:{inset:0},pagination:{inset:24},caption:{inset:60}},f3={toolbar:12,flip:0,pagination:24,caption:60},h3=[{target:"toolbar",label:"toolbar.inset",descKey:"controller.layout.toolbarInset.desc",max:80},{target:"flip",label:"flip.inset",descKey:"controller.layout.flipInset.desc",max:80},{target:"pagination",label:"pagination.inset",descKey:"controller.layout.paginationInset.desc",max:120},{target:"caption",label:"caption.inset",descKey:"controller.layout.captionInset.desc",max:180}],g3={rotateLeft:"rotate",rotateRight:"rotate",flipLeft:"flip",flipRight:"flip"};function y3(e,a,r){var d;const s=(d=e==null?void 0:e[a])==null?void 0:d.inset;if(typeof s=="number")return s;if(typeof s=="string")return Number.parseFloat(s)||r;const l=a==="flip"?["left","right"]:a==="pagination"||a==="caption"?["bottom","top","left","right"]:["top","right","bottom","left"];for(const u of l){const m=s==null?void 0:s[u];if(typeof m=="number")return m;if(typeof m=="string")return Number.parseFloat(m)||r}return r}function b3(e,a,r){const s=e||w1,l=s[a]||{};return{...s,[a]:{...l,inset:r}}}function v3(e){const{layout:a,...r}=e;return r}function x3({value:e,min:a,max:r,step:s,onChange:l}){return c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx(td,{min:a,max:r,step:s,value:[e],onValueChange:d=>l(d[0]),className:"flex-1"}),c.jsx(po,{type:"number",value:e,min:a,max:r,step:s,onChange:d=>{const u=Number(d.target.value);Number.isFinite(u)&&l(u)},className:"h-7 w-16 px-2 text-xs md:text-xs"})]})}function w3({value:e,onChange:a}){const{t:r}=be(),s=typeof e=="object"&&e?e:{},l=!!s.layout,d=(u,m)=>{a({...s,layout:b3(s.layout,u,m)})};return c.jsxs("div",{className:"grid gap-1.5",children:[c.jsxs("label",{className:"mb-1 grid grid-cols-[72px_1fr] items-center gap-2 rounded-md border border-border/70 p-2",children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-[11px] text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:"placement"})}),c.jsxs(mo,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r("controller.placement")}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r("controller.placement.desc")})]})]}),c.jsx(Eo,{value:typeof s.placement=="string"?s.placement:"top-right",onValueChange:u=>a({...s,placement:u}),options:m3,triggerClassName:"h-7 px-2 text-[11px]",contentClassName:"text-xs"})]}),c.jsxs("div",{className:"mb-1 rounded-md border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3 text-[11px] leading-tight",children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:"layout"})}),c.jsxs(mo,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r("controller.layout")}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r("controller.layout.desc")})]})]}),c.jsx(Xe,{checked:l,onCheckedChange:u=>a(u?{...s,layout:w1}:v3(s))})]}),l&&c.jsx("div",{className:"mt-2 grid gap-2 border-t border-border/70 pt-2",children:h3.map(({target:u,label:m,descKey:h,max:g})=>c.jsxs("div",{className:"grid gap-1",children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-[11px] text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:m})}),c.jsx(mo,{side:"left",className:"max-w-[260px] text-xs",children:r(h)})]}),c.jsx(x3,{value:y3(s.layout,u,f3[u]),min:0,max:g,step:1,onChange:b=>d(u,b)})]},u))})]}),u3.map(({key:u,labelKey:m,descKey:h})=>{const g=g3[u],b=!!g&&!!s[g];return c.jsxs("label",{className:`flex items-center justify-between gap-3 text-[11px] leading-tight ${b?"opacity-50":""}`,children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:String(u)})}),c.jsxs(mo,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r(m)}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r(h)}),b&&c.jsxs("div",{className:"mt-1 border-t border-primary-foreground/15 pt-1 text-primary-foreground/70",children:[r("controller.overriddenBy")," ",c.jsx("code",{className:"font-mono",children:g})]})]})]}),c.jsx(Xe,{checked:!!s[u],disabled:b,onCheckedChange:v=>a({...s,[u]:v})})]},String(u))})]})}const S3=[{key:"close",labelKey:"hotkey.close",descKey:"hotkey.close.desc"},{key:"zoom",labelKey:"hotkey.zoom",descKey:"hotkey.zoom.desc"},{key:"flip",labelKey:"hotkey.flip",descKey:"hotkey.flip.desc"},{key:"flipLeft",labelKey:"hotkey.flipLeft",descKey:"hotkey.flipLeft.desc"},{key:"flipRight",labelKey:"hotkey.flipRight",descKey:"hotkey.flipRight.desc"},{key:"rotate",labelKey:"hotkey.rotate",descKey:"hotkey.rotate.desc"},{key:"rotateLeft",labelKey:"hotkey.rotateLeft",descKey:"hotkey.rotateLeft.desc"},{key:"rotateRight",labelKey:"hotkey.rotateRight",descKey:"hotkey.rotateRight.desc"},{key:"download",labelKey:"hotkey.download",descKey:"hotkey.download.desc"}],C3={flipLeft:"flip",flipRight:"flip",rotateLeft:"rotate",rotateRight:"rotate"};function k3({value:e,onChange:a}){const{t:r}=be(),s=typeof e=="object"&&e?e:{};return c.jsx("div",{className:"grid gap-1.5",children:S3.map(({key:l,labelKey:d,descKey:u})=>{const m=C3[String(l)],h=!!m&&!!s[m];return c.jsxs("label",{className:`flex items-center justify-between gap-3 text-[11px] leading-tight ${h?"opacity-50":""}`,children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:String(l)})}),c.jsxs(mo,{side:"left",className:"max-w-[260px] text-xs",children:[c.jsx("div",{className:"font-medium",children:r(d)}),c.jsx("div",{className:"mt-0.5 text-primary-foreground/80",children:r(u)}),h&&c.jsxs("div",{className:"mt-1 border-t border-primary-foreground/15 pt-1 text-primary-foreground/70",children:[r("controller.overriddenBy")," ",c.jsx("code",{className:"font-mono",children:m})]})]})]}),c.jsx(Xe,{checked:!!s[l],disabled:h,onCheckedChange:g=>a({...s,[l]:g})})]},String(l))})})}const T3=[{value:"fade",labelKey:"animate.flip.fade"},{value:"crossFade",labelKey:"animate.flip.crossFade"},{value:"swipe",labelKey:"animate.flip.swipe"},{value:"zoom",labelKey:"animate.flip.zoom"},{value:"blur",labelKey:"animate.flip.blur"},{value:"none",labelKey:"animate.flip.none"}];function Sr({children:e,descKey:a}){const{t:r}=be();return c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:e})}),c.jsx(mo,{side:"left",className:"max-w-[260px] text-xs",children:r(a)})]})}function E3({value:e,onChange:a}){const{t:r}=be(),s=typeof e=="object"&&e?e:{},l=s.cover&&typeof s.cover=="object"?s.cover:{},d=u=>{a({...s,cover:{objectFit:l.objectFit??!0,clip:l.clip??!0,radius:l.radius??!0,...u}})};return c.jsxs("div",{className:"grid gap-1.5 text-[11px] leading-tight",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(Sr,{descKey:"animate.browsing.desc",children:"browsing"}),c.jsx(Xe,{checked:!!s.browsing,onCheckedChange:u=>a({...s,browsing:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(Sr,{descKey:"animate.flip.desc",children:"flip"}),c.jsx(Eo,{value:s.flip??"fade",onValueChange:u=>a({...s,flip:u}),triggerClassName:"h-7 w-32 text-[11px]",options:T3.map(u=>({value:u.value,label:r(u.labelKey)}))})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(Sr,{descKey:"animate.slowMotion.desc",children:"slowMotion"}),c.jsx(Xe,{checked:!!s.slowMotion,onCheckedChange:u=>a({...s,slowMotion:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(Sr,{descKey:"animate.cover.objectFit.desc",children:"cover.objectFit"}),c.jsx(Xe,{checked:s.cover!==!1&&l.objectFit!==!1,onCheckedChange:u=>d({objectFit:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(Sr,{descKey:"animate.cover.clip.desc",children:"cover.clip"}),c.jsx(Xe,{checked:s.cover!==!1&&l.clip!==!1,onCheckedChange:u=>d({clip:u})})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(Sr,{descKey:"animate.cover.radius.desc",children:"cover.radius"}),c.jsx(Xe,{checked:s.cover!==!1&&l.radius!==!1,onCheckedChange:u=>d({radius:u})})]})]})}const Fp={threshold:120,velocity:.35,axisLock:1.2,resistance:.35},Kp={threshold:80,velocity:.35,axisLock:1.2,opacity:!0},Up={step:.12,smooth:!0,minScale:"fit",maxScale:4,center:"pointer",reverse:!1,exitGuardDuration:1e3},Hp={minScale:"fit",maxScale:4,resetBelowFit:!0,center:"gesture"},Gp={scale:1,minScale:"fit",maxScale:4,center:"tap",interval:300,distance:32};function dt({name:e,descKey:a,scope:r}){const{t:s}=be();return c.jsxs("span",{className:"inline-flex min-w-0 items-center gap-1",children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"cursor-help font-mono text-muted-foreground decoration-dotted underline-offset-4 hover:underline",children:e})}),c.jsx(mo,{side:"left",className:"max-w-[260px] text-xs",children:s(a)})]}),r&&c.jsx(Qc,{scope:r})]})}function R3({value:e,min:a,max:r,step:s,onChange:l}){return c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx(td,{min:a,max:r,step:s,value:[e],onValueChange:d=>l(d[0]),className:"flex-1"}),c.jsx(po,{type:"number",value:e,step:s,onChange:d=>l(Number(d.target.value)),className:"h-7 w-16 px-2 text-xs md:text-xs"})]})}function j3({value:e,onChange:a}){const r=e===!1,s=typeof e=="object"&&e?e:{},l=s.swipe&&typeof s.swipe=="object"?{...Fp,...s.swipe}:Fp,d=s.dragExit&&typeof s.dragExit=="object"?{...Kp,...s.dragExit}:Kp,u=s.wheelZoom&&typeof s.wheelZoom=="object"?{...Up,...s.wheelZoom}:Up,m=s.pinchZoom&&typeof s.pinchZoom=="object"?{...Hp,...s.pinchZoom}:Hp,h=s.doubleTapZoom&&typeof s.doubleTapZoom=="object"?{...Gp,...s.doubleTapZoom}:Gp,g=s.touchAction||"managed",b=x=>a({...s,swipe:x}),v=x=>a({...s,dragExit:x}),S=x=>a({...s,wheelZoom:x}),T=x=>a({...s,pinchZoom:x}),C=x=>a({...s,doubleTapZoom:x});return c.jsxs("div",{className:"grid gap-2 text-[11px] leading-tight",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"gesture",descKey:"gesture.desc"}),c.jsx(Xe,{checked:!r,onCheckedChange:x=>a(x?{swipe:Fp,dragExit:Kp,wheelZoom:Up,pinchZoom:Hp,doubleTapZoom:Gp,touchAction:"managed"}:!1)})]}),!r&&c.jsxs(c.Fragment,{children:[c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2 rounded border border-border/70 p-2",children:[c.jsx(dt,{name:"touchAction",descKey:"gesture.touchAction.desc",scope:"mobile"}),c.jsx(Eo,{value:g,onValueChange:x=>a({...s,touchAction:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"managed",label:"managed"},{value:"auto",label:"auto"},{value:"manipulation",label:"manipulation"},{value:"none",label:"none"}]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"swipe",descKey:"gesture.swipe.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.swipe!==!1,onCheckedChange:x=>b(x?l:!1)})]}),s.swipe!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"threshold",descKey:"gesture.threshold.desc",value:l.threshold,min:40,max:240,step:5,onChange:x=>b({...l,threshold:x})}),c.jsx(St,{name:"velocity",descKey:"gesture.velocity.desc",value:l.velocity,min:.1,max:1,step:.05,onChange:x=>b({...l,velocity:x})}),c.jsx(St,{name:"axisLock",descKey:"gesture.axisLock.desc",value:l.axisLock,min:1,max:2,step:.05,onChange:x=>b({...l,axisLock:x})}),c.jsx(St,{name:"resistance",descKey:"gesture.resistance.desc",value:l.resistance,min:.1,max:1,step:.05,onChange:x=>b({...l,resistance:x})})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"dragExit",descKey:"gesture.dragExit.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.dragExit!==!1,onCheckedChange:x=>v(x?d:!1)})]}),s.dragExit!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"threshold",descKey:"gesture.threshold.desc",value:d.threshold,min:40,max:240,step:5,onChange:x=>v({...d,threshold:x})}),c.jsx(St,{name:"velocity",descKey:"gesture.velocity.desc",value:d.velocity,min:.1,max:1,step:.05,onChange:x=>v({...d,velocity:x})}),c.jsx(St,{name:"axisLock",descKey:"gesture.axisLock.desc",value:d.axisLock,min:1,max:2,step:.05,onChange:x=>v({...d,axisLock:x})}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"opacity",descKey:"gesture.opacity.desc"}),c.jsx(Xe,{checked:d.opacity!==!1,onCheckedChange:x=>v({...d,opacity:x})})]})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"pinchZoom",descKey:"gesture.pinchZoom.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.pinchZoom!==!1,onCheckedChange:x=>T(x?m:!1)})]}),s.pinchZoom!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"maxScale",descKey:"gesture.pinchZoom.maxScale.desc",value:m.maxScale,min:1,max:8,step:.25,onChange:x=>T({...m,maxScale:x})}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"minScale",descKey:"gesture.pinchZoom.minScale.desc"}),c.jsx(Eo,{value:m.minScale==="fit"?"fit":String(m.minScale),onValueChange:x=>T({...m,minScale:x==="fit"?"fit":Number(x)}),triggerClassName:"h-7 text-[11px]",options:[{value:"fit",label:"fit"},{value:"0.5",label:"0.5"},{value:"1",label:"1"}]})]}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"center",descKey:"gesture.pinchZoom.center.desc"}),c.jsx(Eo,{value:m.center,onValueChange:x=>T({...m,center:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"gesture",label:"gesture"},{value:"viewport",label:"viewport"}]})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"resetBelowFit",descKey:"gesture.pinchZoom.resetBelowFit.desc"}),c.jsx(Xe,{checked:m.resetBelowFit!==!1,onCheckedChange:x=>T({...m,resetBelowFit:x})})]})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"doubleTapZoom",descKey:"gesture.doubleTapZoom.desc",scope:"mobile"}),c.jsx(Xe,{checked:s.doubleTapZoom!==!1,onCheckedChange:x=>C(x?h:!1)})]}),s.doubleTapZoom!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"scale",descKey:"gesture.doubleTapZoom.scale.desc",value:h.scale,min:.5,max:4,step:.25,onChange:x=>C({...h,scale:x})}),c.jsx(St,{name:"maxScale",descKey:"gesture.doubleTapZoom.maxScale.desc",value:h.maxScale,min:1,max:8,step:.25,onChange:x=>C({...h,maxScale:x})}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"minScale",descKey:"gesture.doubleTapZoom.minScale.desc"}),c.jsx(Eo,{value:h.minScale==="fit"?"fit":String(h.minScale),onValueChange:x=>C({...h,minScale:x==="fit"?"fit":Number(x)}),triggerClassName:"h-7 text-[11px]",options:[{value:"fit",label:"fit"},{value:"0.5",label:"0.5"},{value:"1",label:"1"}]})]}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"center",descKey:"gesture.doubleTapZoom.center.desc"}),c.jsx(Eo,{value:h.center,onValueChange:x=>C({...h,center:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"tap",label:"tap"},{value:"viewport",label:"viewport"}]})]}),c.jsx(St,{name:"interval",descKey:"gesture.doubleTapZoom.interval.desc",value:h.interval,min:120,max:600,step:10,onChange:x=>C({...h,interval:x})}),c.jsx(St,{name:"distance",descKey:"gesture.doubleTapZoom.distance.desc",value:h.distance,min:8,max:80,step:2,onChange:x=>C({...h,distance:x})})]})]}),c.jsxs("div",{className:"rounded border border-border/70 p-2",children:[c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"wheelZoom",descKey:"gesture.wheelZoom.desc",scope:"desktop"}),c.jsx(Xe,{checked:s.wheelZoom!==!1,onCheckedChange:x=>S(x?u:!1)})]}),s.wheelZoom!==!1&&c.jsxs("div",{className:"mt-2 grid gap-2",children:[c.jsx(St,{name:"step",descKey:"gesture.wheelZoom.step.desc",value:u.step,min:.02,max:.5,step:.01,onChange:x=>S({...u,step:x})}),c.jsx(St,{name:"maxScale",descKey:"gesture.wheelZoom.maxScale.desc",value:u.maxScale,min:1,max:8,step:.25,onChange:x=>S({...u,maxScale:x})}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"minScale",descKey:"gesture.wheelZoom.minScale.desc"}),c.jsx(Eo,{value:u.minScale==="fit"?"fit":String(u.minScale),onValueChange:x=>S({...u,minScale:x==="fit"?"fit":Number(x)}),triggerClassName:"h-7 text-[11px]",options:[{value:"fit",label:"fit"},{value:"0.5",label:"0.5"},{value:"1",label:"1"}]})]}),c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:"center",descKey:"gesture.wheelZoom.center.desc"}),c.jsx(Eo,{value:u.center,onValueChange:x=>S({...u,center:x}),triggerClassName:"h-7 text-[11px]",options:[{value:"pointer",label:"pointer"},{value:"viewport",label:"viewport"}]})]}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"reverse",descKey:"gesture.wheelZoom.reverse.desc"}),c.jsx(Xe,{checked:u.reverse===!0,onCheckedChange:x=>S({...u,reverse:x})})]}),c.jsx(St,{name:"exitGuardDuration",descKey:"gesture.wheelZoom.exitGuardDuration.desc",value:u.exitGuardDuration,min:0,max:1e3,step:50,onChange:x=>S({...u,exitGuardDuration:x})}),c.jsxs("label",{className:"flex items-center justify-between gap-3",children:[c.jsx(dt,{name:"smooth",descKey:"gesture.wheelZoom.smooth.desc"}),c.jsx(Xe,{checked:u.smooth!==!1,onCheckedChange:x=>S({...u,smooth:x})})]})]})]})]})]})}function St({name:e,descKey:a,value:r,min:s,max:l,step:d,onChange:u}){return c.jsxs("label",{className:"grid grid-cols-[72px_1fr] items-center gap-2",children:[c.jsx(dt,{name:e,descKey:a}),c.jsx(R3,{value:r,min:s,max:l,step:d,onChange:u})]})}function A3({value:e,onChange:a}){const{t:r}=be(),s=Array.isArray(e)?e:[],l=(m,h)=>{const g=s.slice();g[m]={...g[m],...h},a(g)},d=m=>a(s.filter((h,g)=>g!==m)),u=()=>a([...s,{src:"",alt:"",caption:""}]);return c.jsxs("div",{className:"space-y-3",children:[s.map((m,h)=>{const g=String(h+1).padStart(2,"0");return c.jsxs("div",{className:"group flex items-start gap-2",children:[c.jsxs("div",{className:"relative h-10 w-10 shrink-0 overflow-hidden rounded border border-border/60 bg-muted",children:[m.src&&c.jsx("img",{src:m.src,alt:"",className:"h-full w-full object-cover"}),c.jsx("span",{className:"pointer-events-none absolute bottom-0 right-0 bg-background/80 px-0.5 font-mono text-[9px] leading-tight text-foreground/60",children:g})]}),c.jsxs("div",{className:"grid min-w-0 flex-1 gap-1",children:[c.jsx(po,{value:m.src,onChange:b=>l(h,{src:b.target.value}),placeholder:"src",className:"h-7 px-2 text-xs md:text-xs"}),c.jsx(po,{value:m.alt??"",onChange:b=>l(h,{alt:b.target.value}),placeholder:"alt",className:"h-7 px-2 text-xs md:text-xs"}),c.jsx(po,{value:m.caption??"",onChange:b=>l(h,{caption:b.target.value}),placeholder:"caption",className:"h-7 px-2 text-xs md:text-xs"})]}),c.jsx(it,{size:"icon",variant:"ghost",onClick:()=>d(h),className:"h-7 w-7 shrink-0 text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive","aria-label":r("common.remove"),children:c.jsx(JR,{className:"h-3.5 w-3.5"})})]},h)}),c.jsxs("button",{type:"button",onClick:u,className:"flex w-full items-center justify-center gap-1.5 rounded border border-dashed border-border/60 bg-transparent px-3 py-1.5 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-muted/40 hover:text-foreground",children:[c.jsx(Hs,{className:"h-3 w-3"})," ",r("common.add")]})]})}function N3({events:e,value:a,onChange:r}){const s=typeof a=="function"&&a.__zmageLog===!0;return c.jsx(Xe,{checked:s,onCheckedChange:l=>{if(l){const d=e[0],u=(...m)=>{window.dispatchEvent(new CustomEvent("zmage-pg-event",{detail:{name:d,args:m}}))};u.__zmageLog=!0,u.__name=d,r(u)}else r(void 0)}})}const zr=[{id:"default",src:"/imgSet/childsDream/1.jpg",alt:"童夢 · ONE",set:[{src:"/imgSet/childsDream/1.jpg",alt:"童夢 · ONE",ratio:"3/2"},{src:"/imgSet/childsDream/2.jpg",alt:"童夢 · TWO",ratio:"3/2"}]},{id:"testset",src:"https://picsum.photos/seed/zmage-wide/2000/1000",alt:"横屏 2:1 · JPEG",set:[{src:"https://picsum.photos/seed/zmage-wide/2000/1000",alt:"横屏 2:1 · JPEG",ratio:"2/1"},{src:"https://picsum.photos/seed/zmage-tall/1000/2000",alt:"竖屏 1:2 · JPEG",ratio:"1/2"},{src:"https://picsum.photos/seed/zmage-sq/1500/1500.webp",alt:"方图 1:1 · WebP",ratio:"1/1"},{src:"https://picsum.photos/seed/zmage-pano/3000/500",alt:"全景 6:1 · JPEG",ratio:"6/1"},{src:"https://picsum.photos/seed/zmage-tower/500/3000",alt:"高塔 1:6 · JPEG",ratio:"1/6"},{src:"https://picsum.photos/seed/zmage-small/240/180",alt:"小图 4:3 · 不放大",ratio:"4/3"}]}],z3={src:zr[0].src,alt:zr[0].alt,set:zr[0].set.map(({ratio:e,...a})=>a)},S1=["controller","hotKey","animate","gesture"];function Sm(e,a){const r=cf(e.preset);for(const s of S1)a!=null&&a.has(s)||(e[s]=r[s]);return e}function Cm(e,a){return a!=null&&a.has("animate")||(e.animate=nC(e.animate)),e}function M3(e){for(const a of zr){if(e.src!==a.src)continue;const r=Array.isArray(e.set)?e.set:[];if(r.length!==a.set.length)continue;if(a.set.every((l,d)=>{var u,m;return((u=r[d])==null?void 0:u.src)===l.src&&(((m=r[d])==null?void 0:m.alt)??"")===(l.alt??"")}))return a.id}return null}function km(){const e={};for(const a of da)a.docsOnly||(e[a.name]=a.default);return Sm(e),Object.assign(e,z3),Cm(e),e}function D3(e,a){const r=da.find(s=>s.name===e);if(r)return S1.includes(e)?cf(a==null?void 0:a.preset)[e]:r.default}function _3(e,a,r){if(!da.find(d=>d.name===e)||a===void 0)return!0;const l=D3(e,r);if(typeof a=="object"&&a!==null)try{return JSON.stringify(a)===JSON.stringify(l)}catch{return!1}return a===l}function O3(e,a){if(e===a)return!0;if(typeof e=="function"||typeof a=="function")return!1;try{return JSON.stringify(e)===JSON.stringify(a)}catch{return!1}}function sd(e,a){const r={};for(const s of da){if(s.docsOnly)continue;const l=e[s.name];if(s.required){r[s.name]=l??"";continue}l!==void 0&&(_3(s.name,l,e)&&!(a!=null&&a.has(s.name))||(r[s.name]=l))}return r}function L3(e){const a=km(),r={};for(const s of da){if(s.docsOnly)continue;const l=s.name,d=e[l];d!==void 0&&(O3(d,a[l])||(r[l]=d))}return r}const Us=14,P3=3,tx=3;function Z3({preset:e,active:a}){return c.jsx("span",{className:"flex shrink-0 items-end overflow-hidden",style:{height:Us,gap:P3},"aria-hidden":!0,children:e.set.map((r,s)=>{const[l,d]=r.ratio.split("/").map(Number),u=l/d,m=u>=1?Us:Us*u,h=u>=1?Us/u:Us;return c.jsx("span",{className:ie("shrink-0 rounded-[1.5px] ring-1 ring-inset transition-colors",a?"bg-foreground/55 ring-foreground/40":"bg-foreground/25 ring-foreground/15"),style:{width:m,height:h,minWidth:tx,minHeight:tx}},s)})})}function B3({values:e,onChange:a}){const{t:r}=be(),s=M3(e),l=u=>{const m=zr.find(h=>h.id===u);m&&(a("src",m.src),a("alt",m.alt),a("set",m.set.map(({ratio:h,...g})=>g)),a("defaultPage",0))},d={default:r("playground.preset.default.label"),testset:r("playground.preset.testset.label")};return c.jsx(Tf,{value:s??"",onValueChange:u=>l(u),children:c.jsx(ad,{"aria-label":r("playground.preset.aria"),className:"grid w-full grid-cols-2 h-auto p-0.5",children:zr.map(u=>c.jsxs(nd,{value:u.id,title:d[u.id],className:"min-w-0 gap-2 px-2.5 py-1.5",children:[c.jsx(Z3,{preset:u,active:s===u.id}),c.jsx("span",{className:"min-w-0 truncate",children:d[u.id]})]},u.id))})})}const I3={data:"/docs#props-data",preset:"/docs#props-preset",interface:"/docs#props-interface",controller:"/docs#props-controller",hotkey:"/docs#props-hotkey",animate:"/docs#props-animate",gesture:"/docs#props-gesture",lifecycle:"/docs#props-lifecycle",controlled:"/docs#props-controlled"},Vp=["data","preset","interface","controller","hotkey","animate","gesture","lifecycle","controlled"],q3={data:"group.data",preset:"group.preset",interface:"group.interface",controller:"group.controller",hotkey:"group.hotkey",animate:"group.animate",gesture:"group.gesture",lifecycle:"group.lifecycle",controlled:"group.controlled"};function F3(e,a,r,s){const l=e.control;if(l.kind==="object"){if(l.component==="controller")return c.jsx(w3,{value:a,onChange:r});if(l.component==="hotkey")return c.jsx(k3,{value:a,onChange:r});if(l.component==="animate")return c.jsx(E3,{value:a,onChange:r});if(l.component==="gesture")return c.jsx(j3,{value:a,onChange:r});if(l.component==="set")return c.jsx(A3,{value:a,onChange:r})}return l.kind==="callback"?c.jsx(N3,{events:l.events,value:a,onChange:r}):l.kind==="readonly"?c.jsx("div",{className:"rounded-md border border-dashed border-border bg-muted/20 px-2.5 py-2 text-xs leading-relaxed text-muted-foreground",children:s(e.i18n.descKey)}):c.jsx(d3,{def:e,value:a,onChange:r})}function K3({values:e,onChange:a}){const{t:r}=be(),s=y.useMemo(()=>{const l=new Map;for(const d of Vp)l.set(d,[]);for(const d of da){const u=l.get(d.group)??[];l.has(d.group)||l.set(d.group,u),u.push(d)}return l},[]);return c.jsx(kS,{delayDuration:300,children:c.jsx(bL,{type:"multiple",defaultValue:Vp,className:"w-full",children:Vp.map(l=>{const d=s.get(l);return!d||d.length===0?null:c.jsxs(CC,{value:l,className:"border-border/60",children:[c.jsx(kC,{className:"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:r(q3[l])}),c.jsxs(TC,{className:"space-y-3 px-3 pb-3 pt-1",children:[l==="data"&&c.jsx(B3,{values:e,onChange:a}),d.map(u=>c.jsxs("div",{className:"grid grid-cols-[120px_1fr] items-center gap-3",children:[c.jsxs("div",{className:"flex items-center gap-1.5",children:[c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx("span",{className:"font-mono text-xs underline-offset-4 decoration-dotted hover:underline cursor-help",children:u.name})}),c.jsx(mo,{side:"right",className:"max-w-[280px] text-xs",children:r(u.i18n.descKey)})]}),u.required&&c.jsx("span",{"aria-label":"required",className:"text-destructive font-bold text-sm leading-none",children:"*"}),c.jsxs(No,{children:[c.jsx(zo,{asChild:!0,children:c.jsx(st,{to:I3[u.group]??"/docs","aria-label":r("param.viewInDocs"),className:"inline-flex items-center text-muted-foreground/60 hover:text-foreground transition-colors",children:c.jsx(zx,{className:"h-3 w-3"})})}),c.jsx(mo,{side:"right",className:"text-xs",children:r("param.viewInDocs")})]}),u.presetScope&&c.jsx(Qc,{scope:u.presetScope})]}),c.jsx("div",{children:F3(u,e[u.name],m=>a(u.name,m),r)})]},u.name))]})]},l)})})})}function Rf({title:e,description:a,expandLabel:r,preview:s,expanded:l,footer:d,className:u,previewClassName:m,dialogContentClassName:h,dialogBodyClassName:g}){return c.jsxs("section",{className:ie("min-w-0 rounded-lg border border-border bg-card/30",u),children:[c.jsxs("div",{className:"flex items-start justify-between gap-3 border-b border-border px-3 py-2.5",children:[c.jsxs("div",{className:"min-w-0",children:[c.jsx("h2",{className:"text-sm font-medium leading-5",children:e}),a&&c.jsx("p",{className:"mt-0.5 text-xs text-muted-foreground",children:a})]}),c.jsxs(J0,{children:[c.jsx(eS,{asChild:!0,children:c.jsxs(it,{variant:"outline",size:"sm",className:"h-8 shrink-0 gap-1.5 px-2.5 text-xs",children:[c.jsx(IR,{className:"h-3.5 w-3.5"}),r]})}),c.jsxs(nf,{className:ie("max-h-[88dvh] max-w-5xl gap-0 overflow-hidden p-0",h),children:[c.jsxs(oS,{className:"border-b border-border px-5 py-4 pr-12",children:[c.jsx(rf,{children:e}),a&&c.jsx(sf,{children:a})]}),c.jsxs("div",{className:ie("space-y-3 p-5",g),children:[l,d]})]})]})]}),c.jsx("div",{className:ie("p-3",m),children:s})]})}var U3="Label",C1=y.forwardRef((e,a)=>c.jsx(Ew.label,{...e,ref:a,onMouseDown:r=>{var l;r.target.closest("button, input, select, textarea")||((l=e.onMouseDown)==null||l.call(e,r),!r.defaultPrevented&&r.detail>1&&r.preventDefault())}}));C1.displayName=U3;var k1=C1;const H3=bc("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),jf=y.forwardRef(({className:e,...a},r)=>c.jsx(k1,{ref:r,className:ie(H3(),e),...a}));jf.displayName=k1.displayName;function G3(e){return typeof e=="function"&&(e==null?void 0:e.__zmageLog)===!0}function Af(e){return typeof e=="string"?JSON.stringify(e):typeof e=="function"?"(...args) => console.info(args)":JSON.stringify(e,null,2)}function Nf(e,a){return e.includes(` +`)?e.split(` +`).map((s,l)=>l===0?s:a+s).join(` +`):e}const V3={rotateLeft:"rotate",rotateRight:"rotate",flipLeft:"flip",flipRight:"flip"};function T1(e,a){const r=["{"];for(const[s,l]of Object.entries(e)){const d=V3[s],u=!!d&&!!e[d],m=`"${s}": ${Nf(Af(l)," ")}`;u?r.push(` // ${m} | ${a(d)}`):r.push(` ${m},`)}return r.push("}"),r.join(` +`)}function W3(e,a){const r=["{"];for(const[s,l]of Object.entries(e)){const d=s==="controller"&&l&&typeof l=="object"&&!Array.isArray(l)?T1(l,a):Af(l);r.push(` "${s}": ${Nf(d," ")},`)}return r.push("}"),r.join(` +`)}function $3(e,a,r){return e==="controller"&&a&&typeof a=="object"&&!Array.isArray(a)?T1(a,r):Af(a)}function E1(e,a,r){return typeof a=="string"&&!a.includes(` +`)?` ${e}=${JSON.stringify(a)}`:G3(a)?` ${e}={(...args) => console.info('${e}', args)}`:` ${e}={${Nf($3(e,a,r)," ")}}`}function Y3(e,a){const r=[""),r.join(` +`)}function X3(e,a){return["import Zmage from 'react-zmage'","",`Zmage.browsing(${W3(e,a)})`].join(` +`)}function Q3(e,a){return typeof e=="string"&&e.trim()?e.trim():e&&typeof e=="object"&&typeof e.text=="string"&&e.text.trim()?e.text.trim():a||""}function Wp(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">").replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function J3(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function eP(e){const a=J3(e).slice(0,4);return a.length===0?"const html = `\n

CMS or markdown content with image tags.

\n`":["const html = `","

Rich text from a CMS, markdown renderer, or MDX pipeline.

",...a.map((s,l)=>{const d=Q3(s.caption,s.alt||`Image ${l+1}`);return["
",` ${Wp(s.alt||`,d?`
${Wp(d)}
`:"","
"].filter(Boolean).join(` +`)}),"`"].join(` +`)}function tP(e){const{src:a,alt:r,caption:s,browsing:l,...d}=e;return d}function oP(e,a,r){const s=Object.entries(a),l=[eP(e),""];if(s.length===0)l.push("");else{l.push("")}return l.push("
"),l.push(""),l.join(` +`)}function aP({values:e,touched:a,hideDefaults:r,onHideDefaultsChange:s,mode:l,compact:d=!1}){const{t:u}=be(),m=x=>u("snippet.overriddenByProp").replace("{umbrella}",x),h=sd(e,r?void 0:a),g=l==="wrapper"?tP(h):h,b=l==="component"?Y3(g,m):l==="imperative"?X3(g,m):oP(e,g,m),v=y.useId(),S=y.useId(),T=x=>c.jsxs("div",{className:"flex items-center gap-1.5 whitespace-nowrap",children:[c.jsx(jf,{htmlFor:x,className:"cursor-pointer text-[11px] text-muted-foreground",children:u("pg.code.hideDefaults")}),c.jsx(Xe,{id:x,checked:r,onCheckedChange:s,className:"scale-75 origin-right"})]}),C=T(v);return d?c.jsx(Rf,{title:u("pg.code.title"),description:u("pg.code.subtitle"),expandLabel:u("common.expand"),preview:c.jsx(Me,{code:b,language:"tsx",actions:C,className:"h-36",preClassName:"p-3 pr-44 text-xs leading-5"}),expanded:c.jsx(Me,{code:b,language:"tsx",actions:T(S),className:"h-[62dvh]"}),previewClassName:"p-2"}):c.jsx(Me,{code:b,language:"tsx",actions:C})}function $p({entries:e,emptyLabel:a,compact:r=!1}){return e.length===0?c.jsx("div",{className:"text-muted-foreground",children:a}):c.jsx(c.Fragment,{children:e.map((s,l)=>c.jsxs("div",{className:ie("grid gap-2",r?"grid-cols-[5.5rem_7rem_minmax(0,1fr)]":"grid-cols-[6rem_8rem_minmax(0,1fr)]"),children:[c.jsx("span",{className:"text-muted-foreground",children:s.ts}),c.jsx("span",{children:s.name}),c.jsx("span",{className:"truncate text-muted-foreground",children:JSON.stringify(s.args)})]},l))})}function nP({compact:e=!1}){const{t:a}=be(),[r,s]=y.useState([]);return y.useEffect(()=>{const l=d=>{const u=d.detail;s(m=>[{ts:new Date().toLocaleTimeString(),name:u.name,args:u.args},...m].slice(0,50))};return window.addEventListener("zmage-pg-event",l),()=>window.removeEventListener("zmage-pg-event",l)},[]),e?c.jsx(Rf,{title:a("pg.events.title"),description:a("pg.events.subtitle"),expandLabel:a("common.expand"),preview:c.jsx("div",{className:"code-block-scroll max-h-36 overflow-auto font-mono text-xs leading-5",children:c.jsx($p,{entries:r.slice(0,8),emptyLabel:a("pg.events.empty"),compact:!0})}),expanded:c.jsx("div",{className:"code-block-scroll h-[62dvh] overflow-auto rounded-lg border border-border bg-muted/25 p-3 font-mono text-xs leading-5",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})}):c.jsxs("div",{className:"rounded-lg border border-border bg-card/30",children:[c.jsx("div",{className:"border-b border-border px-3 py-2 text-xs font-medium text-muted-foreground",children:a("pg.events.title")}),c.jsx("div",{className:"max-h-48 overflow-y-auto p-3 font-mono text-xs",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})]})}const ox=[{src:"/imgSet/childsDream/8.jpg",alt:"Portal target demo 1"},{src:"/imgSet/childsDream/7.jpg",alt:"Portal target demo 2"}];function rP(){const{t:e}=be(),a=Ur(),[r,s]=y.useState(null),l=y.useCallback(d=>{s(u=>u===d?u:d)},[]);return c.jsxs("div",{className:"grid gap-3 rounded-lg border border-border bg-card/40 p-3 md:grid-cols-[minmax(0,1fr)_220px]",children:[c.jsxs("div",{className:"min-w-0",children:[c.jsx("div",{className:"text-sm font-medium",children:e("pg.portalTarget.title")}),c.jsx("p",{className:"mt-1 text-xs leading-relaxed text-muted-foreground",children:e("pg.portalTarget.body")}),c.jsxs("p",{className:"mt-2 rounded-md bg-muted/35 px-2.5 py-2 font-mono text-[11px] leading-relaxed text-muted-foreground",children:["portalTarget=","{viewerRoot}"]})]}),c.jsxs("div",{className:"relative min-h-[132px] rounded-md border border-dashed border-border bg-muted/20 p-2",children:[c.jsx("div",{ref:l,className:"absolute inset-2 rounded-md border border-dashed border-primary/35 bg-background/45 px-2 py-1 text-[11px] text-muted-foreground",children:e("pg.portalTarget.root")}),c.jsx(uo,{src:ox[0].src,alt:e("pg.portalTarget.imageAlt"),set:ox,portalTarget:r,backdrop:a,animate:Cn,className:"absolute bottom-3 right-3 h-20 w-28 cursor-zoom-in rounded-md border border-background object-cover shadow-sm"})]})]})}function sP(e){return typeof e=="function"&&(e==null?void 0:e.__zmageLog)===!0}function iP(e){const a=new URLSearchParams,r=L3(e);for(const[s,l]of Object.entries(r)){if(sP(l)){a.set(s,"__log__");continue}typeof l=="string"?a.set(s,l):a.set(s,JSON.stringify(l))}return"#?"+a.toString()}function ax(e){const a={},r=e.startsWith("#?")?e.slice(2):e.startsWith("#")?e.slice(1):e;if(!r)return a;const s=new URLSearchParams(r);for(const[l,d]of s){const u=da.find(m=>m.name===l);if(!(!u||u.docsOnly)){if(d==="__log__"){if((u==null?void 0:u.control.kind)==="callback"){const m=(...h)=>{window.dispatchEvent(new CustomEvent("zmage-pg-event",{detail:{name:l,args:h}}))};m.__zmageLog=!0,m.__name=l,a[l]=m}continue}try{a[l]=JSON.parse(d)}catch{a[l]=d}}}return a}function lP({values:e}){var h;const{t:a}=be(),r=Ur(),s=sd(e),l=!!s.src,d=Array.isArray(s.set)&&s.set.length>0,u=l?s.src:d?(h=s.set[0])==null?void 0:h.src:"",m={backdrop:r,...s,src:u};return c.jsxs("div",{className:"flex h-full min-h-[360px] flex-col items-center justify-center rounded-lg border border-border bg-card/30 p-6 lg:min-h-0",children:[c.jsx("div",{className:"flex min-h-0 w-full flex-1 items-center justify-center",children:c.jsx(uo,{...m,className:"max-h-full max-w-full rounded-md object-contain"})}),c.jsx("p",{className:"mt-4 shrink-0 text-center text-xs text-muted-foreground",children:a("pg.preview.tip")})]})}function cP({values:e}){const{t:a}=be(),r=Ur(),s=y.useRef(null),l=()=>{var g,b;(g=s.current)==null||g.call(s);const d=sd(e),u=!!d.src,m=Array.isArray(d.set)&&d.set.length>0,h=u?d.src:m?(b=d.set[0])==null?void 0:b.src:"";d.src=h,d.backdrop||(d.backdrop=r),s.current=uo.browsing(d)};return y.useEffect(()=>()=>{var d;(d=s.current)==null||d.call(s)},[]),c.jsx("div",{className:"flex h-full min-h-[360px] items-center justify-center rounded-lg border border-border bg-card/30 p-12 lg:min-h-0",children:c.jsxs(it,{size:"lg",onClick:l,children:[c.jsx(WR,{className:"mr-2 h-4 w-4"})," ",a("pg.preview.trigger")]})})}function nx(e,a){const{caption:r}=e;return typeof r=="string"&&r.trim()?r.trim():r&&typeof r=="object"&&typeof r.text=="string"&&r.text.trim()?r.text.trim():e.alt||a}function dP(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function Cr(e,a){return e[a%e.length]}function uP({items:e}){if(e.length===0)return c.jsx("article",{className:"mx-auto max-w-2xl rounded-md border border-dashed border-border p-8 text-sm text-muted-foreground",children:"The wrapped subtree has no image nodes yet."});const a=Cr(e,0),r=Cr(e,1),s=Cr(e,2),l=Cr(e,3),d=Cr(e,4),u=Cr(e,5),m=({item:h,className:g="",imageClassName:b="",label:v})=>c.jsxs("figure",{className:g,children:[c.jsx("img",{src:h.src,alt:h.alt??"","data-zmage-caption":nx(h,v),className:b}),c.jsx("figcaption",{className:"mt-2 text-[11px] leading-5 text-muted-foreground",children:nx(h,v)})]});return c.jsxs("article",{className:"overflow-hidden bg-background text-foreground",children:[c.jsxs("header",{className:"grid gap-6 border-b border-border bg-muted/20 p-5 md:p-7 lg:grid-cols-[minmax(0,1.05fr)_minmax(280px,0.95fr)]",children:[c.jsxs("div",{className:"flex min-w-0 flex-col justify-between gap-8",children:[c.jsxs("div",{className:"space-y-4",children:[c.jsxs("div",{className:"flex flex-wrap gap-2 text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:[c.jsx("span",{className:"rounded-full border border-border bg-background px-2.5 py-1",children:"Field report"}),c.jsx("span",{className:"rounded-full border border-emerald-500/25 bg-emerald-500/10 px-2.5 py-1 text-emerald-700 dark:text-emerald-300",children:"Wrapped HTML"}),c.jsx("span",{className:"rounded-full border border-amber-500/25 bg-amber-500/10 px-2.5 py-1 text-amber-700 dark:text-amber-300",children:"Mixed media"})]}),c.jsx("h2",{className:"max-w-2xl text-3xl font-semibold leading-tight tracking-normal md:text-4xl",children:"An annotated image essay inside one Wrapper"}),c.jsx("p",{className:"max-w-[68ch] text-sm leading-7 text-muted-foreground md:text-[15px]",children:"Long-form CMS pages rarely render as a neat gallery. They mix hero images, floated figures, side notes, dense captions, and repeated thumbnails. This composition keeps that structure intact while every nested image remains part of the same viewer configuration."})]}),c.jsxs("dl",{className:"grid max-w-xl grid-cols-3 gap-3 text-xs",children:[c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Images"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:e.length})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Source"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"HTML"})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Flow"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"Auto"})]})]})]}),c.jsx(m,{item:a,label:"Lead image",className:"min-w-0",imageClassName:"aspect-[5/4] w-full rounded-md object-cover shadow-sm"})]}),c.jsxs("section",{className:"grid gap-7 p-5 md:p-7 lg:grid-cols-[minmax(0,1.15fr)_minmax(260px,0.85fr)]",children:[c.jsxs("div",{className:"min-w-0 space-y-5 text-sm leading-7 text-foreground/85",children:[c.jsx("p",{children:"The route cuts through a quiet shoreline, a workshop archive, and a narrow set of rooms where every surface is used for notes. Image sizes change with the material: field photos need width, object studies need height, and repeated details sit beside the text that refers to them."}),c.jsx(m,{item:r,label:"Inline figure",className:"my-1 rounded-md border border-border bg-muted/25 p-2 md:float-right md:ml-5 md:w-64",imageClassName:"aspect-[4/3] w-full rounded object-cover"}),c.jsx("p",{children:"In the middle section the reading column narrows and the captions become closer to the images. The floated figure interrupts the paragraph without becoming a separate gallery block, so the page keeps the uneven rhythm of an edited article."}),c.jsx("blockquote",{className:"border-y border-border py-4 text-lg font-medium leading-8 text-foreground",children:"The strongest sequence is not the cleanest grid. It is the one where each image keeps its place in the argument."}),c.jsx("p",{children:"The final pass brings small crops back into view. Repeated images are intentional: they let the same material behave as a lead image, a supporting figure, and a tight detail without changing the source data."})]}),c.jsxs("aside",{className:"grid content-start gap-4",children:[c.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[c.jsx(m,{item:s,label:"Side image A",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[3/4] w-full rounded object-cover"}),c.jsx(m,{item:l,label:"Side image B",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-square w-full rounded object-cover"})]}),c.jsx("div",{className:"rounded-md border border-border bg-muted/25 p-4 text-xs leading-6 text-muted-foreground",children:"Field notes, measured captions, and repeated crops share the same reading surface. The layout is deliberately uneven so dense editorial pages stay close to their real shape."}),c.jsx(m,{item:d,label:"Wide supporting image",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[16/9] w-full rounded object-cover"})]})]}),c.jsxs("section",{className:"grid gap-3 border-t border-border bg-muted/20 p-5 md:grid-cols-6 md:p-7",children:[c.jsx(m,{item:u,label:"Panorama strip",className:"md:col-span-3",imageClassName:"aspect-[16/7] w-full rounded-md object-cover"}),c.jsx(m,{item:a,label:"Repeated lead detail",className:"md:col-span-2",imageClassName:"aspect-[4/3] w-full rounded-md object-cover"}),c.jsx(m,{item:r,label:"Tall crop",className:"md:col-span-1",imageClassName:"aspect-[3/5] w-full rounded-md object-cover"})]})]})}function pP({values:e}){const a=Ur(),r=sd(e),{src:s,alt:l,caption:d,browsing:u,...m}=r,h={backdrop:a,...m},g=dP(e),b=uo.Wrapper;return c.jsx("div",{className:"code-block-scroll h-full min-h-[420px] overflow-auto rounded-lg border border-border bg-background lg:min-h-0",children:c.jsx(b,{...h,children:c.jsx(uP,{items:g})})})}const mP=[{to:"",labelKey:"pg.tab.component",end:!0},{to:"imperative",labelKey:"pg.tab.imperative",end:!1},{to:"wrapper",labelKey:"pg.tab.wrapper",end:!1}];function fP(){const{t:e}=be(),a=$a(),r=a.pathname.endsWith("/imperative")?"imperative":a.pathname.endsWith("/wrapper")?"wrapper":"component",s=r==="imperative"?"modes.imperative.when":r==="wrapper"?"modes.wrapper.when":"modes.component.when",[l,d]=y.useState(()=>{const x=km();if(typeof window<"u"){const k=ax(window.location.hash),R=new Set(Object.keys(k));Object.assign(x,k),Sm(x,R),Cm(x,R)}return x}),[u,m]=y.useState(()=>typeof window>"u"?new Set:new Set(Object.keys(ax(window.location.hash)))),[h,g]=y.useState(!1),[b,v]=y.useState(!1),S=y.useCallback((x,k)=>{d(R=>{const j={...R,[x]:k};return x==="preset"&&(Sm(j,u),Cm(j,u)),j}),m(R=>R.has(x)?R:new Set(R).add(x))},[u]),T=y.useCallback(()=>{d(km()),m(new Set)},[]),C=y.useCallback(async()=>{const x=window.location.origin+window.location.pathname+iP(l);window.history.replaceState(null,"",x),await navigator.clipboard.writeText(x),v(!0),setTimeout(()=>v(!1),1500)},[l]);return c.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4 px-4 py-6 sm:px-6 lg:h-[calc(100dvh-3.5rem)] lg:overflow-hidden",children:[c.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[c.jsxs("div",{children:[c.jsx("h1",{className:"text-2xl font-semibold tracking-tight",children:e("pg.title")}),c.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e("pg.subtitle")})]}),c.jsxs("div",{className:"flex gap-2",children:[c.jsxs(it,{variant:"outline",size:"sm",onClick:T,children:[c.jsx($R,{className:"mr-1.5 h-3.5 w-3.5"})," ",e("pg.reset")]}),c.jsxs(it,{variant:"outline",size:"sm",onClick:C,children:[b?c.jsx(Ha,{className:"mr-1.5 h-3.5 w-3.5"}):c.jsx(YR,{className:"mr-1.5 h-3.5 w-3.5"}),e(b?"pg.shared":"pg.share")]})]})]}),c.jsxs("div",{children:[c.jsxs("div",{className:"relative inline-flex rounded-lg border border-border bg-muted/30 p-1",children:[c.jsx(l1,{}),mP.map(x=>c.jsx(Jp,{to:x.to,end:x.end,className:({isActive:k})=>ie("relative z-10 cursor-pointer rounded-md px-3 py-1.5 text-sm transition-colors",k?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e(x.labelKey)},x.to))]}),c.jsx("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:e(s)})]}),c.jsxs("div",{className:"grid min-h-0 flex-1 gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[c.jsxs("aside",{className:"flex min-h-0 flex-col overflow-hidden rounded-lg border border-border bg-card/30",children:[c.jsxs("div",{className:"shrink-0 border-b border-border px-4 py-3",children:[c.jsx("h2",{className:"text-sm font-medium",children:e("pg.params.title")}),c.jsx("p",{className:"mt-0.5 text-[11px] leading-4 text-muted-foreground/65",children:e("pg.params.subtitle")})]}),c.jsx("div",{className:"h-[min(70dvh,720px)] overflow-y-auto py-2 lg:h-auto lg:min-h-0 lg:flex-1",children:c.jsx(K3,{values:l,onChange:S})})]}),c.jsxs("section",{className:"grid min-h-0 gap-4 lg:grid-rows-[auto_minmax(0,1fr)_auto]",children:[c.jsx(rP,{}),c.jsx("div",{className:"min-h-0",children:c.jsxs(Sx,{children:[c.jsx(ut,{index:!0,element:c.jsx(lP,{values:l})}),c.jsx(ut,{path:"imperative",element:c.jsx(cP,{values:l})}),c.jsx(ut,{path:"wrapper",element:c.jsx(pP,{values:l})})]})}),c.jsxs("div",{className:"grid min-h-0 gap-4 lg:grid-cols-[minmax(0,1.2fr)_minmax(280px,0.8fr)]",children:[c.jsx(aP,{values:l,touched:u,hideDefaults:h,onHideDefaultsChange:g,mode:r,compact:!0}),c.jsx(nP,{compact:!0})]})]})]})]})}function hP(e){const[a,r]=y.useState("");return y.useEffect(()=>{const s=Array.from(document.querySelectorAll(e)),l=new IntersectionObserver(d=>{const u=d.filter(m=>m.isIntersecting).sort((m,h)=>m.boundingClientRect.top-h.boundingClientRect.top);u.length>0&&r(u[0].target.id)},{rootMargin:"-80px 0px -70% 0px",threshold:[0,1]});return s.forEach(d=>l.observe(d)),()=>l.disconnect()},[e]),a}function gP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"installation",children:e("docs.section.installation.title")}),c.jsx("p",{children:e("docs.section.installation.intro")}),c.jsx("p",{children:e("docs.section.installation.agent")}),c.jsx(Me,{code:`npm install react-zmage +# or +pnpm add react-zmage`,language:"bash"}),c.jsx("p",{children:e("docs.section.installation.then")}),c.jsx(Me,{code:`import Zmage from 'react-zmage' +import 'react-zmage/style.css'`,language:"tsx"}),c.jsx(xe,{id:"ssr",level:3,children:e("docs.section.installation.ssrTitle")}),c.jsx("p",{children:e("docs.section.installation.ssrBody")}),c.jsx(Me,{code:"import Zmage from 'react-zmage/ssr'",language:"tsx"})]})}function yP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"modes",children:e("docs.section.modes.title")}),c.jsx("p",{children:e("docs.section.modes.intro")}),c.jsx(xe,{id:"modes-component",level:3,children:e("docs.section.modes.componentTitle")}),c.jsx("p",{children:e("docs.section.modes.componentBody")}),c.jsx(Me,{code:'',language:"tsx"}),c.jsx(xe,{id:"modes-imperative",level:3,children:e("docs.section.modes.imperativeTitle")}),c.jsx("p",{children:e("docs.section.modes.imperativeBody")}),c.jsx(Me,{code:`Zmage.browsing({ src: 'hero.jpg' }) +// returns a destructor: () => void`,language:"tsx"}),c.jsx(xe,{id:"modes-wrapper",level:3,children:e("docs.section.modes.wrapperTitle")}),c.jsx("p",{children:e("docs.section.modes.wrapperBody")}),c.jsx(Me,{code:`const gallery = [ + { src: '/photo-1.jpg', alt: 'one', caption: 'First image' }, + { src: '/photo-2.jpg', alt: 'two', caption: 'Second image' }, +] + + +
+`,language:"tsx"}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.modes.wrapperNote")})]})}function bP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"theming",children:e("docs.section.theming.title")}),c.jsx("p",{children:e("docs.section.theming.intro")}),c.jsxs("ul",{className:"list-disc space-y-2 pl-6 text-sm text-muted-foreground",children:[c.jsx("li",{children:e("docs.section.theming.bullet.backdrop")}),c.jsx("li",{children:e("docs.section.theming.bullet.icons")}),c.jsx("li",{children:e("docs.section.theming.bullet.scoped")})]}),c.jsx(xe,{id:"theming-default",level:3,children:e("docs.section.theming.defaultTitle")}),c.jsx("p",{children:e("docs.section.theming.defaultBody")}),c.jsx(Me,{code:` +// equivalent to +`,language:"tsx"}),c.jsx(xe,{id:"theming-pattern",level:3,children:e("docs.section.theming.patternTitle")}),c.jsx("p",{children:e("docs.section.theming.patternBody")}),c.jsx(Me,{code:`import { useTheme } from 'next-themes' // or your own hook +import Zmage from 'react-zmage' + +function Photo (props) { + const { resolvedTheme } = useTheme() + const backdrop = resolvedTheme === 'dark' ? '#0a0a0a' : '#fafafa' + return +}`,language:"tsx"}),c.jsx(xe,{id:"theming-imperative",level:3,children:e("docs.section.theming.imperativeTitle")}),c.jsx("p",{children:e("docs.section.theming.imperativeBody")}),c.jsx(Me,{code:`const themedBackdrop = document.documentElement.classList.contains('dark') + ? '#0a0a0a' + : '#fafafa' + +Zmage.browsing({ src: 'hero.jpg', backdrop: themedBackdrop })`,language:"tsx"}),c.jsx(xe,{id:"theming-icons",level:3,children:e("docs.section.theming.iconsTitle")}),c.jsx("p",{children:e("docs.section.theming.iconsBody")}),c.jsx(Me,{code:`/* In your global CSS, after react-zmage/style.css */ +#zmage svg { + color: hsl(var(--foreground)); /* match your design system */ +}`,language:"css"}),c.jsx(xe,{id:"theming-toolbar",level:3,children:e("docs.section.theming.toolbarTitle")}),c.jsx("p",{children:e("docs.section.theming.toolbarBody")}),c.jsx(Me,{code:``,language:"tsx"})]})}const vP={controller:"ControllerSet",hotkey:"HotKey",animate:"Animate",gesture:"GestureSet",set:"Set"};function xP(e){switch(e.control.kind){case"switch":return"boolean";case"slider":case"number":return"number";case"text":case"color":return"string";case"select":case"segmented":return e.control.options.map(a=>`'${a.value}'`).join(" | ");case"object":{const a=vP[e.control.component];return e.control.component==="set"?`${a}[]`:`${a} | boolean`}case"callback":return"(arg) => void";case"readonly":return e.control.type}}function wP(e){return e===void 0?"—":typeof e=="string"?e===""?"''":`'${e}'`:Array.isArray(e)?e.length===0?"[]":"[…]":typeof e=="object"&&e!==null?Object.keys(e).length===0?"{}":"{…}":String(e)}function oa({group:e}){const{t:a}=be(),r=da.filter(s=>s.group===e);return r.length===0?null:c.jsx("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Prop"}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Type"}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Default"}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:"Description"})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:r.map(s=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5 align-top",children:[c.jsx("span",{className:"font-mono",children:s.name}),s.required&&c.jsx(Wc,{variant:"destructive",className:"ml-1.5 h-4 px-1 text-[9px]",children:a("common.required")}),s.presetScope&&c.jsx(Qc,{scope:s.presetScope,className:"ml-1.5"})]}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:xP(s)}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs",children:s.defaultDisplay??wP(s.default)}),c.jsx("td",{className:"px-4 py-2.5 align-top text-muted-foreground",children:a(s.i18n.descKey)})]},s.name))})]})})}const SP=[{k:"pagination",descKey:"controller.pagination.desc"},{k:"rotate",descKey:"controller.rotate.desc"},{k:"rotateLeft",descKey:"controller.rotateLeft.desc"},{k:"rotateRight",descKey:"controller.rotateRight.desc"},{k:"zoom",descKey:"controller.zoom.desc"},{k:"download",descKey:"controller.download.desc"},{k:"close",descKey:"controller.close.desc"},{k:"flip",descKey:"controller.flip.desc"},{k:"flipLeft",descKey:"controller.flipLeft.desc"},{k:"flipRight",descKey:"controller.flipRight.desc"},{k:"backdrop",descKey:"controller.backdrop.desc"},{k:"color",descKey:"controller.color.desc"},{k:"placement",descKey:"controller.placement.desc"},{k:"layout",descKey:"controller.layout.desc"},{k:"render",descKey:"controller.render.desc"}],CP=[{k:"state",type:"ControllerRenderState"},{k:"state.show",type:"boolean"},{k:"state.zoom",type:"boolean"},{k:"state.page",type:"number"},{k:"state.total",type:"number"},{k:"state.canZoom",type:"boolean"},{k:"state.canPrev",type:"boolean"},{k:"state.canNext",type:"boolean"},{k:"state.canDownload",type:"boolean"},{k:"state.preset",type:"'desktop' | 'mobile'"},{k:"state.placement",type:"ControllerPlacement"},{k:"state.current",type:"Set | undefined"},{k:"actions",type:"ControllerRenderActions"},{k:"actions.close",type:"() => void"},{k:"actions.zoom",type:"() => void"},{k:"actions.rotateLeft",type:"() => void"},{k:"actions.rotateRight",type:"() => void"},{k:"actions.prev",type:"() => void"},{k:"actions.next",type:"() => void"},{k:"actions.toPage",type:"(page: number) => void"},{k:"actions.download",type:"() => void"},{k:"slots",type:"ControllerRenderSlots"},{k:"slots.Toolbar",type:"ReactNode"},{k:"slots.Pagination",type:"ReactNode"},{k:"slots.FlipLeft",type:"ReactNode"},{k:"slots.FlipRight",type:"ReactNode"},{k:"return",type:"ReactNode"}],kP=[{k:"close",descKey:"hotkey.close.desc"},{k:"zoom",descKey:"hotkey.zoom.desc"},{k:"flip",descKey:"hotkey.flip.desc"},{k:"flipLeft",descKey:"hotkey.flipLeft.desc"},{k:"flipRight",descKey:"hotkey.flipRight.desc"},{k:"rotate",descKey:"hotkey.rotate.desc"},{k:"rotateLeft",descKey:"hotkey.rotateLeft.desc"},{k:"rotateRight",descKey:"hotkey.rotateRight.desc"},{k:"download",descKey:"hotkey.download.desc"}],TP=[{k:"browsing",type:"boolean",descKey:"animate.browsing.desc"},{k:"flip",type:"'fade' | 'crossFade' | 'swipe' | 'zoom' | 'blur' | 'none'",descKey:"animate.flip.desc"},{k:"slowMotion",type:"boolean",descKey:"animate.slowMotion.desc"},{k:"cover",type:"boolean | AnimateCoverOptions",descKey:"animate.cover.desc"},{k:"cover.objectFit",type:"boolean",descKey:"animate.cover.objectFit.desc"},{k:"cover.clip",type:"boolean",descKey:"animate.cover.clip.desc"},{k:"cover.radius",type:"boolean",descKey:"animate.cover.radius.desc"}],EP=[{k:"swipe",type:"boolean | GestureSwipeOptions",descKey:"gesture.swipe.desc",scope:"mobile"},{k:"dragExit",type:"boolean | GestureDragExitOptions",descKey:"gesture.dragExit.desc",scope:"mobile"},{k:"wheelZoom",type:"boolean | GestureWheelZoomOptions",descKey:"gesture.wheelZoom.desc",scope:"desktop"},{k:"pinchZoom",type:"boolean | GesturePinchZoomOptions",descKey:"gesture.pinchZoom.desc",scope:"mobile"},{k:"doubleTapZoom",type:"boolean | GestureDoubleTapZoomOptions",descKey:"gesture.doubleTapZoom.desc",scope:"mobile"},{k:"touchAction",type:"'managed' | 'auto' | 'manipulation' | 'none'",descKey:"gesture.touchAction.desc",scope:"mobile"},{k:"swipe.threshold",type:"number",descKey:"gesture.threshold.desc",scope:"mobile"},{k:"swipe.velocity",type:"number",descKey:"gesture.velocity.desc",scope:"mobile"},{k:"swipe.axisLock",type:"number",descKey:"gesture.axisLock.desc",scope:"mobile"},{k:"swipe.resistance",type:"number",descKey:"gesture.resistance.desc",scope:"mobile"},{k:"dragExit.threshold",type:"number",descKey:"gesture.threshold.desc",scope:"mobile"},{k:"dragExit.velocity",type:"number",descKey:"gesture.velocity.desc",scope:"mobile"},{k:"dragExit.axisLock",type:"number",descKey:"gesture.axisLock.desc",scope:"mobile"},{k:"dragExit.opacity",type:"boolean",descKey:"gesture.opacity.desc",scope:"mobile"},{k:"wheelZoom.step",type:"number",descKey:"gesture.wheelZoom.step.desc",scope:"desktop"},{k:"wheelZoom.smooth",type:"boolean",descKey:"gesture.wheelZoom.smooth.desc",scope:"desktop"},{k:"wheelZoom.minScale",type:"'fit' | number",descKey:"gesture.wheelZoom.minScale.desc",scope:"desktop"},{k:"wheelZoom.maxScale",type:"number",descKey:"gesture.wheelZoom.maxScale.desc",scope:"desktop"},{k:"wheelZoom.center",type:"'pointer' | 'viewport'",descKey:"gesture.wheelZoom.center.desc",scope:"desktop"},{k:"wheelZoom.reverse",type:"boolean",descKey:"gesture.wheelZoom.reverse.desc",scope:"desktop"},{k:"wheelZoom.exitGuardDuration",type:"number",descKey:"gesture.wheelZoom.exitGuardDuration.desc",scope:"desktop"},{k:"pinchZoom.minScale",type:"'fit' | number",descKey:"gesture.pinchZoom.minScale.desc",scope:"mobile"},{k:"pinchZoom.maxScale",type:"number",descKey:"gesture.pinchZoom.maxScale.desc",scope:"mobile"},{k:"pinchZoom.resetBelowFit",type:"boolean",descKey:"gesture.pinchZoom.resetBelowFit.desc",scope:"mobile"},{k:"pinchZoom.center",type:"'gesture' | 'viewport'",descKey:"gesture.pinchZoom.center.desc",scope:"mobile"},{k:"doubleTapZoom.scale",type:"number",descKey:"gesture.doubleTapZoom.scale.desc",scope:"mobile"},{k:"doubleTapZoom.minScale",type:"'fit' | number",descKey:"gesture.doubleTapZoom.minScale.desc",scope:"mobile"},{k:"doubleTapZoom.maxScale",type:"number",descKey:"gesture.doubleTapZoom.maxScale.desc",scope:"mobile"},{k:"doubleTapZoom.center",type:"'tap' | 'viewport'",descKey:"gesture.doubleTapZoom.center.desc",scope:"mobile"},{k:"doubleTapZoom.interval",type:"number",descKey:"gesture.doubleTapZoom.interval.desc",scope:"mobile"},{k:"doubleTapZoom.distance",type:"number",descKey:"gesture.doubleTapZoom.distance.desc",scope:"mobile"}],RP=[{k:"src",type:"string",required:!0,descKey:"set.src.desc"},{k:"alt",type:"string",descKey:"set.alt.desc"},{k:"caption",type:"string | { text, style?, className? }",descKey:"set.caption.desc"},{k:"className",type:"string",descKey:"set.className.desc"},{k:"style",type:"CSSStyleDeclaration",descKey:"set.style.desc"}],jP=[{path:"radius",label:"param.radius.label"},{path:"edge",label:"param.edge.label"},{path:"controller.pagination",label:"controller.pagination"},{path:"controller.rotate",label:"controller.rotate"},{path:"controller.zoom",label:"controller.zoom"},{path:"controller.download",label:"controller.download"},{path:"controller.close",label:"controller.close"},{path:"controller.flip",label:"controller.flip"},{path:"controller.placement",label:"controller.placement"},{path:"controller.layout",label:"controller.layout"},{path:"hotKey.close",label:"hotkey.close"},{path:"hotKey.zoom",label:"hotkey.zoom"},{path:"hotKey.flip",label:"hotkey.flip"},{path:"hotKey.rotate",label:"hotkey.rotate"},{path:"hotKey.download",label:"hotkey.download"},{path:"animate.browsing",label:"animate.browsing.desc"},{path:"animate.flip",label:"animate.flip.desc"},{path:"animate.slowMotion",label:"animate.slowMotion.desc"},{path:"animate.cover",label:"animate.cover.desc"},{path:"gesture.swipe",label:"gesture.swipe"},{path:"gesture.dragExit",label:"gesture.dragExit"},{path:"gesture.wheelZoom",label:"gesture.wheelZoom"},{path:"gesture.pinchZoom",label:"gesture.pinchZoom"},{path:"gesture.doubleTapZoom",label:"gesture.doubleTapZoom"},{path:"gesture.touchAction",label:"gesture.touchAction"}];function rx(e,a){return a.split(".").reduce((r,s)=>r&&typeof r=="object"?r[s]:void 0,pS[e])}function sx({value:e}){const a=typeof e=="string"?`'${e}'`:typeof e=="object"&&e!==null?"{…}":String(e);return c.jsx("code",{className:"font-mono text-xs",children:a})}function AP(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.props.preset.intro")}),c.jsx("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.preset.subParamHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.preset.desktopHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.preset.mobileHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:jP.map(({path:a,label:r})=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5",children:[c.jsx("span",{className:"font-mono text-xs",children:a}),c.jsx("span",{className:"ml-2 text-muted-foreground",children:e(r)})]}),c.jsx("td",{className:"px-4 py-2.5",children:c.jsx(sx,{value:rx("desktop",a)})}),c.jsx("td",{className:"px-4 py-2.5",children:c.jsx(sx,{value:rx("mobile",a)})})]},a))})]})})]})}function NP(){const{t:e}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:"Set"}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.animate.typeHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:RP.map(({k:a,type:r,required:s,descKey:l})=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5 font-mono align-top",children:[a,s&&c.jsx("span",{className:"ml-1.5 text-[9px] text-destructive",children:e("common.required")})]}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:r}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:e(l)})]},a))})]})]})}function zP(){const{t:e}=be();return c.jsxs("div",{className:"my-6 rounded-lg border border-border bg-muted/25 p-4 text-sm",children:[c.jsx("p",{className:"font-medium",children:e("docs.section.props.wrapperScope.title")}),c.jsx("p",{className:"mt-2 text-muted-foreground",children:e("docs.section.props.wrapperScope.intro")}),c.jsxs("ul",{className:"mt-3 list-disc space-y-1.5 pl-5 text-muted-foreground",children:[c.jsx("li",{children:e("docs.section.props.wrapperScope.data")}),c.jsx("li",{children:e("docs.section.props.wrapperScope.config")}),c.jsx("li",{children:e("docs.section.props.wrapperScope.lifecycle")}),c.jsx("li",{children:e("docs.section.props.wrapperScope.controlled")})]})]})}function MP(){const{t:e}=be();return c.jsxs("div",{className:"my-6 space-y-3 rounded-lg border border-border bg-muted/20 p-4 text-sm",children:[c.jsxs("div",{children:[c.jsx("h4",{className:"font-medium",children:e("docs.section.props.portalTarget.title")}),c.jsx("p",{className:"mt-2 text-muted-foreground",children:e("docs.section.props.portalTarget.body")}),c.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:e("docs.section.props.portalTarget.boundary")})]}),c.jsx(Me,{code:`import { useState } from 'react' +import Zmage from 'react-zmage' +import 'react-zmage/style.css' + +export function ArticleImage () { + const [viewerRoot, setViewerRoot] = useState(null) + + return ( +
+
+ + +
+ ) +}`,language:"tsx"})]})}function gi({name:e}){return c.jsx("div",{className:"border-b border-border px-4 py-2 font-mono text-xs text-muted-foreground",children:e})}function R1({typeName:e,rows:a}){const{t:r}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:e}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:a.map(({k:s,descKey:l})=>c.jsxs("tr",{children:[c.jsx("td",{className:"px-4 py-2.5 font-mono align-top",children:s}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:r(l)})]},s))})]})]})}function DP({typeName:e,rows:a}){const{t:r}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:e}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:r("docs.section.props.animate.typeHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:a.map(({k:s,type:l})=>c.jsxs("tr",{children:[c.jsx("td",{className:"px-4 py-2.5 font-mono align-top",children:s}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:l})]},s))})]})]})}function _P(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsx(R1,{typeName:"ControllerSet",rows:SP}),c.jsx("p",{className:"-mt-4 mb-6 text-xs text-muted-foreground",children:e("docs.section.props.controller.umbrella")}),c.jsx("h4",{className:"mt-4 mb-2 text-sm font-semibold",children:e("docs.section.props.controller.layoutTitle")}),c.jsx("p",{className:"mb-2 text-xs text-muted-foreground",children:e("docs.section.props.controller.layoutIntro")}),c.jsx(Me,{code:``,language:"tsx"}),c.jsx("h4",{className:"mt-4 mb-2 text-sm font-semibold",children:e("docs.section.props.controller.renderTitle")}),c.jsx("p",{className:"mb-2 text-xs text-muted-foreground",children:e("docs.section.props.controller.renderIntro")}),c.jsx(DP,{typeName:"ControllerRender",rows:CP}),c.jsx(Me,{code:` { + if (!state.show) return null + + return ( +
+ + + {state.page + 1} / {state.total} + + + + {state.canDownload && ( + + )} + + + {/* Reuse built-in pieces only where you want them. */} + {slots.Pagination} +
+ ) + }, + }} +/>`,language:"tsx"})]})}function OP(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsx(R1,{typeName:"HotKey",rows:kP}),c.jsx("p",{className:"-mt-4 mb-3 text-xs text-muted-foreground",children:e("docs.section.props.hotkey.umbrella")}),c.jsx("h4",{className:"mt-4 mb-2 text-sm font-semibold",children:e("docs.section.props.hotkey.customTitle")}),c.jsx("p",{className:"mb-2 text-xs text-muted-foreground",children:e("docs.section.props.hotkey.customIntro")}),c.jsx(Me,{code:`// Enable Cmd/Ctrl+S to download (off by default — opt in) + + +// Rebind rotate to A / D, keep download default + + +// Add Q as a second close key alongside the default Escape + + +// Custom download shortcut (Mod = ⌘ on macOS, Ctrl on Windows/Linux) +`,language:"tsx"}),c.jsx("p",{className:"mt-3 mb-1 text-xs font-medium text-muted-foreground",children:e("docs.section.props.hotkey.cheatsheetTitle")}),c.jsxs("ul",{className:"mb-6 list-disc space-y-1 pl-5 text-xs text-muted-foreground",children:[c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'S'"})," → ",c.jsx("span",{className:"font-mono",children:"'KeyS'"}),","," ",c.jsx("span",{className:"font-mono",children:"'1'"})," → ",c.jsx("span",{className:"font-mono",children:"'Digit1'"})," ","(",e("docs.section.props.hotkey.cheatsheet.shorthand"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'ArrowLeft' / 'ArrowRight' / 'ArrowUp' / 'ArrowDown'"})," ","(",e("docs.section.props.hotkey.cheatsheet.arrows"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'BracketLeft' ([) / 'BracketRight' (]) / 'Comma' / 'Period' / 'Slash'"})," ","(",e("docs.section.props.hotkey.cheatsheet.punct"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'Space' / 'Enter' / 'Tab' / 'Backspace' / 'Escape'"})," ","(",e("docs.section.props.hotkey.cheatsheet.whitespace"),")"]}),c.jsxs("li",{children:[c.jsx("span",{className:"font-mono",children:"'Mod+' / 'Cmd+' / 'Ctrl+' / 'Shift+' / 'Alt+'"})," ","(",e("docs.section.props.hotkey.cheatsheet.modifier"),")"]})]})]})}function LP(){const{t:e}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:"Animate"}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.animate.typeHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:TP.map(({k:a,type:r,descKey:s})=>c.jsxs("tr",{children:[c.jsx("td",{className:"px-4 py-2.5 font-mono align-top",children:a}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:r}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:e(s)})]},a))})]})]})}function PP(){const{t:e}=be();return c.jsxs("div",{className:"my-6 overflow-x-auto rounded-lg border border-border",children:[c.jsx(gi,{name:"GestureSet"}),c.jsxs("table",{className:"min-w-[720px] w-full text-sm",children:[c.jsx("thead",{className:"bg-muted/40 text-left text-xs uppercase tracking-wider text-muted-foreground",children:c.jsxs("tr",{children:[c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.keyHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.animate.typeHeader")}),c.jsx("th",{className:"px-4 py-2.5 font-medium",children:e("docs.section.props.controller.descHeader")})]})}),c.jsx("tbody",{className:"divide-y divide-border",children:EP.map(({k:a,type:r,descKey:s,scope:l})=>c.jsxs("tr",{children:[c.jsxs("td",{className:"px-4 py-2.5 align-top",children:[c.jsx("span",{className:"font-mono",children:a}),l&&c.jsx(Qc,{scope:l,className:"ml-1.5"})]}),c.jsx("td",{className:"px-4 py-2.5 align-top font-mono text-xs text-muted-foreground",children:r}),c.jsx("td",{className:"px-4 py-2.5 text-muted-foreground",children:e(s)})]},a))})]})]})}function ZP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"props",children:e("docs.section.props.title")}),c.jsx("p",{children:e("docs.section.props.intro")}),c.jsx(zP,{}),c.jsx(xe,{id:"props-data",level:3,children:e("group.data")}),c.jsx(oa,{group:"data"}),c.jsx(NP,{}),c.jsx(xe,{id:"props-preset",level:3,children:e("group.preset")}),c.jsx(oa,{group:"preset"}),c.jsx(xe,{id:"props-preset-bundles",level:3,children:e("docs.section.props.preset.title")}),c.jsx(AP,{}),c.jsx(xe,{id:"props-interface",level:3,children:e("docs.section.props.interface")}),c.jsx(oa,{group:"interface"}),c.jsx(MP,{}),c.jsx(xe,{id:"props-controller",level:3,children:e("group.controller")}),c.jsx(oa,{group:"controller"}),c.jsx(_P,{}),c.jsx(xe,{id:"props-hotkey",level:3,children:e("group.hotkey")}),c.jsx(oa,{group:"hotkey"}),c.jsx(OP,{}),c.jsx(xe,{id:"props-animate",level:3,children:e("group.animate")}),c.jsx(oa,{group:"animate"}),c.jsx(LP,{}),c.jsx(xe,{id:"props-gesture",level:3,children:e("group.gesture")}),c.jsx(oa,{group:"gesture"}),c.jsx(PP,{}),c.jsx(xe,{id:"props-lifecycle",level:3,children:e("group.lifecycle")}),c.jsx(oa,{group:"lifecycle"}),c.jsx(xe,{id:"props-controlled",level:3,children:e("group.controlled")}),c.jsx(oa,{group:"controlled"})]})}const BP=``,IP=``,qP=``,FP=` { + if (!state.show || state.zoom) return null + + return ( +
+ + {state.page + 1} / {state.total} + + + +
+ ) + }, + }} +/>`,KP=``,UP=`import { useState } from 'react' + +export function ShellImage () { + const [viewerRoot, setViewerRoot] = useState(null) + + return ( +
+
+ + +
+ ) +}`;function HP(){const{t:e}=be(),a=Ur(),[r,s]=y.useState(null),l=y.useCallback(d=>{s(u=>u===d?u:d)},[]);return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"examples",children:e("docs.section.examples.title")}),c.jsx(xe,{id:"examples-single",level:3,children:e("docs.section.examples.singleTitle")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(uo,{src:"/imgSet/childsDream/1.jpg",alt:"童夢 · ONE",backdrop:a,animate:Cn,className:"w-full rounded-md"}),c.jsx(Me,{code:BP,language:"tsx"})]}),c.jsx(xe,{id:"examples-gallery",level:3,children:e("docs.section.examples.galleryTitle")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(uo,{src:"/imgSet/childsDream/3.jpg",alt:"童夢 · THREE",backdrop:a,animate:Cn,className:"w-full rounded-md",set:[{src:"/imgSet/childsDream/3.jpg",alt:"童夢 · THREE"},{src:"/imgSet/childsDream/4.jpg",alt:"童夢 · FOUR"},{src:"/imgSet/childsDream/5.jpg",alt:"童夢 · FIVE"}]}),c.jsx(Me,{code:IP,language:"tsx"})]}),c.jsx(xe,{id:"examples-mobile",level:3,children:e("docs.section.examples.mobileTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.mobileBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(uo,{src:"/imgSet/childsDream/6.jpg",alt:"童夢 · SIX",backdrop:a,animate:Cn,preset:"mobile",className:"h-64 w-full rounded-md object-cover",gesture:{swipe:!0,dragExit:!0,pinchZoom:{resetBelowFit:!0},doubleTapZoom:{scale:2.5}}}),c.jsx(Me,{code:qP,language:"tsx"})]}),c.jsx(xe,{id:"examples-controller",level:3,children:e("docs.section.examples.controllerTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.controllerBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(uo,{src:"/imgSet/childsDream/7.jpg",alt:"童夢 · SEVEN",backdrop:a,animate:Cn,className:"h-64 w-full rounded-md object-cover",set:[{src:"/imgSet/childsDream/7.jpg",alt:"童夢 · SEVEN"},{src:"/imgSet/childsDream/8.jpg",alt:"童夢 · EIGHT"}],controller:{placement:"bottom-center",render:({state:d,actions:u})=>!d.show||d.zoom?null:c.jsxs("div",{className:"pointer-events-auto flex items-center gap-2 rounded-md border border-white/15 bg-black/70 px-3 py-2 text-xs text-white shadow-lg","data-placement":d.placement,style:{position:"absolute",left:"50%",bottom:"1rem",transform:"translateX(-50%)",zIndex:1e3},children:[c.jsx("button",{type:"button",disabled:!d.canPrev,onClick:u.prev,className:"disabled:opacity-40",children:"Prev"}),c.jsxs("span",{className:"font-mono",children:[d.page+1," / ",d.total]}),c.jsx("button",{type:"button",disabled:!d.canNext,onClick:u.next,className:"disabled:opacity-40",children:"Next"}),c.jsx("button",{type:"button",disabled:!d.canZoom,onClick:u.zoom,className:"disabled:opacity-40",children:"Zoom"}),c.jsx("button",{type:"button",onClick:u.close,children:"Close"})]})}}),c.jsx(Me,{code:FP,language:"tsx"})]}),c.jsx(xe,{id:"examples-cover",level:3,children:e("docs.section.examples.coverTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.coverBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsx(uo,{src:"/imgSet/childsDream/demo.jpg",alt:"童夢 · DEMO",backdrop:a,className:"h-64 w-full rounded-2xl object-cover",style:{objectPosition:"35% 50%"},animate:nC({cover:{objectFit:!0,clip:!0,radius:!0}})}),c.jsx(Me,{code:KP,language:"tsx"})]}),c.jsx(xe,{id:"examples-portal-target",level:3,children:e("docs.section.examples.portalTargetTitle")}),c.jsx("p",{className:"text-sm text-muted-foreground",children:e("docs.section.examples.portalTargetBody")}),c.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[c.jsxs("div",{className:"relative min-h-64 overflow-hidden rounded-md border border-dashed border-border bg-muted/25 p-4",children:[c.jsx("div",{ref:l,className:"absolute inset-4 rounded-md border border-dashed border-primary/35 bg-background/60 px-3 py-2 text-xs text-muted-foreground",children:e("docs.section.examples.portalTargetRoot")}),c.jsx(uo,{src:"/imgSet/childsDream/8.jpg",alt:"童夢 · EIGHT",backdrop:a,animate:Cn,portalTarget:r,className:"absolute bottom-6 right-6 h-32 w-44 cursor-zoom-in rounded-md border border-background object-cover shadow-lg"})]}),c.jsx(Me,{code:UP,language:"tsx"})]})]})}function GP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"typescript",children:e("docs.section.typescript.title")}),c.jsx("p",{children:e("docs.section.typescript.intro")}),c.jsx(Me,{code:`import type { + BaseType, + Set, + Preset, + ControllerSet, + HotKey, + Animate, + AnimateCoverOptions, + GestureSet, + GestureWheelZoomOptions, +} from 'react-zmage' + +const props: BaseType = { + src: 'hero.jpg', + set: [{ src: 'hero.jpg', alt: 'hero' }], + preset: 'desktop', +}`,language:"tsx"}),c.jsx("p",{children:e("docs.section.typescript.refIntro")}),c.jsx(Me,{code:`const ref = useRef(null) +`,language:"tsx"})]})}function VP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"migration",children:e("docs.section.migration.title")}),c.jsx("p",{children:e("docs.section.migration.from")}),c.jsxs("ul",{className:"list-disc space-y-2 pl-6 text-muted-foreground",children:[c.jsx("li",{children:e("docs.section.migration.bullet1")}),c.jsx("li",{children:e("docs.section.migration.bullet2")})]})]})}function WP(){const e=hP("main h2[id], main h3[id]"),{t:a}=be(),{pathname:r,hash:s}=$a();return y.useEffect(()=>{if(!s)return;const l=s.slice(1);let d=!1;return requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(d)return;const u=document.getElementById(l);u==null||u.scrollIntoView({behavior:"smooth",block:"start"})})}),()=>{d=!0}},[r,s]),c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:"mx-auto grid max-w-6xl gap-10 px-4 py-10 sm:px-6 lg:grid-cols-[260px_minmax(0,1fr)]",children:[c.jsx("aside",{className:"hidden lg:block",children:c.jsx("div",{className:"sticky top-20 max-h-[calc(100vh-6rem)] overflow-y-auto pr-2",children:c.jsx(pM,{activeId:e})})}),c.jsxs("main",{className:"max-w-none space-y-2 min-w-0",children:[c.jsx("h1",{className:"text-3xl font-semibold tracking-tight",children:a("docs.title")}),c.jsx(gP,{}),c.jsx(yP,{}),c.jsx(bP,{}),c.jsx(ZP,{}),c.jsx(HP,{}),c.jsx(GP,{}),c.jsx(VP,{}),c.jsx(yD,{})]})]}),c.jsx(fi,{})]})}const $P=[{icon:zx,titleKey:"useCases.card.blog.title",bodyKey:"useCases.card.blog.body"},{icon:_R,titleKey:"useCases.card.cms.title",bodyKey:"useCases.card.cms.body"},{icon:GR,titleKey:"useCases.card.news.title",bodyKey:"useCases.card.news.body"},{icon:VR,titleKey:"useCases.card.mdx.title",bodyKey:"useCases.card.mdx.body"},{icon:DR,titleKey:"useCases.card.lightbox.title",bodyKey:"useCases.card.lightbox.body"},{icon:Ox,titleKey:"useCases.card.ssr.title",bodyKey:"useCases.card.ssr.body"}],YP=["useCases.fact.react","useCases.fact.modes","useCases.fact.input","useCases.fact.ssr","useCases.fact.gallery","useCases.fact.origin"],XP=[{questionKey:"useCases.faq.what.q",answerKey:"useCases.faq.what.a"},{questionKey:"useCases.faq.lightbox.q",answerKey:"useCases.faq.lightbox.a"},{questionKey:"useCases.faq.richText.q",answerKey:"useCases.faq.richText.a"},{questionKey:"useCases.faq.ssr.q",answerKey:"useCases.faq.ssr.a"}],QP=[["Component","useCases.mode.component"],["Imperative","useCases.mode.imperative"],["Wrapper","useCases.mode.wrapper"]];function JP(){const{t:e}=be();return c.jsxs(c.Fragment,{children:[c.jsxs("section",{className:"mx-auto max-w-6xl px-4 py-20 sm:px-6",children:[c.jsxs("div",{className:"max-w-3xl",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.eyebrow")}),c.jsx("h1",{className:"mt-4 text-4xl font-semibold tracking-tight sm:text-5xl",children:e("useCases.title")}),c.jsx("p",{className:"mt-5 text-base leading-7 text-muted-foreground sm:text-lg",children:e("useCases.body")}),c.jsxs("div",{className:"mt-8 flex flex-wrap gap-3",children:[c.jsx(it,{asChild:!0,children:c.jsxs(st,{to:"/docs",children:[e("useCases.cta.docs"),c.jsx(Nx,{className:"ml-1.5 h-4 w-4"})]})}),c.jsx(it,{variant:"outline",asChild:!0,children:c.jsx(st,{to:"/playground/wrapper",children:e("useCases.cta.wrapper")})})]})]}),c.jsx("div",{className:"mt-14 grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:$P.map(({icon:a,titleKey:r,bodyKey:s})=>c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx(a,{className:"h-5 w-5 text-muted-foreground"}),c.jsx("h2",{className:"mt-4 text-lg font-medium",children:e(r)}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:e(s)})]},r))}),c.jsxs("section",{className:"mt-20 grid gap-8 lg:grid-cols-[minmax(0,0.75fr)_minmax(0,1fr)]",children:[c.jsxs("div",{children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.mode.eyebrow")}),c.jsx("h2",{className:"mt-3 text-2xl font-semibold tracking-tight",children:e("useCases.mode.title")})]}),c.jsx("div",{className:"grid gap-3",children:QP.map(([a,r])=>c.jsxs("div",{className:"grid gap-2 border-b border-border pb-4 sm:grid-cols-[9rem_1fr]",children:[c.jsx("span",{className:"font-mono text-sm text-foreground",children:a}),c.jsx("span",{className:"text-sm leading-6 text-muted-foreground",children:e(r)})]},a))})]}),c.jsxs("section",{className:"mt-20",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.facts.eyebrow")}),c.jsx("h2",{className:"mt-3 text-2xl font-semibold tracking-tight",children:e("useCases.facts.title")}),c.jsx("div",{className:"mt-6 grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:YP.map(a=>c.jsxs("div",{className:"flex min-w-0 items-start gap-3 rounded-md border border-border bg-muted/20 p-3 text-sm text-muted-foreground",children:[c.jsx(zR,{className:"mt-0.5 h-4 w-4 shrink-0 text-foreground"}),c.jsx("span",{children:e(a)})]},a))})]}),c.jsxs("section",{className:"mt-20",id:"faq",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:e("useCases.faq.eyebrow")}),c.jsx("h2",{className:"mt-3 text-2xl font-semibold tracking-tight",children:e("useCases.faq.title")}),c.jsx("div",{className:"mt-8 divide-y divide-border border-y border-border",children:XP.map(a=>c.jsxs("article",{className:"py-6",children:[c.jsx("h3",{className:"text-base font-medium",children:e(a.questionKey)}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:e(a.answerKey)})]},a.questionKey))})]})]}),c.jsx(fi,{})]})}function kr({label:e,description:a,value:r,options:s,onValueChange:l,className:d,listClassName:u,compact:m=!1}){const h=y.useId();return c.jsxs("div",{className:ie("min-w-0",d),children:[c.jsxs("div",{className:"mb-2",children:[c.jsx("div",{id:h,className:"text-sm font-medium text-foreground",children:e}),a&&c.jsx("p",{className:"mt-1 text-xs leading-5 text-muted-foreground",children:a})]}),c.jsx(Tf,{value:r,onValueChange:g=>l(g),children:c.jsx(ad,{"aria-labelledby":h,className:ie("h-auto max-w-full flex-wrap justify-start gap-1 bg-muted/40 p-1",m?"text-xs":"text-sm",u),children:s.map(g=>c.jsx(nd,{value:g.value,disabled:g.disabled,title:g.description??g.label,className:ie("min-w-0 max-w-full whitespace-normal text-left",m?"px-2 py-1 text-xs":"px-3 py-1.5"),children:c.jsx("span",{className:"break-words leading-5",children:g.label})},g.value))})})]})}const Ql=y.forwardRef(({className:e,...a},r)=>c.jsx("textarea",{ref:r,className:ie("flex min-h-24 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),...a}));Ql.displayName="Textarea";const j1=[{value:"auto",labelKey:"ai.option.auto",descriptionKey:"ai.option.agent.auto.desc"},{value:"codex",labelKey:"ai.option.agent.codex"},{value:"claude",labelKey:"ai.option.agent.claude"},{value:"cursor",labelKey:"ai.option.agent.cursor"},{value:"devin",labelKey:"ai.option.agent.devin"},{value:"other",labelKey:"ai.option.other"}],A1=[{value:"auto",labelKey:"ai.option.depth.auto",descriptionKey:"ai.option.depth.auto.desc"},{value:"fine",labelKey:"ai.option.depth.fine",descriptionKey:"ai.option.depth.fine.desc"}],N1=[{value:"auto",labelKey:"ai.option.auto"},{value:"vite",labelKey:"ai.option.env.vite"},{value:"next-rsc",labelKey:"ai.option.env.nextRsc"},{value:"ssr",labelKey:"ai.option.env.ssr"},{value:"cms-mdx",labelKey:"ai.option.env.cmsMdx"},{value:"event",labelKey:"ai.option.env.event"}],z1=[{value:"auto",labelKey:"ai.option.auto"},{value:"component",labelKey:"ai.option.mode.component"},{value:"imperative",labelKey:"ai.option.mode.imperative"},{value:"wrapper",labelKey:"ai.option.mode.wrapper"}],M1=[{value:"auto",labelKey:"ai.option.auto"},{value:"single",labelKey:"ai.option.image.single"},{value:"set",labelKey:"ai.option.image.set"},{value:"caption",labelKey:"ai.option.image.caption"},{value:"wrapper-caption",labelKey:"ai.option.image.wrapperCaption"}],D1=[{value:"auto",labelKey:"ai.option.auto"},{value:"preset-auto",labelKey:"ai.option.interaction.presetAuto"},{value:"desktop-tools",labelKey:"ai.option.interaction.desktopTools"},{value:"mobile-gestures",labelKey:"ai.option.interaction.mobileGestures"},{value:"no-browsing-animation",labelKey:"ai.option.interaction.noBrowsingAnimation"},{value:"custom-controller",labelKey:"ai.option.interaction.customController"}],eZ="https://zmage.caldis.me/llms.txt",tZ=e=>e.trim()||"(Not provided)";function Sn(e,a){return a[e]??e}function oZ(e){return e.depth!=="auto"?e:{...e,environment:"auto",mode:"auto",imageSource:"auto",interaction:"auto"}}function aZ(e,a){return e.agent==="auto"?["Use the workflow that fits your coding agent, but keep the integration strategy Auto. Prefer project inspection, short user questions, and small, reviewable edits.","If the agent has tool limits, read `llms.txt` first, then inspect package files, routing files, and the image-rendering components before proposing code changes."].join(` +`):`Optimize the workflow for ${Sn(e.agent,a.agent)}. Keep the same technical checks and source-of-truth rules below.`}function nZ(e){return e.depth==="auto"||e.environment==="auto"?["- Detect the framework from package files and routing structure before choosing imports.","- In CSR-only React, import from `react-zmage`.","- In SSR, React Server Components, or code that may run during server render, import from `react-zmage/ssr` and keep viewer opening inside a client boundary or event handler."].join(` +`):e.environment==="next-rsc"?['- Use the SSR-safe entry: `import Zmage from "react-zmage/ssr"`.','- Add `"use client"` only to the smallest component that renders or opens the viewer.',"- Import `react-zmage/style.css` from the app-level style entry allowed by the project."].join(` +`):e.environment==="ssr"?["- Use `react-zmage/ssr` for code that can be evaluated server-side.","- Call `Zmage.browsing()` only after `window` and `document` exist.","- Keep the stylesheet imported once by the client bundle."].join(` +`):e.environment==="cms-mdx"?["- Expect image markup to be partially uncontrolled.","- Prefer Wrapper mode unless the project already maps MDX or CMS images into React components."].join(` +`):e.environment==="event"?["- Prefer Imperative mode when the viewer opens from a button, command menu, custom thumbnail, or callback.","- Store and call the destructor when the host lifecycle can outlive the viewer."].join(` +`):["- Use the standard client import from `react-zmage`.","- Import `react-zmage/style.css` once from the app entry or root layout used by this Vite app."].join(` +`)}function rZ(e){return e.depth==="auto"||e.mode==="auto"?["Use Auto mode selection. Inspect the codebase first, then choose the integration path from real project evidence.","","- Component: use this when the app owns the image markup.","- Imperative: use this when the viewer opens from a button, callback, or non-image event.","- Wrapper: use this when images come from CMS, MDX, markdown, or uncontrolled HTML.","","Ask concise questions until the implementation scope is clear. Do not ask the user to choose low-level props before reading the project."].join(` +`):e.mode==="component"?["Use Component mode.","","Replace owned `` elements with `` and preserve native image attributes such as `alt`, `className`, `loading`, `width`, and `height`.","","Use `set` when the host image belongs to a gallery."].join(` +`):e.mode==="imperative"?["Use Imperative mode.","","Call `Zmage.browsing(props)` from an event handler or client effect. Store the returned destructor when the host lifecycle needs cleanup.","","Do not call `Zmage.browsing()` during server render."].join(` +`):["Use Wrapper mode.","","Wrap the uncontrolled image subtree with ``. Keep `src`, `alt`, and native image attributes on descendant `` nodes. Put viewer config on ``.","","If using a shared `set`, the clicked image `src` should match `set[i].src`. Without explicit `set`, `data-zmage-caption` or nearest `figcaption` can supply caption text."].join(` +`)}function sZ(e){const a=['- Prefer omitted `preset` or `preset="auto"` unless project evidence requires a fixed desktop or mobile setup.',"- Keep optional behavior and UI props at their defaults unless the user asks for them or testing exposes a concrete issue.","- You may set the top-level `backdrop` to match the host page background color when the default white viewer would clash.","- Do not set `controller`, `controller.layout`, `edge`, `zIndex`, `portalTarget`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install unless the selected setup or user request specifically requires them.","- Only configure `controller.color` or `controller.backdrop` when the user asks for controller styling or when controls are visibly illegible after testing."];return(e.environment==="next-rsc"||e.environment==="ssr")&&a.push("- For SSR or RSC-sensitive code, import from `react-zmage/ssr` and keep interactive usage inside a client boundary."),e.imageSource==="set"&&a.push("- Use `set` plus `defaultPage` for multi-image galleries."),e.imageSource==="caption"&&a.push("- Use `caption` on the top-level image or `set[i].caption` for per-image captions."),e.imageSource==="wrapper-caption"&&a.push("- In Wrapper mode without explicit `set`, use `data-zmage-caption` or the nearest `figcaption` for viewer captions."),e.interaction==="desktop-tools"?a.push("- Keep desktop controller and hotKey defaults unless the host UI has a reason to hide tools. Wheel zoom applies while already zoomed."):e.interaction==="mobile-gestures"?a.push("- Use mobile gesture defaults when the host deliberately wants touch-first behavior: swipe, drag exit, pinch zoom, and double tap zoom."):e.interaction==="no-browsing-animation"?a.push("- Use `animate={{ browsing: false }}` when open and close transitions should be disabled."):e.interaction==="custom-controller"&&a.push("- Use `controller.render` only when the host needs a fully custom controller; otherwise prefer partial `controller` options."),a.join(` +`)}function iZ(e,a){const r=oZ(e);return`> **Canonical reference:** ${eZ} +> +> If anything below looks outdated or contradicts real package behavior, fetch that URL first. It is the source of truth for react-zmage usage modes, props, defaults, SSR entry, and common pitfalls. Report staleness back to the user. + +--- + +# react-zmage Setup Guide + +## Your Configuration + +| Setting | Value | +|---------|-------| +| Coding Tool | ${Sn(e.agent,a.agent)} | +| Project Environment | ${Sn(r.environment,a.environment)} | +| Setup Depth | ${Sn(e.depth,a.depth)} | +| Usage Mode | ${Sn(r.mode,a.mode)} | +| Image Source | ${Sn(r.imageSource,a.imageSource)} | +| Interaction Detail | ${Sn(r.interaction,a.interaction)} | + +**Project Description:** ${tZ(e.projectDescription)} + +--- + +## Agent Workflow + +${aZ(e,a)} + +Before editing code: + +0. Explain what react-zmage is for: turning existing images into a fullscreen, zoomable, keyboard-navigable viewer. State that your goal is to integrate it into the user's real image surfaces without changing unrelated UI. +1. Read this canonical reference first, then inspect package files, routing, render mode, CSS entry, and any existing image/viewer conventions in the user's project. +2. Find the actual image surfaces: owned React images, galleries, generated HTML, CMS/MDX/markdown content, rich text, and buttons or commands that open media. +3. Classify each target as Component, Imperative, or Wrapper. Explain the classification from project evidence. +4. Ask the user short follow-up questions until the scope is concrete: which pages/sections, single-image vs gallery behavior, captions, SSR/RSC boundary, theme/backdrop, mobile gestures, rollout priority, and acceptance criteria. +5. Implement one pilot change on a representative image path. Keep the diff small and ask the user to verify the real visual result. +6. Incorporate user feedback, adjust the pilot, then apply the confirmed pattern to the remaining agreed scope. + +If this setup is Auto, make technical choices from project evidence and user answers. Do not force the user to decide every prop up front. + +--- + +## Installation + +Use the package manager already used by the project. + +\`\`\`bash +npm install react-zmage +\`\`\` + +Use pnpm, yarn, or bun instead if the project uses one of those. + +--- + +## Required Imports + +For normal client-side React: + +\`\`\`tsx +import Zmage from 'react-zmage' +import 'react-zmage/style.css' +\`\`\` + +For SSR or RSC-sensitive code: + +\`\`\`tsx +import Zmage from 'react-zmage/ssr' +import 'react-zmage/style.css' +\`\`\` + +Do not call \`Zmage.browsing()\` during server render. Call it from event handlers or client effects only. + +--- + +## Environment Guidance + +${nZ(r)} + +--- + +## Recommended Integration + +${rZ(r)} + +--- + +## Configuration Guidance + +${sZ(r)} + +--- + +## Common Mistakes To Avoid + +- Do not forget \`import 'react-zmage/style.css'\`. +- Do not use \`new Zmage()\`. +- Do not confuse the static method \`Zmage.browsing()\` with the controlled \`browsing\` prop. +- In Wrapper mode, put \`src\`, \`alt\`, and native image attributes on child \`\` elements, not on \`\`. +- In Wrapper mode, remember that newly injected images are bound after the wrapper re-renders. +- For non-light UIs, set the top-level \`backdrop\` to match the host page background; do not preemptively customize controller styling. +- For Next.js App Router or RSC, keep interactive viewer usage inside a client boundary. + +--- + +## Deliverables + +Return: + +1. Install command. +2. Files changed. +3. Final React code. +4. Where \`react-zmage/style.css\` is imported. +5. Any SSR/RSC notes. +6. Minimal verification steps. +`}const lZ={agent:"auto",depth:"auto",environment:"auto",mode:"auto",imageSource:"auto",interaction:"auto",projectDescription:""};function Tr(e,a){return e.map(r=>({value:r.value,label:a(r.labelKey),description:r.descriptionKey?a(r.descriptionKey):void 0}))}function cZ(e){const a=r=>Object.fromEntries(r.map(s=>[s.value,e(s.labelKey)]));return{agent:a(j1),depth:a(A1),environment:a(N1),mode:a(z1),imageSource:a(M1),interaction:a(D1)}}function dZ(){const{t:e}=be(),[a,r]=y.useState(lZ),[s,l]=y.useState(!1),{copied:d,error:u,copy:m}=Bc(),h=y.useMemo(()=>cZ(e),[e]),g=y.useMemo(()=>iZ(a,h),[a,h]),b=a.depth==="fine",v=y.useCallback((T,C)=>{r(x=>({...x,[T]:C}))},[]),S=y.useCallback(()=>{m(g)},[m,g]);return c.jsxs("div",{className:"grid min-h-[calc(100dvh-3.5rem)] lg:grid-cols-[minmax(0,1fr)_minmax(420px,0.94fr)]",children:[c.jsx("section",{className:"min-w-0 px-4 py-8 sm:px-8 lg:px-12 lg:py-10 xl:px-16",children:c.jsxs("div",{className:"mx-auto flex h-full max-w-3xl min-w-0 flex-col",children:[c.jsxs("div",{children:[c.jsxs(Wc,{variant:"secondary",className:"mb-5 gap-1.5 font-mono",children:[c.jsx(Nm,{className:"h-3.5 w-3.5"}),e("ai.badge")]}),c.jsx("h1",{className:"max-w-3xl text-3xl font-semibold tracking-tight sm:text-4xl",children:e("ai.title")}),c.jsx("p",{className:"mt-3 max-w-2xl text-sm leading-6 text-muted-foreground sm:text-base",children:e("ai.subtitle")})]}),c.jsxs("div",{className:"mt-8 space-y-6",children:[c.jsx(kr,{label:e("ai.field.agent"),value:a.agent,options:Tr(j1,e),onValueChange:T=>v("agent",T)}),c.jsxs("div",{children:[c.jsx(kr,{label:e("ai.field.depth"),value:a.depth,options:Tr(A1,e),onValueChange:T=>v("depth",T)}),c.jsx("div",{className:ie("grid transition-[grid-template-rows,opacity,transform] duration-[220ms] ease-out motion-reduce:transition-none",a.depth==="auto"?"grid-rows-[1fr] opacity-100 translate-y-0":"pointer-events-none grid-rows-[0fr] opacity-0 -translate-y-1"),"aria-hidden":a.depth!=="auto",children:c.jsx("div",{className:"min-h-0 overflow-hidden",children:c.jsx("p",{className:"mt-2 rounded-md border border-border bg-muted/30 px-3 py-2 text-xs leading-5 text-muted-foreground",children:e("ai.autoTip")})})})]}),c.jsx("div",{className:ie("grid transition-[grid-template-rows,opacity,transform] duration-[220ms] ease-out motion-reduce:transition-none",b?"grid-rows-[1fr] opacity-100 translate-y-0":"pointer-events-none grid-rows-[0fr] opacity-0 translate-y-2"),"aria-hidden":!b,children:c.jsx("div",{className:"min-h-0 overflow-hidden",children:c.jsxs("div",{className:"grid gap-5 pt-1",children:[c.jsx(kr,{label:e("ai.field.environment"),value:a.environment,options:Tr(N1,e),onValueChange:T=>v("environment",T)}),c.jsx(kr,{label:e("ai.field.mode"),value:a.mode,options:Tr(z1,e),onValueChange:T=>v("mode",T)}),c.jsx(kr,{label:e("ai.field.imageSource"),value:a.imageSource,options:Tr(M1,e),onValueChange:T=>v("imageSource",T)}),c.jsx(kr,{label:e("ai.field.interaction"),value:a.interaction,options:Tr(D1,e),onValueChange:T=>v("interaction",T)})]})})}),c.jsxs("div",{children:[c.jsx(jf,{htmlFor:"ai-project-description",children:e("ai.field.project")}),c.jsx(Ql,{id:"ai-project-description",value:a.projectDescription,onChange:T=>v("projectDescription",T.target.value),placeholder:e("ai.project.placeholder"),className:"mt-2 min-h-24 resize-y"})]})]}),c.jsxs("div",{className:"mt-8",children:[c.jsx(Rf,{title:e("ai.preview.title"),description:e("ai.preview.subtitle"),expandLabel:e("ai.preview.expand"),preview:c.jsx(Ql,{readOnly:!0,value:g,"aria-label":e("ai.preview.title"),className:"h-28 resize-none bg-muted/25 font-mono text-xs leading-5 text-muted-foreground"}),expanded:c.jsx(Ql,{readOnly:!0,value:g,className:"h-[62dvh] resize-none border-0 bg-muted/30 font-mono text-xs leading-5 shadow-none focus-visible:ring-0 sm:text-sm"}),footer:c.jsxs(it,{onClick:S,children:[d?c.jsx(Ha,{className:"h-4 w-4"}):c.jsx($s,{className:"h-4 w-4"}),e(d?"ai.action.copied":"ai.preview.copy")]}),className:"border-0 bg-transparent",previewClassName:"p-0"}),c.jsxs("div",{className:"mt-4 flex flex-wrap gap-3",children:[c.jsxs(it,{onClick:S,className:"min-w-40",children:[d?c.jsx(Ha,{className:"h-4 w-4"}):c.jsx($s,{className:"h-4 w-4"}),e(d?"ai.action.copied":"ai.action.copy")]}),c.jsx(it,{variant:"outline",asChild:!0,children:c.jsxs("a",{href:"/llms.txt",target:"_blank",rel:"noreferrer",children:[e("ai.action.openLlms"),c.jsx(Dx,{className:"h-4 w-4"})]})})]}),u&&c.jsx("p",{className:"mt-3 text-sm text-destructive",children:e("ai.copy.error")})]})]})}),c.jsxs("aside",{className:"relative hidden overflow-hidden border-l border-border bg-muted/30 lg:sticky lg:top-14 lg:block lg:h-[calc(100dvh-3.5rem)]",children:[!s&&c.jsx("img",{src:"/ai-onboarding/prompt-setup.png",alt:"",className:"absolute inset-0 h-full w-full object-cover object-center brightness-[1.02] saturate-[0.95] transition-[filter] duration-300 dark:brightness-[0.68] dark:contrast-[0.95] dark:saturate-[0.72]",onError:()=>l(!0)}),c.jsx("div",{className:"pointer-events-none absolute inset-0 bg-background/0 dark:bg-background/10"}),c.jsx("div",{className:"pointer-events-none absolute inset-y-0 left-0 hidden w-[calc(var(--spacing)*100)] bg-gradient-to-r from-background/20 to-transparent lg:block"}),c.jsx("div",{className:"pointer-events-none absolute inset-y-0 right-0 w-[calc(var(--spacing)*100)] bg-gradient-to-r from-transparent via-background/45 to-background dark:via-background/65 dark:to-background"})]})]})}const uZ=[["llms.txt","/llms.txt","Compact agent instructions for choosing the right react-zmage integration mode."],["llms-full.txt","/llms-full.txt","Single-file agent context that includes the compact guide, README, and repository agent notes."],["index.md","/index.md","Markdown version of the homepage for agents that prefer prose over HTML."],["OpenAPI metadata","/api/openapi.json","Read-only description of static documentation endpoints. This is not a runtime product API."],["Auth notes","/developers/auth.md","The package and docs require no OAuth, API key, login, or rate-limit budget."],["Error recovery","/developers/errors.md","How agents should recover from GitHub Pages HTML 404 responses and missing static endpoints."],["Rate limits","/developers/rate-limits.md","Clarifies that no product API quota applies because react-zmage is a client-side package."],["Status","/status.md","Static site and package status notes for agents."],["Status page","/status","Human-readable status page for the static docs site and npm package surfaces."],["About","/about","Project identity, repository, npm package, license, and package boundaries."],["Contact","/contact","GitHub issue path for support, bugs, feature requests, and documentation problems."],["Privacy","/privacy","Plain-language privacy notes for the package and documentation site."],["MCP notes","/developers/mcp.md","Current MCP status and the recommended fallback for coding agents."],["Webhook notes","/developers/webhooks.md","Why a client-side React component has no webhook events or registration API."],["AGENTS.md","/AGENTS.md","Repository instructions for coding agents working in react-zmage."],[".cursorrules","/.cursorrules","Cursor-compatible pointer to the repository agent instructions."],["Agent discovery","/.well-known/agent.json","Machine-readable identity, package, and integration resource links."],["A2A card","/.well-known/agent-card.json","A discovery card that describes the documentation surface without claiming an A2A task endpoint."],["Agent skill","/.well-known/agent-skills/react-zmage-integration/SKILL.md","A portable skill for adding react-zmage to existing React image surfaces."]];function pZ(){return c.jsxs(c.Fragment,{children:[c.jsxs("section",{className:"mx-auto max-w-6xl px-4 py-20 sm:px-6",children:[c.jsxs("div",{className:"max-w-3xl",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:"Developer resources"}),c.jsx("h1",{className:"mt-4 text-4xl font-semibold tracking-tight sm:text-5xl",children:"react-zmage machine-readable docs"}),c.jsx("p",{className:"mt-5 text-base leading-7 text-muted-foreground sm:text-lg",children:"These endpoints are for coding agents, search crawlers, and developers who need the package contract without running the React UI. react-zmage is a free MIT-licensed npm package, not a hosted API service."})]}),c.jsx("div",{className:"mt-12 grid gap-4 md:grid-cols-2",children:uZ.map(([e,a,r])=>c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsxs("a",{href:a,className:"inline-flex items-center gap-2 text-base font-medium underline-offset-4 hover:underline",children:[e,c.jsx(Dx,{className:"h-4 w-4 text-muted-foreground"})]}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:r})]},a))})]}),c.jsx(fi,{})]})}const mZ={compare:{eyebrow:"Comparison",title:"react-zmage vs alternatives",body:"react-zmage is an alternative to react-medium-image-zoom, Lightbox.js, and react-photoswipe when a React page needs fullscreen image preview from existing img elements.",sections:[{title:"When react-zmage fits",body:"Use react-zmage for documentation screenshots, editorial articles, CMS content, MDX docs, product galleries, and Next.js pages that need SSR/RSC-safe imports."},{title:"How it differs",body:"Unlike gallery-first tools, react-zmage can start as a drop-in img replacement and later expand to Wrapper or imperative mode without replacing the page architecture."}]},about:{eyebrow:"Project",title:"About react-zmage",body:"react-zmage is a free MIT-licensed open-source React image viewer maintained in the Caldis/react-zmage GitHub repository and published to npm as react-zmage.",sections:[{title:"What it provides",body:"The package turns ordinary img elements into a fullscreen image viewer with origin-expand animation, gallery browsing, keyboard navigation, mobile gestures, Wrapper mode, and an SSR/RSC-safe import path."},{title:"Boundaries",body:"There is no hosted runtime API, account system, payment plan, OAuth flow, API key, webhook delivery service, MCP transport, or service-side rate limit."}]},contact:{eyebrow:"Support",title:"Contact react-zmage",body:"react-zmage support happens through the public GitHub repository.",sections:[{title:"Public support",body:"Open issues at https://github.com/Caldis/react-zmage/issues for bugs, documentation problems, feature requests, and integration questions."},{title:"Private data",body:"Do not post secrets, private images, access tokens, or customer data in public issues. Most reproductions should use placeholder images or public sample assets."}]},privacy:{eyebrow:"Privacy",title:"react-zmage privacy notes",body:"react-zmage is a client-side React package and the documentation site is static.",sections:[{title:"Package behavior",body:"The npm package runs inside the user's React app. It displays images already available to that app and does not upload images to a react-zmage server."},{title:"Documentation site",body:"zmage.caldis.me is hosted as static GitHub Pages content and includes Google Analytics page view measurement. External links to GitHub and npm follow those services' policies."}]},status:{eyebrow:"Status",title:"react-zmage status",body:"react-zmage has no hosted runtime service. The public surfaces are the static documentation site, the npm package, and the GitHub source repository.",sections:[{title:"Available surfaces",body:"Documentation is static GitHub Pages content. The installable package is react-zmage on npm. The source repository is Caldis/react-zmage on GitHub."},{title:"Unavailable hosted surfaces",body:"There is no hosted product API, background job system, status dashboard, OAuth application, API key, webhook delivery service, MCP transport, or service-side rate limit."}]},errors:{eyebrow:"Recovery",title:"react-zmage error recovery",body:"Non-existent zmage.caldis.me paths may return a GitHub Pages HTML 404. That is a static documentation miss, not a failed product API call.",sections:[{title:"Recovery order",body:"Fetch /llms.txt, /llms-full.txt, /index.md, npm package metadata, or the GitHub repository instead of retrying a missing static endpoint."},{title:"Future API shape",body:"If react-zmage ever adds a hosted API, error responses should use JSON with error, code, message, and retry_after fields."}]},rateLimits:{eyebrow:"Access",title:"react-zmage rate limits",body:"No API rate limits apply to react-zmage because it is a client-side React package and static documentation site, not a hosted network API.",sections:[{title:"Package use",body:"Installing and using react-zmage does not require API keys, OAuth tokens, Retry-After scheduling, or quota handling."},{title:"External services",body:"Agents should still follow npm and GitHub public service policies when fetching package metadata, source files, issues, or release history."}]}};function xn({page:e}){const a=mZ[e];return c.jsxs(c.Fragment,{children:[c.jsxs("section",{className:"mx-auto max-w-4xl px-4 py-20 sm:px-6",children:[c.jsx("p",{className:"font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground",children:a.eyebrow}),c.jsx("h1",{className:"mt-4 text-4xl font-semibold tracking-tight sm:text-5xl",children:a.title}),c.jsx("p",{className:"mt-5 text-base leading-7 text-muted-foreground sm:text-lg",children:a.body}),c.jsx("div",{className:"mt-12 grid gap-4",children:a.sections.map(r=>c.jsxs(Ua,{className:"border-border/70 bg-card/40 p-5",children:[c.jsx("h2",{className:"text-lg font-medium",children:r.title}),c.jsx("p",{className:"mt-2 text-sm leading-6 text-muted-foreground",children:r.body})]},r.title))})]}),c.jsx(fi,{})]})}function fZ(){return YD(),c.jsxs(kS,{delayDuration:300,children:[c.jsx(ED,{}),c.jsx("main",{className:"pt-14",children:c.jsxs(Sx,{children:[c.jsx(ut,{path:"/",element:c.jsx(ex,{})}),c.jsx(ut,{path:"/playground/*",element:c.jsx(fP,{})}),c.jsx(ut,{path:"/docs",element:c.jsx(WP,{})}),c.jsx(ut,{path:"/use-cases",element:c.jsx(JP,{})}),c.jsx(ut,{path:"/ai",element:c.jsx(dZ,{})}),c.jsx(ut,{path:"/developers",element:c.jsx(pZ,{})}),c.jsx(ut,{path:"/compare",element:c.jsx(xn,{page:"compare"})}),c.jsx(ut,{path:"/about",element:c.jsx(xn,{page:"about"})}),c.jsx(ut,{path:"/contact",element:c.jsx(xn,{page:"contact"})}),c.jsx(ut,{path:"/privacy",element:c.jsx(xn,{page:"privacy"})}),c.jsx(ut,{path:"/status",element:c.jsx(xn,{page:"status"})}),c.jsx(ut,{path:"/errors",element:c.jsx(xn,{page:"errors"})}),c.jsx(ut,{path:"/rate-limits",element:c.jsx(xn,{page:"rateLimits"})}),c.jsx(ut,{path:"*",element:c.jsx(ex,{})})]})})]})}const _1=document.getElementById("app");if(!_1)throw new Error("Missing #app root element");const O1=_1;function hZ(){O1.innerHTML=` +
+

react-zmage agent view

+

react-zmage is a free MIT-licensed npm package for turning React img elements, galleries, CMS HTML, MDX, markdown, and rich text images into a fullscreen image viewer. This site is documentation-only; it has no hosted product API, OAuth flow, API key, rate-limit budget, webhook system, or hosted MCP server.

+

Install

+
npm install react-zmage
+

Package entry points

+
    +
  • react-zmage - browser and bundler entry.
  • +
  • react-zmage/ssr - SSR and React Server Components-safe import path.
  • +
  • react-zmage/style.css - required visual stylesheet.
  • +
+

Machine-readable resources

+ +

Use this when

+ + + + + + + +
ModeUse case
ComponentOwned React image markup.
WrapperCMS, MDX, markdown, rich text, or generated HTML images.
ImperativeButtons, commands, callbacks, and non-image triggers.
+
+ `}new URLSearchParams(window.location.search).get("mode")==="agent"?hZ():cx.createRoot(O1).render(c.jsx(Q.StrictMode,{children:c.jsx(gR,{children:c.jsx(TR,{children:c.jsx(cR,{children:c.jsx(fZ,{})})})})})); diff --git a/docs/compare/index.html b/docs/compare/index.html index d8698e8..fa286e2 100644 --- a/docs/compare/index.html +++ b/docs/compare/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/contact/index.html b/docs/contact/index.html index 2ace680..5053380 100644 --- a/docs/contact/index.html +++ b/docs/contact/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/developers/index.html b/docs/developers/index.html index 0ae363e..09bb5af 100644 --- a/docs/developers/index.html +++ b/docs/developers/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/docs/index.html b/docs/docs/index.html index 59311d5..3989c53 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/errors/index.html b/docs/errors/index.html index f902815..90d66d0 100644 --- a/docs/errors/index.html +++ b/docs/errors/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/index.html b/docs/index.html index 3166f6b..359c956 100644 --- a/docs/index.html +++ b/docs/index.html @@ -222,8 +222,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 410d2b6..035dba0 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -128,7 +128,7 @@ When integrating react-zmage into an existing site, keep the integration minimal - For existing image lists or rich content, use `Zmage.Wrapper` with `set` so clicked images open at the matching gallery index. - You may set the top-level `backdrop` to match the host page background color. -- Do not set optional behavior, `controller`, `controller.layout`, `edge`, `zIndex`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` props unless the user explicitly asks. +- Do not set optional behavior, `controller`, `controller.layout`, `edge`, `zIndex`, `portalTarget`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` props unless the user explicitly asks. - Only configure `controller.color` or `controller.backdrop` when the user asks for controller styling or when icons are visibly illegible after testing. Do not preemptively customize controller layout or placement. ### Expected deliverables @@ -209,6 +209,7 @@ const [open, setOpen] = useState(false) | `hideOnDblClick` | `boolean` | `false` | Auto-close on image double-click. Off by default to preserve current single-click semantics; turn on to dismiss with a double-click. | | `coverVisible` | `boolean` | `false` | Keep the underlying `` visible while the modal is open. | | `zIndex` / `radius` / `edge` | `number` | `1000` / desktop `8`, mobile `0` / desktop `16`, mobile `0` | Modal stacking, image corner radius, viewport padding. | +| `portalTarget` | `HTMLElement \| null` | `document.body` | Custom DOM element for mounting the viewer Portal. Use it when an app has a dedicated overlay root, modal root, shadow host, or micro-frontend container. It changes the mount parent only; the viewer still uses fullscreen fixed positioning and is not clipped into a local preview. | | `loop` | `boolean` | `true` | Wrap-around when paging past the ends. | | `loadingDelay` | `number` | `200` | Delay (ms) before showing the loading indicator. If the image loads within this window, the indicator never appears — prevents the flash on cached page changes. Set 0 for legacy instant-show. | | `onBrowsing` | `(isBrowsing: boolean) => void` | — | Fires on open/close. | @@ -220,6 +221,8 @@ const [open, setOpen] = useState(false) Standard `` HTML attributes (`className`, `style`, `width`, `height`, `loading`, `id`, etc.) pass through to the cover image. +`portalTarget` is an advanced integration prop, not a normal visual tweak. Use it only when the host app already has an overlay root, modal root, shadow host, or micro-frontend shell container that should own Portal children. It does not replace `zIndex` and does not make the fullscreen viewer local to that container. + Controller render example: ```tsx @@ -259,7 +262,7 @@ Controller render example: Wrapper mode prop scope: - Put `src` / `alt` on child `` nodes; top-level `src` / `alt` are overridden by the clicked DOM node. -- Pass viewer behavior and visuals on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, plus lifecycle callbacks. +- Pass viewer behavior and visuals on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, plus lifecycle callbacks. - Pass `set` when the wrapped subtree should be one shared gallery. If clicked `img.src` matches `set[i].src`, Wrapper opens `i`; otherwise it falls back to `defaultPage`. - Without `set`, the clicked image opens alone. `data-zmage-caption` or the nearest `figcaption` can provide the viewer caption. - `browsing` is component-controlled state and does not control Wrapper. @@ -318,7 +321,8 @@ The library is theme-agnostic by design — there's no theme provider, no light/ 4. Putting `src` / `alt` on `` and expecting them to render images — Wrapper reads actual descendant `` nodes instead. 5. Calling `Zmage.browsing()` in code that may run server-side — guard with `typeof window !== 'undefined'`, or import from `react-zmage/ssr`. 6. Leaving `backdrop` at the default `#FFFFFF` on a dark-themed page — the modal may clash with the host page. Set the top-level `backdrop` explicitly if your host UI isn't light. -7. Preemptively setting `controller`, `controller.layout`, `edge`, `zIndex`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install — keep these defaults unless the user asks or testing exposes a concrete issue. +7. Preemptively setting `controller`, `controller.layout`, `edge`, `zIndex`, `portalTarget`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install — keep these defaults unless the user asks or testing exposes a concrete issue. +8. Treating `portalTarget` as a clipping or local-preview boundary — it only changes the Portal mount parent. The viewer still uses fullscreen fixed positioning. ## Optional @@ -446,7 +450,7 @@ The wrapper queries `` descendants in `componentDidMount` / `componentDidUp Wrapper-specific prop scope: - Put `src` / `alt` on the child `` nodes. Top-level `src` / `alt` are overwritten by the clicked DOM node. -- Viewer configuration still belongs on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, and lifecycle callbacks. +- Viewer configuration still belongs on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, and lifecycle callbacks. - Pass `set` when the wrapped subtree should behave as one shared gallery. If the clicked image's `src` appears in `set`, Wrapper opens that matching index; `defaultPage` is only the fallback. - Without `set`, the clicked image opens as a single image. `data-zmage-caption` or the nearest `figcaption` can provide the viewer caption. - The controlled `browsing` prop is for component mode; it does not control ``. @@ -870,11 +874,31 @@ Wheel zoom is active only while the viewer is already in zoom mode; normal brows | `coverVisible` | `boolean` | `false` | Keep the cover `` visible while the modal is open. | | `backdrop` | `string` | `'#FFFFFF'` | Viewer backdrop. Any valid CSS color or gradient. **Default is white** — override (`'#111'`, etc.) for dark UIs. | | `zIndex` | `number` | `1000` | Portal stacking. | +| `portalTarget` | `HTMLElement \| null` | `document.body` | Custom DOM element for mounting the viewer Portal. Use it when an app has a dedicated overlay root, modal root, shadow host, or micro-frontend container. It changes the mount parent only; the viewer still uses fullscreen fixed positioning. | | `radius` | `number` | desktop `8`, mobile `0` | Image corner radius (px). | | `edge` | `number` | desktop `16`, mobile `0` | Minimum margin between image and viewport (px). | | `loop` | `boolean` | `true` | Wrap-around when paging past the ends. | | `loadingDelay` | `number` | `200` | Delay (ms) before showing the loading indicator. If the image loads within this window, the indicator never appears — prevents the flash on cached page changes. Set 0 for legacy instant-show. | +`portalTarget` is for host apps that already centralize overlays outside the normal content tree. It does not make a local, clipped preview; use `zIndex` and your app shell's stacking rules to control how the fullscreen viewer sits above other UI. + +```tsx +import { useState } from 'react' +import Zmage from 'react-zmage' +import 'react-zmage/style.css' + +export function ArticleImage () { + const [viewerRoot, setViewerRoot] = useState(null) + + return ( +
+
+ +
+ ) +} +``` + ### Lifecycle | Prop | Signature | Triggered when | @@ -902,7 +926,7 @@ export type BaseType = & BaseParams // src / alt / caption / set / defaultPage & PresetParams // preset & FunctionalParams // controller / hotKey / animate / gesture - & InterfaceAndInteractionParams // hideOnScroll / hideOnDblClick / coverVisible / backdrop / zIndex / radius / edge / loop / loadingDelay + & InterfaceAndInteractionParams // hideOnScroll / hideOnDblClick / coverVisible / backdrop / zIndex / portalTarget / radius / edge / loop / loadingDelay & LifeCycleParams // onBrowsing / onZooming / onSwitching / onRotating / onError & ControlledParams // browsing & HTMLAttributes @@ -1117,7 +1141,7 @@ Single `BaseType` covers all. Grouped here by purpose: | Preset | `preset: 'desktop' \| 'mobile' \| 'auto'` | defaults to `'auto'` when omitted; drives default `controller` / `hotKey` / `animate` / `gesture` plus preset-aware viewer spacing. `'auto'` resolves via `matchMedia('(pointer: coarse) and (hover: none)')` on the client; SSR falls back to desktop | | Controlled | `browsing` | omit for self-managed; pair with `onBrowsing` if set. Does not control `` | | Functional | `controller`, `hotKey`, `animate`, `gesture` | pass `boolean` to disable, or partial object to override. `controller.flip` / `hotKey.flip` and `controller.rotate` / `hotKey.rotate` are umbrellas over their per-side counterparts; enabling the umbrella forces both sides on. `controller.placement` moves only the toolbar capsule (`top-right` default); side flips and pagination keep their existing positions. `controller.layout` adjusts toolbar / flip / pagination / caption overlay safe insets without changing image animation geometry; number = px, string = CSS length, scalar `inset` follows each target's natural edge (toolbar by placement, flip left/right, pagination/caption bottom), and `layout.mobile` overrides base layout for mobile preset. Desktop defaults include `pagination.inset=24` and `caption.inset=60`; mobile leaves `layout` unset unless configured. `controller.render({ state, actions, slots })` replaces the whole controller UI, and `controller=false` disables both built-in slots and render. **`hotKey` entries accept `boolean \| string \| string[]`** — string is an `e.code` descriptor (`'Escape'` / `'BracketLeft'` / `'S'`) with cross-platform `Mod` prefix (= ⌘ on macOS, Ctrl elsewhere; e.g. `'Mod+S'`). New defaults: `[`/`]` rotate, `Mod+S` download (download is opt-in: defaults `false` because it hijacks the browser's "Save Page As"). Per-side string descriptor wins over umbrella. `controller.backdrop` / `controller.color` decouple the toolbar bg/icon-color from the modal `backdrop` (set both when `backdrop` is solid dark). `animate.cover` is preset-driven and defaults to `{ objectFit: true, clip: true, radius: true }`; it reads the cover `` itself and does not infer parent-wrapper clipping. `clip-path` / `border-radius` animation may repaint; use `cover.clip=false` or `cover.radius=false` for performance-sensitive mobile pages. Set `animate={{ cover: false }}` for legacy cover geometry. `animate.slowMotion` defaults `false`; when enabled, holding `Shift` while opening or closing slows the full browsing transition to 10x for inspection and demos. `gesture` is preset-driven: desktop enables `wheelZoom` while already zoomed and disables `swipe` / `dragExit` / `pinchZoom` / `doubleTapZoom`; mobile enables horizontal drag paging, vertical drag-to-exit, pinch zoom, and double-tap zoom, while disabling `wheelZoom`. `gesture.touchAction` defaults to `'managed'`: pinch uses CSS `touch-action: none`, double-tap-only uses `manipulation`, otherwise `auto`; set it explicitly if the host page owns touch behavior. `pinchZoom.resetBelowFit` defaults `true`, so shrinking back to fit exits zoom and recenters. `doubleTapZoom.interval` / `distance` define the second-tap window. `wheelZoom.reverse` flips wheel direction; `wheelZoom.exitGuardDuration` defaults to `1000`, so wheel zooming out to `minScale` exits zoom immediately and blocks residual wheel events for that duration. `gesture=false` disables all gestures, and per-child overrides such as `gesture={{ swipe: false }}` / `gesture={{ wheelZoom: false }}` / `gesture={{ pinchZoom: false }}` keep the other preset defaults intact | -| Interface | `hideOnScroll`, `hideOnDblClick`, `coverVisible`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `loadingDelay` | desktop-only flags noted in README. `radius` defaults to desktop `8` / mobile `0`; `edge` defaults to desktop `16` / mobile `0`. `hideOnScroll` and `hideOnDblClick` are the auto-dismiss trigger family (user action → close viewer); `hideOnDblClick` defaults `false`. `loadingDelay` defaults `200ms` — anti-flicker delay before showing the loading indicator (set 0 for legacy instant-show) | +| Interface | `hideOnScroll`, `hideOnDblClick`, `coverVisible`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `loadingDelay` | desktop-only flags noted in README. `portalTarget` defaults to `document.body` and is for app overlay roots / modal roots / micro-frontend containers; it changes only the Portal mount parent, while the viewer remains fullscreen fixed. `radius` defaults to desktop `8` / mobile `0`; `edge` defaults to desktop `16` / mobile `0`. `hideOnScroll` and `hideOnDblClick` are the auto-dismiss trigger family (user action → close viewer); `hideOnDblClick` defaults `false`. `loadingDelay` defaults `200ms` — anti-flicker delay before showing the loading indicator (set 0 for legacy instant-show) | | Lifecycle | `onBrowsing`, `onZooming`, `onSwitching`, `onRotating`, `onError` | first 4 callback args: `boolean`/`boolean`/`number`/`number`. `onError(e: SyntheticEvent)` fires for cover **or** viewer img-load failure — the only hook for the viewer-side failure (cover also flows via native `` `onError` passthrough) | | Native | All `HTMLAttributes` | className, style, onClick, etc. transparently forwarded to inner `` | @@ -1129,7 +1153,7 @@ Defaults & sub-shapes: see [`packages/core/src/types/default.ts`](./packages/cor 2. **Hard-coding `preset='desktop'` on a touch-targeted page** — omitted `preset` already defaults to `'auto'`. The desktop bundle ships hotkeys + arrow buttons, enables wheel zoom while zoomed, and disables mobile `gesture.swipe` / `gesture.dragExit` / `gesture.pinchZoom` / `gesture.doubleTapZoom`. Use `'desktop'` only when the page deliberately wants desktop behavior on touch devices. 3. **Treating `Zmage` as a class** — it is a `forwardRef` exotic component. ❌ `new Zmage()`. ✅ JSX or `Zmage.browsing()`. 4. **Mixing controlled and uncontrolled** — if `browsing` is in props, it must be a fully controlled `boolean` (provide `onBrowsing` to receive changes). Mixing both modes silently breaks state sync. -5. **Calling `Zmage.browsing` server-side** — it manipulates `document.body`. Guard with `typeof window !== 'undefined'` or call from event handlers / effects. +5. **Calling `Zmage.browsing` server-side** — it manipulates the DOM (`document.body` by default, or `portalTarget` when provided). Guard with `typeof window !== 'undefined'` or call from event handlers / effects. 6. **Putting `src` / `alt` on `` as if it rendered an image** — Wrapper binds real descendant `` nodes. Put image data in the HTML, and pass only viewer config / optional shared `set` to Wrapper. 7. **Wrapping with `Zmage.Wrapper` without re-rendering** — wrapper attaches click handlers in `componentDidMount` / `componentDidUpdate` by querying `wrapperRef.current.querySelectorAll('img')`. Dynamically-injected `` (after wrapper update) won't get attached unless wrapper re-renders. diff --git a/docs/llms.txt b/docs/llms.txt index 220a0b6..9f90e1f 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -109,7 +109,7 @@ When integrating react-zmage into an existing site, keep the integration minimal - For existing image lists or rich content, use `Zmage.Wrapper` with `set` so clicked images open at the matching gallery index. - You may set the top-level `backdrop` to match the host page background color. -- Do not set optional behavior, `controller`, `controller.layout`, `edge`, `zIndex`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` props unless the user explicitly asks. +- Do not set optional behavior, `controller`, `controller.layout`, `edge`, `zIndex`, `portalTarget`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` props unless the user explicitly asks. - Only configure `controller.color` or `controller.backdrop` when the user asks for controller styling or when icons are visibly illegible after testing. Do not preemptively customize controller layout or placement. ### Expected deliverables @@ -190,6 +190,7 @@ const [open, setOpen] = useState(false) | `hideOnDblClick` | `boolean` | `false` | Auto-close on image double-click. Off by default to preserve current single-click semantics; turn on to dismiss with a double-click. | | `coverVisible` | `boolean` | `false` | Keep the underlying `` visible while the modal is open. | | `zIndex` / `radius` / `edge` | `number` | `1000` / desktop `8`, mobile `0` / desktop `16`, mobile `0` | Modal stacking, image corner radius, viewport padding. | +| `portalTarget` | `HTMLElement \| null` | `document.body` | Custom DOM element for mounting the viewer Portal. Use it when an app has a dedicated overlay root, modal root, shadow host, or micro-frontend container. It changes the mount parent only; the viewer still uses fullscreen fixed positioning and is not clipped into a local preview. | | `loop` | `boolean` | `true` | Wrap-around when paging past the ends. | | `loadingDelay` | `number` | `200` | Delay (ms) before showing the loading indicator. If the image loads within this window, the indicator never appears — prevents the flash on cached page changes. Set 0 for legacy instant-show. | | `onBrowsing` | `(isBrowsing: boolean) => void` | — | Fires on open/close. | @@ -201,6 +202,8 @@ const [open, setOpen] = useState(false) Standard `` HTML attributes (`className`, `style`, `width`, `height`, `loading`, `id`, etc.) pass through to the cover image. +`portalTarget` is an advanced integration prop, not a normal visual tweak. Use it only when the host app already has an overlay root, modal root, shadow host, or micro-frontend shell container that should own Portal children. It does not replace `zIndex` and does not make the fullscreen viewer local to that container. + Controller render example: ```tsx @@ -240,7 +243,7 @@ Controller render example: Wrapper mode prop scope: - Put `src` / `alt` on child `` nodes; top-level `src` / `alt` are overridden by the clicked DOM node. -- Pass viewer behavior and visuals on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, plus lifecycle callbacks. +- Pass viewer behavior and visuals on ``: `preset`, `controller`, `hotKey`, `animate`, `gesture`, `backdrop`, `zIndex`, `portalTarget`, `radius`, `edge`, `loop`, `coverVisible`, `hideOnScroll`, `hideOnDblClick`, `loadingDelay`, plus lifecycle callbacks. - Pass `set` when the wrapped subtree should be one shared gallery. If clicked `img.src` matches `set[i].src`, Wrapper opens `i`; otherwise it falls back to `defaultPage`. - Without `set`, the clicked image opens alone. `data-zmage-caption` or the nearest `figcaption` can provide the viewer caption. - `browsing` is component-controlled state and does not control Wrapper. @@ -299,7 +302,8 @@ The library is theme-agnostic by design — there's no theme provider, no light/ 4. Putting `src` / `alt` on `` and expecting them to render images — Wrapper reads actual descendant `` nodes instead. 5. Calling `Zmage.browsing()` in code that may run server-side — guard with `typeof window !== 'undefined'`, or import from `react-zmage/ssr`. 6. Leaving `backdrop` at the default `#FFFFFF` on a dark-themed page — the modal may clash with the host page. Set the top-level `backdrop` explicitly if your host UI isn't light. -7. Preemptively setting `controller`, `controller.layout`, `edge`, `zIndex`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install — keep these defaults unless the user asks or testing exposes a concrete issue. +7. Preemptively setting `controller`, `controller.layout`, `edge`, `zIndex`, `portalTarget`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install — keep these defaults unless the user asks or testing exposes a concrete issue. +8. Treating `portalTarget` as a clipping or local-preview boundary — it only changes the Portal mount parent. The viewer still uses fullscreen fixed positioning. ## Optional diff --git a/docs/playground/imperative/index.html b/docs/playground/imperative/index.html index f1c74fb..a3b8f50 100644 --- a/docs/playground/imperative/index.html +++ b/docs/playground/imperative/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/playground/index.html b/docs/playground/index.html index 039c386..7670e69 100644 --- a/docs/playground/index.html +++ b/docs/playground/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/playground/wrapper/index.html b/docs/playground/wrapper/index.html index d7fdaa7..d7b671d 100644 --- a/docs/playground/wrapper/index.html +++ b/docs/playground/wrapper/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/privacy/index.html b/docs/privacy/index.html index 5fdff15..362687c 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/rate-limits/index.html b/docs/rate-limits/index.html index c492348..e1f84ef 100644 --- a/docs/rate-limits/index.html +++ b/docs/rate-limits/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/status/index.html b/docs/status/index.html index a280d34..f3f68ed 100644 --- a/docs/status/index.html +++ b/docs/status/index.html @@ -190,8 +190,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/docs/use-cases/index.html b/docs/use-cases/index.html index 43151b8..c4a8eb8 100644 --- a/docs/use-cases/index.html +++ b/docs/use-cases/index.html @@ -228,8 +228,8 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - - + +
diff --git a/packages/core/src/types/global.ts b/packages/core/src/types/global.ts index 58e6d1a..ca7188e 100644 --- a/packages/core/src/types/global.ts +++ b/packages/core/src/types/global.ts @@ -377,7 +377,7 @@ export interface InterfaceAndInteractionParams { // 缓存图时的视觉闪烁. 默认 200 (业界 react-loadable 的经典值; UX 研究"顺滑"上限). // 设为 0 = 立即显示 (旧行为). 内部命中 fast-path (img.complete 已就绪) 时直接绕过此延迟. loadingDelay?: number - // 浏览层 Portal 挂载目标元素 (默认 document.body). 传入自定义容器可将浏览层限制在特定 DOM 子树内. + // 浏览层 Portal 挂载目标元素 (默认 document.body). 用于接入宿主 overlay root / modal root; 只改变 DOM 父节点, 不改变 fixed 全屏布局. portalTarget?: HTMLElement | null } diff --git a/packages/home/src/aiPrompt/buildPrompt.ts b/packages/home/src/aiPrompt/buildPrompt.ts index d6c7d90..5f7e067 100644 --- a/packages/home/src/aiPrompt/buildPrompt.ts +++ b/packages/home/src/aiPrompt/buildPrompt.ts @@ -123,7 +123,7 @@ function propGuidance (config: AiPromptConfig) { '- Prefer omitted `preset` or `preset="auto"` unless project evidence requires a fixed desktop or mobile setup.', '- Keep optional behavior and UI props at their defaults unless the user asks for them or testing exposes a concrete issue.', '- You may set the top-level `backdrop` to match the host page background color when the default white viewer would clash.', - '- Do not set `controller`, `controller.layout`, `edge`, `zIndex`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install unless the selected setup or user request specifically requires them.', + '- Do not set `controller`, `controller.layout`, `edge`, `zIndex`, `portalTarget`, `animate`, `gesture`, `hotKey`, `radius`, `loop`, `coverVisible`, `hideOnScroll`, or `hideOnDblClick` during a basic install unless the selected setup or user request specifically requires them.', '- Only configure `controller.color` or `controller.backdrop` when the user asks for controller styling or when controls are visibly illegible after testing.', ] diff --git a/packages/home/src/docs/ParamTable.tsx b/packages/home/src/docs/ParamTable.tsx index 0f7811b..1eb142f 100644 --- a/packages/home/src/docs/ParamTable.tsx +++ b/packages/home/src/docs/ParamTable.tsx @@ -25,6 +25,7 @@ function inferType (def: typeof PARAM_SCHEMA[number]): string { return def.control.component === 'set' ? `${name}[]` : `${name} | boolean` } case 'callback': return '(arg) => void' + case 'readonly': return def.control.type } } @@ -60,7 +61,7 @@ export function ParamTable ({ group }: { group: ParamGroup }) { {d.presetScope && } {inferType(d)} - {fmtDefault(d.default)} + {d.defaultDisplay ?? fmtDefault(d.default)} {t(d.i18n.descKey)} ))} diff --git a/packages/home/src/docs/sections/Examples.tsx b/packages/home/src/docs/sections/Examples.tsx index 2e8613e..57455ce 100644 --- a/packages/home/src/docs/sections/Examples.tsx +++ b/packages/home/src/docs/sections/Examples.tsx @@ -1,3 +1,4 @@ +import { useCallback, useState } from 'react' import Zmage from 'react-zmage' import { Heading } from '@/docs/Heading' import { CodeBlock } from '@/components/CodeBlock' @@ -62,9 +63,31 @@ const COVER_GEOMETRY_CODE = `` +const PORTAL_TARGET_CODE = `import { useState } from 'react' + +export function ShellImage () { + const [viewerRoot, setViewerRoot] = useState(null) + + return ( +
+
+ + +
+ ) +}` + export function Examples () { const { t } = useT() const backdrop = useThemedBackdrop() + const [portalTarget, setPortalTarget] = useState(null) + const setPortalRoot = useCallback((node: HTMLDivElement | null) => { + setPortalTarget(prev => prev === node ? prev : node) + }, []) return (
{t('docs.section.examples.title')} @@ -168,6 +191,25 @@ export function Examples () { />
+ + {t('docs.section.examples.portalTargetTitle')} +

{t('docs.section.examples.portalTargetBody')}

+
+
+
+ {t('docs.section.examples.portalTargetRoot')} +
+ +
+ +
) } diff --git a/packages/home/src/docs/sections/Props.tsx b/packages/home/src/docs/sections/Props.tsx index d2773ea..f35d2cf 100644 --- a/packages/home/src/docs/sections/Props.tsx +++ b/packages/home/src/docs/sections/Props.tsx @@ -246,6 +246,39 @@ function WrapperScopeDetail () { ) } +function PortalTargetDetail () { + const { t } = useT() + return ( +
+
+

{t('docs.section.props.portalTarget.title')}

+

{t('docs.section.props.portalTarget.body')}

+

{t('docs.section.props.portalTarget.boundary')}

+
+ (null) + + return ( +
+
+ + +
+ ) +}`} language={'tsx' as any} /> +
+ ) +} + function TypeCaption ({ name }: { name: string }) { return (
@@ -505,6 +538,7 @@ export function Props () { {t('docs.section.props.interface')} + {t('group.controller')} diff --git a/packages/home/src/i18n/de.ts b/packages/home/src/i18n/de.ts index cd1b423..050ad16 100644 --- a/packages/home/src/i18n/de.ts +++ b/packages/home/src/i18n/de.ts @@ -199,6 +199,10 @@ export const de: I18nDict = { 'pg.code.hideDefaults': 'Standardwerte ausblenden', 'pg.copy': 'Kopieren', 'pg.copied': 'Kopiert', + 'pg.portalTarget.title': 'Eigenes Portal-Ziel', + 'pg.portalTarget.body': 'Für Apps mit eigenem Overlay-Root, Modal-Root oder Micro-Frontend-Container. Beim Klick auf das Bild rechts wird der Viewer dort statt in document.body gemountet.', + 'pg.portalTarget.root': 'Host Overlay Root', + 'pg.portalTarget.imageAlt': 'Portal-Ziel Demo-Bild', 'group.data': 'Daten', 'group.preset': 'Preset', @@ -388,6 +392,8 @@ export const de: I18nDict = { 'param.backdrop.desc': 'Hintergrundfarbe des Viewers. Beliebige gültige CSS-Farbe.', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': 'Stapelreihenfolge des Viewers.', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': 'DOM-Element als Mount-Ziel des Viewer-Portals. Standard ist document.body. Für App-Overlay-Roots, Modal-Roots oder Micro-Frontend-Container; es ändert nur den Mount-Parent, der Viewer bleibt fixed im Vollbild.', 'param.radius.label': 'radius', 'param.radius.desc': 'Eckenradius des Bildes (px).', 'param.edge.label': 'edge', @@ -463,7 +469,7 @@ export const de: I18nDict = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': 'Preset-Auswahl: auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'Standard-Bundles für controller, hotKey, animate und gesture', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex und weitere UI-Stellschrauben', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget und weitere UI-Stellschrauben', 'docs.search.desc.propsController': 'Steuerleisten-Buttons, Position und eigener Render', 'docs.search.desc.propsHotkey': 'Tastenkürzel: ESC / Leertaste / Pfeile', 'docs.search.desc.propsAnimate': 'Browsing- und Blätter-Animationen', @@ -480,10 +486,13 @@ export const de: I18nDict = { 'docs.section.props.wrapperScope.title': 'Prop-Bereich im Wrapper-Modus', 'docs.section.props.wrapperScope.intro': ' rendert das Cover-Bild nicht selbst. Er bindet vorhandene untergeordnete -Knoten, daher haben einige Props im Wrapper-Modus eine eigene Bedeutung.', 'docs.section.props.wrapperScope.data': 'src und alt gehören auf das untergeordnete . Top-Level src / alt werden durch den angeklickten DOM-Knoten überschrieben. Ohne set kann caption aus data-zmage-caption oder der nächsten figcaption gelesen werden.', - 'docs.section.props.wrapperScope.config': 'set und defaultPage werden für eine explizite gemeinsame Galerie unterstützt. Wenn das angeklickte img-src in set vorkommt, öffnet Wrapper diesen passenden Index; defaultPage ist nur der Fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick und loadingDelay gelten normal.', + 'docs.section.props.wrapperScope.config': 'set und defaultPage werden für eine explizite gemeinsame Galerie unterstützt. Wenn das angeklickte img-src in set vorkommt, öffnet Wrapper diesen passenden Index; defaultPage ist nur der Fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick und loadingDelay gelten normal.', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing, onZooming, onSwitching, onRotating und onError funktionieren, weil Wrapper intern denselben Viewer öffnet.', 'docs.section.props.wrapperScope.controlled': 'browsing ist der kontrollierte Zustand des Komponentenmodus und steuert Wrapper nicht. Wenn du aus eigenem State öffnen willst, nutze den Komponentenmodus oder rufe Zmage.browsing() selbst auf.', 'docs.section.props.interface': 'Oberfläche & Interaktion', + 'docs.section.props.portalTarget.title': 'Eigenes Portal-Ziel', + 'docs.section.props.portalTarget.body': 'Standardmäßig mountet die Viewer-Ebene in document.body. Wenn deine App bereits einen Overlay-Root, Modal-Root, Shadow-Host oder Micro-Frontend-Shell-Container hat, übergib dieses Element an portalTarget, damit Stapelung, Style-Scope und Host-Lebenszyklus bei der App-Shell bleiben.', + 'docs.section.props.portalTarget.boundary': 'portalTarget ändert nur den DOM-Parent. Der Viewer bleibt fixed im Vollbild und wird nicht zu einer lokalen Vorschau beschnitten; nutze zIndex für die Stapelreihenfolge.', 'docs.section.props.controller.keyHeader': 'Schlüssel', 'docs.section.props.controller.descHeader': 'Beschreibung', 'docs.section.props.controller.umbrella': 'rotate ist der übergeordnete Schalter für rotateLeft / rotateRight — beim Aktivieren werden beide Buttons angezeigt. flip funktioniert genauso für flipLeft / flipRight.', @@ -521,6 +530,9 @@ export const de: I18nDict = { 'docs.section.examples.controllerBody': 'Platziere den Controller an einem Bildschirmrand oder ersetze die gesamte UI mit einem render-Callback, der state und actions erhält.', 'docs.section.examples.coverTitle': 'Zugeschnittenes Cover', 'docs.section.examples.coverBody': 'Lege object-fit und border radius direkt auf das Cover-img, damit der erste Öffnungsframe den sichtbaren Zuschnitt trifft.', + 'docs.section.examples.portalTargetTitle': 'In einen Host Overlay Root mounten', + 'docs.section.examples.portalTargetBody': 'Wenn die Seite einen gemeinsamen Overlay-Container hat, übergib diesen DOM-Knoten an portalTarget. Das Beispiel bleibt Vollbild; nur der Portal-Parent wechselt zum Host-Root.', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': 'Typen liegen am selben Ort wie der Runtime-Export. Die vollständige Prop-Union ist BaseType:', diff --git a/packages/home/src/i18n/en.ts b/packages/home/src/i18n/en.ts index 73fc607..ccb4ca8 100644 --- a/packages/home/src/i18n/en.ts +++ b/packages/home/src/i18n/en.ts @@ -199,6 +199,10 @@ export const en: I18nDict = { 'pg.code.hideDefaults': 'Hide defaults', 'pg.copy': 'Copy', 'pg.copied': 'Copied', + 'pg.portalTarget.title': 'Custom Portal target', + 'pg.portalTarget.body': 'For apps that already own an overlay root, modal root, or micro-frontend container. Click the image on the right and the viewer mounts there instead of document.body.', + 'pg.portalTarget.root': 'Host overlay root', + 'pg.portalTarget.imageAlt': 'Portal target demo image', 'group.data': 'Data', 'group.preset': 'Preset', @@ -388,6 +392,8 @@ export const en: I18nDict = { 'param.backdrop.desc': 'Viewer backdrop color. Any valid CSS color.', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': 'Stacking level for the viewer.', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': 'DOM element used as the viewer Portal mount target. Defaults to document.body. Use it with an app overlay root, modal root, or micro-frontend container; it changes only the mount parent and the viewer still uses fullscreen fixed positioning.', 'param.radius.label': 'radius', 'param.radius.desc': 'Image corner radius (px).', 'param.edge.label': 'edge', @@ -471,7 +477,7 @@ export const en: I18nDict = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': 'Preset selection: auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'Default controller, hotKey, animate, and gesture bundles', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex and other UI knobs', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget and other UI knobs', 'docs.search.desc.propsController': 'Buttons, placement, and custom controller render', 'docs.search.desc.propsHotkey': 'Keyboard shortcuts: ESC / Space / arrows', 'docs.search.desc.propsAnimate': 'Browsing and flip animations', @@ -488,10 +494,13 @@ export const en: I18nDict = { 'docs.section.props.wrapperScope.title': 'Wrapper mode prop scope', 'docs.section.props.wrapperScope.intro': ' does not render the cover image itself. It binds existing descendant nodes, so a few props have wrapper-specific meaning.', 'docs.section.props.wrapperScope.data': 'src and alt should live on the child . Top-level src / alt are overridden by the clicked DOM node. caption may be read from data-zmage-caption or the nearest figcaption when no set is supplied.', - 'docs.section.props.wrapperScope.config': 'set and defaultPage are supported for an explicit shared gallery. When the clicked img src appears in set, Wrapper opens that matching index; defaultPage is only the fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, and loadingDelay apply normally.', + 'docs.section.props.wrapperScope.config': 'set and defaultPage are supported for an explicit shared gallery. When the clicked img src appears in set, Wrapper opens that matching index; defaultPage is only the fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, and loadingDelay apply normally.', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing, onZooming, onSwitching, onRotating, and onError work because Wrapper opens the same viewer internally.', 'docs.section.props.wrapperScope.controlled': 'browsing is component-controlled state and does not control Wrapper. To open from your own state, use component mode or call Zmage.browsing() yourself.', 'docs.section.props.interface': 'Interface & interaction', + 'docs.section.props.portalTarget.title': 'Custom Portal target', + 'docs.section.props.portalTarget.body': 'By default, the viewer layer mounts into document.body. If your app already has an overlay root, modal root, shadow host, or micro-frontend shell container, pass that element to portalTarget so stacking, style scope, and host lifecycle stay under your app shell.', + 'docs.section.props.portalTarget.boundary': 'portalTarget changes only the DOM parent. The viewer still uses fullscreen fixed positioning and is not clipped into a local preview; use zIndex when you need to adjust stacking.', 'docs.section.props.controller.keyHeader': 'Key', 'docs.section.props.controller.descHeader': 'Description', 'docs.section.props.controller.umbrella': 'rotate is the umbrella for rotateLeft / rotateRight — enabling it shows both buttons. flip works the same way over flipLeft / flipRight.', @@ -529,6 +538,9 @@ export const en: I18nDict = { 'docs.section.examples.controllerBody': 'Place the controller at a screen edge, or replace the full UI with a render callback that receives state and actions.', 'docs.section.examples.coverTitle': 'Cropped cover', 'docs.section.examples.coverBody': 'Put object-fit and border radius on the cover img itself so the opening frame can match the visible crop.', + 'docs.section.examples.portalTargetTitle': 'Mount into a host overlay root', + 'docs.section.examples.portalTargetBody': 'When the page has a shared overlay container, pass that DOM node to portalTarget. The example is still fullscreen; only the Portal parent changes to the host root.', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': 'Types are co-located with the runtime export. The full prop union is BaseType:', diff --git a/packages/home/src/i18n/es.ts b/packages/home/src/i18n/es.ts index 0526b77..2f973fe 100644 --- a/packages/home/src/i18n/es.ts +++ b/packages/home/src/i18n/es.ts @@ -199,6 +199,10 @@ export const es: I18nDict = { 'pg.code.hideDefaults': 'Ocultar valores por defecto', 'pg.copy': 'Copiar', 'pg.copied': 'Copiado', + 'pg.portalTarget.title': 'Destino Portal personalizado', + 'pg.portalTarget.body': 'Para apps que ya tienen un overlay root, modal root o contenedor de micro-frontend. Al hacer clic en la imagen de la derecha, el visor se monta ahí en vez de document.body.', + 'pg.portalTarget.root': 'Overlay root anfitrión', + 'pg.portalTarget.imageAlt': 'Imagen de demostración de portalTarget', 'group.data': 'Datos', 'group.preset': 'Preset', @@ -388,6 +392,8 @@ export const es: I18nDict = { 'param.backdrop.desc': 'Color de fondo del visor. Cualquier color CSS válido.', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': 'Nivel de apilamiento del visor.', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': 'Elemento DOM usado como destino de montaje del Portal del visor. Por defecto es document.body. Úsalo con un overlay root, modal root o contenedor de micro-frontend; solo cambia el padre de montaje y el visor sigue usando fixed a pantalla completa.', 'param.radius.label': 'radius', 'param.radius.desc': 'Radio de las esquinas de la imagen (px).', 'param.edge.label': 'edge', @@ -463,7 +469,7 @@ export const es: I18nDict = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': 'Selección de preset: auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'Valores por defecto de controller, hotKey, animate y gesture', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex y otros ajustes de UI', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget y otros ajustes de UI', 'docs.search.desc.propsController': 'Botones, posición y render personalizado de la barra de control', 'docs.search.desc.propsHotkey': 'Atajos de teclado: ESC / Espacio / flechas', 'docs.search.desc.propsAnimate': 'Animaciones de navegación y paso de página', @@ -480,10 +486,13 @@ export const es: I18nDict = { 'docs.section.props.wrapperScope.title': 'Alcance de props en modo Wrapper', 'docs.section.props.wrapperScope.intro': ' no renderiza por sí mismo la imagen de portada. Enlaza nodos descendientes ya existentes, así que algunas props tienen significado propio en este modo.', 'docs.section.props.wrapperScope.data': 'src y alt deben estar en el hijo. Los src / alt de nivel superior son sobrescritos por el nodo DOM pulsado. Si no se pasa set, caption puede leerse desde data-zmage-caption o desde la figcaption más cercana.', - 'docs.section.props.wrapperScope.config': 'set y defaultPage son compatibles para una galería compartida explícita. Cuando el src del img pulsado aparece en set, Wrapper abre ese índice; defaultPage queda solo como fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick y loadingDelay se aplican normalmente.', + 'docs.section.props.wrapperScope.config': 'set y defaultPage son compatibles para una galería compartida explícita. Cuando el src del img pulsado aparece en set, Wrapper abre ese índice; defaultPage queda solo como fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick y loadingDelay se aplican normalmente.', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing, onZooming, onSwitching, onRotating y onError funcionan porque Wrapper abre internamente el mismo visor.', 'docs.section.props.wrapperScope.controlled': 'browsing es el estado controlado del modo componente y no controla Wrapper. Para abrir desde tu propio estado, usa el modo componente o llama a Zmage.browsing() directamente.', 'docs.section.props.interface': 'Interfaz e interacción', + 'docs.section.props.portalTarget.title': 'Destino Portal personalizado', + 'docs.section.props.portalTarget.body': 'Por defecto, la capa del visor se monta en document.body. Si tu app ya tiene un overlay root, modal root, shadow host o contenedor shell de micro-frontend, pasa ese elemento a portalTarget para mantener el apilamiento, el alcance de estilos y el ciclo de vida dentro del shell anfitrión.', + 'docs.section.props.portalTarget.boundary': 'portalTarget solo cambia el padre DOM. El visor sigue usando fixed a pantalla completa y no se recorta como una vista previa local; usa zIndex para ajustar el apilamiento.', 'docs.section.props.controller.keyHeader': 'Clave', 'docs.section.props.controller.descHeader': 'Descripción', 'docs.section.props.controller.umbrella': 'rotate es el interruptor maestro de rotateLeft / rotateRight — al activarlo se muestran ambos botones. flip funciona de la misma forma sobre flipLeft / flipRight.', @@ -521,6 +530,9 @@ export const es: I18nDict = { 'docs.section.examples.controllerBody': 'Coloca el controlador en un borde de la pantalla o reemplaza toda la UI con un callback render que recibe state y actions.', 'docs.section.examples.coverTitle': 'Portada recortada', 'docs.section.examples.coverBody': 'Pon object-fit y border radius en el img de portada para que el primer frame coincida con el recorte visible.', + 'docs.section.examples.portalTargetTitle': 'Montar en un overlay root anfitrión', + 'docs.section.examples.portalTargetBody': 'Cuando la página tiene un contenedor de overlays compartido, pasa ese nodo DOM a portalTarget. El ejemplo sigue siendo de pantalla completa; solo cambia el padre del Portal.', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': 'Los tipos están junto al export de runtime. La unión completa de props es BaseType:', diff --git a/packages/home/src/i18n/fr.ts b/packages/home/src/i18n/fr.ts index 9ef6fb3..a17b8a1 100644 --- a/packages/home/src/i18n/fr.ts +++ b/packages/home/src/i18n/fr.ts @@ -199,6 +199,10 @@ export const fr: I18nDict = { 'pg.code.hideDefaults': 'Masquer les valeurs par défaut', 'pg.copy': 'Copier', 'pg.copied': 'Copié', + 'pg.portalTarget.title': 'Cible Portal personnalisée', + 'pg.portalTarget.body': 'Pour les apps qui possèdent déjà une racine d\'overlay, de modale ou de micro-frontend. Cliquez l\'image à droite: la visionneuse s\'y monte au lieu de document.body.', + 'pg.portalTarget.root': 'Racine overlay hôte', + 'pg.portalTarget.imageAlt': 'Image de démonstration portalTarget', 'group.data': 'Données', 'group.preset': 'Préréglage', @@ -388,6 +392,8 @@ export const fr: I18nDict = { 'param.backdrop.desc': 'Couleur de fond de la visionneuse. Toute couleur CSS valide.', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': 'Niveau d\'empilement de la visionneuse.', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': 'Élément DOM utilisé comme cible de montage du Portal. Par défaut: document.body. À utiliser avec une racine d\'overlay, de modale ou de micro-frontend; seul le parent de montage change, la visionneuse reste en fixed plein écran.', 'param.radius.label': 'radius', 'param.radius.desc': 'Rayon des coins de l\'image (px).', 'param.edge.label': 'edge', @@ -463,7 +469,7 @@ export const fr: I18nDict = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': 'Choix de préréglage : auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'Valeurs par défaut de controller, hotKey, animate et gesture', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex et autres réglages d\'UI', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget et autres réglages d\'UI', 'docs.search.desc.propsController': 'Boutons, position et rendu personnalisé de la barre de contrôle', 'docs.search.desc.propsHotkey': 'Raccourcis clavier : ESC / Espace / flèches', 'docs.search.desc.propsAnimate': 'Animations de navigation et de changement de page', @@ -480,10 +486,13 @@ export const fr: I18nDict = { 'docs.section.props.wrapperScope.title': 'Portée des props en mode Wrapper', 'docs.section.props.wrapperScope.intro': ' ne rend pas lui-même l\'image de couverture. Il lie des nœuds descendants déjà présents ; certaines props ont donc une signification propre en mode Wrapper.', 'docs.section.props.wrapperScope.data': 'src et alt doivent être placés sur le enfant. Les src / alt de premier niveau sont remplacés par le nœud DOM cliqué. Sans set, caption peut être lue depuis data-zmage-caption ou depuis la figcaption la plus proche.', - 'docs.section.props.wrapperScope.config': 'set et defaultPage sont pris en charge pour une galerie partagée explicite. Quand le src du img cliqué apparaît dans set, Wrapper ouvre l\'index correspondant ; defaultPage ne sert que de fallback. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick et loadingDelay s\'appliquent normalement.', + 'docs.section.props.wrapperScope.config': 'set et defaultPage sont pris en charge pour une galerie partagée explicite. Quand le src du img cliqué apparaît dans set, Wrapper ouvre l\'index correspondant ; defaultPage ne sert que de fallback. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick et loadingDelay s\'appliquent normalement.', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing, onZooming, onSwitching, onRotating et onError fonctionnent, car Wrapper ouvre la même visionneuse en interne.', 'docs.section.props.wrapperScope.controlled': 'browsing est l\'état contrôlé du mode composant et ne contrôle pas Wrapper. Pour ouvrir depuis votre propre état, utilisez le mode composant ou appelez Zmage.browsing() vous-même.', 'docs.section.props.interface': 'Interface et interaction', + 'docs.section.props.portalTarget.title': 'Cible Portal personnalisée', + 'docs.section.props.portalTarget.body': 'Par défaut, la couche de visionneuse se monte dans document.body. Si votre app possède déjà une racine d\'overlay, de modale, un shadow host ou un conteneur shell de micro-frontend, passez cet élément à portalTarget afin de garder le stacking, le scope de styles et le cycle de vie côté hôte.', + 'docs.section.props.portalTarget.boundary': 'portalTarget ne change que le parent DOM. La visionneuse reste en fixed plein écran et n\'est pas découpée en aperçu local; utilisez zIndex pour ajuster l\'empilement.', 'docs.section.props.controller.keyHeader': 'Clé', 'docs.section.props.controller.descHeader': 'Description', 'docs.section.props.controller.umbrella': 'rotate est le commutateur parent de rotateLeft / rotateRight — l\'activer affiche les deux boutons. flip fonctionne de la même manière sur flipLeft / flipRight.', @@ -521,6 +530,9 @@ export const fr: I18nDict = { 'docs.section.examples.controllerBody': 'Place le controleur sur un bord de l\'ecran ou remplace toute l\'UI avec un callback render qui recoit state et actions.', 'docs.section.examples.coverTitle': 'Couverture recadree', 'docs.section.examples.coverBody': 'Place object-fit et border radius sur le img de couverture pour que la premiere frame corresponde au recadrage visible.', + 'docs.section.examples.portalTargetTitle': 'Monter dans une racine overlay hôte', + 'docs.section.examples.portalTargetBody': 'Quand la page a un conteneur d\'overlay partagé, passez ce nœud DOM à portalTarget. L\'exemple reste plein écran; seul le parent du Portal devient la racine hôte.', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': 'Les types sont co-localisés avec l\'export d\'exécution. Le type union complet des props est BaseType :', diff --git a/packages/home/src/i18n/ja.ts b/packages/home/src/i18n/ja.ts index db61b4b..9f052d2 100644 --- a/packages/home/src/i18n/ja.ts +++ b/packages/home/src/i18n/ja.ts @@ -199,6 +199,10 @@ export const ja: I18nDict = { 'pg.code.hideDefaults': 'デフォルト値を非表示', 'pg.copy': 'コピー', 'pg.copied': 'コピーしました', + 'pg.portalTarget.title': 'カスタム Portal ターゲット', + 'pg.portalTarget.body': 'アプリ側に overlay root、modal root、micro-frontend コンテナがある場合に使います。右の画像をクリックすると、ビューアは document.body ではなくその root にマウントされます。', + 'pg.portalTarget.root': 'ホスト側 overlay root', + 'pg.portalTarget.imageAlt': 'portalTarget デモ画像', 'group.data': 'データ', 'group.preset': 'プリセット', @@ -388,6 +392,8 @@ export const ja: I18nDict = { 'param.backdrop.desc': 'ビューアの背景色。任意の有効な CSS カラー文字列。', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': 'ビューアの重ね順。', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': 'ビューア Portal のマウント先 DOM 要素。既定は document.body。アプリの overlay root、modal root、micro-frontend コンテナに接続するための設定で、変わるのはマウント親だけです。ビューアは引き続き fixed の全画面レイアウトです。', 'param.radius.label': 'radius', 'param.radius.desc': '画像の角丸(px)。', 'param.edge.label': 'edge', @@ -463,7 +469,7 @@ export const ja: I18nDict = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': 'プリセット選択: auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'controller / hotKey / animate / gesture のデフォルトセット', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex などの UI パラメータ', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget などの UI パラメータ', 'docs.search.desc.propsController': 'コントロールバーのボタン、配置、カスタム render', 'docs.search.desc.propsHotkey': 'キーボードショートカット: ESC / Space / 矢印キー', 'docs.search.desc.propsAnimate': '閲覧アニメーションとページ送りアニメーション', @@ -480,10 +486,13 @@ export const ja: I18nDict = { 'docs.section.props.wrapperScope.title': 'Wrapper モードの prop 範囲', 'docs.section.props.wrapperScope.intro': ' はカバー画像自体をレンダリングしません。既存の子孫 ノードにビューアを結び付けるため、一部の prop は Wrapper モード固有の意味を持ちます。', 'docs.section.props.wrapperScope.data': 'src と alt は子の に置きます。トップレベルの src / alt は、クリックされた DOM ノードの値で上書きされます。set がない場合、caption は data-zmage-caption または最も近い figcaption から読み取れます。', - 'docs.section.props.wrapperScope.config': 'set と defaultPage は明示的な共有ギャラリーに使えます。クリックされた img の src が set に含まれる場合、Wrapper は対応する index を開きます。defaultPage は fallback です。preset、controller、hotKey、animate、backdrop、zIndex、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay は通常どおり適用されます。', + 'docs.section.props.wrapperScope.config': 'set と defaultPage は明示的な共有ギャラリーに使えます。クリックされた img の src が set に含まれる場合、Wrapper は対応する index を開きます。defaultPage は fallback です。preset、controller、hotKey、animate、backdrop、zIndex、portalTarget、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay は通常どおり適用されます。', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing、onZooming、onSwitching、onRotating、onError は動作します。Wrapper 内部で同じビューアを開くためです。', 'docs.section.props.wrapperScope.controlled': 'browsing はコンポーネントモードの controlled state であり、Wrapper は制御しません。外部 state から開きたい場合は、コンポーネントモードを使うか Zmage.browsing() を直接呼び出してください。', 'docs.section.props.interface': 'インターフェースとインタラクション', + 'docs.section.props.portalTarget.title': 'カスタム Portal ターゲット', + 'docs.section.props.portalTarget.body': '既定ではビューア層は document.body にマウントされます。アプリに overlay root、modal root、shadow host、micro-frontend shell コンテナがある場合は、その要素を portalTarget に渡すことで、重ね順、スタイルのスコープ、ホスト側のライフサイクル管理をアプリシェル側に残せます。', + 'docs.section.props.portalTarget.boundary': 'portalTarget は DOM の親だけを変えます。ビューアは fixed の全画面レイアウトのままで、ローカルプレビューのようにコンテナ内へ切り抜かれません。重ね順の調整には zIndex を使ってください。', 'docs.section.props.controller.keyHeader': 'キー', 'docs.section.props.controller.descHeader': '説明', 'docs.section.props.controller.umbrella': 'rotate は rotateLeft / rotateRight の親スイッチで、有効にすると両方のボタンが表示されます。flip も flipLeft / flipRight に対して同様に動作します。', @@ -521,6 +530,9 @@ export const ja: I18nDict = { 'docs.section.examples.controllerBody': 'コントローラーを画面端へ移動したり、state と actions を受け取る render コールバックで UI 全体を差し替えられます。', 'docs.section.examples.coverTitle': 'クロップされたカバー', 'docs.section.examples.coverBody': 'object-fit と border radius をカバー img 自体に置くと、開く最初のフレームが見えている切り抜きに一致します。', + 'docs.section.examples.portalTargetTitle': 'ホストの overlay root にマウント', + 'docs.section.examples.portalTargetBody': 'ページに共有 overlay コンテナがある場合、その DOM ノードを portalTarget に渡します。例は引き続き全画面ビューアで、変わるのは Portal の親だけです。', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': '型はランタイムのエクスポートと同じ場所に置かれています。完全な prop ユニオン型は BaseType です:', diff --git a/packages/home/src/i18n/ko.ts b/packages/home/src/i18n/ko.ts index 62870ba..8b40289 100644 --- a/packages/home/src/i18n/ko.ts +++ b/packages/home/src/i18n/ko.ts @@ -199,6 +199,10 @@ export const ko: I18nDict = { 'pg.code.hideDefaults': '기본값 숨기기', 'pg.copy': '복사', 'pg.copied': '복사됨', + 'pg.portalTarget.title': '사용자 지정 Portal 대상', + 'pg.portalTarget.body': '앱에 overlay root, modal root, micro-frontend 컨테이너가 이미 있을 때 사용합니다. 오른쪽 이미지를 클릭하면 뷰어가 document.body 대신 그 root 아래에 마운트됩니다.', + 'pg.portalTarget.root': '호스트 overlay root', + 'pg.portalTarget.imageAlt': 'portalTarget 데모 이미지', 'group.data': '데이터', 'group.preset': '프리셋', @@ -388,6 +392,8 @@ export const ko: I18nDict = { 'param.backdrop.desc': '뷰어 배경색. 유효한 CSS 색상 문자열이면 됩니다.', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': '뷰어의 쌓임 순서.', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': '뷰어 Portal을 마운트할 DOM 요소입니다. 기본값은 document.body입니다. 앱의 overlay root, modal root, micro-frontend 컨테이너에 연결할 때 사용하며, 마운트 부모만 바뀌고 뷰어는 여전히 fixed 전체 화면 레이아웃을 사용합니다.', 'param.radius.label': 'radius', 'param.radius.desc': '이미지 모서리 반경 (px).', 'param.edge.label': 'edge', @@ -463,7 +469,7 @@ export const ko: I18nDict = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': '프리셋 선택: auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'controller / hotKey / animate / gesture 기본 묶음', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex 등 UI 옵션', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget 등 UI 옵션', 'docs.search.desc.propsController': '컨트롤 바 버튼, 위치, 사용자 지정 render', 'docs.search.desc.propsHotkey': '키보드 단축키: ESC / Space / 화살표', 'docs.search.desc.propsAnimate': '브라우징 및 페이지 이동 애니메이션', @@ -480,10 +486,13 @@ export const ko: I18nDict = { 'docs.section.props.wrapperScope.title': 'Wrapper 모드의 prop 범위', 'docs.section.props.wrapperScope.intro': '는 커버 이미지를 직접 렌더링하지 않습니다. 이미 존재하는 하위 노드에 뷰어를 연결하므로, 일부 prop은 Wrapper 모드에서 별도의 의미를 갖습니다.', 'docs.section.props.wrapperScope.data': 'src와 alt는 자식 에 둡니다. 최상위 src / alt는 클릭된 DOM 노드 값으로 덮어써집니다. set이 없을 때는 caption을 data-zmage-caption 또는 가장 가까운 figcaption에서 읽을 수 있습니다.', - 'docs.section.props.wrapperScope.config': 'set과 defaultPage는 명시적인 공유 갤러리에 사용할 수 있습니다. 클릭된 img src가 set에 있으면 Wrapper는 해당 index를 열고, defaultPage는 fallback으로만 쓰입니다. preset, controller, hotKey, animate, backdrop, zIndex, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, loadingDelay는 평소처럼 적용됩니다.', + 'docs.section.props.wrapperScope.config': 'set과 defaultPage는 명시적인 공유 갤러리에 사용할 수 있습니다. 클릭된 img src가 set에 있으면 Wrapper는 해당 index를 열고, defaultPage는 fallback으로만 쓰입니다. preset, controller, hotKey, animate, backdrop, zIndex, portalTarget, radius, edge, loop, coverVisible, hideOnScroll, hideOnDblClick, loadingDelay는 평소처럼 적용됩니다.', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing, onZooming, onSwitching, onRotating, onError는 정상 동작합니다. Wrapper 내부에서 같은 뷰어를 열기 때문입니다.', 'docs.section.props.wrapperScope.controlled': 'browsing은 컴포넌트 모드의 controlled state이며 Wrapper를 제어하지 않습니다. 외부 state로 열고 싶다면 컴포넌트 모드를 쓰거나 Zmage.browsing()을 직접 호출하세요.', 'docs.section.props.interface': '인터페이스 및 인터랙션', + 'docs.section.props.portalTarget.title': '사용자 지정 Portal 대상', + 'docs.section.props.portalTarget.body': '기본적으로 뷰어 레이어는 document.body에 마운트됩니다. 앱에 overlay root, modal root, shadow host, micro-frontend shell 컨테이너가 있다면 그 요소를 portalTarget에 넘겨 쌓임 순서, 스타일 범위, 호스트 생명주기를 앱 셸 안에서 관리할 수 있습니다.', + 'docs.section.props.portalTarget.boundary': 'portalTarget은 DOM 부모만 바꿉니다. 뷰어는 여전히 fixed 전체 화면 레이아웃을 사용하며 로컬 미리보기처럼 컨테이너 안으로 잘리지 않습니다. 쌓임 순서를 조정할 때는 zIndex를 사용하세요.', 'docs.section.props.controller.keyHeader': '키', 'docs.section.props.controller.descHeader': '설명', 'docs.section.props.controller.umbrella': 'rotate는 rotateLeft / rotateRight의 상위 스위치로, 활성화하면 두 버튼이 모두 표시됩니다. flip도 flipLeft / flipRight에 대해 동일하게 동작합니다.', @@ -521,6 +530,9 @@ export const ko: I18nDict = { 'docs.section.examples.controllerBody': '컨트롤러를 화면 가장자리로 옮기거나 state와 actions를 받는 render 콜백으로 전체 UI를 교체할 수 있습니다.', 'docs.section.examples.coverTitle': '잘린 커버', 'docs.section.examples.coverBody': 'object-fit과 border radius를 커버 img 자체에 두면 열리는 첫 프레임이 보이는 크롭과 맞춰집니다.', + 'docs.section.examples.portalTargetTitle': '호스트 overlay root에 마운트', + 'docs.section.examples.portalTargetBody': '페이지에 공유 overlay 컨테이너가 있다면 그 DOM 노드를 portalTarget에 넘깁니다. 예시는 여전히 전체 화면 뷰어이며, Portal의 부모만 호스트 root로 바뀝니다.', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': '타입은 런타임 export와 같은 위치에 있습니다. 전체 prop 유니온 타입은 BaseType입니다:', diff --git a/packages/home/src/i18n/zh-CN.ts b/packages/home/src/i18n/zh-CN.ts index de4a513..7f687a7 100644 --- a/packages/home/src/i18n/zh-CN.ts +++ b/packages/home/src/i18n/zh-CN.ts @@ -207,6 +207,10 @@ export const zhCN = { 'pg.code.hideDefaults': '隐藏默认值', 'pg.copy': '复制', 'pg.copied': '已复制', + 'pg.portalTarget.title': '自定义 Portal 挂载点', + 'pg.portalTarget.body': '适合已有 overlay root、modal root 或微前端容器的应用。点击右侧图片时,查看器会挂到这个 root 下,而不是默认 document.body。', + 'pg.portalTarget.root': '宿主应用的 overlay root', + 'pg.portalTarget.imageAlt': 'Portal 挂载点演示图片', // Group labels 'group.data': '数据', @@ -405,6 +409,8 @@ export const zhCN = { 'param.backdrop.desc': '查看器背景颜色,任意有效 CSS 颜色字符串。', 'param.zIndex.label': 'zIndex', 'param.zIndex.desc': '查看器层级。', + 'param.portalTarget.label': 'portalTarget', + 'param.portalTarget.desc': '查看器 Portal 的 DOM 挂载目标,默认 document.body。用于宿主应用已有 overlay root、modal root 或微前端容器的场景;它只改变挂载父节点,查看器仍是 fixed 全屏布局。', 'param.radius.label': 'radius', 'param.radius.desc': '图片圆角,单位 px。', 'param.edge.label': 'edge', @@ -489,7 +495,7 @@ export const zhCN = { 'docs.search.desc.propsData': 'src · alt · caption · set · defaultPage', 'docs.search.desc.propsPreset': '预设选择: auto / desktop / mobile', 'docs.search.desc.propsPresetBundles': 'controller、hotKey、animate 与 gesture 的默认组合', - 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex 等界面参数', + 'docs.search.desc.propsInterface': 'backdrop · radius · edge · loop · zIndex · portalTarget 等界面参数', 'docs.search.desc.propsController': '控制栏按钮、位置和自定义渲染', 'docs.search.desc.propsHotkey': '快捷键: ESC / 空格 / 方向键', 'docs.search.desc.propsAnimate': '浏览动画与翻页动画', @@ -506,10 +512,13 @@ export const zhCN = { 'docs.section.props.wrapperScope.title': 'Wrapper 模式下的参数范围', 'docs.section.props.wrapperScope.intro': ' 自己不渲染封面图,而是给已有的子级 绑定查看器。因此有些参数在包裹器模式下有不同语义。', 'docs.section.props.wrapperScope.data': 'src 和 alt 应放在子级 上。顶层 src / alt 会被点击的 DOM 节点覆盖。不传 set 时,caption 可从 data-zmage-caption 或最近的 figcaption 读取。', - 'docs.section.props.wrapperScope.config': 'set 和 defaultPage 可用于显式共享图库。若被点击图片的 src 出现在 set 中,Wrapper 会打开匹配索引;defaultPage 只作为兜底。preset、controller、hotKey、animate、backdrop、zIndex、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay 正常生效。', + 'docs.section.props.wrapperScope.config': 'set 和 defaultPage 可用于显式共享图库。若被点击图片的 src 出现在 set 中,Wrapper 会打开匹配索引;defaultPage 只作为兜底。preset、controller、hotKey、animate、backdrop、zIndex、portalTarget、radius、edge、loop、coverVisible、hideOnScroll、hideOnDblClick、loadingDelay 正常生效。', 'docs.section.props.wrapperScope.lifecycle': 'onBrowsing、onZooming、onSwitching、onRotating、onError 正常生效,因为 Wrapper 内部打开的是同一个查看器。', 'docs.section.props.wrapperScope.controlled': 'browsing 是组件模式的受控态,不能控制 Wrapper。需要用外部状态打开时,使用组件模式,或自行调用 Zmage.browsing()。', 'docs.section.props.interface': '界面与交互', + 'docs.section.props.portalTarget.title': '自定义 Portal 挂载点', + 'docs.section.props.portalTarget.body': '默认情况下,浏览层挂到 document.body。若你的应用已经有统一的 overlay root、modal root、shadow host 或微前端 shell 容器,可以把该元素传给 portalTarget,方便统一管理层级、样式作用域和宿主框架的生命周期。', + 'docs.section.props.portalTarget.boundary': 'portalTarget 只改变 DOM 父节点。查看器仍使用 fixed 全屏布局,不会被挂载容器裁剪成局部预览;需要调整遮罩层级时继续使用 zIndex。', 'docs.section.props.controller.keyHeader': '名称', 'docs.section.props.controller.descHeader': '说明', 'docs.section.props.controller.umbrella': 'rotate 是 rotateLeft / rotateRight 的组合开关 — 启用时同时显示左右两个旋转按钮;flip 与 flipLeft / flipRight 同理。', @@ -547,6 +556,9 @@ export const zhCN = { 'docs.section.examples.controllerBody': '可以把控制器放到屏幕边缘,也可以用 render 回调完全替换 UI,回调会收到 state 和 actions。', 'docs.section.examples.coverTitle': '裁剪封面', 'docs.section.examples.coverBody': '把 object-fit 和圆角放在封面 img 本身,打开时的首帧就能匹配封面可见裁切区域。', + 'docs.section.examples.portalTargetTitle': '挂到宿主 overlay root', + 'docs.section.examples.portalTargetBody': '当页面有统一的弹层容器时,把该 DOM 节点传给 portalTarget。示例仍是全屏查看器,只是 Portal 的父节点换成了宿主 root。', + 'docs.section.examples.portalTargetRoot': 'app-overlay-root', 'docs.section.typescript.title': 'TypeScript', 'docs.section.typescript.intro': '类型与运行时导出位于同一处,完整的属性联合类型为 BaseType:', diff --git a/packages/home/src/playground/ParamPanel.tsx b/packages/home/src/playground/ParamPanel.tsx index 38a9da3..a4c3b46 100644 --- a/packages/home/src/playground/ParamPanel.tsx +++ b/packages/home/src/playground/ParamPanel.tsx @@ -48,7 +48,7 @@ type Props = { onChange: (name: string, value: any) => void } -function renderControl (def: ParamDef, value: any, onChange: (v: any) => void) { +function renderControl (def: ParamDef, value: any, onChange: (v: any) => void, t: (key: I18nKey) => string) { const c = def.control if (c.kind === 'object') { if (c.component === 'controller') return @@ -60,6 +60,13 @@ function renderControl (def: ParamDef, value: any, onChange: (v: any) => void) { if (c.kind === 'callback') { return } + if (c.kind === 'readonly') { + return ( +
+ {t(def.i18n.descKey)} +
+ ) + } return } @@ -121,7 +128,7 @@ export function ParamPanel ({ values, onChange }: Props) { {def.presetScope && }
-
{renderControl(def, values[def.name], (v) => onChange(def.name, v))}
+
{renderControl(def, values[def.name], (v) => onChange(def.name, v), t)}
))} diff --git a/packages/home/src/playground/PortalTargetScenario.tsx b/packages/home/src/playground/PortalTargetScenario.tsx new file mode 100644 index 0000000..cb0a4c4 --- /dev/null +++ b/packages/home/src/playground/PortalTargetScenario.tsx @@ -0,0 +1,47 @@ +import * as React from 'react' +import Zmage from 'react-zmage' +import { useT } from '@/i18n/useT' +import { useThemedBackdrop } from '@/lib/themedBackdrop' +import { siteZmageAnimate } from '@/lib/zmageSiteConfig' + +const SCENARIO_SET = [ + { src: '/imgSet/childsDream/8.jpg', alt: 'Portal target demo 1' }, + { src: '/imgSet/childsDream/7.jpg', alt: 'Portal target demo 2' }, +] + +export function PortalTargetScenario () { + const { t } = useT() + const backdrop = useThemedBackdrop() + const [portalTarget, setPortalTarget] = React.useState(null) + const setPortalRoot = React.useCallback((node: HTMLDivElement | null) => { + setPortalTarget(prev => prev === node ? prev : node) + }, []) + + return ( +
+
+
{t('pg.portalTarget.title')}
+

+ {t('pg.portalTarget.body')} +

+

+ portalTarget={"{viewerRoot}"} +

+
+
+
+ {t('pg.portalTarget.root')} +
+ +
+
+ ) +} diff --git a/packages/home/src/playground/shareState.ts b/packages/home/src/playground/shareState.ts index 05564c1..050f532 100644 --- a/packages/home/src/playground/shareState.ts +++ b/packages/home/src/playground/shareState.ts @@ -22,8 +22,9 @@ export function decodeStateFromHash (hash: string): Record { if (!q) return out const params = new URLSearchParams(q) for (const [k, raw] of params) { + const def = PARAM_SCHEMA.find(d => d.name === k) + if (!def || def.docsOnly) continue if (raw === '__log__') { - const def = PARAM_SCHEMA.find(d => d.name === k) if (def?.control.kind === 'callback') { const fn: any = (...args: any[]) => { window.dispatchEvent(new CustomEvent('zmage-pg-event', { detail: { name: k, args } })) diff --git a/packages/home/src/playground/state.ts b/packages/home/src/playground/state.ts index d30e577..9ad712f 100644 --- a/packages/home/src/playground/state.ts +++ b/packages/home/src/playground/state.ts @@ -105,7 +105,10 @@ export function detectActivePreset (values: Record): DataPreset['id export function getInitialValues (): Record { const v: Record = {} - for (const def of PARAM_SCHEMA) v[def.name] = def.default + for (const def of PARAM_SCHEMA) { + if (def.docsOnly) continue + v[def.name] = def.default + } applyPresetDrivenDefaults(v) Object.assign(v, PLAYGROUND_SEED) applySiteSlowMotionDefault(v) @@ -154,6 +157,7 @@ export function buildLibProps ( ): Record { const out: Record = {} for (const def of PARAM_SCHEMA) { + if (def.docsOnly) continue const v = values[def.name] if (def.required) { out[def.name] = v ?? ''; continue } if (v === undefined) continue @@ -172,6 +176,7 @@ export function diffFromInitial (values: Record): Record = {} for (const def of PARAM_SCHEMA) { + if (def.docsOnly) continue const k = def.name const v = values[k] if (v === undefined) continue diff --git a/packages/home/src/routes/Playground.tsx b/packages/home/src/routes/Playground.tsx index 3d9ce7d..6cc0e43 100644 --- a/packages/home/src/routes/Playground.tsx +++ b/packages/home/src/routes/Playground.tsx @@ -7,6 +7,7 @@ import { cn } from '@/lib/utils' import { ParamPanel } from '@/playground/ParamPanel' import { CodeSnippet, type Mode as PlaygroundMode } from '@/playground/CodeSnippet' import { EventLog } from '@/playground/EventLog' +import { PortalTargetScenario } from '@/playground/PortalTargetScenario' import { SlidingPill } from '@/components/ui/SlidingPill' import { encodeStateToHash, decodeStateFromHash } from '@/playground/shareState' import { applyPresetDrivenDefaults, applySiteSlowMotionDefault, getInitialValues } from '@/playground/state' @@ -130,7 +131,8 @@ export default function Playground () {
-
+
+
} /> diff --git a/packages/home/src/schema/param-schema.ts b/packages/home/src/schema/param-schema.ts index 434fcba..be6a42d 100644 --- a/packages/home/src/schema/param-schema.ts +++ b/packages/home/src/schema/param-schema.ts @@ -102,6 +102,7 @@ export type ControlKind = | { kind: 'segmented'; options: { value: string; labelKey: I18nKey }[] } | { kind: 'object'; component: 'controller' | 'hotkey' | 'animate' | 'gesture' | 'set' } | { kind: 'callback'; events: string[] } + | { kind: 'readonly'; type: string } export type ParamGroup = | 'data' | 'preset' | 'interface' | 'controller' | 'hotkey' | 'animate' | 'gesture' | 'lifecycle' | 'controlled' @@ -110,6 +111,8 @@ export type ParamDef = { name: K group: ParamGroup default: unknown + defaultDisplay?: string + docsOnly?: boolean control: ControlKind i18n: { labelKey: I18nKey; descKey: I18nKey } presetScope?: PresetScope @@ -146,6 +149,8 @@ export const PARAM_SCHEMA: ParamDef[] = [ i18n: { labelKey: 'param.backdrop.label', descKey: 'param.backdrop.desc' } }, { name: 'zIndex', group: 'interface', default: defProp.zIndex, control: { kind: 'number' }, i18n: { labelKey: 'param.zIndex.label', descKey: 'param.zIndex.desc' } }, + { name: 'portalTarget', group: 'interface', default: undefined, defaultDisplay: 'document.body', docsOnly: true, control: { kind: 'readonly', type: 'HTMLElement | null' }, + i18n: { labelKey: 'param.portalTarget.label', descKey: 'param.portalTarget.desc' } }, { name: 'radius', group: 'interface', default: defaultPresetValues.radius, control: { kind: 'slider', min: 0, max: 32, step: 1 }, i18n: { labelKey: 'param.radius.label', descKey: 'param.radius.desc' } }, { name: 'edge', group: 'interface', default: defaultPresetValues.edge, control: { kind: 'slider', min: 0, max: 64, step: 1 }, diff --git a/packages/llms-eval/agent-onboarding/rubric.mjs b/packages/llms-eval/agent-onboarding/rubric.mjs index 532ff7e..51cdbaa 100644 --- a/packages/llms-eval/agent-onboarding/rubric.mjs +++ b/packages/llms-eval/agent-onboarding/rubric.mjs @@ -16,7 +16,7 @@ const VALID_PROPS = new Set([ 'src', 'alt', 'caption', 'set', 'defaultPage', 'preset', 'controller', 'hotKey', 'animate', 'gesture', - 'hideOnScroll', 'hideOnDblClick', 'coverVisible', 'backdrop', 'zIndex', 'radius', 'edge', 'loop', 'loadingDelay', + 'hideOnScroll', 'hideOnDblClick', 'coverVisible', 'backdrop', 'zIndex', 'portalTarget', 'radius', 'edge', 'loop', 'loadingDelay', 'onBrowsing', 'onZooming', 'onSwitching', 'onRotating', 'onError', 'browsing', 'className', 'style', 'id', 'onClick', 'onLoad', 'title', 'role', diff --git a/packages/llms-eval/eval.test.mjs b/packages/llms-eval/eval.test.mjs index de1361e..3af2e60 100644 --- a/packages/llms-eval/eval.test.mjs +++ b/packages/llms-eval/eval.test.mjs @@ -14,6 +14,8 @@ const globalTs = readFileSync(join(corePkgDir, 'src', 'types', 'global.ts'), 'ut const defaultTs = readFileSync(join(corePkgDir, 'src', 'types', 'default.ts'), 'utf8') const indexTs = readFileSync(join(corePkgDir, 'src', 'index.ts'), 'utf8') const imageUtilsTs = readFileSync(join(corePkgDir, 'src', 'components', 'Image', 'Image.utils.ts'), 'utf8') +const calleeTsx = readFileSync(join(corePkgDir, 'src', 'Zmage.callee.tsx'), 'utf8') +const browserTsx = readFileSync(join(corePkgDir, 'src', 'components', 'Browser', 'Browser.tsx'), 'utf8') // --- Static tests --- @@ -91,7 +93,7 @@ test('llms.txt tells agents to keep basic integrations minimal', () => { 'llms.txt should recommend Wrapper + set for existing image lists') assert.match(llmsTxt, /top-level `backdrop`/, 'llms.txt should allow only top-level backdrop as a default theme adjustment') - for (const prop of ['controller', 'controller.layout', 'edge', 'zIndex', 'animate', 'gesture', 'hotKey', 'radius', 'loop', 'coverVisible', 'hideOnScroll', 'hideOnDblClick']) { + for (const prop of ['controller', 'controller.layout', 'edge', 'zIndex', 'portalTarget', 'animate', 'gesture', 'hotKey', 'radius', 'loop', 'coverVisible', 'hideOnScroll', 'hideOnDblClick']) { assert.ok(llmsTxt.includes(`\`${prop}\``), `llms.txt minimal integration guidance should mention not setting ${prop} by default`) } @@ -202,6 +204,29 @@ test('loadingDelay prop wired across types, defaults and llms.txt', () => { assert.ok(line, 'no API-table row in llms.txt declares loadingDelay') }) +test('portalTarget prop wired across types, runtime and public docs', () => { + assert.match(globalTs, /\bportalTarget\?:\s*HTMLElement\s*\|\s*null\b/, + 'portalTarget missing in types/global.ts') + assert.match(defaultTs, /getConfigFromProps[\s\S]*?\bportalTarget\b/, + 'portalTarget should flow through getConfigFromProps in default.ts') + assert.match(calleeTsx, /props\.portalTarget\s*\?\?\s*document\.body/, + 'Zmage.browsing should append into portalTarget before falling back to document.body') + assert.match(browserTsx, /target=\{portalTarget\}/, + 'component mode should pass portalTarget into the Portal target') + + const line = llmsTxt.split('\n').find( + (row) => /^\s*\|\s*`portalTarget`\s*\|/.test(row) + ) + assert.ok(line, 'no API-table row in llms.txt declares portalTarget') + assert.match(line, /document\.body/, 'portalTarget row should document the default mount target') + assert.match(line, /overlay root|modal root|micro-frontend/, 'portalTarget row should document the intended host-app scenario') + assert.match(line, /fullscreen fixed positioning/, 'portalTarget row should preserve fullscreen fixed semantics') + assert.match(llmsTxt, /not clipped into a local preview/, + 'llms.txt should warn that portalTarget is not a local clipping boundary') + assert.match(llmsTxt, /[\s\S]*`portalTarget`/, + 'Wrapper scope guidance should include portalTarget') +}) + test('controller visual keys (backdrop + color) declared in ControllerSet and llms.txt', () => { // global.ts: ControllerSet declares the visual keys assert.match(globalTs, /export\s+interface\s+ControllerSet\b/, 'ControllerSet interface missing in types/global.ts') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55a1871..b4bc56c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4140,7 +4140,7 @@ packages: optional: true react-zmage@file:.pack/react-zmage-1.8.4.tgz: - resolution: {integrity: sha512-hlrpi58UqmQI8Muc8IQ2AxyVmYSV41x8oNUr7Pesn92/Ahzg9tvhrTIvGaK2Su9kjqRrF59Q713JoQ8ZBSHv0g==, tarball: file:.pack/react-zmage-1.8.4.tgz} + resolution: {integrity: sha512-WCxBfJ2bSJq8T24eRDPlkY5MU8dG1c9tDHvPAjRutBz60VMh5rmbjcuIZnlno1CA7XHqjdB9S4gKUJX/01geeg==, tarball: file:.pack/react-zmage-1.8.4.tgz} version: 1.8.4 peerDependencies: react: '>=16.8.0 <20' From bd931bd3adcc886b0cd66937d173ddd55b01a31e Mon Sep 17 00:00:00 2001 From: Caldis Date: Tue, 19 May 2026 00:25:41 +0800 Subject: [PATCH 3/3] fix: satisfy portalTarget playground lint --- docs/404.html | 2 +- docs/about/index.html | 2 +- docs/ai/index.html | 2 +- docs/assets/{index-yZwjA0O9.js => index-C8ce7pKE.js} | 2 +- docs/compare/index.html | 2 +- docs/contact/index.html | 2 +- docs/developers/index.html | 2 +- docs/docs/index.html | 2 +- docs/errors/index.html | 2 +- docs/index.html | 2 +- docs/playground/imperative/index.html | 2 +- docs/playground/index.html | 2 +- docs/playground/wrapper/index.html | 2 +- docs/privacy/index.html | 2 +- docs/rate-limits/index.html | 2 +- docs/status/index.html | 2 +- docs/use-cases/index.html | 2 +- packages/home/src/playground/PortalTargetScenario.tsx | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) rename docs/assets/{index-yZwjA0O9.js => index-C8ce7pKE.js} (98%) diff --git a/docs/404.html b/docs/404.html index d814884..0ba0856 100644 --- a/docs/404.html +++ b/docs/404.html @@ -184,7 +184,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/about/index.html b/docs/about/index.html index a7c029a..7841a7d 100644 --- a/docs/about/index.html +++ b/docs/about/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/ai/index.html b/docs/ai/index.html index 12d1258..a788aca 100644 --- a/docs/ai/index.html +++ b/docs/ai/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/assets/index-yZwjA0O9.js b/docs/assets/index-C8ce7pKE.js similarity index 98% rename from docs/assets/index-yZwjA0O9.js rename to docs/assets/index-C8ce7pKE.js index 7148d4c..ecba3eb 100644 --- a/docs/assets/index-yZwjA0O9.js +++ b/docs/assets/index-C8ce7pKE.js @@ -373,7 +373,7 @@ button.onclick = () => Zmage.browsing({ `)}function Q3(e,a){return typeof e=="string"&&e.trim()?e.trim():e&&typeof e=="object"&&typeof e.text=="string"&&e.text.trim()?e.text.trim():a||""}function Wp(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">").replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function J3(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function eP(e){const a=J3(e).slice(0,4);return a.length===0?"const html = `\n

CMS or markdown content with image tags.

\n`":["const html = `","

Rich text from a CMS, markdown renderer, or MDX pipeline.

",...a.map((s,l)=>{const d=Q3(s.caption,s.alt||`Image ${l+1}`);return["
",` ${Wp(s.alt||`,d?`
${Wp(d)}
`:"","
"].filter(Boolean).join(` `)}),"`"].join(` `)}function tP(e){const{src:a,alt:r,caption:s,browsing:l,...d}=e;return d}function oP(e,a,r){const s=Object.entries(a),l=[eP(e),""];if(s.length===0)l.push("");else{l.push("")}return l.push("
"),l.push(""),l.join(` -`)}function aP({values:e,touched:a,hideDefaults:r,onHideDefaultsChange:s,mode:l,compact:d=!1}){const{t:u}=be(),m=x=>u("snippet.overriddenByProp").replace("{umbrella}",x),h=sd(e,r?void 0:a),g=l==="wrapper"?tP(h):h,b=l==="component"?Y3(g,m):l==="imperative"?X3(g,m):oP(e,g,m),v=y.useId(),S=y.useId(),T=x=>c.jsxs("div",{className:"flex items-center gap-1.5 whitespace-nowrap",children:[c.jsx(jf,{htmlFor:x,className:"cursor-pointer text-[11px] text-muted-foreground",children:u("pg.code.hideDefaults")}),c.jsx(Xe,{id:x,checked:r,onCheckedChange:s,className:"scale-75 origin-right"})]}),C=T(v);return d?c.jsx(Rf,{title:u("pg.code.title"),description:u("pg.code.subtitle"),expandLabel:u("common.expand"),preview:c.jsx(Me,{code:b,language:"tsx",actions:C,className:"h-36",preClassName:"p-3 pr-44 text-xs leading-5"}),expanded:c.jsx(Me,{code:b,language:"tsx",actions:T(S),className:"h-[62dvh]"}),previewClassName:"p-2"}):c.jsx(Me,{code:b,language:"tsx",actions:C})}function $p({entries:e,emptyLabel:a,compact:r=!1}){return e.length===0?c.jsx("div",{className:"text-muted-foreground",children:a}):c.jsx(c.Fragment,{children:e.map((s,l)=>c.jsxs("div",{className:ie("grid gap-2",r?"grid-cols-[5.5rem_7rem_minmax(0,1fr)]":"grid-cols-[6rem_8rem_minmax(0,1fr)]"),children:[c.jsx("span",{className:"text-muted-foreground",children:s.ts}),c.jsx("span",{children:s.name}),c.jsx("span",{className:"truncate text-muted-foreground",children:JSON.stringify(s.args)})]},l))})}function nP({compact:e=!1}){const{t:a}=be(),[r,s]=y.useState([]);return y.useEffect(()=>{const l=d=>{const u=d.detail;s(m=>[{ts:new Date().toLocaleTimeString(),name:u.name,args:u.args},...m].slice(0,50))};return window.addEventListener("zmage-pg-event",l),()=>window.removeEventListener("zmage-pg-event",l)},[]),e?c.jsx(Rf,{title:a("pg.events.title"),description:a("pg.events.subtitle"),expandLabel:a("common.expand"),preview:c.jsx("div",{className:"code-block-scroll max-h-36 overflow-auto font-mono text-xs leading-5",children:c.jsx($p,{entries:r.slice(0,8),emptyLabel:a("pg.events.empty"),compact:!0})}),expanded:c.jsx("div",{className:"code-block-scroll h-[62dvh] overflow-auto rounded-lg border border-border bg-muted/25 p-3 font-mono text-xs leading-5",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})}):c.jsxs("div",{className:"rounded-lg border border-border bg-card/30",children:[c.jsx("div",{className:"border-b border-border px-3 py-2 text-xs font-medium text-muted-foreground",children:a("pg.events.title")}),c.jsx("div",{className:"max-h-48 overflow-y-auto p-3 font-mono text-xs",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})]})}const ox=[{src:"/imgSet/childsDream/8.jpg",alt:"Portal target demo 1"},{src:"/imgSet/childsDream/7.jpg",alt:"Portal target demo 2"}];function rP(){const{t:e}=be(),a=Ur(),[r,s]=y.useState(null),l=y.useCallback(d=>{s(u=>u===d?u:d)},[]);return c.jsxs("div",{className:"grid gap-3 rounded-lg border border-border bg-card/40 p-3 md:grid-cols-[minmax(0,1fr)_220px]",children:[c.jsxs("div",{className:"min-w-0",children:[c.jsx("div",{className:"text-sm font-medium",children:e("pg.portalTarget.title")}),c.jsx("p",{className:"mt-1 text-xs leading-relaxed text-muted-foreground",children:e("pg.portalTarget.body")}),c.jsxs("p",{className:"mt-2 rounded-md bg-muted/35 px-2.5 py-2 font-mono text-[11px] leading-relaxed text-muted-foreground",children:["portalTarget=","{viewerRoot}"]})]}),c.jsxs("div",{className:"relative min-h-[132px] rounded-md border border-dashed border-border bg-muted/20 p-2",children:[c.jsx("div",{ref:l,className:"absolute inset-2 rounded-md border border-dashed border-primary/35 bg-background/45 px-2 py-1 text-[11px] text-muted-foreground",children:e("pg.portalTarget.root")}),c.jsx(uo,{src:ox[0].src,alt:e("pg.portalTarget.imageAlt"),set:ox,portalTarget:r,backdrop:a,animate:Cn,className:"absolute bottom-3 right-3 h-20 w-28 cursor-zoom-in rounded-md border border-background object-cover shadow-sm"})]})]})}function sP(e){return typeof e=="function"&&(e==null?void 0:e.__zmageLog)===!0}function iP(e){const a=new URLSearchParams,r=L3(e);for(const[s,l]of Object.entries(r)){if(sP(l)){a.set(s,"__log__");continue}typeof l=="string"?a.set(s,l):a.set(s,JSON.stringify(l))}return"#?"+a.toString()}function ax(e){const a={},r=e.startsWith("#?")?e.slice(2):e.startsWith("#")?e.slice(1):e;if(!r)return a;const s=new URLSearchParams(r);for(const[l,d]of s){const u=da.find(m=>m.name===l);if(!(!u||u.docsOnly)){if(d==="__log__"){if((u==null?void 0:u.control.kind)==="callback"){const m=(...h)=>{window.dispatchEvent(new CustomEvent("zmage-pg-event",{detail:{name:l,args:h}}))};m.__zmageLog=!0,m.__name=l,a[l]=m}continue}try{a[l]=JSON.parse(d)}catch{a[l]=d}}}return a}function lP({values:e}){var h;const{t:a}=be(),r=Ur(),s=sd(e),l=!!s.src,d=Array.isArray(s.set)&&s.set.length>0,u=l?s.src:d?(h=s.set[0])==null?void 0:h.src:"",m={backdrop:r,...s,src:u};return c.jsxs("div",{className:"flex h-full min-h-[360px] flex-col items-center justify-center rounded-lg border border-border bg-card/30 p-6 lg:min-h-0",children:[c.jsx("div",{className:"flex min-h-0 w-full flex-1 items-center justify-center",children:c.jsx(uo,{...m,className:"max-h-full max-w-full rounded-md object-contain"})}),c.jsx("p",{className:"mt-4 shrink-0 text-center text-xs text-muted-foreground",children:a("pg.preview.tip")})]})}function cP({values:e}){const{t:a}=be(),r=Ur(),s=y.useRef(null),l=()=>{var g,b;(g=s.current)==null||g.call(s);const d=sd(e),u=!!d.src,m=Array.isArray(d.set)&&d.set.length>0,h=u?d.src:m?(b=d.set[0])==null?void 0:b.src:"";d.src=h,d.backdrop||(d.backdrop=r),s.current=uo.browsing(d)};return y.useEffect(()=>()=>{var d;(d=s.current)==null||d.call(s)},[]),c.jsx("div",{className:"flex h-full min-h-[360px] items-center justify-center rounded-lg border border-border bg-card/30 p-12 lg:min-h-0",children:c.jsxs(it,{size:"lg",onClick:l,children:[c.jsx(WR,{className:"mr-2 h-4 w-4"})," ",a("pg.preview.trigger")]})})}function nx(e,a){const{caption:r}=e;return typeof r=="string"&&r.trim()?r.trim():r&&typeof r=="object"&&typeof r.text=="string"&&r.text.trim()?r.text.trim():e.alt||a}function dP(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function Cr(e,a){return e[a%e.length]}function uP({items:e}){if(e.length===0)return c.jsx("article",{className:"mx-auto max-w-2xl rounded-md border border-dashed border-border p-8 text-sm text-muted-foreground",children:"The wrapped subtree has no image nodes yet."});const a=Cr(e,0),r=Cr(e,1),s=Cr(e,2),l=Cr(e,3),d=Cr(e,4),u=Cr(e,5),m=({item:h,className:g="",imageClassName:b="",label:v})=>c.jsxs("figure",{className:g,children:[c.jsx("img",{src:h.src,alt:h.alt??"","data-zmage-caption":nx(h,v),className:b}),c.jsx("figcaption",{className:"mt-2 text-[11px] leading-5 text-muted-foreground",children:nx(h,v)})]});return c.jsxs("article",{className:"overflow-hidden bg-background text-foreground",children:[c.jsxs("header",{className:"grid gap-6 border-b border-border bg-muted/20 p-5 md:p-7 lg:grid-cols-[minmax(0,1.05fr)_minmax(280px,0.95fr)]",children:[c.jsxs("div",{className:"flex min-w-0 flex-col justify-between gap-8",children:[c.jsxs("div",{className:"space-y-4",children:[c.jsxs("div",{className:"flex flex-wrap gap-2 text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:[c.jsx("span",{className:"rounded-full border border-border bg-background px-2.5 py-1",children:"Field report"}),c.jsx("span",{className:"rounded-full border border-emerald-500/25 bg-emerald-500/10 px-2.5 py-1 text-emerald-700 dark:text-emerald-300",children:"Wrapped HTML"}),c.jsx("span",{className:"rounded-full border border-amber-500/25 bg-amber-500/10 px-2.5 py-1 text-amber-700 dark:text-amber-300",children:"Mixed media"})]}),c.jsx("h2",{className:"max-w-2xl text-3xl font-semibold leading-tight tracking-normal md:text-4xl",children:"An annotated image essay inside one Wrapper"}),c.jsx("p",{className:"max-w-[68ch] text-sm leading-7 text-muted-foreground md:text-[15px]",children:"Long-form CMS pages rarely render as a neat gallery. They mix hero images, floated figures, side notes, dense captions, and repeated thumbnails. This composition keeps that structure intact while every nested image remains part of the same viewer configuration."})]}),c.jsxs("dl",{className:"grid max-w-xl grid-cols-3 gap-3 text-xs",children:[c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Images"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:e.length})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Source"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"HTML"})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Flow"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"Auto"})]})]})]}),c.jsx(m,{item:a,label:"Lead image",className:"min-w-0",imageClassName:"aspect-[5/4] w-full rounded-md object-cover shadow-sm"})]}),c.jsxs("section",{className:"grid gap-7 p-5 md:p-7 lg:grid-cols-[minmax(0,1.15fr)_minmax(260px,0.85fr)]",children:[c.jsxs("div",{className:"min-w-0 space-y-5 text-sm leading-7 text-foreground/85",children:[c.jsx("p",{children:"The route cuts through a quiet shoreline, a workshop archive, and a narrow set of rooms where every surface is used for notes. Image sizes change with the material: field photos need width, object studies need height, and repeated details sit beside the text that refers to them."}),c.jsx(m,{item:r,label:"Inline figure",className:"my-1 rounded-md border border-border bg-muted/25 p-2 md:float-right md:ml-5 md:w-64",imageClassName:"aspect-[4/3] w-full rounded object-cover"}),c.jsx("p",{children:"In the middle section the reading column narrows and the captions become closer to the images. The floated figure interrupts the paragraph without becoming a separate gallery block, so the page keeps the uneven rhythm of an edited article."}),c.jsx("blockquote",{className:"border-y border-border py-4 text-lg font-medium leading-8 text-foreground",children:"The strongest sequence is not the cleanest grid. It is the one where each image keeps its place in the argument."}),c.jsx("p",{children:"The final pass brings small crops back into view. Repeated images are intentional: they let the same material behave as a lead image, a supporting figure, and a tight detail without changing the source data."})]}),c.jsxs("aside",{className:"grid content-start gap-4",children:[c.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[c.jsx(m,{item:s,label:"Side image A",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[3/4] w-full rounded object-cover"}),c.jsx(m,{item:l,label:"Side image B",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-square w-full rounded object-cover"})]}),c.jsx("div",{className:"rounded-md border border-border bg-muted/25 p-4 text-xs leading-6 text-muted-foreground",children:"Field notes, measured captions, and repeated crops share the same reading surface. The layout is deliberately uneven so dense editorial pages stay close to their real shape."}),c.jsx(m,{item:d,label:"Wide supporting image",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[16/9] w-full rounded object-cover"})]})]}),c.jsxs("section",{className:"grid gap-3 border-t border-border bg-muted/20 p-5 md:grid-cols-6 md:p-7",children:[c.jsx(m,{item:u,label:"Panorama strip",className:"md:col-span-3",imageClassName:"aspect-[16/7] w-full rounded-md object-cover"}),c.jsx(m,{item:a,label:"Repeated lead detail",className:"md:col-span-2",imageClassName:"aspect-[4/3] w-full rounded-md object-cover"}),c.jsx(m,{item:r,label:"Tall crop",className:"md:col-span-1",imageClassName:"aspect-[3/5] w-full rounded-md object-cover"})]})]})}function pP({values:e}){const a=Ur(),r=sd(e),{src:s,alt:l,caption:d,browsing:u,...m}=r,h={backdrop:a,...m},g=dP(e),b=uo.Wrapper;return c.jsx("div",{className:"code-block-scroll h-full min-h-[420px] overflow-auto rounded-lg border border-border bg-background lg:min-h-0",children:c.jsx(b,{...h,children:c.jsx(uP,{items:g})})})}const mP=[{to:"",labelKey:"pg.tab.component",end:!0},{to:"imperative",labelKey:"pg.tab.imperative",end:!1},{to:"wrapper",labelKey:"pg.tab.wrapper",end:!1}];function fP(){const{t:e}=be(),a=$a(),r=a.pathname.endsWith("/imperative")?"imperative":a.pathname.endsWith("/wrapper")?"wrapper":"component",s=r==="imperative"?"modes.imperative.when":r==="wrapper"?"modes.wrapper.when":"modes.component.when",[l,d]=y.useState(()=>{const x=km();if(typeof window<"u"){const k=ax(window.location.hash),R=new Set(Object.keys(k));Object.assign(x,k),Sm(x,R),Cm(x,R)}return x}),[u,m]=y.useState(()=>typeof window>"u"?new Set:new Set(Object.keys(ax(window.location.hash)))),[h,g]=y.useState(!1),[b,v]=y.useState(!1),S=y.useCallback((x,k)=>{d(R=>{const j={...R,[x]:k};return x==="preset"&&(Sm(j,u),Cm(j,u)),j}),m(R=>R.has(x)?R:new Set(R).add(x))},[u]),T=y.useCallback(()=>{d(km()),m(new Set)},[]),C=y.useCallback(async()=>{const x=window.location.origin+window.location.pathname+iP(l);window.history.replaceState(null,"",x),await navigator.clipboard.writeText(x),v(!0),setTimeout(()=>v(!1),1500)},[l]);return c.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4 px-4 py-6 sm:px-6 lg:h-[calc(100dvh-3.5rem)] lg:overflow-hidden",children:[c.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[c.jsxs("div",{children:[c.jsx("h1",{className:"text-2xl font-semibold tracking-tight",children:e("pg.title")}),c.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e("pg.subtitle")})]}),c.jsxs("div",{className:"flex gap-2",children:[c.jsxs(it,{variant:"outline",size:"sm",onClick:T,children:[c.jsx($R,{className:"mr-1.5 h-3.5 w-3.5"})," ",e("pg.reset")]}),c.jsxs(it,{variant:"outline",size:"sm",onClick:C,children:[b?c.jsx(Ha,{className:"mr-1.5 h-3.5 w-3.5"}):c.jsx(YR,{className:"mr-1.5 h-3.5 w-3.5"}),e(b?"pg.shared":"pg.share")]})]})]}),c.jsxs("div",{children:[c.jsxs("div",{className:"relative inline-flex rounded-lg border border-border bg-muted/30 p-1",children:[c.jsx(l1,{}),mP.map(x=>c.jsx(Jp,{to:x.to,end:x.end,className:({isActive:k})=>ie("relative z-10 cursor-pointer rounded-md px-3 py-1.5 text-sm transition-colors",k?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e(x.labelKey)},x.to))]}),c.jsx("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:e(s)})]}),c.jsxs("div",{className:"grid min-h-0 flex-1 gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[c.jsxs("aside",{className:"flex min-h-0 flex-col overflow-hidden rounded-lg border border-border bg-card/30",children:[c.jsxs("div",{className:"shrink-0 border-b border-border px-4 py-3",children:[c.jsx("h2",{className:"text-sm font-medium",children:e("pg.params.title")}),c.jsx("p",{className:"mt-0.5 text-[11px] leading-4 text-muted-foreground/65",children:e("pg.params.subtitle")})]}),c.jsx("div",{className:"h-[min(70dvh,720px)] overflow-y-auto py-2 lg:h-auto lg:min-h-0 lg:flex-1",children:c.jsx(K3,{values:l,onChange:S})})]}),c.jsxs("section",{className:"grid min-h-0 gap-4 lg:grid-rows-[auto_minmax(0,1fr)_auto]",children:[c.jsx(rP,{}),c.jsx("div",{className:"min-h-0",children:c.jsxs(Sx,{children:[c.jsx(ut,{index:!0,element:c.jsx(lP,{values:l})}),c.jsx(ut,{path:"imperative",element:c.jsx(cP,{values:l})}),c.jsx(ut,{path:"wrapper",element:c.jsx(pP,{values:l})})]})}),c.jsxs("div",{className:"grid min-h-0 gap-4 lg:grid-cols-[minmax(0,1.2fr)_minmax(280px,0.8fr)]",children:[c.jsx(aP,{values:l,touched:u,hideDefaults:h,onHideDefaultsChange:g,mode:r,compact:!0}),c.jsx(nP,{compact:!0})]})]})]})]})}function hP(e){const[a,r]=y.useState("");return y.useEffect(()=>{const s=Array.from(document.querySelectorAll(e)),l=new IntersectionObserver(d=>{const u=d.filter(m=>m.isIntersecting).sort((m,h)=>m.boundingClientRect.top-h.boundingClientRect.top);u.length>0&&r(u[0].target.id)},{rootMargin:"-80px 0px -70% 0px",threshold:[0,1]});return s.forEach(d=>l.observe(d)),()=>l.disconnect()},[e]),a}function gP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"installation",children:e("docs.section.installation.title")}),c.jsx("p",{children:e("docs.section.installation.intro")}),c.jsx("p",{children:e("docs.section.installation.agent")}),c.jsx(Me,{code:`npm install react-zmage +`)}function aP({values:e,touched:a,hideDefaults:r,onHideDefaultsChange:s,mode:l,compact:d=!1}){const{t:u}=be(),m=x=>u("snippet.overriddenByProp").replace("{umbrella}",x),h=sd(e,r?void 0:a),g=l==="wrapper"?tP(h):h,b=l==="component"?Y3(g,m):l==="imperative"?X3(g,m):oP(e,g,m),v=y.useId(),S=y.useId(),T=x=>c.jsxs("div",{className:"flex items-center gap-1.5 whitespace-nowrap",children:[c.jsx(jf,{htmlFor:x,className:"cursor-pointer text-[11px] text-muted-foreground",children:u("pg.code.hideDefaults")}),c.jsx(Xe,{id:x,checked:r,onCheckedChange:s,className:"scale-75 origin-right"})]}),C=T(v);return d?c.jsx(Rf,{title:u("pg.code.title"),description:u("pg.code.subtitle"),expandLabel:u("common.expand"),preview:c.jsx(Me,{code:b,language:"tsx",actions:C,className:"h-36",preClassName:"p-3 pr-44 text-xs leading-5"}),expanded:c.jsx(Me,{code:b,language:"tsx",actions:T(S),className:"h-[62dvh]"}),previewClassName:"p-2"}):c.jsx(Me,{code:b,language:"tsx",actions:C})}function $p({entries:e,emptyLabel:a,compact:r=!1}){return e.length===0?c.jsx("div",{className:"text-muted-foreground",children:a}):c.jsx(c.Fragment,{children:e.map((s,l)=>c.jsxs("div",{className:ie("grid gap-2",r?"grid-cols-[5.5rem_7rem_minmax(0,1fr)]":"grid-cols-[6rem_8rem_minmax(0,1fr)]"),children:[c.jsx("span",{className:"text-muted-foreground",children:s.ts}),c.jsx("span",{children:s.name}),c.jsx("span",{className:"truncate text-muted-foreground",children:JSON.stringify(s.args)})]},l))})}function nP({compact:e=!1}){const{t:a}=be(),[r,s]=y.useState([]);return y.useEffect(()=>{const l=d=>{const u=d.detail;s(m=>[{ts:new Date().toLocaleTimeString(),name:u.name,args:u.args},...m].slice(0,50))};return window.addEventListener("zmage-pg-event",l),()=>window.removeEventListener("zmage-pg-event",l)},[]),e?c.jsx(Rf,{title:a("pg.events.title"),description:a("pg.events.subtitle"),expandLabel:a("common.expand"),preview:c.jsx("div",{className:"code-block-scroll max-h-36 overflow-auto font-mono text-xs leading-5",children:c.jsx($p,{entries:r.slice(0,8),emptyLabel:a("pg.events.empty"),compact:!0})}),expanded:c.jsx("div",{className:"code-block-scroll h-[62dvh] overflow-auto rounded-lg border border-border bg-muted/25 p-3 font-mono text-xs leading-5",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})}):c.jsxs("div",{className:"rounded-lg border border-border bg-card/30",children:[c.jsx("div",{className:"border-b border-border px-3 py-2 text-xs font-medium text-muted-foreground",children:a("pg.events.title")}),c.jsx("div",{className:"max-h-48 overflow-y-auto p-3 font-mono text-xs",children:c.jsx($p,{entries:r,emptyLabel:a("pg.events.empty")})})]})}const ox=[{src:"/imgSet/childsDream/8.jpg",alt:"Portal target demo 1"},{src:"/imgSet/childsDream/7.jpg",alt:"Portal target demo 2"}];function rP(){const{t:e}=be(),a=Ur(),[r,s]=y.useState(null),l=y.useCallback(d=>{s(u=>u===d?u:d)},[]);return c.jsxs("div",{className:"grid gap-3 rounded-lg border border-border bg-card/40 p-3 md:grid-cols-[minmax(0,1fr)_220px]",children:[c.jsxs("div",{className:"min-w-0",children:[c.jsx("div",{className:"text-sm font-medium",children:e("pg.portalTarget.title")}),c.jsx("p",{className:"mt-1 text-xs leading-relaxed text-muted-foreground",children:e("pg.portalTarget.body")}),c.jsx("p",{className:"mt-2 rounded-md bg-muted/35 px-2.5 py-2 font-mono text-[11px] leading-relaxed text-muted-foreground",children:"portalTarget={viewerRoot}"})]}),c.jsxs("div",{className:"relative min-h-[132px] rounded-md border border-dashed border-border bg-muted/20 p-2",children:[c.jsx("div",{ref:l,className:"absolute inset-2 rounded-md border border-dashed border-primary/35 bg-background/45 px-2 py-1 text-[11px] text-muted-foreground",children:e("pg.portalTarget.root")}),c.jsx(uo,{src:ox[0].src,alt:e("pg.portalTarget.imageAlt"),set:ox,portalTarget:r,backdrop:a,animate:Cn,className:"absolute bottom-3 right-3 h-20 w-28 cursor-zoom-in rounded-md border border-background object-cover shadow-sm"})]})]})}function sP(e){return typeof e=="function"&&(e==null?void 0:e.__zmageLog)===!0}function iP(e){const a=new URLSearchParams,r=L3(e);for(const[s,l]of Object.entries(r)){if(sP(l)){a.set(s,"__log__");continue}typeof l=="string"?a.set(s,l):a.set(s,JSON.stringify(l))}return"#?"+a.toString()}function ax(e){const a={},r=e.startsWith("#?")?e.slice(2):e.startsWith("#")?e.slice(1):e;if(!r)return a;const s=new URLSearchParams(r);for(const[l,d]of s){const u=da.find(m=>m.name===l);if(!(!u||u.docsOnly)){if(d==="__log__"){if((u==null?void 0:u.control.kind)==="callback"){const m=(...h)=>{window.dispatchEvent(new CustomEvent("zmage-pg-event",{detail:{name:l,args:h}}))};m.__zmageLog=!0,m.__name=l,a[l]=m}continue}try{a[l]=JSON.parse(d)}catch{a[l]=d}}}return a}function lP({values:e}){var h;const{t:a}=be(),r=Ur(),s=sd(e),l=!!s.src,d=Array.isArray(s.set)&&s.set.length>0,u=l?s.src:d?(h=s.set[0])==null?void 0:h.src:"",m={backdrop:r,...s,src:u};return c.jsxs("div",{className:"flex h-full min-h-[360px] flex-col items-center justify-center rounded-lg border border-border bg-card/30 p-6 lg:min-h-0",children:[c.jsx("div",{className:"flex min-h-0 w-full flex-1 items-center justify-center",children:c.jsx(uo,{...m,className:"max-h-full max-w-full rounded-md object-contain"})}),c.jsx("p",{className:"mt-4 shrink-0 text-center text-xs text-muted-foreground",children:a("pg.preview.tip")})]})}function cP({values:e}){const{t:a}=be(),r=Ur(),s=y.useRef(null),l=()=>{var g,b;(g=s.current)==null||g.call(s);const d=sd(e),u=!!d.src,m=Array.isArray(d.set)&&d.set.length>0,h=u?d.src:m?(b=d.set[0])==null?void 0:b.src:"";d.src=h,d.backdrop||(d.backdrop=r),s.current=uo.browsing(d)};return y.useEffect(()=>()=>{var d;(d=s.current)==null||d.call(s)},[]),c.jsx("div",{className:"flex h-full min-h-[360px] items-center justify-center rounded-lg border border-border bg-card/30 p-12 lg:min-h-0",children:c.jsxs(it,{size:"lg",onClick:l,children:[c.jsx(WR,{className:"mr-2 h-4 w-4"})," ",a("pg.preview.trigger")]})})}function nx(e,a){const{caption:r}=e;return typeof r=="string"&&r.trim()?r.trim():r&&typeof r=="object"&&typeof r.text=="string"&&r.text.trim()?r.text.trim():e.alt||a}function dP(e){return Array.isArray(e.set)&&e.set.length>0?e.set:e.src?[{src:e.src,alt:e.alt,caption:e.caption}]:[]}function Cr(e,a){return e[a%e.length]}function uP({items:e}){if(e.length===0)return c.jsx("article",{className:"mx-auto max-w-2xl rounded-md border border-dashed border-border p-8 text-sm text-muted-foreground",children:"The wrapped subtree has no image nodes yet."});const a=Cr(e,0),r=Cr(e,1),s=Cr(e,2),l=Cr(e,3),d=Cr(e,4),u=Cr(e,5),m=({item:h,className:g="",imageClassName:b="",label:v})=>c.jsxs("figure",{className:g,children:[c.jsx("img",{src:h.src,alt:h.alt??"","data-zmage-caption":nx(h,v),className:b}),c.jsx("figcaption",{className:"mt-2 text-[11px] leading-5 text-muted-foreground",children:nx(h,v)})]});return c.jsxs("article",{className:"overflow-hidden bg-background text-foreground",children:[c.jsxs("header",{className:"grid gap-6 border-b border-border bg-muted/20 p-5 md:p-7 lg:grid-cols-[minmax(0,1.05fr)_minmax(280px,0.95fr)]",children:[c.jsxs("div",{className:"flex min-w-0 flex-col justify-between gap-8",children:[c.jsxs("div",{className:"space-y-4",children:[c.jsxs("div",{className:"flex flex-wrap gap-2 text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:[c.jsx("span",{className:"rounded-full border border-border bg-background px-2.5 py-1",children:"Field report"}),c.jsx("span",{className:"rounded-full border border-emerald-500/25 bg-emerald-500/10 px-2.5 py-1 text-emerald-700 dark:text-emerald-300",children:"Wrapped HTML"}),c.jsx("span",{className:"rounded-full border border-amber-500/25 bg-amber-500/10 px-2.5 py-1 text-amber-700 dark:text-amber-300",children:"Mixed media"})]}),c.jsx("h2",{className:"max-w-2xl text-3xl font-semibold leading-tight tracking-normal md:text-4xl",children:"An annotated image essay inside one Wrapper"}),c.jsx("p",{className:"max-w-[68ch] text-sm leading-7 text-muted-foreground md:text-[15px]",children:"Long-form CMS pages rarely render as a neat gallery. They mix hero images, floated figures, side notes, dense captions, and repeated thumbnails. This composition keeps that structure intact while every nested image remains part of the same viewer configuration."})]}),c.jsxs("dl",{className:"grid max-w-xl grid-cols-3 gap-3 text-xs",children:[c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Images"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:e.length})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Source"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"HTML"})]}),c.jsxs("div",{className:"rounded-md border border-border bg-background p-3",children:[c.jsx("dt",{className:"text-muted-foreground",children:"Flow"}),c.jsx("dd",{className:"mt-1 text-lg font-semibold",children:"Auto"})]})]})]}),c.jsx(m,{item:a,label:"Lead image",className:"min-w-0",imageClassName:"aspect-[5/4] w-full rounded-md object-cover shadow-sm"})]}),c.jsxs("section",{className:"grid gap-7 p-5 md:p-7 lg:grid-cols-[minmax(0,1.15fr)_minmax(260px,0.85fr)]",children:[c.jsxs("div",{className:"min-w-0 space-y-5 text-sm leading-7 text-foreground/85",children:[c.jsx("p",{children:"The route cuts through a quiet shoreline, a workshop archive, and a narrow set of rooms where every surface is used for notes. Image sizes change with the material: field photos need width, object studies need height, and repeated details sit beside the text that refers to them."}),c.jsx(m,{item:r,label:"Inline figure",className:"my-1 rounded-md border border-border bg-muted/25 p-2 md:float-right md:ml-5 md:w-64",imageClassName:"aspect-[4/3] w-full rounded object-cover"}),c.jsx("p",{children:"In the middle section the reading column narrows and the captions become closer to the images. The floated figure interrupts the paragraph without becoming a separate gallery block, so the page keeps the uneven rhythm of an edited article."}),c.jsx("blockquote",{className:"border-y border-border py-4 text-lg font-medium leading-8 text-foreground",children:"The strongest sequence is not the cleanest grid. It is the one where each image keeps its place in the argument."}),c.jsx("p",{children:"The final pass brings small crops back into view. Repeated images are intentional: they let the same material behave as a lead image, a supporting figure, and a tight detail without changing the source data."})]}),c.jsxs("aside",{className:"grid content-start gap-4",children:[c.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[c.jsx(m,{item:s,label:"Side image A",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[3/4] w-full rounded object-cover"}),c.jsx(m,{item:l,label:"Side image B",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-square w-full rounded object-cover"})]}),c.jsx("div",{className:"rounded-md border border-border bg-muted/25 p-4 text-xs leading-6 text-muted-foreground",children:"Field notes, measured captions, and repeated crops share the same reading surface. The layout is deliberately uneven so dense editorial pages stay close to their real shape."}),c.jsx(m,{item:d,label:"Wide supporting image",className:"rounded-md border border-border bg-background p-2",imageClassName:"aspect-[16/9] w-full rounded object-cover"})]})]}),c.jsxs("section",{className:"grid gap-3 border-t border-border bg-muted/20 p-5 md:grid-cols-6 md:p-7",children:[c.jsx(m,{item:u,label:"Panorama strip",className:"md:col-span-3",imageClassName:"aspect-[16/7] w-full rounded-md object-cover"}),c.jsx(m,{item:a,label:"Repeated lead detail",className:"md:col-span-2",imageClassName:"aspect-[4/3] w-full rounded-md object-cover"}),c.jsx(m,{item:r,label:"Tall crop",className:"md:col-span-1",imageClassName:"aspect-[3/5] w-full rounded-md object-cover"})]})]})}function pP({values:e}){const a=Ur(),r=sd(e),{src:s,alt:l,caption:d,browsing:u,...m}=r,h={backdrop:a,...m},g=dP(e),b=uo.Wrapper;return c.jsx("div",{className:"code-block-scroll h-full min-h-[420px] overflow-auto rounded-lg border border-border bg-background lg:min-h-0",children:c.jsx(b,{...h,children:c.jsx(uP,{items:g})})})}const mP=[{to:"",labelKey:"pg.tab.component",end:!0},{to:"imperative",labelKey:"pg.tab.imperative",end:!1},{to:"wrapper",labelKey:"pg.tab.wrapper",end:!1}];function fP(){const{t:e}=be(),a=$a(),r=a.pathname.endsWith("/imperative")?"imperative":a.pathname.endsWith("/wrapper")?"wrapper":"component",s=r==="imperative"?"modes.imperative.when":r==="wrapper"?"modes.wrapper.when":"modes.component.when",[l,d]=y.useState(()=>{const x=km();if(typeof window<"u"){const k=ax(window.location.hash),R=new Set(Object.keys(k));Object.assign(x,k),Sm(x,R),Cm(x,R)}return x}),[u,m]=y.useState(()=>typeof window>"u"?new Set:new Set(Object.keys(ax(window.location.hash)))),[h,g]=y.useState(!1),[b,v]=y.useState(!1),S=y.useCallback((x,k)=>{d(R=>{const j={...R,[x]:k};return x==="preset"&&(Sm(j,u),Cm(j,u)),j}),m(R=>R.has(x)?R:new Set(R).add(x))},[u]),T=y.useCallback(()=>{d(km()),m(new Set)},[]),C=y.useCallback(async()=>{const x=window.location.origin+window.location.pathname+iP(l);window.history.replaceState(null,"",x),await navigator.clipboard.writeText(x),v(!0),setTimeout(()=>v(!1),1500)},[l]);return c.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4 px-4 py-6 sm:px-6 lg:h-[calc(100dvh-3.5rem)] lg:overflow-hidden",children:[c.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[c.jsxs("div",{children:[c.jsx("h1",{className:"text-2xl font-semibold tracking-tight",children:e("pg.title")}),c.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e("pg.subtitle")})]}),c.jsxs("div",{className:"flex gap-2",children:[c.jsxs(it,{variant:"outline",size:"sm",onClick:T,children:[c.jsx($R,{className:"mr-1.5 h-3.5 w-3.5"})," ",e("pg.reset")]}),c.jsxs(it,{variant:"outline",size:"sm",onClick:C,children:[b?c.jsx(Ha,{className:"mr-1.5 h-3.5 w-3.5"}):c.jsx(YR,{className:"mr-1.5 h-3.5 w-3.5"}),e(b?"pg.shared":"pg.share")]})]})]}),c.jsxs("div",{children:[c.jsxs("div",{className:"relative inline-flex rounded-lg border border-border bg-muted/30 p-1",children:[c.jsx(l1,{}),mP.map(x=>c.jsx(Jp,{to:x.to,end:x.end,className:({isActive:k})=>ie("relative z-10 cursor-pointer rounded-md px-3 py-1.5 text-sm transition-colors",k?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e(x.labelKey)},x.to))]}),c.jsx("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:e(s)})]}),c.jsxs("div",{className:"grid min-h-0 flex-1 gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[c.jsxs("aside",{className:"flex min-h-0 flex-col overflow-hidden rounded-lg border border-border bg-card/30",children:[c.jsxs("div",{className:"shrink-0 border-b border-border px-4 py-3",children:[c.jsx("h2",{className:"text-sm font-medium",children:e("pg.params.title")}),c.jsx("p",{className:"mt-0.5 text-[11px] leading-4 text-muted-foreground/65",children:e("pg.params.subtitle")})]}),c.jsx("div",{className:"h-[min(70dvh,720px)] overflow-y-auto py-2 lg:h-auto lg:min-h-0 lg:flex-1",children:c.jsx(K3,{values:l,onChange:S})})]}),c.jsxs("section",{className:"grid min-h-0 gap-4 lg:grid-rows-[auto_minmax(0,1fr)_auto]",children:[c.jsx(rP,{}),c.jsx("div",{className:"min-h-0",children:c.jsxs(Sx,{children:[c.jsx(ut,{index:!0,element:c.jsx(lP,{values:l})}),c.jsx(ut,{path:"imperative",element:c.jsx(cP,{values:l})}),c.jsx(ut,{path:"wrapper",element:c.jsx(pP,{values:l})})]})}),c.jsxs("div",{className:"grid min-h-0 gap-4 lg:grid-cols-[minmax(0,1.2fr)_minmax(280px,0.8fr)]",children:[c.jsx(aP,{values:l,touched:u,hideDefaults:h,onHideDefaultsChange:g,mode:r,compact:!0}),c.jsx(nP,{compact:!0})]})]})]})]})}function hP(e){const[a,r]=y.useState("");return y.useEffect(()=>{const s=Array.from(document.querySelectorAll(e)),l=new IntersectionObserver(d=>{const u=d.filter(m=>m.isIntersecting).sort((m,h)=>m.boundingClientRect.top-h.boundingClientRect.top);u.length>0&&r(u[0].target.id)},{rootMargin:"-80px 0px -70% 0px",threshold:[0,1]});return s.forEach(d=>l.observe(d)),()=>l.disconnect()},[e]),a}function gP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"installation",children:e("docs.section.installation.title")}),c.jsx("p",{children:e("docs.section.installation.intro")}),c.jsx("p",{children:e("docs.section.installation.agent")}),c.jsx(Me,{code:`npm install react-zmage # or pnpm add react-zmage`,language:"bash"}),c.jsx("p",{children:e("docs.section.installation.then")}),c.jsx(Me,{code:`import Zmage from 'react-zmage' import 'react-zmage/style.css'`,language:"tsx"}),c.jsx(xe,{id:"ssr",level:3,children:e("docs.section.installation.ssrTitle")}),c.jsx("p",{children:e("docs.section.installation.ssrBody")}),c.jsx(Me,{code:"import Zmage from 'react-zmage/ssr'",language:"tsx"})]})}function yP(){const{t:e}=be();return c.jsxs("section",{className:"mt-12 space-y-4",children:[c.jsx(xe,{id:"modes",children:e("docs.section.modes.title")}),c.jsx("p",{children:e("docs.section.modes.intro")}),c.jsx(xe,{id:"modes-component",level:3,children:e("docs.section.modes.componentTitle")}),c.jsx("p",{children:e("docs.section.modes.componentBody")}),c.jsx(Me,{code:'',language:"tsx"}),c.jsx(xe,{id:"modes-imperative",level:3,children:e("docs.section.modes.imperativeTitle")}),c.jsx("p",{children:e("docs.section.modes.imperativeBody")}),c.jsx(Me,{code:`Zmage.browsing({ src: 'hero.jpg' }) diff --git a/docs/compare/index.html b/docs/compare/index.html index fa286e2..5795b60 100644 --- a/docs/compare/index.html +++ b/docs/compare/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/contact/index.html b/docs/contact/index.html index 5053380..1fb5774 100644 --- a/docs/contact/index.html +++ b/docs/contact/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/developers/index.html b/docs/developers/index.html index 09bb5af..3040ae0 100644 --- a/docs/developers/index.html +++ b/docs/developers/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/docs/index.html b/docs/docs/index.html index 3989c53..83fec99 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/errors/index.html b/docs/errors/index.html index 90d66d0..bf03e1a 100644 --- a/docs/errors/index.html +++ b/docs/errors/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/index.html b/docs/index.html index 359c956..13f17d7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -222,7 +222,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/playground/imperative/index.html b/docs/playground/imperative/index.html index a3b8f50..3116d18 100644 --- a/docs/playground/imperative/index.html +++ b/docs/playground/imperative/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/playground/index.html b/docs/playground/index.html index 7670e69..35ca94c 100644 --- a/docs/playground/index.html +++ b/docs/playground/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/playground/wrapper/index.html b/docs/playground/wrapper/index.html index d7b671d..e83b57b 100644 --- a/docs/playground/wrapper/index.html +++ b/docs/playground/wrapper/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/privacy/index.html b/docs/privacy/index.html index 362687c..d98a978 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/rate-limits/index.html b/docs/rate-limits/index.html index e1f84ef..6fa01fb 100644 --- a/docs/rate-limits/index.html +++ b/docs/rate-limits/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/status/index.html b/docs/status/index.html index f3f68ed..4781b98 100644 --- a/docs/status/index.html +++ b/docs/status/index.html @@ -190,7 +190,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/docs/use-cases/index.html b/docs/use-cases/index.html index c4a8eb8..2dc2b09 100644 --- a/docs/use-cases/index.html +++ b/docs/use-cases/index.html @@ -228,7 +228,7 @@ document.documentElement.classList.toggle('dark', theme === 'dark') } catch {} - + diff --git a/packages/home/src/playground/PortalTargetScenario.tsx b/packages/home/src/playground/PortalTargetScenario.tsx index cb0a4c4..41a520b 100644 --- a/packages/home/src/playground/PortalTargetScenario.tsx +++ b/packages/home/src/playground/PortalTargetScenario.tsx @@ -25,7 +25,7 @@ export function PortalTargetScenario () { {t('pg.portalTarget.body')}

- portalTarget={"{viewerRoot}"} + {'portalTarget={viewerRoot}'}