@g9tm/lynxcontrols 1.4.5 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/base/pressable.d.ts.map +1 -1
  3. package/dist/base/pressable.jsx +2 -1
  4. package/dist/base/pressable.jsx.map +1 -1
  5. package/dist/cascade/cascade-panel.d.ts.map +1 -1
  6. package/dist/cascade/cascade-panel.jsx +2 -2
  7. package/dist/cascade/cascade-panel.jsx.map +1 -1
  8. package/dist/edge-panel/edge-panel.jsx +5 -5
  9. package/dist/edge-panel/edge-panel.jsx.map +1 -1
  10. package/dist/expander/expander.d.ts.map +1 -1
  11. package/dist/expander/expander.jsx +2 -1
  12. package/dist/expander/expander.jsx.map +1 -1
  13. package/dist/host/host.css.map +1 -1
  14. package/dist/host/host.d.ts +3 -2
  15. package/dist/host/host.d.ts.map +1 -1
  16. package/dist/host/host.jsx +2 -2
  17. package/dist/host/host.jsx.map +1 -1
  18. package/dist/plus-button/model.d.ts.map +1 -1
  19. package/dist/plus-button/model.jsx +5 -1
  20. package/dist/plus-button/model.jsx.map +1 -1
  21. package/dist/popup/frame.jsx +2 -2
  22. package/dist/popup/frame.jsx.map +1 -1
  23. package/dist/popup/service.d.ts.map +1 -1
  24. package/dist/popup/service.jsx +2 -2
  25. package/dist/popup/service.jsx.map +1 -1
  26. package/dist/provider/provider.css +4 -0
  27. package/dist/provider/provider.css.map +1 -1
  28. package/dist/provider/provider.d.ts.map +1 -1
  29. package/dist/provider/provider.jsx +4 -2
  30. package/dist/provider/provider.jsx.map +1 -1
  31. package/dist/selection/selection-sheet.d.ts +5 -0
  32. package/dist/selection/selection-sheet.d.ts.map +1 -1
  33. package/dist/selection/selection-sheet.jsx +7 -3
  34. package/dist/selection/selection-sheet.jsx.map +1 -1
  35. package/dist/sheet/frame.d.ts.map +1 -1
  36. package/dist/sheet/frame.jsx +30 -8
  37. package/dist/sheet/frame.jsx.map +1 -1
  38. package/dist/sheet/index.d.ts +1 -0
  39. package/dist/sheet/index.d.ts.map +1 -1
  40. package/dist/sheet/index.jsx +1 -0
  41. package/dist/sheet/motion.d.ts.map +1 -1
  42. package/dist/sheet/motion.jsx +14 -0
  43. package/dist/sheet/motion.jsx.map +1 -1
  44. package/dist/sheet/options.d.ts +6 -0
  45. package/dist/sheet/options.d.ts.map +1 -1
  46. package/dist/sheet/options.jsx.map +1 -1
  47. package/dist/sheet/scroll-indicator.d.ts +33 -0
  48. package/dist/sheet/scroll-indicator.d.ts.map +1 -0
  49. package/dist/sheet/scroll-indicator.jsx +84 -0
  50. package/dist/sheet/scroll-indicator.jsx.map +1 -0
  51. package/dist/sheet/sheet.css +14 -0
  52. package/dist/sheet/sheet.css.map +1 -1
  53. package/dist/tab-bar/tab-bar.d.ts.map +1 -1
  54. package/dist/tab-bar/tab-bar.jsx +11 -6
  55. package/dist/tab-bar/tab-bar.jsx.map +1 -1
  56. package/dist/toast/service.jsx +3 -3
  57. package/dist/toast/service.jsx.map +1 -1
  58. package/dist/toast/store.d.ts.map +1 -1
  59. package/dist/toast/store.jsx +3 -2
  60. package/dist/toast/store.jsx.map +1 -1
  61. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"cascade-panel.d.ts","sourceRoot":"","sources":["../../src/cascade/cascade-panel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cascade-panel.d.ts","sourceRoot":"","sources":["../../src/cascade/cascade-panel.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import "./cascade.css";
2
- import { G9CascadeDirection, G9CascadeTransition, G9StringKey } from "@g9tm/lynxcontrols-foundation";
2
+ import { G9CascadeDirection, G9CascadeTransition, G9StringKey, g9Ms } from "@g9tm/lynxcontrols-foundation";
3
3
  import { useEffect, useRef, useState, useSyncExternalStore } from "@lynx-js/react";
4
4
  import { useG9Press } from "../base/press.jsx";
5
5
  import { startTimer, stopTimer } from "../base/timers.jsx";
@@ -98,7 +98,7 @@ function G9CascadePanel(props) {
98
98
  var _props_controller, _props_animationDurationMs, _props_transition, _ref, _props_rootContent, _props_cornerRadius, _props_rootTitle;
99
99
  const own = useCascadePanel();
100
100
  const controller = null != (_props_controller = props.controller) ? _props_controller : own;
101
- const duration = null != (_props_animationDurationMs = props.animationDurationMs) ? _props_animationDurationMs : g9CascadeAnimationMs;
101
+ const duration = g9Ms(null != (_props_animationDurationMs = props.animationDurationMs) ? _props_animationDurationMs : g9CascadeAnimationMs);
102
102
  controller.state.durationMs = duration;
103
103
  controller.state.onPushed = props.onPanelPushed;
104
104
  controller.state.onPopped = props.onPanelPopped;
@@ -1 +1 @@
1
- {"version":3,"file":"cascade/cascade-panel.jsx","sources":["../../src/cascade/cascade-panel.tsx"],"sourcesContent":["import './cascade.css';\nimport { G9CascadeDirection, G9CascadeTransition, G9StringKey } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useRef, useState, useSyncExternalStore } from '@lynx-js/react';\nimport { useG9Press } from '../base/press';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { G9ActivityIndicator } from '../display/activity-indicator';\nimport { G9IconSlot } from '../icon/slot';\nimport { useG9Direction, useG9Settings, useG9Strings } from '../provider/hooks';\nimport { type G9CascadeContent, type G9CascadePanelEntry, type G9CascadePushOptions, G9CascadeStack } from './model';\n\n/** Slide duration (MAUI `G9Metrics.CascadePanelAnimationMs`). */\nexport const g9CascadeAnimationMs = 280;\n/** How far a covered panel parallaxes (share of the slide) and how much it dims, in `overlay` mode. */\nexport const g9CascadeParallax = Object.freeze({ shift: 0.3, dim: 0.12 });\n\n/** Imperative API of a cascade panel (MAUI `G9CascadePanel` methods), from {@link useCascadePanel}. */\nexport interface G9CascadeController {\n /** Push a built view, or a factory built after the slide (spinner meanwhile). Resolves when it slid in. */\n push(content: G9CascadeContent, options?: G9CascadePushOptions): Promise<boolean>;\n /** Pop the top panel (no-op at the root). Resolves when it slid out. */\n pop(): Promise<boolean>;\n /** Pop every panel back to the root (after a slide in flight). */\n popToRoot(): Promise<boolean>;\n /** Current nesting depth; 0 = only the root. */\n readonly depth: number;\n /** @internal the stack the panel renders */\n readonly stack: G9CascadeStack;\n}\n\ninterface ControllerState {\n durationMs: number;\n onPushed?: ((depth: number) => void) | undefined;\n onPopped?: ((depth: number) => void) | undefined;\n}\n\n/** Creates a cascade controller outside React (tests, view models). */\nexport function createCascadeController(): G9CascadeController & { readonly state: ControllerState } {\n const state: ControllerState = { durationMs: g9CascadeAnimationMs };\n const stack = new G9CascadeStack({\n setTimer: (cb, ms) => startTimer(cb, ms),\n clearTimer: (h) => stopTimer(h as never),\n durationMs: () => state.durationMs,\n onPushed: (d) => state.onPushed?.(d),\n onPopped: (d) => state.onPopped?.(d),\n });\n return {\n state,\n stack,\n push: (content, options) => stack.push(content, options),\n pop: () => stack.pop(),\n popToRoot: () => stack.popToRoot(),\n get depth() {\n return stack.depth;\n },\n };\n}\n\n/** A stable controller for a `G9CascadePanel` (pass it as `controller`). */\nexport function useCascadePanel(): G9CascadeController {\n const ref = useRef<G9CascadeController | null>(null);\n if (ref.current === null) ref.current = createCascadeController();\n return ref.current;\n}\n\n/** Props of {@link G9CascadePanel}. */\nexport interface G9CascadePanelProps {\n readonly controller?: G9CascadeController;\n /** The view at depth 0; swapping it replaces the root without touching the nested stack. */\n readonly rootContent?: ReactNode;\n /** Lazy root (used when `rootContent` is absent): spinner, then built one tick after mount. */\n readonly rootContentFactory?: (() => ReactNode) | null;\n readonly rootTitle?: string | null;\n /** Default entry direction; `'auto'` follows the reading direction (L→R in LTR, R→L in RTL). */\n readonly direction?: G9CascadeDirection;\n /** `'overlay'` (default) slides over a stationary base; `'push'` slides the base out. */\n readonly transition?: G9CascadeTransition;\n /** Fade the root in on first appearance. Default false. */\n readonly animateRoot?: boolean;\n /** Back + title header on nested panels. Default true. */\n readonly showHeader?: boolean;\n /** A (back-less) header on the root too. Default false. */\n readonly showRootHeader?: boolean;\n /** Default 280. */\n readonly animationDurationMs?: number;\n /** Overlay mode: the covered panel parallaxes and dims. Default true. */\n readonly enableParallax?: boolean;\n /** Default 16 (MAUI `RadiusLg`). */\n readonly cornerRadius?: number;\n /** After a panel slid in, with the new depth (MAUI `PanelPushed`). */\n readonly onPanelPushed?: (depth: number) => void;\n /** After a panel slid out, with the new depth (MAUI `PanelPopped`). */\n readonly onPanelPopped?: (depth: number) => void;\n readonly className?: string;\n}\n\ntype Physical = 'leftToRight' | 'rightToLeft' | 'topToBottom' | 'bottomToTop';\n\n/** Resolves `'auto'` to the reading direction. */\nexport function resolveCascadeDirection(direction: G9CascadeDirection | null | undefined, rtl: boolean): Physical {\n if (!direction || direction === G9CascadeDirection.Auto) return rtl ? 'rightToLeft' : 'leftToRight';\n return direction;\n}\n\n/** The transform of a panel `amount` (0…1) of the way off-screen against its entry direction. */\nexport function cascadeOffset(direction: Physical, amount: number): string {\n const pct = `${Math.round(amount * 1000) / 10}%`;\n const neg = `-${pct}`;\n switch (direction) {\n case 'leftToRight':\n return `translateX(${amount === 0 ? '0%' : neg})`;\n case 'rightToLeft':\n return `translateX(${pct})`;\n case 'topToBottom':\n return `translateY(${amount === 0 ? '0%' : neg})`;\n default:\n return `translateY(${pct})`;\n }\n}\n\nfunction Header(props: { readonly title: string | null; readonly onBack: (() => void) | null }): ReactNode {\n const rtl = useG9Direction() === 'rtl';\n const glyphs = useG9Settings().glyphs;\n const strings = useG9Strings();\n const back = useG9Press(() => props.onBack?.(), { source: 'G9CascadePanel', guardMs: 0 });\n return (\n <view className={`g9-cascade__header g9-dir-${rtl ? 'rtl' : 'ltr'}`}>\n {props.onBack ? (\n <view\n className=\"g9-cascade__back\"\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={strings.get(G9StringKey.Back)}\n bindtap={back}\n >\n <G9IconSlot icon={rtl ? glyphs.chevronForward : glyphs.chevronBack} size={24} color=\"var(--g9-on-surface)\" />\n </view>\n ) : null}\n <text className=\"g9-cascade__title\" text-maxline=\"1\">\n {props.title ?? ''}\n </text>\n </view>\n );\n}\n\nfunction Body(props: {\n readonly content: G9CascadeContent;\n readonly wrap: boolean;\n readonly ready: boolean;\n}): ReactNode {\n const lazy = typeof props.content === 'function';\n const node = lazy ? (props.ready ? (props.content as () => ReactNode)() : null) : (props.content as ReactNode);\n const inner =\n lazy && !props.ready ? (\n <view className=\"g9-cascade__loading\">\n <G9ActivityIndicator running size={32} />\n </view>\n ) : (\n node\n );\n return props.wrap ? (\n <scroll-view className=\"g9-cascade__body\" scroll-orientation=\"vertical\">\n {inner}\n </scroll-view>\n ) : (\n <view className=\"g9-cascade__body\">{inner}</view>\n );\n}\n\n/**\n * In-place drill-down navigation (MAUI `G9CascadePanel`): `controller.push(view, { title })` slides a panel in over\n * the current one from any edge, `pop()` slides it back; panels stack to any depth inside whatever container holds the\n * panel (clipped to its bounds, opaque `Surface` panels). `overlay` keeps the base still (parallax + dim with\n * `enableParallax`); `push` slides it out. Lazy panels show a spinner and build after the slide. One slide runs at a\n * time: same-kind repeats are dropped, the other kind waits (see `G9CascadeStack`).\n */\nexport function G9CascadePanel(props: G9CascadePanelProps): ReactNode {\n const own = useCascadePanel();\n const controller = (props.controller ?? own) as ReturnType<typeof createCascadeController>;\n const duration = props.animationDurationMs ?? g9CascadeAnimationMs;\n controller.state.durationMs = duration;\n controller.state.onPushed = props.onPanelPushed;\n controller.state.onPopped = props.onPanelPopped;\n const stack = controller.stack;\n const panels = useSyncExternalStore(\n (l) => stack.subscribe(l),\n () => stack.getSnapshot(),\n );\n const rtl = useG9Direction() === 'rtl';\n const overlay = (props.transition ?? G9CascadeTransition.Overlay) === G9CascadeTransition.Overlay;\n const parallax = props.enableParallax !== false;\n useEffect(() => () => stack.dispose(), [stack]);\n\n // Lazy root: built one tick after mount. Root fade: visible after the first frame.\n const [rootReady, setRootReady] = useState(false);\n const [rootShown, setRootShown] = useState(props.animateRoot !== true);\n useEffect(() => {\n const t = startTimer(() => {\n setRootReady(true);\n setRootShown(true);\n }, 16);\n return () => stopTimer(t);\n }, []);\n\n const topIndex = (id: number | 'root') => (id === 'root' ? 0 : panels.findIndex((p) => p.id === id) + 1);\n // The panel that covers a given level, if any, and how far it is in.\n const coverOf = (level: number): { entry: G9CascadePanelEntry; amount: number } | null => {\n const above = panels[level];\n if (!above) return null;\n const amount = above.status === 'entering' || above.status === 'shown' ? 1 : 0;\n return { entry: above, amount };\n };\n const style = (level: number, entry: G9CascadePanelEntry | null) => {\n const own = entry ? resolveCascadeDirection(entry.direction ?? props.direction, rtl) : null;\n // Own slide: off-screen while staged/leaving, in place otherwise.\n const out = entry && (entry.status === 'staged' || entry.status === 'leaving');\n let transform = own && out ? cascadeOffset(own, 1) : 'translateX(0%)';\n let dim = 0;\n const cover = coverOf(level);\n if (cover && !out) {\n const dir = resolveCascadeDirection(cover.entry.direction ?? props.direction, rtl);\n // A covered level moves the other way: by the parallax share (overlay) or all the way (push).\n const opposite: Record<Physical, Physical> = {\n leftToRight: 'rightToLeft',\n rightToLeft: 'leftToRight',\n topToBottom: 'bottomToTop',\n bottomToTop: 'topToBottom',\n };\n const amount = cover.amount * (overlay ? (parallax ? g9CascadeParallax.shift : 0) : 1);\n transform = cascadeOffset(opposite[dir], amount);\n dim = overlay && parallax ? cover.amount * g9CascadeParallax.dim : 0;\n }\n return {\n transform,\n transition: entry?.status === 'staged' ? 'none' : `transform ${duration}ms ease-out, opacity ${duration}ms`,\n zIndex: level,\n ...(dim > 0 ? { opacity: 1 - dim } : { opacity: level === 0 && !rootShown ? 0 : 1 }),\n };\n };\n\n const rootContent = props.rootContent ?? props.rootContentFactory ?? null;\n return (\n <view\n className={`g9-cascade${props.className ? ` ${props.className}` : ''}`}\n style={{ borderRadius: `${props.cornerRadius ?? 16}px` }}\n >\n <view className=\"g9-cascade__panel\" style={style(0, null)}>\n {props.showRootHeader ? <Header title={props.rootTitle ?? null} onBack={null} /> : null}\n <Body content={rootContent} wrap ready={rootReady} />\n </view>\n {panels.map((entry) => (\n <view\n key={entry.id}\n className={`g9-cascade__panel g9-cascade__panel--${entry.status}`}\n style={style(topIndex(entry.id), entry)}\n >\n {props.showHeader !== false ? <Header title={entry.title} onBack={() => void stack.pop()} /> : null}\n <Body\n content={entry.content}\n wrap={entry.wrap}\n ready={entry.status === 'shown' || entry.status === 'leaving'}\n />\n </view>\n ))}\n </view>\n );\n}\n"],"names":["g9CascadeAnimationMs","g9CascadeParallax","Object","createCascadeController","state","stack","G9CascadeStack","cb","ms","startTimer","h","stopTimer","d","content","options","useCascadePanel","ref","useRef","resolveCascadeDirection","direction","rtl","G9CascadeDirection","cascadeOffset","amount","pct","Math","neg","Header","props","_props_title","useG9Direction","glyphs","useG9Settings","strings","useG9Strings","back","useG9Press","view","G9StringKey","G9IconSlot","text","Body","lazy","node","inner","G9ActivityIndicator","scroll-view","G9CascadePanel","_props_controller","_props_animationDurationMs","_props_transition","_ref","_props_cornerRadius","_props_rootTitle","own","controller","duration","panels","useSyncExternalStore","l","overlay","G9CascadeTransition","parallax","useEffect","rootReady","setRootReady","useState","rootShown","setRootShown","t","topIndex","id","p","coverOf","level","above","style","entry","_entry_direction","out","transform","dim","cover","_cover_entry_direction","dir","opposite","rootContent"],"mappings":"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"}
1
+ {"version":3,"file":"cascade/cascade-panel.jsx","sources":["../../src/cascade/cascade-panel.tsx"],"sourcesContent":["import './cascade.css';\nimport { G9CascadeDirection, G9CascadeTransition, G9StringKey, g9Ms } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useRef, useState, useSyncExternalStore } from '@lynx-js/react';\nimport { useG9Press } from '../base/press';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { G9ActivityIndicator } from '../display/activity-indicator';\nimport { G9IconSlot } from '../icon/slot';\nimport { useG9Direction, useG9Settings, useG9Strings } from '../provider/hooks';\nimport { type G9CascadeContent, type G9CascadePanelEntry, type G9CascadePushOptions, G9CascadeStack } from './model';\n\n/** Slide duration (MAUI `G9Metrics.CascadePanelAnimationMs`). */\nexport const g9CascadeAnimationMs = 280;\n/** How far a covered panel parallaxes (share of the slide) and how much it dims, in `overlay` mode. */\nexport const g9CascadeParallax = Object.freeze({ shift: 0.3, dim: 0.12 });\n\n/** Imperative API of a cascade panel (MAUI `G9CascadePanel` methods), from {@link useCascadePanel}. */\nexport interface G9CascadeController {\n /** Push a built view, or a factory built after the slide (spinner meanwhile). Resolves when it slid in. */\n push(content: G9CascadeContent, options?: G9CascadePushOptions): Promise<boolean>;\n /** Pop the top panel (no-op at the root). Resolves when it slid out. */\n pop(): Promise<boolean>;\n /** Pop every panel back to the root (after a slide in flight). */\n popToRoot(): Promise<boolean>;\n /** Current nesting depth; 0 = only the root. */\n readonly depth: number;\n /** @internal the stack the panel renders */\n readonly stack: G9CascadeStack;\n}\n\ninterface ControllerState {\n durationMs: number;\n onPushed?: ((depth: number) => void) | undefined;\n onPopped?: ((depth: number) => void) | undefined;\n}\n\n/** Creates a cascade controller outside React (tests, view models). */\nexport function createCascadeController(): G9CascadeController & { readonly state: ControllerState } {\n const state: ControllerState = { durationMs: g9CascadeAnimationMs };\n const stack = new G9CascadeStack({\n setTimer: (cb, ms) => startTimer(cb, ms),\n clearTimer: (h) => stopTimer(h as never),\n durationMs: () => state.durationMs,\n onPushed: (d) => state.onPushed?.(d),\n onPopped: (d) => state.onPopped?.(d),\n });\n return {\n state,\n stack,\n push: (content, options) => stack.push(content, options),\n pop: () => stack.pop(),\n popToRoot: () => stack.popToRoot(),\n get depth() {\n return stack.depth;\n },\n };\n}\n\n/** A stable controller for a `G9CascadePanel` (pass it as `controller`). */\nexport function useCascadePanel(): G9CascadeController {\n const ref = useRef<G9CascadeController | null>(null);\n if (ref.current === null) ref.current = createCascadeController();\n return ref.current;\n}\n\n/** Props of {@link G9CascadePanel}. */\nexport interface G9CascadePanelProps {\n readonly controller?: G9CascadeController;\n /** The view at depth 0; swapping it replaces the root without touching the nested stack. */\n readonly rootContent?: ReactNode;\n /** Lazy root (used when `rootContent` is absent): spinner, then built one tick after mount. */\n readonly rootContentFactory?: (() => ReactNode) | null;\n readonly rootTitle?: string | null;\n /** Default entry direction; `'auto'` follows the reading direction (L→R in LTR, R→L in RTL). */\n readonly direction?: G9CascadeDirection;\n /** `'overlay'` (default) slides over a stationary base; `'push'` slides the base out. */\n readonly transition?: G9CascadeTransition;\n /** Fade the root in on first appearance. Default false. */\n readonly animateRoot?: boolean;\n /** Back + title header on nested panels. Default true. */\n readonly showHeader?: boolean;\n /** A (back-less) header on the root too. Default false. */\n readonly showRootHeader?: boolean;\n /** Default 280. */\n readonly animationDurationMs?: number;\n /** Overlay mode: the covered panel parallaxes and dims. Default true. */\n readonly enableParallax?: boolean;\n /** Default 16 (MAUI `RadiusLg`). */\n readonly cornerRadius?: number;\n /** After a panel slid in, with the new depth (MAUI `PanelPushed`). */\n readonly onPanelPushed?: (depth: number) => void;\n /** After a panel slid out, with the new depth (MAUI `PanelPopped`). */\n readonly onPanelPopped?: (depth: number) => void;\n readonly className?: string;\n}\n\ntype Physical = 'leftToRight' | 'rightToLeft' | 'topToBottom' | 'bottomToTop';\n\n/** Resolves `'auto'` to the reading direction. */\nexport function resolveCascadeDirection(direction: G9CascadeDirection | null | undefined, rtl: boolean): Physical {\n if (!direction || direction === G9CascadeDirection.Auto) return rtl ? 'rightToLeft' : 'leftToRight';\n return direction;\n}\n\n/** The transform of a panel `amount` (0…1) of the way off-screen against its entry direction. */\nexport function cascadeOffset(direction: Physical, amount: number): string {\n const pct = `${Math.round(amount * 1000) / 10}%`;\n const neg = `-${pct}`;\n switch (direction) {\n case 'leftToRight':\n return `translateX(${amount === 0 ? '0%' : neg})`;\n case 'rightToLeft':\n return `translateX(${pct})`;\n case 'topToBottom':\n return `translateY(${amount === 0 ? '0%' : neg})`;\n default:\n return `translateY(${pct})`;\n }\n}\n\nfunction Header(props: { readonly title: string | null; readonly onBack: (() => void) | null }): ReactNode {\n const rtl = useG9Direction() === 'rtl';\n const glyphs = useG9Settings().glyphs;\n const strings = useG9Strings();\n const back = useG9Press(() => props.onBack?.(), { source: 'G9CascadePanel', guardMs: 0 });\n return (\n <view className={`g9-cascade__header g9-dir-${rtl ? 'rtl' : 'ltr'}`}>\n {props.onBack ? (\n <view\n className=\"g9-cascade__back\"\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={strings.get(G9StringKey.Back)}\n bindtap={back}\n >\n <G9IconSlot icon={rtl ? glyphs.chevronForward : glyphs.chevronBack} size={24} color=\"var(--g9-on-surface)\" />\n </view>\n ) : null}\n <text className=\"g9-cascade__title\" text-maxline=\"1\">\n {props.title ?? ''}\n </text>\n </view>\n );\n}\n\nfunction Body(props: {\n readonly content: G9CascadeContent;\n readonly wrap: boolean;\n readonly ready: boolean;\n}): ReactNode {\n const lazy = typeof props.content === 'function';\n const node = lazy ? (props.ready ? (props.content as () => ReactNode)() : null) : (props.content as ReactNode);\n const inner =\n lazy && !props.ready ? (\n <view className=\"g9-cascade__loading\">\n <G9ActivityIndicator running size={32} />\n </view>\n ) : (\n node\n );\n return props.wrap ? (\n <scroll-view className=\"g9-cascade__body\" scroll-orientation=\"vertical\">\n {inner}\n </scroll-view>\n ) : (\n <view className=\"g9-cascade__body\">{inner}</view>\n );\n}\n\n/**\n * In-place drill-down navigation (MAUI `G9CascadePanel`): `controller.push(view, { title })` slides a panel in over\n * the current one from any edge, `pop()` slides it back; panels stack to any depth inside whatever container holds the\n * panel (clipped to its bounds, opaque `Surface` panels). `overlay` keeps the base still (parallax + dim with\n * `enableParallax`); `push` slides it out. Lazy panels show a spinner and build after the slide. One slide runs at a\n * time: same-kind repeats are dropped, the other kind waits (see `G9CascadeStack`).\n */\nexport function G9CascadePanel(props: G9CascadePanelProps): ReactNode {\n const own = useCascadePanel();\n const controller = (props.controller ?? own) as ReturnType<typeof createCascadeController>;\n const duration = g9Ms(props.animationDurationMs ?? g9CascadeAnimationMs);\n controller.state.durationMs = duration;\n controller.state.onPushed = props.onPanelPushed;\n controller.state.onPopped = props.onPanelPopped;\n const stack = controller.stack;\n const panels = useSyncExternalStore(\n (l) => stack.subscribe(l),\n () => stack.getSnapshot(),\n );\n const rtl = useG9Direction() === 'rtl';\n const overlay = (props.transition ?? G9CascadeTransition.Overlay) === G9CascadeTransition.Overlay;\n const parallax = props.enableParallax !== false;\n useEffect(() => () => stack.dispose(), [stack]);\n\n // Lazy root: built one tick after mount. Root fade: visible after the first frame.\n const [rootReady, setRootReady] = useState(false);\n const [rootShown, setRootShown] = useState(props.animateRoot !== true);\n useEffect(() => {\n const t = startTimer(() => {\n setRootReady(true);\n setRootShown(true);\n }, 16);\n return () => stopTimer(t);\n }, []);\n\n const topIndex = (id: number | 'root') => (id === 'root' ? 0 : panels.findIndex((p) => p.id === id) + 1);\n // The panel that covers a given level, if any, and how far it is in.\n const coverOf = (level: number): { entry: G9CascadePanelEntry; amount: number } | null => {\n const above = panels[level];\n if (!above) return null;\n const amount = above.status === 'entering' || above.status === 'shown' ? 1 : 0;\n return { entry: above, amount };\n };\n const style = (level: number, entry: G9CascadePanelEntry | null) => {\n const own = entry ? resolveCascadeDirection(entry.direction ?? props.direction, rtl) : null;\n // Own slide: off-screen while staged/leaving, in place otherwise.\n const out = entry && (entry.status === 'staged' || entry.status === 'leaving');\n let transform = own && out ? cascadeOffset(own, 1) : 'translateX(0%)';\n let dim = 0;\n const cover = coverOf(level);\n if (cover && !out) {\n const dir = resolveCascadeDirection(cover.entry.direction ?? props.direction, rtl);\n // A covered level moves the other way: by the parallax share (overlay) or all the way (push).\n const opposite: Record<Physical, Physical> = {\n leftToRight: 'rightToLeft',\n rightToLeft: 'leftToRight',\n topToBottom: 'bottomToTop',\n bottomToTop: 'topToBottom',\n };\n const amount = cover.amount * (overlay ? (parallax ? g9CascadeParallax.shift : 0) : 1);\n transform = cascadeOffset(opposite[dir], amount);\n dim = overlay && parallax ? cover.amount * g9CascadeParallax.dim : 0;\n }\n return {\n transform,\n transition: entry?.status === 'staged' ? 'none' : `transform ${duration}ms ease-out, opacity ${duration}ms`,\n zIndex: level,\n ...(dim > 0 ? { opacity: 1 - dim } : { opacity: level === 0 && !rootShown ? 0 : 1 }),\n };\n };\n\n const rootContent = props.rootContent ?? props.rootContentFactory ?? null;\n return (\n <view\n className={`g9-cascade${props.className ? ` ${props.className}` : ''}`}\n style={{ borderRadius: `${props.cornerRadius ?? 16}px` }}\n >\n <view className=\"g9-cascade__panel\" style={style(0, null)}>\n {props.showRootHeader ? <Header title={props.rootTitle ?? null} onBack={null} /> : null}\n <Body content={rootContent} wrap ready={rootReady} />\n </view>\n {panels.map((entry) => (\n <view\n key={entry.id}\n className={`g9-cascade__panel g9-cascade__panel--${entry.status}`}\n style={style(topIndex(entry.id), entry)}\n >\n {props.showHeader !== false ? <Header title={entry.title} onBack={() => void stack.pop()} /> : null}\n <Body\n content={entry.content}\n wrap={entry.wrap}\n ready={entry.status === 'shown' || entry.status === 'leaving'}\n />\n </view>\n ))}\n </view>\n );\n}\n"],"names":["g9CascadeAnimationMs","g9CascadeParallax","Object","createCascadeController","state","stack","G9CascadeStack","cb","ms","startTimer","h","stopTimer","d","content","options","useCascadePanel","ref","useRef","resolveCascadeDirection","direction","rtl","G9CascadeDirection","cascadeOffset","amount","pct","Math","neg","Header","props","_props_title","useG9Direction","glyphs","useG9Settings","strings","useG9Strings","back","useG9Press","view","G9StringKey","G9IconSlot","text","Body","lazy","node","inner","G9ActivityIndicator","scroll-view","G9CascadePanel","_props_controller","_props_animationDurationMs","_props_transition","_ref","_props_cornerRadius","_props_rootTitle","own","controller","duration","g9Ms","panels","useSyncExternalStore","l","overlay","G9CascadeTransition","parallax","useEffect","rootReady","setRootReady","useState","rootShown","setRootShown","t","topIndex","id","p","coverOf","level","above","style","entry","_entry_direction","out","transform","dim","cover","_cover_entry_direction","dir","opposite","rootContent"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import "./edge-panel.css";
2
- import { G9StringKey } from "@g9tm/lynxcontrols-foundation";
2
+ import { G9StringKey, g9Ms } from "@g9tm/lynxcontrols-foundation";
3
3
  import { useEffect, useMemo, useRef, useState } from "@lynx-js/react";
4
4
  import { g9RowStyle, g9TextStart } from "../base/control.jsx";
5
5
  import { startTimer, stopTimer } from "../base/timers.jsx";
@@ -68,8 +68,8 @@ function G9EdgePanel(props) {
68
68
  onChange: props.onOpenChange,
69
69
  name: 'G9EdgePanel.open'
70
70
  });
71
- const openMs = null != (_ref = null != (_props_openAnimationDuration = props.openAnimationDuration) ? _props_openAnimationDuration : props.animationDuration) ? _ref : g9EdgePanelMetrics.defaultOpenAnimationDurationMs;
72
- const closeMs = null != (_ref1 = null != (_props_closeAnimationDuration = props.closeAnimationDuration) ? _props_closeAnimationDuration : props.animationDuration) ? _ref1 : g9EdgePanelMetrics.defaultCloseAnimationDurationMs;
71
+ const openMs = g9Ms(null != (_ref = null != (_props_openAnimationDuration = props.openAnimationDuration) ? _props_openAnimationDuration : props.animationDuration) ? _ref : g9EdgePanelMetrics.defaultOpenAnimationDurationMs);
72
+ const closeMs = g9Ms(null != (_ref1 = null != (_props_closeAnimationDuration = props.closeAnimationDuration) ? _props_closeAnimationDuration : props.animationDuration) ? _ref1 : g9EdgePanelMetrics.defaultCloseAnimationDurationMs);
73
73
  const [phase, setPhase] = useState(isOpen ? 'entering' : 'closed');
74
74
  const latest = useRef(props);
75
75
  latest.current = props;
@@ -201,7 +201,7 @@ function EdgePanelOverlay(o) {
201
201
  {cardRendered ? <view className={`g9-edge-panel__close g9-edge-panel__close--${placement}`} style={{
202
202
  ...closeStyle,
203
203
  opacity: shown ? 1 : 0,
204
- transition: `opacity ${g9EdgePanelMetrics.tabEntranceDurationMs}ms ease-out`,
204
+ transition: `opacity ${g9Ms(g9EdgePanelMetrics.tabEntranceDurationMs)}ms ease-out`,
205
205
  backgroundColor: null != (_p_tabBackgroundColor = p.tabBackgroundColor) ? _p_tabBackgroundColor : 'var(--g9-surface-container-highest)'
206
206
  }} accessibility-element accessibility-traits="button" bindtap={o.onTab}>
207
207
  <G9IconSlot icon={glyphs.clear} size={g9EdgePanelMetrics.tabIconSize} color="var(--g9-on-surface)"/>
@@ -274,7 +274,7 @@ function PanelBody(props) {
274
274
  const content = null != p.panelContent ? p.panelContent : frame ? <view key={`level-${version}`} className="g9-edge-panel__menu" style={{
275
275
  transform: `translateX(${entered ? 0 : 24 * sign}px)`,
276
276
  opacity: entered ? 1 : 0,
277
- transition: entered ? `transform ${g9EdgePanelMetrics.menuTransitionDurationMs}ms ease-out, opacity ${g9EdgePanelMetrics.menuTransitionDurationMs}ms ease-out` : 'none'
277
+ transition: entered ? `transform ${g9Ms(g9EdgePanelMetrics.menuTransitionDurationMs)}ms ease-out, opacity ${g9Ms(g9EdgePanelMetrics.menuTransitionDurationMs)}ms ease-out` : 'none'
278
278
  }}>
279
279
  {nav.isRoot ? null : <view className="g9-edge-panel__back" style={g9RowStyle(contentRtl ? 'rtl' : 'ltr')} accessibility-element accessibility-traits="button" bindtap={()=>{
280
280
  nav.back();
@@ -1 +1 @@
1
- {"version":3,"file":"edge-panel/edge-panel.jsx","sources":["../../src/edge-panel/edge-panel.tsx"],"sourcesContent":["import './edge-panel.css';\nimport { G9StringKey } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from '@lynx-js/react';\nimport { g9RowStyle, g9TextStart } from '../base/control';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Back, useG9LayerItem } from '../host/hooks';\nimport type { G9IconInput } from '../icon/icon';\nimport { G9IconSlot } from '../icon/slot';\nimport {\n useG9Core,\n useG9Diagnostics,\n useG9Direction,\n useG9Settings,\n useG9Strings,\n useG9Window,\n} from '../provider/hooks';\nimport {\n type G9EdgeCloseButtonPlacement,\n type G9EdgeMenuHeader,\n type G9EdgeMenuHeaderAlignment,\n type G9EdgeMenuItem,\n G9EdgeMenuNavigator,\n type G9EdgePanelContentDirection,\n type G9EdgeSide,\n isEdgeMenuHeaderEmpty,\n g9EdgePanelMetrics as M,\n resolveEdgePanelMaxHeight,\n} from './types';\n\n/** Imperative handle of an edge panel (MAUI `G9EdgePanel` methods), from {@link useEdgePanel} or the helper. */\nexport interface G9EdgePanelController {\n open(): void;\n close(): void;\n toggle(): void;\n readonly isOpen: boolean;\n /** Closes an open panel and reports whether the press was consumed (MAUI `HandleHardwareBackPressed`). */\n handleHardwareBackPressed(): boolean;\n navigateToSubList(items: readonly G9EdgeMenuItem[], header?: G9EdgeMenuHeader | null): void;\n navigateToRoot(): void;\n refreshMenuItems(): void;\n /** `true` while a panel is mounted on this controller. */\n readonly isMounted: boolean;\n /** @internal set by the mounted panel */\n bind(target: G9EdgePanelTarget): () => void;\n}\n\ninterface G9EdgePanelTarget {\n setOpen(open: boolean): void;\n isOpen(): boolean;\n navigator: G9EdgeMenuNavigator;\n renderNav(): void;\n}\n\n/** Creates a controller outside React. */\nexport function createEdgePanelController(): G9EdgePanelController {\n let target: G9EdgePanelTarget | null = null;\n return {\n open: () => target?.setOpen(true),\n close: () => target?.setOpen(false),\n toggle: () => target?.setOpen(!target.isOpen()),\n get isOpen() {\n return target ? target.isOpen() : false;\n },\n get isMounted() {\n return target !== null;\n },\n handleHardwareBackPressed() {\n if (!target?.isOpen()) return false;\n target.setOpen(false);\n return true;\n },\n navigateToSubList(items, header = null) {\n if (!target) return;\n target.navigator.navigateToSubList(items, header);\n target.renderNav();\n },\n navigateToRoot() {\n if (!target) return;\n target.navigator.navigateToRoot();\n target.renderNav();\n },\n refreshMenuItems() {\n if (!target) return;\n target.navigator.refresh();\n target.renderNav();\n },\n bind(next) {\n target = next;\n return () => {\n if (target === next) target = null;\n };\n },\n };\n}\n\n/** A stable controller for a `G9EdgePanel`. */\nexport function useEdgePanel(): G9EdgePanelController {\n const ref = useRef<G9EdgePanelController | null>(null);\n if (ref.current === null) ref.current = createEdgePanelController();\n return ref.current;\n}\n\n/** Props of {@link G9EdgePanel} (MAUI bindable properties and events). */\nexport interface G9EdgePanelProps {\n /** Absolute edge (MAUI `Side`). Default `'left'`. */\n readonly side?: G9EdgeSide;\n /** Panel width as a share of the host width (MAUI `WidthRatio`). Default 0.35. */\n readonly widthRatio?: number;\n /** Distance from the top (MAUI `TopGap`). Default 112. */\n readonly topGap?: number;\n /** Absolute height cap; 0 = none (MAUI `MaxPanelHeight`). */\n readonly maxPanelHeight?: number;\n /** Height cap as a share of the host height (MAUI `MaxPanelHeightRatio`). Default 0.69. */\n readonly maxPanelHeightRatio?: number;\n /** Controlled open state (MAUI `IsOpen`, two-way). */\n readonly open?: boolean;\n readonly defaultOpen?: boolean;\n readonly onOpenChange?: (open: boolean) => void;\n /** Custom content (MAUI `PanelContent`); wins over `menuItems`. */\n readonly panelContent?: ReactNode;\n /** A navigable list menu (MAUI `MenuItems`). */\n readonly menuItems?: readonly G9EdgeMenuItem[] | null;\n readonly panelBackgroundColor?: string | null;\n readonly tabBackgroundColor?: string | null;\n /** Icon of the collapsed tab. Default: a chevron pointing into the screen. */\n readonly collapsedTabIcon?: G9IconInput;\n /** Sets both durations (MAUI `AnimationDuration`); the specific ones win. */\n readonly animationDuration?: number;\n /** Slide-in duration (MAUI `OpenAnimationDuration`). Default 450. */\n readonly openAnimationDuration?: number;\n /** Slide-out duration (MAUI `CloseAnimationDuration`). Default 450. */\n readonly closeAnimationDuration?: number;\n /** A backdrop tap closes the panel (needs `useBackdrop`). Default true. */\n readonly enableOutsideTapToClose?: boolean;\n /** Modal: a dimmed backdrop takes every tap outside the panel. Default true. Off = non-modal: only the panel and its tab take touches. */\n readonly useBackdrop?: boolean;\n /** Show the peek tab while closed. Default false. */\n readonly showCollapsedTab?: boolean;\n readonly contentFlowDirection?: G9EdgePanelContentDirection;\n readonly menuHeader?: G9EdgeMenuHeader | null;\n readonly menuHeaderAlignment?: G9EdgeMenuHeaderAlignment;\n readonly closeButtonPlacement?: G9EdgeCloseButtonPlacement;\n /** After the open slide (MAUI `Opened`). */\n readonly onOpened?: () => void;\n /** When the close slide starts (MAUI `Closing`). */\n readonly onClosing?: () => void;\n /** After the close slide (MAUI `Closed`). */\n readonly onClosed?: () => void;\n readonly controller?: G9EdgePanelController;\n}\n\nlet panelSequence = 0;\n\ntype Phase = 'closed' | 'entering' | 'opening' | 'open' | 'closing';\n\n/**\n * A panel that slides in from a screen edge (MAUI `G9EdgePanel`), mounted in the host's `edgePanel` layer whatever\n * its place in the tree. Modal by default (a dimmed backdrop that closes on tap); with `useBackdrop={false}` it is\n * non-modal: the page stays interactive and only the panel and its tab receive touches. Content is a custom view or a\n * list menu with nested levels (Back row, per-level header). Hardware back closes it.\n */\nexport function G9EdgePanel(props: G9EdgePanelProps): ReactNode {\n const keyRef = useRef<string | null>(null);\n if (keyRef.current === null) {\n panelSequence += 1;\n keyRef.current = `g9-edge-panel-${panelSequence}`;\n }\n const key = keyRef.current;\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: props.open,\n defaultValue: props.defaultOpen ?? false,\n onChange: props.onOpenChange,\n name: 'G9EdgePanel.open',\n });\n const openMs = props.openAnimationDuration ?? props.animationDuration ?? M.defaultOpenAnimationDurationMs;\n const closeMs = props.closeAnimationDuration ?? props.animationDuration ?? M.defaultCloseAnimationDurationMs;\n const [phase, setPhase] = useState<Phase>(isOpen ? 'entering' : 'closed');\n const latest = useRef(props);\n latest.current = props;\n const openRef = useRef(isOpen);\n openRef.current = isOpen;\n\n useEffect(() => {\n if (isOpen) {\n setPhase((p) => (p === 'closed' ? 'entering' : 'opening'));\n const enter = startTimer(() => setPhase('opening'), 16);\n const done = startTimer(() => {\n setPhase('open');\n latest.current.onOpened?.();\n }, openMs + 16);\n return () => {\n stopTimer(enter);\n stopTimer(done);\n };\n }\n if (phase === 'closed') return;\n latest.current.onClosing?.();\n setPhase('closing');\n const done = startTimer(() => {\n setPhase('closed');\n latest.current.onClosed?.();\n }, closeMs);\n return () => stopTimer(done);\n }, [isOpen]);\n\n // List navigation: a new menuItems list or header resets to the root level.\n const navigator = useMemo(() => new G9EdgeMenuNavigator(), []);\n const [, setNavVersion] = useState(0);\n const renderNav = () => setNavVersion(navigator.version);\n const rootHeader = props.menuHeader ?? null;\n useMemo(() => navigator.setRoot(props.menuItems, rootHeader), [props.menuItems, rootHeader]);\n useEffect(\n () =>\n props.controller?.bind({\n setOpen: (open) => setOpen(open),\n isOpen: () => openRef.current,\n navigator,\n renderNav,\n }),\n [props.controller],\n );\n\n useG9Back(\n () => {\n setOpen(false);\n return true;\n },\n { enabled: isOpen, layer: 'edgePanel' },\n );\n\n // Shared debounce for tab and backdrop taps (MAUI InteractionDebounceMs: one physical tap can reach both).\n const core = useG9Core();\n const lastInteraction = useRef(Number.NEGATIVE_INFINITY);\n const accept = () => {\n const now = core.services.clock.monotonicNow();\n if (now - lastInteraction.current < M.interactionDebounceMs) return false;\n lastInteraction.current = now;\n return true;\n };\n const animating = phase === 'entering' || phase === 'opening' || phase === 'closing';\n const onTab = () => {\n if (animating || !accept()) return;\n setOpen(!openRef.current);\n };\n const useBackdrop = props.useBackdrop ?? true;\n const onBackdrop = () => {\n if (!accept()) return;\n if (useBackdrop && (props.enableOutsideTapToClose ?? true) && openRef.current) setOpen(false);\n };\n\n const overlay = (\n <EdgePanelOverlay\n props={props}\n phase={phase}\n openMs={openMs}\n closeMs={closeMs}\n navigator={navigator}\n navVersion={navigator.version}\n onTab={onTab}\n onBackdrop={onBackdrop}\n onNavigate={renderNav}\n onClose={() => setOpen(false)}\n />\n );\n const visible = phase !== 'closed' || props.showCollapsedTab === true;\n useG9LayerItem('edgePanel', key, overlay, { enabled: visible });\n return null;\n}\n\ninterface OverlayProps {\n readonly props: G9EdgePanelProps;\n readonly phase: Phase;\n readonly openMs: number;\n readonly closeMs: number;\n readonly navigator: G9EdgeMenuNavigator;\n readonly navVersion: number;\n readonly onTab: () => void;\n readonly onBackdrop: () => void;\n readonly onNavigate: () => void;\n readonly onClose: () => void;\n}\n\nfunction EdgePanelOverlay(o: OverlayProps): ReactNode {\n const p = o.props;\n const win = useG9Window();\n const appRtl = useG9Direction() === 'rtl';\n const glyphs = useG9Settings().glyphs;\n const left = (p.side ?? 'left') === 'left';\n const direction = p.contentFlowDirection ?? 'matchApplication';\n const contentRtl = direction === 'matchApplication' ? appRtl : direction === 'rightToLeft';\n const width = Math.max(win.width * (p.widthRatio ?? M.defaultWidthRatio), 0);\n const topGap = p.topGap ?? M.defaultTopGap;\n const maxHeight = resolveEdgePanelMaxHeight(\n win.height,\n topGap,\n p.maxPanelHeight ?? 0,\n p.maxPanelHeightRatio ?? M.defaultMaxPanelHeightRatio,\n );\n const shown = o.phase === 'opening' || o.phase === 'open';\n const cardRendered = o.phase !== 'closed';\n const hiddenOffset = (width + M.collapsedExtraOffset) * (left ? -1 : 1);\n const edge = left ? 'left' : 'right';\n const far = left ? 'right' : 'left';\n const useBackdrop = p.useBackdrop ?? true;\n const placement = p.closeButtonPlacement ?? 'inset';\n\n const closeStyle =\n placement === 'onCorner'\n ? { top: `${topGap - M.tabExpandedSize / 2}px`, [edge]: `${width - M.tabExpandedSize / 2}px` }\n : { top: `${topGap + M.tabTopInset}px`, [edge]: `${width - M.tabTopInset - M.tabExpandedSize}px` };\n const tabIcon = p.collapsedTabIcon ?? (left ? glyphs.chevronForward : glyphs.chevronBack);\n\n return (\n <view className=\"g9-edge-panel\">\n {useBackdrop && cardRendered ? (\n <view\n className=\"g9-edge-panel__backdrop\"\n style={{\n opacity: shown ? 1 : 0,\n transition: `opacity ${shown ? o.openMs : o.closeMs}ms ease-out`,\n backgroundColor: `rgba(0, 0, 0, ${M.backdropAlpha})`,\n }}\n bindtap={o.onBackdrop}\n />\n ) : null}\n {cardRendered ? (\n <view\n className={`g9-edge-panel__card g9-edge-panel__card--${edge}`}\n style={{\n [edge]: `${-M.wallOverlap}px`,\n top: `${topGap}px`,\n width: `${width + M.wallOverlap}px`,\n maxHeight: `${maxHeight}px`,\n backgroundColor: p.panelBackgroundColor ?? 'var(--g9-surface-container-high)',\n transform: `translateX(${shown ? 0 : hiddenOffset}px)`,\n transition:\n o.phase === 'entering'\n ? 'none'\n : `transform ${shown ? o.openMs : o.closeMs}ms ${shown ? 'cubic-bezier(0.215, 0.61, 0.355, 1)' : 'cubic-bezier(0.55, 0.055, 0.675, 0.19)'}`,\n }}\n >\n <PanelBody o={o} contentRtl={contentRtl} closeOnFar={far} />\n </view>\n ) : null}\n {cardRendered ? (\n <view\n className={`g9-edge-panel__close g9-edge-panel__close--${placement}`}\n style={{\n ...closeStyle,\n opacity: shown ? 1 : 0,\n transition: `opacity ${M.tabEntranceDurationMs}ms ease-out`,\n backgroundColor: p.tabBackgroundColor ?? 'var(--g9-surface-container-highest)',\n }}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={o.onTab}\n >\n <G9IconSlot icon={glyphs.clear} size={M.tabIconSize} color=\"var(--g9-on-surface)\" />\n </view>\n ) : p.showCollapsedTab ? (\n <view\n className={`g9-edge-panel__tab g9-edge-panel__tab--${edge}`}\n style={{\n [edge]: '0px',\n top: `${topGap + M.tabTopInset}px`,\n backgroundColor: p.tabBackgroundColor ?? 'var(--g9-surface-container-highest)',\n }}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={o.onTab}\n >\n <G9IconSlot icon={tabIcon} size={M.tabIconSize} color=\"var(--g9-on-surface)\" />\n </view>\n ) : null}\n </view>\n );\n}\n\nfunction headerText(header: G9EdgeMenuHeader, resolve: (key: string) => string | null): string {\n if (header.text) return header.text;\n const key = header.localizationKey as string;\n return resolve(key) ?? key;\n}\n\nfunction PanelBody(props: {\n readonly o: OverlayProps;\n readonly contentRtl: boolean;\n readonly closeOnFar: string;\n}): ReactNode {\n const { o, contentRtl } = props;\n const p = o.props;\n const strings = useG9Strings();\n const diagnostics = useG9Diagnostics();\n const glyphs = useG9Settings().glyphs;\n const resolve = (key: string) => strings.resolve(key);\n const nav = o.navigator;\n const frame = nav.frame;\n const header = p.panelContent != null ? (p.menuHeader ?? null) : (frame?.header ?? null);\n const alignment = p.menuHeaderAlignment ?? 'auto';\n const textAlign =\n alignment === 'center'\n ? 'center'\n : alignment === 'leftToRight'\n ? 'left'\n : alignment === 'rightToLeft'\n ? 'right'\n : contentRtl\n ? 'right'\n : 'left';\n const footprint = M.tabExpandedSize + M.tabTopInset;\n const headerPadding =\n alignment === 'center'\n ? { paddingLeft: `${footprint}px`, paddingRight: `${footprint}px` }\n : { [props.closeOnFar === 'right' ? 'paddingRight' : 'paddingLeft']: `${footprint}px` };\n\n // Directional entry of a new menu level (MAUI menu content slide, 220 ms).\n const [entered, setEntered] = useState(true);\n const version = o.navVersion;\n useEffect(() => {\n if (nav.transition === 'none') return;\n setEntered(false);\n const t = startTimer(() => setEntered(true), 16);\n return () => stopTimer(t);\n }, [version]);\n const sign = (nav.transition === 'forward' ? 1 : -1) * (contentRtl ? -1 : 1);\n\n const onRow = (item: G9EdgeMenuItem) => {\n if (item.isEnabled === false) return;\n try {\n item.onClick?.(item);\n item.command?.(item.commandParameter);\n } catch (error) {\n diagnostics.log({\n level: 'error',\n message: 'G9EdgePanel: menu item handler failed.',\n source: 'G9EdgePanel',\n error,\n });\n }\n if (item.nextList && item.nextList.length > 0) {\n nav.navigateToSubList(item.nextList, item.subMenuHeader ?? null);\n o.onNavigate();\n } else if (item.closeAfterClick) {\n o.onClose();\n }\n };\n\n const content =\n p.panelContent != null ? (\n p.panelContent\n ) : frame ? (\n <view\n key={`level-${version}`}\n className=\"g9-edge-panel__menu\"\n style={{\n transform: `translateX(${entered ? 0 : 24 * sign}px)`,\n opacity: entered ? 1 : 0,\n transition: entered\n ? `transform ${M.menuTransitionDurationMs}ms ease-out, opacity ${M.menuTransitionDurationMs}ms ease-out`\n : 'none',\n }}\n >\n {nav.isRoot ? null : (\n <view\n className=\"g9-edge-panel__back\"\n style={g9RowStyle(contentRtl ? 'rtl' : 'ltr')}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={() => {\n nav.back();\n o.onNavigate();\n }}\n >\n <G9IconSlot\n icon={contentRtl ? glyphs.chevronForward : glyphs.chevronBack}\n size={M.menuItemIconSize}\n color=\"var(--g9-on-surface)\"\n />\n <text className=\"g9-edge-panel__back-text\">{strings.get(G9StringKey.Back)}</text>\n </view>\n )}\n {frame.items.map((item, i) => (\n <view key={`${version}-${i}`} className=\"g9-edge-panel__row-wrap\">\n <view\n className={`g9-edge-panel__row${item.isEnabled === false ? ' g9-edge-panel__row--disabled' : ''}`}\n {...(item.automationId ? { id: item.automationId } : {})}\n style={{\n ...g9RowStyle(contentRtl ? 'rtl' : 'ltr'),\n backgroundColor: item.backgroundColor ?? 'transparent',\n opacity: item.isEnabled === false ? 0.5 : 1,\n }}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={item.isEnabled === false ? undefined : () => onRow(item)}\n >\n <G9IconSlot\n emoji={item.emoji}\n icon={item.icon}\n imagePath={item.imageSource}\n image={item.image}\n size={item.icon ? M.menuItemIconSize : item.emoji ? M.menuItemEmojiSize : M.menuItemImageSize}\n color={item.iconColor ?? 'var(--g9-on-surface-variant)'}\n />\n <text\n className=\"g9-edge-panel__row-text\"\n text-maxline=\"1\"\n style={{ color: item.textColor ?? 'var(--g9-on-surface)', ...g9TextStart(contentRtl ? 'rtl' : 'ltr') }}\n >\n {item.text ?? (item.localizedTextKey ? (resolve(item.localizedTextKey) ?? item.localizedTextKey) : '')}\n </text>\n {item.nextList && item.nextList.length > 0 ? (\n <G9IconSlot\n icon={contentRtl ? glyphs.chevronBack : glyphs.chevronForward}\n size={18}\n color=\"var(--g9-on-surface-variant)\"\n />\n ) : null}\n </view>\n {item.showDividerBelow ? <view className=\"g9-edge-panel__divider\" /> : null}\n </view>\n ))}\n </view>\n ) : null;\n\n return (\n <view className=\"g9-edge-panel__body\" style={{ direction: contentRtl ? 'rtl' : 'ltr' }}>\n {!isEdgeMenuHeaderEmpty(header) ? (\n <view className=\"g9-edge-panel__header\" style={headerPadding}>\n {(header as G9EdgeMenuHeader).view != null ? (\n (header as G9EdgeMenuHeader).view\n ) : (\n <text className=\"g9-edge-panel__title\" style={{ textAlign }}>\n {headerText(header as G9EdgeMenuHeader, resolve)}\n </text>\n )}\n </view>\n ) : null}\n <scroll-view className=\"g9-edge-panel__scroll\" scroll-orientation=\"vertical\">\n {content}\n </scroll-view>\n </view>\n );\n}\n"],"names":["createEdgePanelController","target","items","header","next","useEdgePanel","ref","useRef","panelSequence","G9EdgePanel","props","_props_defaultOpen","_ref","_ref1","_props_menuHeader","_props_useBackdrop","keyRef","key","isOpen","setOpen","useControllableState","openMs","M","closeMs","phase","setPhase","useState","latest","openRef","useEffect","_latest_current","p","enter","startTimer","done","stopTimer","navigator","useMemo","G9EdgeMenuNavigator","setNavVersion","renderNav","rootHeader","_props_controller","open","useG9Back","core","useG9Core","lastInteraction","Number","accept","now","animating","onTab","useBackdrop","onBackdrop","_props_enableOutsideTapToClose","overlay","EdgePanelOverlay","visible","useG9LayerItem","o","_p_side","_p_contentFlowDirection","_p_widthRatio","_p_topGap","_p_maxPanelHeight","_p_maxPanelHeightRatio","_p_useBackdrop","_p_closeButtonPlacement","_p_collapsedTabIcon","_p_panelBackgroundColor","_p_tabBackgroundColor","_p_tabBackgroundColor1","win","useG9Window","appRtl","useG9Direction","glyphs","useG9Settings","left","direction","contentRtl","width","Math","topGap","maxHeight","resolveEdgePanelMaxHeight","shown","cardRendered","hiddenOffset","edge","far","placement","closeStyle","tabIcon","view","PanelBody","G9IconSlot","headerText","resolve","_resolve","_p_menuHeader","_p_menuHeaderAlignment","strings","useG9Strings","diagnostics","useG9Diagnostics","nav","frame","alignment","textAlign","footprint","headerPadding","entered","setEntered","version","t","sign","onRow","item","error","_item_subMenuHeader","content","g9RowStyle","text","G9StringKey","i","_item_backgroundColor","_item_iconColor","_item_textColor","_item_text","undefined","g9TextStart","isEdgeMenuHeaderEmpty","scroll-view"],"mappings":"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"}
1
+ {"version":3,"file":"edge-panel/edge-panel.jsx","sources":["../../src/edge-panel/edge-panel.tsx"],"sourcesContent":["import './edge-panel.css';\nimport { G9StringKey, g9Ms } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from '@lynx-js/react';\nimport { g9RowStyle, g9TextStart } from '../base/control';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Back, useG9LayerItem } from '../host/hooks';\nimport type { G9IconInput } from '../icon/icon';\nimport { G9IconSlot } from '../icon/slot';\nimport {\n useG9Core,\n useG9Diagnostics,\n useG9Direction,\n useG9Settings,\n useG9Strings,\n useG9Window,\n} from '../provider/hooks';\nimport {\n type G9EdgeCloseButtonPlacement,\n type G9EdgeMenuHeader,\n type G9EdgeMenuHeaderAlignment,\n type G9EdgeMenuItem,\n G9EdgeMenuNavigator,\n type G9EdgePanelContentDirection,\n type G9EdgeSide,\n isEdgeMenuHeaderEmpty,\n g9EdgePanelMetrics as M,\n resolveEdgePanelMaxHeight,\n} from './types';\n\n/** Imperative handle of an edge panel (MAUI `G9EdgePanel` methods), from {@link useEdgePanel} or the helper. */\nexport interface G9EdgePanelController {\n open(): void;\n close(): void;\n toggle(): void;\n readonly isOpen: boolean;\n /** Closes an open panel and reports whether the press was consumed (MAUI `HandleHardwareBackPressed`). */\n handleHardwareBackPressed(): boolean;\n navigateToSubList(items: readonly G9EdgeMenuItem[], header?: G9EdgeMenuHeader | null): void;\n navigateToRoot(): void;\n refreshMenuItems(): void;\n /** `true` while a panel is mounted on this controller. */\n readonly isMounted: boolean;\n /** @internal set by the mounted panel */\n bind(target: G9EdgePanelTarget): () => void;\n}\n\ninterface G9EdgePanelTarget {\n setOpen(open: boolean): void;\n isOpen(): boolean;\n navigator: G9EdgeMenuNavigator;\n renderNav(): void;\n}\n\n/** Creates a controller outside React. */\nexport function createEdgePanelController(): G9EdgePanelController {\n let target: G9EdgePanelTarget | null = null;\n return {\n open: () => target?.setOpen(true),\n close: () => target?.setOpen(false),\n toggle: () => target?.setOpen(!target.isOpen()),\n get isOpen() {\n return target ? target.isOpen() : false;\n },\n get isMounted() {\n return target !== null;\n },\n handleHardwareBackPressed() {\n if (!target?.isOpen()) return false;\n target.setOpen(false);\n return true;\n },\n navigateToSubList(items, header = null) {\n if (!target) return;\n target.navigator.navigateToSubList(items, header);\n target.renderNav();\n },\n navigateToRoot() {\n if (!target) return;\n target.navigator.navigateToRoot();\n target.renderNav();\n },\n refreshMenuItems() {\n if (!target) return;\n target.navigator.refresh();\n target.renderNav();\n },\n bind(next) {\n target = next;\n return () => {\n if (target === next) target = null;\n };\n },\n };\n}\n\n/** A stable controller for a `G9EdgePanel`. */\nexport function useEdgePanel(): G9EdgePanelController {\n const ref = useRef<G9EdgePanelController | null>(null);\n if (ref.current === null) ref.current = createEdgePanelController();\n return ref.current;\n}\n\n/** Props of {@link G9EdgePanel} (MAUI bindable properties and events). */\nexport interface G9EdgePanelProps {\n /** Absolute edge (MAUI `Side`). Default `'left'`. */\n readonly side?: G9EdgeSide;\n /** Panel width as a share of the host width (MAUI `WidthRatio`). Default 0.35. */\n readonly widthRatio?: number;\n /** Distance from the top (MAUI `TopGap`). Default 112. */\n readonly topGap?: number;\n /** Absolute height cap; 0 = none (MAUI `MaxPanelHeight`). */\n readonly maxPanelHeight?: number;\n /** Height cap as a share of the host height (MAUI `MaxPanelHeightRatio`). Default 0.69. */\n readonly maxPanelHeightRatio?: number;\n /** Controlled open state (MAUI `IsOpen`, two-way). */\n readonly open?: boolean;\n readonly defaultOpen?: boolean;\n readonly onOpenChange?: (open: boolean) => void;\n /** Custom content (MAUI `PanelContent`); wins over `menuItems`. */\n readonly panelContent?: ReactNode;\n /** A navigable list menu (MAUI `MenuItems`). */\n readonly menuItems?: readonly G9EdgeMenuItem[] | null;\n readonly panelBackgroundColor?: string | null;\n readonly tabBackgroundColor?: string | null;\n /** Icon of the collapsed tab. Default: a chevron pointing into the screen. */\n readonly collapsedTabIcon?: G9IconInput;\n /** Sets both durations (MAUI `AnimationDuration`); the specific ones win. */\n readonly animationDuration?: number;\n /** Slide-in duration (MAUI `OpenAnimationDuration`). Default 450. */\n readonly openAnimationDuration?: number;\n /** Slide-out duration (MAUI `CloseAnimationDuration`). Default 450. */\n readonly closeAnimationDuration?: number;\n /** A backdrop tap closes the panel (needs `useBackdrop`). Default true. */\n readonly enableOutsideTapToClose?: boolean;\n /** Modal: a dimmed backdrop takes every tap outside the panel. Default true. Off = non-modal: only the panel and its tab take touches. */\n readonly useBackdrop?: boolean;\n /** Show the peek tab while closed. Default false. */\n readonly showCollapsedTab?: boolean;\n readonly contentFlowDirection?: G9EdgePanelContentDirection;\n readonly menuHeader?: G9EdgeMenuHeader | null;\n readonly menuHeaderAlignment?: G9EdgeMenuHeaderAlignment;\n readonly closeButtonPlacement?: G9EdgeCloseButtonPlacement;\n /** After the open slide (MAUI `Opened`). */\n readonly onOpened?: () => void;\n /** When the close slide starts (MAUI `Closing`). */\n readonly onClosing?: () => void;\n /** After the close slide (MAUI `Closed`). */\n readonly onClosed?: () => void;\n readonly controller?: G9EdgePanelController;\n}\n\nlet panelSequence = 0;\n\ntype Phase = 'closed' | 'entering' | 'opening' | 'open' | 'closing';\n\n/**\n * A panel that slides in from a screen edge (MAUI `G9EdgePanel`), mounted in the host's `edgePanel` layer whatever\n * its place in the tree. Modal by default (a dimmed backdrop that closes on tap); with `useBackdrop={false}` it is\n * non-modal: the page stays interactive and only the panel and its tab receive touches. Content is a custom view or a\n * list menu with nested levels (Back row, per-level header). Hardware back closes it.\n */\nexport function G9EdgePanel(props: G9EdgePanelProps): ReactNode {\n const keyRef = useRef<string | null>(null);\n if (keyRef.current === null) {\n panelSequence += 1;\n keyRef.current = `g9-edge-panel-${panelSequence}`;\n }\n const key = keyRef.current;\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: props.open,\n defaultValue: props.defaultOpen ?? false,\n onChange: props.onOpenChange,\n name: 'G9EdgePanel.open',\n });\n const openMs = g9Ms(props.openAnimationDuration ?? props.animationDuration ?? M.defaultOpenAnimationDurationMs);\n const closeMs = g9Ms(props.closeAnimationDuration ?? props.animationDuration ?? M.defaultCloseAnimationDurationMs);\n const [phase, setPhase] = useState<Phase>(isOpen ? 'entering' : 'closed');\n const latest = useRef(props);\n latest.current = props;\n const openRef = useRef(isOpen);\n openRef.current = isOpen;\n\n useEffect(() => {\n if (isOpen) {\n setPhase((p) => (p === 'closed' ? 'entering' : 'opening'));\n const enter = startTimer(() => setPhase('opening'), 16);\n const done = startTimer(() => {\n setPhase('open');\n latest.current.onOpened?.();\n }, openMs + 16);\n return () => {\n stopTimer(enter);\n stopTimer(done);\n };\n }\n if (phase === 'closed') return;\n latest.current.onClosing?.();\n setPhase('closing');\n const done = startTimer(() => {\n setPhase('closed');\n latest.current.onClosed?.();\n }, closeMs);\n return () => stopTimer(done);\n }, [isOpen]);\n\n // List navigation: a new menuItems list or header resets to the root level.\n const navigator = useMemo(() => new G9EdgeMenuNavigator(), []);\n const [, setNavVersion] = useState(0);\n const renderNav = () => setNavVersion(navigator.version);\n const rootHeader = props.menuHeader ?? null;\n useMemo(() => navigator.setRoot(props.menuItems, rootHeader), [props.menuItems, rootHeader]);\n useEffect(\n () =>\n props.controller?.bind({\n setOpen: (open) => setOpen(open),\n isOpen: () => openRef.current,\n navigator,\n renderNav,\n }),\n [props.controller],\n );\n\n useG9Back(\n () => {\n setOpen(false);\n return true;\n },\n { enabled: isOpen, layer: 'edgePanel' },\n );\n\n // Shared debounce for tab and backdrop taps (MAUI InteractionDebounceMs: one physical tap can reach both).\n const core = useG9Core();\n const lastInteraction = useRef(Number.NEGATIVE_INFINITY);\n const accept = () => {\n const now = core.services.clock.monotonicNow();\n if (now - lastInteraction.current < M.interactionDebounceMs) return false;\n lastInteraction.current = now;\n return true;\n };\n const animating = phase === 'entering' || phase === 'opening' || phase === 'closing';\n const onTab = () => {\n if (animating || !accept()) return;\n setOpen(!openRef.current);\n };\n const useBackdrop = props.useBackdrop ?? true;\n const onBackdrop = () => {\n if (!accept()) return;\n if (useBackdrop && (props.enableOutsideTapToClose ?? true) && openRef.current) setOpen(false);\n };\n\n const overlay = (\n <EdgePanelOverlay\n props={props}\n phase={phase}\n openMs={openMs}\n closeMs={closeMs}\n navigator={navigator}\n navVersion={navigator.version}\n onTab={onTab}\n onBackdrop={onBackdrop}\n onNavigate={renderNav}\n onClose={() => setOpen(false)}\n />\n );\n const visible = phase !== 'closed' || props.showCollapsedTab === true;\n useG9LayerItem('edgePanel', key, overlay, { enabled: visible });\n return null;\n}\n\ninterface OverlayProps {\n readonly props: G9EdgePanelProps;\n readonly phase: Phase;\n readonly openMs: number;\n readonly closeMs: number;\n readonly navigator: G9EdgeMenuNavigator;\n readonly navVersion: number;\n readonly onTab: () => void;\n readonly onBackdrop: () => void;\n readonly onNavigate: () => void;\n readonly onClose: () => void;\n}\n\nfunction EdgePanelOverlay(o: OverlayProps): ReactNode {\n const p = o.props;\n const win = useG9Window();\n const appRtl = useG9Direction() === 'rtl';\n const glyphs = useG9Settings().glyphs;\n const left = (p.side ?? 'left') === 'left';\n const direction = p.contentFlowDirection ?? 'matchApplication';\n const contentRtl = direction === 'matchApplication' ? appRtl : direction === 'rightToLeft';\n const width = Math.max(win.width * (p.widthRatio ?? M.defaultWidthRatio), 0);\n const topGap = p.topGap ?? M.defaultTopGap;\n const maxHeight = resolveEdgePanelMaxHeight(\n win.height,\n topGap,\n p.maxPanelHeight ?? 0,\n p.maxPanelHeightRatio ?? M.defaultMaxPanelHeightRatio,\n );\n const shown = o.phase === 'opening' || o.phase === 'open';\n const cardRendered = o.phase !== 'closed';\n const hiddenOffset = (width + M.collapsedExtraOffset) * (left ? -1 : 1);\n const edge = left ? 'left' : 'right';\n const far = left ? 'right' : 'left';\n const useBackdrop = p.useBackdrop ?? true;\n const placement = p.closeButtonPlacement ?? 'inset';\n\n const closeStyle =\n placement === 'onCorner'\n ? { top: `${topGap - M.tabExpandedSize / 2}px`, [edge]: `${width - M.tabExpandedSize / 2}px` }\n : { top: `${topGap + M.tabTopInset}px`, [edge]: `${width - M.tabTopInset - M.tabExpandedSize}px` };\n const tabIcon = p.collapsedTabIcon ?? (left ? glyphs.chevronForward : glyphs.chevronBack);\n\n return (\n <view className=\"g9-edge-panel\">\n {useBackdrop && cardRendered ? (\n <view\n className=\"g9-edge-panel__backdrop\"\n style={{\n opacity: shown ? 1 : 0,\n transition: `opacity ${shown ? o.openMs : o.closeMs}ms ease-out`,\n backgroundColor: `rgba(0, 0, 0, ${M.backdropAlpha})`,\n }}\n bindtap={o.onBackdrop}\n />\n ) : null}\n {cardRendered ? (\n <view\n className={`g9-edge-panel__card g9-edge-panel__card--${edge}`}\n style={{\n [edge]: `${-M.wallOverlap}px`,\n top: `${topGap}px`,\n width: `${width + M.wallOverlap}px`,\n maxHeight: `${maxHeight}px`,\n backgroundColor: p.panelBackgroundColor ?? 'var(--g9-surface-container-high)',\n transform: `translateX(${shown ? 0 : hiddenOffset}px)`,\n transition:\n o.phase === 'entering'\n ? 'none'\n : `transform ${shown ? o.openMs : o.closeMs}ms ${shown ? 'cubic-bezier(0.215, 0.61, 0.355, 1)' : 'cubic-bezier(0.55, 0.055, 0.675, 0.19)'}`,\n }}\n >\n <PanelBody o={o} contentRtl={contentRtl} closeOnFar={far} />\n </view>\n ) : null}\n {cardRendered ? (\n <view\n className={`g9-edge-panel__close g9-edge-panel__close--${placement}`}\n style={{\n ...closeStyle,\n opacity: shown ? 1 : 0,\n transition: `opacity ${g9Ms(M.tabEntranceDurationMs)}ms ease-out`,\n backgroundColor: p.tabBackgroundColor ?? 'var(--g9-surface-container-highest)',\n }}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={o.onTab}\n >\n <G9IconSlot icon={glyphs.clear} size={M.tabIconSize} color=\"var(--g9-on-surface)\" />\n </view>\n ) : p.showCollapsedTab ? (\n <view\n className={`g9-edge-panel__tab g9-edge-panel__tab--${edge}`}\n style={{\n [edge]: '0px',\n top: `${topGap + M.tabTopInset}px`,\n backgroundColor: p.tabBackgroundColor ?? 'var(--g9-surface-container-highest)',\n }}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={o.onTab}\n >\n <G9IconSlot icon={tabIcon} size={M.tabIconSize} color=\"var(--g9-on-surface)\" />\n </view>\n ) : null}\n </view>\n );\n}\n\nfunction headerText(header: G9EdgeMenuHeader, resolve: (key: string) => string | null): string {\n if (header.text) return header.text;\n const key = header.localizationKey as string;\n return resolve(key) ?? key;\n}\n\nfunction PanelBody(props: {\n readonly o: OverlayProps;\n readonly contentRtl: boolean;\n readonly closeOnFar: string;\n}): ReactNode {\n const { o, contentRtl } = props;\n const p = o.props;\n const strings = useG9Strings();\n const diagnostics = useG9Diagnostics();\n const glyphs = useG9Settings().glyphs;\n const resolve = (key: string) => strings.resolve(key);\n const nav = o.navigator;\n const frame = nav.frame;\n const header = p.panelContent != null ? (p.menuHeader ?? null) : (frame?.header ?? null);\n const alignment = p.menuHeaderAlignment ?? 'auto';\n const textAlign =\n alignment === 'center'\n ? 'center'\n : alignment === 'leftToRight'\n ? 'left'\n : alignment === 'rightToLeft'\n ? 'right'\n : contentRtl\n ? 'right'\n : 'left';\n const footprint = M.tabExpandedSize + M.tabTopInset;\n const headerPadding =\n alignment === 'center'\n ? { paddingLeft: `${footprint}px`, paddingRight: `${footprint}px` }\n : { [props.closeOnFar === 'right' ? 'paddingRight' : 'paddingLeft']: `${footprint}px` };\n\n // Directional entry of a new menu level (MAUI menu content slide, 220 ms).\n const [entered, setEntered] = useState(true);\n const version = o.navVersion;\n useEffect(() => {\n if (nav.transition === 'none') return;\n setEntered(false);\n const t = startTimer(() => setEntered(true), 16);\n return () => stopTimer(t);\n }, [version]);\n const sign = (nav.transition === 'forward' ? 1 : -1) * (contentRtl ? -1 : 1);\n\n const onRow = (item: G9EdgeMenuItem) => {\n if (item.isEnabled === false) return;\n try {\n item.onClick?.(item);\n item.command?.(item.commandParameter);\n } catch (error) {\n diagnostics.log({\n level: 'error',\n message: 'G9EdgePanel: menu item handler failed.',\n source: 'G9EdgePanel',\n error,\n });\n }\n if (item.nextList && item.nextList.length > 0) {\n nav.navigateToSubList(item.nextList, item.subMenuHeader ?? null);\n o.onNavigate();\n } else if (item.closeAfterClick) {\n o.onClose();\n }\n };\n\n const content =\n p.panelContent != null ? (\n p.panelContent\n ) : frame ? (\n <view\n key={`level-${version}`}\n className=\"g9-edge-panel__menu\"\n style={{\n transform: `translateX(${entered ? 0 : 24 * sign}px)`,\n opacity: entered ? 1 : 0,\n transition: entered\n ? `transform ${g9Ms(M.menuTransitionDurationMs)}ms ease-out, opacity ${g9Ms(M.menuTransitionDurationMs)}ms ease-out`\n : 'none',\n }}\n >\n {nav.isRoot ? null : (\n <view\n className=\"g9-edge-panel__back\"\n style={g9RowStyle(contentRtl ? 'rtl' : 'ltr')}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={() => {\n nav.back();\n o.onNavigate();\n }}\n >\n <G9IconSlot\n icon={contentRtl ? glyphs.chevronForward : glyphs.chevronBack}\n size={M.menuItemIconSize}\n color=\"var(--g9-on-surface)\"\n />\n <text className=\"g9-edge-panel__back-text\">{strings.get(G9StringKey.Back)}</text>\n </view>\n )}\n {frame.items.map((item, i) => (\n <view key={`${version}-${i}`} className=\"g9-edge-panel__row-wrap\">\n <view\n className={`g9-edge-panel__row${item.isEnabled === false ? ' g9-edge-panel__row--disabled' : ''}`}\n {...(item.automationId ? { id: item.automationId } : {})}\n style={{\n ...g9RowStyle(contentRtl ? 'rtl' : 'ltr'),\n backgroundColor: item.backgroundColor ?? 'transparent',\n opacity: item.isEnabled === false ? 0.5 : 1,\n }}\n accessibility-element\n accessibility-traits=\"button\"\n bindtap={item.isEnabled === false ? undefined : () => onRow(item)}\n >\n <G9IconSlot\n emoji={item.emoji}\n icon={item.icon}\n imagePath={item.imageSource}\n image={item.image}\n size={item.icon ? M.menuItemIconSize : item.emoji ? M.menuItemEmojiSize : M.menuItemImageSize}\n color={item.iconColor ?? 'var(--g9-on-surface-variant)'}\n />\n <text\n className=\"g9-edge-panel__row-text\"\n text-maxline=\"1\"\n style={{ color: item.textColor ?? 'var(--g9-on-surface)', ...g9TextStart(contentRtl ? 'rtl' : 'ltr') }}\n >\n {item.text ?? (item.localizedTextKey ? (resolve(item.localizedTextKey) ?? item.localizedTextKey) : '')}\n </text>\n {item.nextList && item.nextList.length > 0 ? (\n <G9IconSlot\n icon={contentRtl ? glyphs.chevronBack : glyphs.chevronForward}\n size={18}\n color=\"var(--g9-on-surface-variant)\"\n />\n ) : null}\n </view>\n {item.showDividerBelow ? <view className=\"g9-edge-panel__divider\" /> : null}\n </view>\n ))}\n </view>\n ) : null;\n\n return (\n <view className=\"g9-edge-panel__body\" style={{ direction: contentRtl ? 'rtl' : 'ltr' }}>\n {!isEdgeMenuHeaderEmpty(header) ? (\n <view className=\"g9-edge-panel__header\" style={headerPadding}>\n {(header as G9EdgeMenuHeader).view != null ? (\n (header as G9EdgeMenuHeader).view\n ) : (\n <text className=\"g9-edge-panel__title\" style={{ textAlign }}>\n {headerText(header as G9EdgeMenuHeader, resolve)}\n </text>\n )}\n </view>\n ) : null}\n <scroll-view className=\"g9-edge-panel__scroll\" scroll-orientation=\"vertical\">\n {content}\n </scroll-view>\n </view>\n );\n}\n"],"names":["createEdgePanelController","target","items","header","next","useEdgePanel","ref","useRef","panelSequence","G9EdgePanel","props","_props_defaultOpen","_ref","_ref1","_props_menuHeader","_props_useBackdrop","keyRef","key","isOpen","setOpen","useControllableState","openMs","g9Ms","M","closeMs","phase","setPhase","useState","latest","openRef","useEffect","_latest_current","p","enter","startTimer","done","stopTimer","navigator","useMemo","G9EdgeMenuNavigator","setNavVersion","renderNav","rootHeader","_props_controller","open","useG9Back","core","useG9Core","lastInteraction","Number","accept","now","animating","onTab","useBackdrop","onBackdrop","_props_enableOutsideTapToClose","overlay","EdgePanelOverlay","visible","useG9LayerItem","o","_p_side","_p_contentFlowDirection","_p_widthRatio","_p_topGap","_p_maxPanelHeight","_p_maxPanelHeightRatio","_p_useBackdrop","_p_closeButtonPlacement","_p_collapsedTabIcon","_p_panelBackgroundColor","_p_tabBackgroundColor","_p_tabBackgroundColor1","win","useG9Window","appRtl","useG9Direction","glyphs","useG9Settings","left","direction","contentRtl","width","Math","topGap","maxHeight","resolveEdgePanelMaxHeight","shown","cardRendered","hiddenOffset","edge","far","placement","closeStyle","tabIcon","view","PanelBody","G9IconSlot","headerText","resolve","_resolve","_p_menuHeader","_p_menuHeaderAlignment","strings","useG9Strings","diagnostics","useG9Diagnostics","nav","frame","alignment","textAlign","footprint","headerPadding","entered","setEntered","version","t","sign","onRow","item","error","_item_subMenuHeader","content","g9RowStyle","text","G9StringKey","i","_item_backgroundColor","_item_iconColor","_item_textColor","_item_text","undefined","g9TextStart","isEdgeMenuHeaderEmpty","scroll-view"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"expander.d.ts","sourceRoot":"","sources":["../../src/expander/expander.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAc,KAAK,SAAS,EAAoD,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,KAAK,kBAAkB,EAAkD,MAAM,iBAAiB,CAAC;AAK1G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,uDAAuD;AACvD,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1C,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,8FAA8F;IAC9F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,uFAAuF;IACvF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,iGAAiG;IACjG,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,MAAM,IAAI,IAAI,CAAC;CAChB;AAID;;;;GAIG;AACH,eAAO,MAAM,UAAU,8GA+FrB,CAAC"}
1
+ {"version":3,"file":"expander.d.ts","sourceRoot":"","sources":["../../src/expander/expander.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAc,KAAK,SAAS,EAAoD,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,KAAK,kBAAkB,EAAkD,MAAM,iBAAiB,CAAC;AAK1G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,uDAAuD;AACvD,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1C,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,8FAA8F;IAC9F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,uFAAuF;IACvF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,iGAAiG;IACjG,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,MAAM,IAAI,IAAI,CAAC;CAChB;AAID;;;;GAIG;AACH,eAAO,MAAM,UAAU,8GA+FrB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import "./expander.css";
2
+ import { g9Ms } from "@g9tm/lynxcontrols-foundation";
2
3
  import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "@lynx-js/react";
3
4
  import { g9ChildId, g9IdProps, g9RowStyle, useG9Control } from "../base/control.jsx";
4
5
  import { useG9Press, usePressVisual } from "../base/press.jsx";
@@ -34,7 +35,7 @@ const expander_G9Expander = forwardRef(function(props, ref) {
34
35
  timer.current = startTimer(()=>{
35
36
  timer.current = null;
36
37
  setPhase(expanded ? 'open' : 'closed');
37
- }, g9ExpanderDurationMs);
38
+ }, g9Ms(g9ExpanderDurationMs));
38
39
  }, [
39
40
  expanded
40
41
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"expander/expander.jsx","sources":["../../src/expander/expander.tsx"],"sourcesContent":["import './expander.css';\nimport type { G9ImageSource } from '@g9tm/lynxcontrols-foundation';\nimport { forwardRef, type ReactNode, useEffect, useImperativeHandle, useRef, useState } from '@lynx-js/react';\nimport { type G9ControlBaseProps, g9ChildId, g9IdProps, g9RowStyle, useG9Control } from '../base/control';\nimport { useG9Press, usePressVisual } from '../base/press';\nimport { type G9TimerHandle, startTimer, stopTimer } from '../base/timers';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { g9FieldNotchStyle } from '../fields/notch';\nimport type { G9IconInput } from '../icon/icon';\nimport { G9IconSlot, hasIconSlot } from '../icon/slot';\nimport { useG9Settings, useG9Theme } from '../provider/hooks';\n\n/** Expand/collapse duration (MAUI `G9Metrics` expander 220 ms). */\nexport const g9ExpanderDurationMs = 220;\n\n/** Props of {@link G9Expander} (MAUI `G9Expander`). */\nexport interface G9ExpanderProps extends G9ControlBaseProps {\n readonly title?: string | null;\n /** Default `var(--g9-text-primary)`. */\n readonly titleColor?: string | null;\n readonly iconEmoji?: string | null;\n readonly icon?: G9IconInput;\n readonly iconPath?: string | null;\n readonly iconImage?: G9ImageSource | null;\n /** Default `var(--g9-text-primary)`. */\n readonly iconColor?: string | null;\n /** Default `var(--g9-text-secondary)`. */\n readonly chevronColor?: string | null;\n /** Controlled open state (MAUI `IsExpanded`). */\n readonly expanded?: boolean;\n readonly defaultExpanded?: boolean;\n /** Once per change made by the expander (header tap, `toggle()`); never for pushed values. */\n readonly onExpandedChange?: (expanded: boolean) => void;\n /** Card look: surface, 1 px outline, 16 px corners, 14 × 12 padding. Default false. */\n readonly showFrame?: boolean;\n /** Minimum header height. Default 48. */\n readonly headerHeight?: number;\n /** Content padding `[left, top, right, bottom]` (an 8 px top gap is always added). Default 0. */\n readonly contentPadding?: readonly [number, number, number, number];\n /** The content (MAUI `ExpanderContent`): mounted at once and kept, hidden while collapsed. */\n readonly children?: ReactNode;\n}\n\n/** Imperative handle of {@link G9Expander}. */\nexport interface G9ExpanderHandle {\n /** Same as a header tap (MAUI `Toggle`). */\n toggle(): void;\n}\n\ntype Phase = 'open' | 'opening' | 'closing' | 'closed';\n\n/**\n * Collapsible section (MAUI `G9Expander`): only the header toggles; the chevron turns 180° and the content height\n * animates over 220 ms (CSS transition on the measured height; instant when it cannot be measured). The first render\n * does not animate. The content stays mounted.\n */\nexport const G9Expander = forwardRef<G9ExpanderHandle, G9ExpanderProps>(function G9Expander(props, ref): ReactNode {\n const control = useG9Control(props, 'g9-expander');\n const glyphs = useG9Settings().glyphs;\n // A framed expander is a Surface card: fields inside notch their floated label with it.\n const palette = useG9Theme().palette;\n const [expanded, setExpanded] = useControllableState<boolean>({\n value: props.expanded,\n defaultValue: props.defaultExpanded ?? false,\n onChange: props.onExpandedChange,\n name: 'G9Expander.expanded',\n });\n const [phase, setPhase] = useState<Phase>(expanded ? 'open' : 'closed');\n const [measured, setMeasured] = useState(0);\n const timer = useRef<G9TimerHandle | null>(null);\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n if (timer.current !== null) stopTimer(timer.current);\n if (measured <= 0) {\n setPhase(expanded ? 'open' : 'closed');\n return;\n }\n setPhase(expanded ? 'opening' : 'closing');\n timer.current = startTimer(() => {\n timer.current = null;\n setPhase(expanded ? 'open' : 'closed');\n }, g9ExpanderDurationMs);\n }, [expanded]);\n useEffect(\n () => () => {\n if (timer.current !== null) stopTimer(timer.current);\n },\n [],\n );\n\n const toggle = () => {\n if (!control.disabled) setExpanded((v) => !v);\n };\n useImperativeHandle(ref, () => ({ toggle }));\n const press = useG9Press(toggle, { blocked: control.disabled, source: 'G9Expander', guardMs: 0 });\n const visual = usePressVisual({ property: 'scale', rest: 1, pressed: 0.99, inMs: 60, outMs: 90 }, control.disabled);\n const icon = { emoji: props.iconEmoji, icon: props.icon, imagePath: props.iconPath, image: props.iconImage };\n const [pl, pt, pr, pb] = props.contentPadding ?? [0, 0, 0, 0];\n const height = phase === 'open' ? undefined : phase === 'opening' ? `${measured}px` : '0px';\n return (\n <view\n className={`${control.className}${props.showFrame ? ' g9-expander--frame' : ''}`}\n {...control.idProps}\n style={props.showFrame ? g9FieldNotchStyle(palette.Surface) : {}}\n >\n <view\n className=\"g9-expander__header\"\n {...g9IdProps(g9ChildId(props.id, 'Header'))}\n style={{ minHeight: `${props.headerHeight ?? 48}px`, ...g9RowStyle(control.direction) }}\n accessibility-element={true}\n accessibility-traits=\"button\"\n {...(props.title ? { 'accessibility-label': props.title } : {})}\n bindtap={press}\n {...visual}\n >\n <view className=\"g9-expander__lead\" style={g9RowStyle(control.direction)}>\n {hasIconSlot(icon) ? (\n <G9IconSlot {...icon} size={20} color={props.iconColor ?? 'var(--g9-text-primary)'} />\n ) : null}\n {props.title ? (\n <text\n className=\"g9-expander__title\"\n text-maxline=\"1\"\n style={{ color: props.titleColor ?? 'var(--g9-text-primary)' }}\n >\n {props.title}\n </text>\n ) : null}\n </view>\n <view className={`g9-expander__chevron${expanded ? ' g9-expander__chevron--open' : ''}`}>\n <G9IconSlot icon={glyphs.chevron} size={22} color={props.chevronColor ?? 'var(--g9-text-secondary)'} />\n </view>\n </view>\n <view className={`g9-expander__clip g9-expander__clip--${phase}`} style={height === undefined ? {} : { height }}>\n <view\n className=\"g9-expander__content\"\n style={{ padding: `${pt + 8}px ${pr}px ${pb}px ${pl}px` }}\n bindlayoutchange={(e: { detail?: { height?: number } }) => {\n const h = e.detail?.height ?? 0;\n if (h > 0 && h !== measured) setMeasured(h);\n }}\n >\n {props.children}\n </view>\n </view>\n </view>\n );\n});\n"],"names":["g9ExpanderDurationMs","G9Expander","forwardRef","props","ref","_props_defaultExpanded","_props_contentPadding","_props_headerHeight","_props_iconColor","_props_titleColor","_props_chevronColor","control","useG9Control","glyphs","useG9Settings","palette","useG9Theme","expanded","setExpanded","useControllableState","phase","setPhase","useState","measured","setMeasured","timer","useRef","first","useEffect","stopTimer","startTimer","toggle","v","useImperativeHandle","press","useG9Press","visual","usePressVisual","icon","pl","pt","pr","pb","height","undefined","view","g9FieldNotchStyle","g9IdProps","g9ChildId","g9RowStyle","hasIconSlot","G9IconSlot","text","e","_e_detail","h"],"mappings":"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"}
1
+ {"version":3,"file":"expander/expander.jsx","sources":["../../src/expander/expander.tsx"],"sourcesContent":["import './expander.css';\nimport type { G9ImageSource } from '@g9tm/lynxcontrols-foundation';\nimport { g9Ms } from '@g9tm/lynxcontrols-foundation';\nimport { forwardRef, type ReactNode, useEffect, useImperativeHandle, useRef, useState } from '@lynx-js/react';\nimport { type G9ControlBaseProps, g9ChildId, g9IdProps, g9RowStyle, useG9Control } from '../base/control';\nimport { useG9Press, usePressVisual } from '../base/press';\nimport { type G9TimerHandle, startTimer, stopTimer } from '../base/timers';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { g9FieldNotchStyle } from '../fields/notch';\nimport type { G9IconInput } from '../icon/icon';\nimport { G9IconSlot, hasIconSlot } from '../icon/slot';\nimport { useG9Settings, useG9Theme } from '../provider/hooks';\n\n/** Expand/collapse duration (MAUI `G9Metrics` expander 220 ms). */\nexport const g9ExpanderDurationMs = 220;\n\n/** Props of {@link G9Expander} (MAUI `G9Expander`). */\nexport interface G9ExpanderProps extends G9ControlBaseProps {\n readonly title?: string | null;\n /** Default `var(--g9-text-primary)`. */\n readonly titleColor?: string | null;\n readonly iconEmoji?: string | null;\n readonly icon?: G9IconInput;\n readonly iconPath?: string | null;\n readonly iconImage?: G9ImageSource | null;\n /** Default `var(--g9-text-primary)`. */\n readonly iconColor?: string | null;\n /** Default `var(--g9-text-secondary)`. */\n readonly chevronColor?: string | null;\n /** Controlled open state (MAUI `IsExpanded`). */\n readonly expanded?: boolean;\n readonly defaultExpanded?: boolean;\n /** Once per change made by the expander (header tap, `toggle()`); never for pushed values. */\n readonly onExpandedChange?: (expanded: boolean) => void;\n /** Card look: surface, 1 px outline, 16 px corners, 14 × 12 padding. Default false. */\n readonly showFrame?: boolean;\n /** Minimum header height. Default 48. */\n readonly headerHeight?: number;\n /** Content padding `[left, top, right, bottom]` (an 8 px top gap is always added). Default 0. */\n readonly contentPadding?: readonly [number, number, number, number];\n /** The content (MAUI `ExpanderContent`): mounted at once and kept, hidden while collapsed. */\n readonly children?: ReactNode;\n}\n\n/** Imperative handle of {@link G9Expander}. */\nexport interface G9ExpanderHandle {\n /** Same as a header tap (MAUI `Toggle`). */\n toggle(): void;\n}\n\ntype Phase = 'open' | 'opening' | 'closing' | 'closed';\n\n/**\n * Collapsible section (MAUI `G9Expander`): only the header toggles; the chevron turns 180° and the content height\n * animates over 220 ms (CSS transition on the measured height; instant when it cannot be measured). The first render\n * does not animate. The content stays mounted.\n */\nexport const G9Expander = forwardRef<G9ExpanderHandle, G9ExpanderProps>(function G9Expander(props, ref): ReactNode {\n const control = useG9Control(props, 'g9-expander');\n const glyphs = useG9Settings().glyphs;\n // A framed expander is a Surface card: fields inside notch their floated label with it.\n const palette = useG9Theme().palette;\n const [expanded, setExpanded] = useControllableState<boolean>({\n value: props.expanded,\n defaultValue: props.defaultExpanded ?? false,\n onChange: props.onExpandedChange,\n name: 'G9Expander.expanded',\n });\n const [phase, setPhase] = useState<Phase>(expanded ? 'open' : 'closed');\n const [measured, setMeasured] = useState(0);\n const timer = useRef<G9TimerHandle | null>(null);\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n if (timer.current !== null) stopTimer(timer.current);\n if (measured <= 0) {\n setPhase(expanded ? 'open' : 'closed');\n return;\n }\n setPhase(expanded ? 'opening' : 'closing');\n timer.current = startTimer(() => {\n timer.current = null;\n setPhase(expanded ? 'open' : 'closed');\n }, g9Ms(g9ExpanderDurationMs));\n }, [expanded]);\n useEffect(\n () => () => {\n if (timer.current !== null) stopTimer(timer.current);\n },\n [],\n );\n\n const toggle = () => {\n if (!control.disabled) setExpanded((v) => !v);\n };\n useImperativeHandle(ref, () => ({ toggle }));\n const press = useG9Press(toggle, { blocked: control.disabled, source: 'G9Expander', guardMs: 0 });\n const visual = usePressVisual({ property: 'scale', rest: 1, pressed: 0.99, inMs: 60, outMs: 90 }, control.disabled);\n const icon = { emoji: props.iconEmoji, icon: props.icon, imagePath: props.iconPath, image: props.iconImage };\n const [pl, pt, pr, pb] = props.contentPadding ?? [0, 0, 0, 0];\n const height = phase === 'open' ? undefined : phase === 'opening' ? `${measured}px` : '0px';\n return (\n <view\n className={`${control.className}${props.showFrame ? ' g9-expander--frame' : ''}`}\n {...control.idProps}\n style={props.showFrame ? g9FieldNotchStyle(palette.Surface) : {}}\n >\n <view\n className=\"g9-expander__header\"\n {...g9IdProps(g9ChildId(props.id, 'Header'))}\n style={{ minHeight: `${props.headerHeight ?? 48}px`, ...g9RowStyle(control.direction) }}\n accessibility-element={true}\n accessibility-traits=\"button\"\n {...(props.title ? { 'accessibility-label': props.title } : {})}\n bindtap={press}\n {...visual}\n >\n <view className=\"g9-expander__lead\" style={g9RowStyle(control.direction)}>\n {hasIconSlot(icon) ? (\n <G9IconSlot {...icon} size={20} color={props.iconColor ?? 'var(--g9-text-primary)'} />\n ) : null}\n {props.title ? (\n <text\n className=\"g9-expander__title\"\n text-maxline=\"1\"\n style={{ color: props.titleColor ?? 'var(--g9-text-primary)' }}\n >\n {props.title}\n </text>\n ) : null}\n </view>\n <view className={`g9-expander__chevron${expanded ? ' g9-expander__chevron--open' : ''}`}>\n <G9IconSlot icon={glyphs.chevron} size={22} color={props.chevronColor ?? 'var(--g9-text-secondary)'} />\n </view>\n </view>\n <view className={`g9-expander__clip g9-expander__clip--${phase}`} style={height === undefined ? {} : { height }}>\n <view\n className=\"g9-expander__content\"\n style={{ padding: `${pt + 8}px ${pr}px ${pb}px ${pl}px` }}\n bindlayoutchange={(e: { detail?: { height?: number } }) => {\n const h = e.detail?.height ?? 0;\n if (h > 0 && h !== measured) setMeasured(h);\n }}\n >\n {props.children}\n </view>\n </view>\n </view>\n );\n});\n"],"names":["g9ExpanderDurationMs","G9Expander","forwardRef","props","ref","_props_defaultExpanded","_props_contentPadding","_props_headerHeight","_props_iconColor","_props_titleColor","_props_chevronColor","control","useG9Control","glyphs","useG9Settings","palette","useG9Theme","expanded","setExpanded","useControllableState","phase","setPhase","useState","measured","setMeasured","timer","useRef","first","useEffect","stopTimer","startTimer","g9Ms","toggle","v","useImperativeHandle","press","useG9Press","visual","usePressVisual","icon","pl","pt","pr","pb","height","undefined","view","g9FieldNotchStyle","g9IdProps","g9ChildId","g9RowStyle","hasIconSlot","G9IconSlot","text","e","_e_detail","h"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/host/host.css"],"names":[],"mappings":"AACA;EAAE,sBAAsB;EACtB,OAAO;EACP,WAAW;EACX,YAAY;EACZ,aAAa;EACb,kBAAkB;EAClB,gBAAgB;AAClB;;AAIA;EADE,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAIA;EADE,sBAAsB;EACtB,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAKA;EAFE,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAMA;EAHE,UAAU;EACV,uBAAuB;EACvB,mBAAmB;EACnB,uCAAuC;EACvC,wBAAwB;EACxB,8DAA8D;EAC9D,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;EACR,mBAAmB;AACrB;;AAMA;EAHE,UAAU;EACV,oBAAoB;AACtB;;AAMA;EAHE,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,sCAAsC;AACxC;;AAMA;EAHE;IACE,oBAAoB;EACtB;;EAEA;IACE,yBAAyB;EAC3B;AACF","sourcesContent":["/* G9Host: one page frame. Sibling order below is the z-order (MAUI G9PageTemplate.xaml); nothing uses z-index. */\n.g9-host {\n display: flex;\n flex-direction: column;\n position: relative;\n flex: 1;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* MAUI BackdropHost: behind the content, input-transparent, visible only when a sheet recedes the page. */\n.g9-host__backdrop {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n}\n\n.g9-host__content {\n display: flex;\n flex-direction: column;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n\n/* Overlay layers: full-size and input-transparent; items opt back in (pointer-events does not inherit). */\n.g9-host__layer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n}\n\n/* The page-loading cover: topmost, input-opaque, centred spinner. */\n.g9-page-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n opacity: 1;\n transform: scale(1);\n transition-property: opacity, transform;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n}\n\n.g9-page-loading--exiting {\n opacity: 0;\n transform: scale(0.9);\n}\n\n.g9-page-loading__spinner {\n width: 48px;\n height: 48px;\n border-width: 4px;\n border-style: solid;\n border-radius: 24px;\n border-top-color: transparent;\n animation: g9-spin 900ms linear infinite;\n}\n\n@keyframes g9-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/host/host.css"],"names":[],"mappings":"AACA;EAAE,sBAAsB;EACtB,OAAO;EACP,WAAW;EACX,YAAY;EACZ,aAAa;EACb,kBAAkB;EAClB,gBAAgB;AAClB;;AAIA;EADE,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAIA;EADE,sBAAsB;EACtB,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAOA;EAJE,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAQA;EALE,UAAU;EACV,uBAAuB;EACvB,mBAAmB;EACnB,uCAAuC;EACvC,wBAAwB;EACxB,8DAA8D;EAC9D,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;EACR,mBAAmB;AACrB;;AAQA;EALE,UAAU;EACV,oBAAoB;AACtB;;AAQA;EALE,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,sCAAsC;AACxC;;AAQA;EALE;IACE,oBAAoB;EACtB;;EAEA;IACE,yBAAyB;EAC3B;AACF","sourcesContent":["/* G9Host: one page frame. Sibling order below is the z-order (MAUI G9PageTemplate.xaml); nothing uses z-index. */\n.g9-host {\n display: flex;\n flex-direction: column;\n position: relative;\n flex: 1;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* MAUI BackdropHost: behind the content, input-transparent, visible only when a sheet recedes the page. */\n.g9-host__backdrop {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n}\n\n.g9-host__content {\n display: flex;\n flex-direction: column;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n\n/* Overlay layers: full-size and input-transparent. Every item MUST opt back in with `pointer-events: auto` on its root:\n Lynx INHERITS pointer-events from the parent element, so an item without it is transparent too — its handlers never\n run and the touch reaches what is under the layer (AgriPad's Initialize cover let a tap open a tab, 2026-11-03). */\n.g9-host__layer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n}\n\n/* The page-loading cover: topmost, input-opaque, centred spinner. */\n.g9-page-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n opacity: 1;\n transform: scale(1);\n transition-property: opacity, transform;\n transition-duration: 200ms;\n transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n}\n\n.g9-page-loading--exiting {\n opacity: 0;\n transform: scale(0.9);\n}\n\n.g9-page-loading__spinner {\n width: 48px;\n height: 48px;\n border-width: 4px;\n border-style: solid;\n border-radius: 24px;\n border-top-color: transparent;\n animation: g9-spin 900ms linear infinite;\n}\n\n@keyframes g9-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n"],"sourceRoot":""}
@@ -63,8 +63,9 @@ export declare const G9HostReadinessContext: import("react").Context<G9HostReadi
63
63
  * stack, readiness and loading cover, safe-area insets, tap-outside keyboard dismissal, and its registration in
64
64
  * `g9Hosts` for code outside the tree. One per page; hosts may nest. Must be inside `G9Provider`.
65
65
  *
66
- * Layers are input-transparent (`pointer-events: none`), so empty areas pass touches to the layers below while each
67
- * item receives its own touches; an empty layer renders nothing.
66
+ * Layers are input-transparent (`pointer-events: none`), so empty areas pass touches to the layers below; each item
67
+ * receives its own touches only when its root sets `pointer-events: auto` — Lynx inherits pointer-events, so an item
68
+ * without it is transparent as well. An empty layer renders nothing.
68
69
  */
69
70
  export declare function G9Host(props: G9HostProps): ReactNode;
70
71
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/host/host.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAIL,KAAK,SAAS,EAOf,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE5D,OAAO,EAAuC,KAAK,cAAc,EAAgB,MAAM,UAAU,CAAC;AAElG,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAC;AAC1G,OAAO,YAAY,CAAC;AAEpB,oHAAoH;AACpH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;AAElD,+BAA+B;AAC/B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,mGAAmG;IACnG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC;IAC/C,oHAAoH;IACpH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,oHAAoH;IACpH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,iHAAiH;IACjH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,uHAAuH;IACvH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,wHAAwH;IACxH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,2HAA2H;IAC3H,QAAQ,CAAC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAC/C,iHAAiH;IACjH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC7E,gHAAgH;IAChH,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3E,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+GAA+G;IAC/G,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,mCAAmC;AACnC,eAAO,MAAM,aAAa,8CAA2C,CAAC;AACtE,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,8CAA2C,CAAC;AAC5E,+CAA+C;AAC/C,eAAO,MAAM,sBAAsB,2DAAwD,CAAC;AA+B5F;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAmNpD"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/host/host.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,+BAA+B,CAAC;AAElF,OAAO,EAIL,KAAK,SAAS,EAOf,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE5D,OAAO,EAAuC,KAAK,cAAc,EAAgB,MAAM,UAAU,CAAC;AAElG,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAC;AAC1G,OAAO,YAAY,CAAC;AAEpB,oHAAoH;AACpH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;AAElD,+BAA+B;AAC/B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,mGAAmG;IACnG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC;IAC/C,oHAAoH;IACpH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,oHAAoH;IACpH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,iHAAiH;IACjH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,uHAAuH;IACvH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,wHAAwH;IACxH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,2HAA2H;IAC3H,QAAQ,CAAC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAC/C,iHAAiH;IACjH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC7E,gHAAgH;IAChH,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3E,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+GAA+G;IAC/G,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,mCAAmC;AACnC,eAAO,MAAM,aAAa,8CAA2C,CAAC;AACtE,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,8CAA2C,CAAC;AAC5E,+CAA+C;AAC/C,eAAO,MAAM,sBAAsB,2DAAwD,CAAC;AA+B5F;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAmNpD"}
@@ -1,4 +1,4 @@
1
- import { G9Error } from "@g9tm/lynxcontrols-foundation";
1
+ import { G9Error, g9Ms } from "@g9tm/lynxcontrols-foundation";
2
2
  import { OverlayView } from "@lynx-js/lynx-ui-overlay";
3
3
  import { Fragment, createContext, memo, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "@lynx-js/react";
4
4
  import { useStableCallback } from "../base/use-stable-callback.jsx";
@@ -210,7 +210,7 @@ function G9Host(props) {
210
210
  <view className="g9-host__content" style={{
211
211
  backgroundColor: null != (_props_background = props.background) ? _props_background : 'var(--g9-background)',
212
212
  transform: effect ? `translateY(${effect.translateY}px) scale(${effect.scale})` : 'translateY(0px) scale(1)',
213
- transition: `transform ${null != (_ref2 = null == effect ? void 0 : effect.durationMs) ? _ref2 : 300}ms ease-out`
213
+ transition: `transform ${g9Ms(null != (_ref2 = null == effect ? void 0 : effect.durationMs) ? _ref2 : 300)}ms ease-out`
214
214
  }}>
215
215
  {props.children}
216
216
  </view>