@g9tm/lynxcontrols 1.4.4 → 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 (72) 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/fields/index.d.ts +1 -1
  14. package/dist/fields/index.d.ts.map +1 -1
  15. package/dist/fields/index.jsx +1 -1
  16. package/dist/fields/use-text-input.d.ts +14 -1
  17. package/dist/fields/use-text-input.d.ts.map +1 -1
  18. package/dist/fields/use-text-input.jsx +17 -3
  19. package/dist/fields/use-text-input.jsx.map +1 -1
  20. package/dist/host/host.css.map +1 -1
  21. package/dist/host/host.d.ts +3 -2
  22. package/dist/host/host.d.ts.map +1 -1
  23. package/dist/host/host.jsx +2 -2
  24. package/dist/host/host.jsx.map +1 -1
  25. package/dist/plus-button/model.d.ts.map +1 -1
  26. package/dist/plus-button/model.jsx +5 -1
  27. package/dist/plus-button/model.jsx.map +1 -1
  28. package/dist/popup/frame.jsx +2 -2
  29. package/dist/popup/frame.jsx.map +1 -1
  30. package/dist/popup/service.d.ts.map +1 -1
  31. package/dist/popup/service.jsx +2 -2
  32. package/dist/popup/service.jsx.map +1 -1
  33. package/dist/provider/provider.css +4 -0
  34. package/dist/provider/provider.css.map +1 -1
  35. package/dist/provider/provider.d.ts.map +1 -1
  36. package/dist/provider/provider.jsx +4 -2
  37. package/dist/provider/provider.jsx.map +1 -1
  38. package/dist/selection/selection-sheet.d.ts +5 -0
  39. package/dist/selection/selection-sheet.d.ts.map +1 -1
  40. package/dist/selection/selection-sheet.jsx +7 -3
  41. package/dist/selection/selection-sheet.jsx.map +1 -1
  42. package/dist/sheet/frame.d.ts.map +1 -1
  43. package/dist/sheet/frame.jsx +30 -8
  44. package/dist/sheet/frame.jsx.map +1 -1
  45. package/dist/sheet/index.d.ts +1 -0
  46. package/dist/sheet/index.d.ts.map +1 -1
  47. package/dist/sheet/index.jsx +1 -0
  48. package/dist/sheet/motion.d.ts.map +1 -1
  49. package/dist/sheet/motion.jsx +14 -0
  50. package/dist/sheet/motion.jsx.map +1 -1
  51. package/dist/sheet/options.d.ts +13 -0
  52. package/dist/sheet/options.d.ts.map +1 -1
  53. package/dist/sheet/options.jsx.map +1 -1
  54. package/dist/sheet/scroll-indicator.d.ts +33 -0
  55. package/dist/sheet/scroll-indicator.d.ts.map +1 -0
  56. package/dist/sheet/scroll-indicator.jsx +84 -0
  57. package/dist/sheet/scroll-indicator.jsx.map +1 -0
  58. package/dist/sheet/sheet.css +14 -0
  59. package/dist/sheet/sheet.css.map +1 -1
  60. package/dist/sheet/sizing.d.ts +1 -1
  61. package/dist/sheet/sizing.d.ts.map +1 -1
  62. package/dist/sheet/sizing.jsx +2 -2
  63. package/dist/sheet/sizing.jsx.map +1 -1
  64. package/dist/tab-bar/tab-bar.d.ts.map +1 -1
  65. package/dist/tab-bar/tab-bar.jsx +11 -6
  66. package/dist/tab-bar/tab-bar.jsx.map +1 -1
  67. package/dist/toast/service.jsx +3 -3
  68. package/dist/toast/service.jsx.map +1 -1
  69. package/dist/toast/store.d.ts.map +1 -1
  70. package/dist/toast/store.jsx +3 -2
  71. package/dist/toast/store.jsx.map +1 -1
  72. 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":";;;;;;;;;;AAcO,MAAMA,uBAAuB;AA2C7B,MAAMC,sBAAaC,WAA8C,SAAoBC,KAAK,EAAEC,GAAG;QAOpFC,wBAsCSC,uBAWIC,qBASoBC,kBAMrBC,mBAO+BC;IA7E3D,MAAMC,UAAUC,aAAaT,OAAO;IACpC,MAAMU,SAASC,gBAAgB,MAAM;IAErC,MAAMC,UAAUC,aAAa,OAAO;IACpC,MAAM,CAACC,UAAUC,YAAY,GAAGC,qBAA8B;QAC5D,OAAOhB,MAAM,QAAQ;QACrB,cAAc,QAAAE,CAAAA,yBAAAA,MAAM,eAAe,AAAD,IAApBA,yBAAyB;QACvC,UAAUF,MAAM,gBAAgB;QAChC,MAAM;IACR;IACA,MAAM,CAACiB,OAAOC,SAAS,GAAGC,SAAgBL,WAAW,SAAS;IAC9D,MAAM,CAACM,UAAUC,YAAY,GAAGF,SAAS;IACzC,MAAMG,QAAQC,OAA6B;IAC3C,MAAMC,QAAQD,OAAO;IACrBE,UAAU;QACR,IAAID,MAAM,OAAO,EAAE;YACjBA,MAAM,OAAO,GAAG;YAChB;QACF;QACA,IAAIF,AAAkB,SAAlBA,MAAM,OAAO,EAAWI,UAAUJ,MAAM,OAAO;QACnD,IAAIF,YAAY,GAAG,YACjBF,SAASJ,WAAW,SAAS;QAG/BI,SAASJ,WAAW,YAAY;QAChCQ,MAAM,OAAO,GAAGK,WAAW;YACzBL,MAAM,OAAO,GAAG;YAChBJ,SAASJ,WAAW,SAAS;QAC/B,GAAGc,KAAK/B;IACV,GAAG;QAACiB;KAAS;IACbW,UACE,IAAM;YACJ,IAAIH,AAAkB,SAAlBA,MAAM,OAAO,EAAWI,UAAUJ,MAAM,OAAO;QACrD,GACA,EAAE;IAGJ,MAAMO,SAAS;QACb,IAAI,CAACrB,QAAQ,QAAQ,EAAEO,YAAY,CAACe,IAAM,CAACA;IAC7C;IACAC,oBAAoB9B,KAAK,IAAO;YAAE4B;QAAO;IACzC,MAAMG,QAAQC,WAAWJ,QAAQ;QAAE,SAASrB,QAAQ,QAAQ;QAAE,QAAQ;QAAc,SAAS;IAAE;IAC/F,MAAM0B,SAASC,eAAe;QAAE,UAAU;QAAS,MAAM;QAAG,SAAS;QAAM,MAAM;QAAI,OAAO;IAAG,GAAG3B,QAAQ,QAAQ;IAClH,MAAM4B,OAAO;QAAE,OAAOpC,MAAM,SAAS;QAAE,MAAMA,MAAM,IAAI;QAAE,WAAWA,MAAM,QAAQ;QAAE,OAAOA,MAAM,SAAS;IAAC;IAC3G,MAAM,CAACqC,IAAIC,IAAIC,IAAIC,GAAG,GAAG,QAAArC,CAAAA,wBAAAA,MAAM,cAAc,AAAD,IAAnBA,wBAAwB;QAAC;QAAG;QAAG;QAAG;KAAE;IAC7D,MAAMsC,SAASxB,AAAU,WAAVA,QAAmByB,SAAYzB,AAAU,cAAVA,QAAsB,GAAGG,SAAS,EAAE,CAAC,GAAG;IACtF,QACGuB,KACC,WAAW,GAAGnC,QAAQ,SAAS,GAAGR,MAAM,SAAS,GAAG,wBAAwB,IAAI,GAC/E,GAAGQ,QAAQ,OAAO,EACnB,OAAOR,MAAM,SAAS,GAAG4C,kBAAkBhC,QAAQ,OAAO,IAAI,CAAC,GAChE;MACC,CAAC+B,KACC,UAAU,uBACT,GAAGE,UAAUC,UAAU9C,MAAM,EAAE,EAAE,UAAU,EAC5C,OAAO;QAAE,WAAW,GAAG,QAAAI,CAAAA,sBAAAA,MAAM,YAAY,AAAD,IAAjBA,sBAAsB,GAAG,EAAE,CAAC;QAAE,GAAG2C,WAAWvC,QAAQ,SAAS,CAAC;IAAC,GACtF,uBAAuB,MACvB,qBAAqB,UACpB,GAAIR,MAAM,KAAK,GAAG;QAAE,uBAAuBA,MAAM,KAAK;IAAC,IAAI,CAAC,CAAC,EAC9D,SAASgC,QACR,GAAGE,MAAM,EACX;QACC,CAACS,KAAK,UAAU,oBAAoB,OAAOI,WAAWvC,QAAQ,SAAS,GAAG;UACxE,CAACwC,YAAYZ,SACVa,YAAY,GAAGb,IAAI,EAAE,MAAM,IAAI,OAAO,QAAA/B,CAAAA,mBAAAA,MAAM,SAAS,AAAD,IAAdA,mBAAmB,8BACxD,KAAK;UACT,CAACL,MAAM,KAAK,IACTkD,KACC,UAAU,qBACV,aAAa,IACb,OAAO;QAAE,OAAO,QAAA5C,CAAAA,oBAAAA,MAAM,UAAU,AAAD,IAAfA,oBAAoB;IAAyB,GAC9D;cACC,CAACN,MAAM,KAAK,CAAC;YACf,EAAEkD,QACA,KAAK;QACX,EAAEP,KAAK;QACP,CAACA,KAAK,WAAW,CAAC,oBAAoB,EAAE7B,WAAW,gCAAgC,IAAI,EAAE;UACvF,CAACmC,WAAW,MAAMvC,OAAO,OAAO,EAAE,MAAM,IAAI,OAAO,QAAAH,CAAAA,sBAAAA,MAAM,YAAY,AAAD,IAAjBA,sBAAsB,6BAA8B;QACzG,EAAEoC,KAAK;MACT,EAAEA,KAAK;MACP,CAACA,KAAK,WAAW,CAAC,qCAAqC,EAAE1B,OAAO,EAAE,OAAOwB,AAAWC,WAAXD,SAAuB,CAAC,IAAI;QAAEA;IAAO,GAAG;QAC/G,CAACE,KACC,UAAU,uBACV,OAAO;QAAE,SAAS,GAAGL,KAAK,EAAE,GAAG,EAAEC,GAAG,GAAG,EAAEC,GAAG,GAAG,EAAEH,GAAG,EAAE,CAAC;IAAC,GACxD,kBAAkB,CAACc;;YACPC;QAAV,MAAMC,IAAI,QAAJA,CAAAA,OAAAA,QAAID,CAAAA,YAAAA,EAAE,MAAM,AAAD,IAAPA,KAAAA,IAAAA,UAAU,MAAM,AAAD,IAAC,OAAI;QAC9B,IAAIC,IAAI,KAAKA,MAAMjC,UAAUC,YAAYgC;IAC3C,GACD;UACC,CAACrD,MAAM,QAAQ,CAAC;QAClB,EAAE2C,KAAK;MACT,EAAEA,KAAK;IACT,EAAEA;AAEN"}
@@ -8,6 +8,6 @@ export { type G9SearchContext, G9SearchEntry, type G9SearchEntryHandle, type G9S
8
8
  export { type G9FieldSlotLayout, type G9FieldSlotLayoutInput, type G9PhysicalPadding, resolveFieldSlotLayout, } from './slot-layout.js';
9
9
  export { G9TextEntry, type G9TextEntryHandle, type G9TextEntryProps, shouldShowEntryMic } from './text-entry.js';
10
10
  export { type G9DictationOptions, type G9DictationState, useDictation } from './use-dictation.js';
11
- export { type G9NodeRef, type G9TextInputHandle, type G9TextInputProps, type G9ValueChangeDetails, type G9ValueChangeSource, resolveInputTextDirection, } from './use-text-input.js';
11
+ export { type G9FieldDigits, type G9NodeRef, type G9TextInputHandle, type G9TextInputProps, type G9ValueChangeDetails, type G9ValueChangeSource, resolveFieldDigits, resolveInputTextDirection, } from './use-text-input.js';
12
12
  export { combineValidators, type G9TextValidator, requiredValidator, runTextValidator, } from './validator.js';
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACpG,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,eAAe,EACpB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EACL,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACpG,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,eAAe,EACpB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC"}
@@ -8,5 +8,5 @@ export { G9SearchEntry } from "./search-entry.jsx";
8
8
  export { resolveFieldSlotLayout } from "./slot-layout.jsx";
9
9
  export { G9TextEntry, shouldShowEntryMic } from "./text-entry.jsx";
10
10
  export { useDictation } from "./use-dictation.jsx";
11
- export { resolveInputTextDirection } from "./use-text-input.jsx";
11
+ export { resolveFieldDigits, resolveInputTextDirection } from "./use-text-input.jsx";
12
12
  export { combineValidators, requiredValidator, runTextValidator } from "./validator.jsx";
@@ -1,4 +1,4 @@
1
- import { G9InputType, type G9KeyboardType, G9TextInputDirection } from '@g9tm/lynxcontrols-foundation';
1
+ import { G9InputType, type G9KeyboardType, G9NumberingSystem, G9TextInputDirection } from '@g9tm/lynxcontrols-foundation';
2
2
  import type { NodesRef } from '@lynx-js/types';
3
3
  import type { G9OutlinedFieldProps } from './outlined-field.js';
4
4
  import { type G9TextValidator } from './validator.js';
@@ -79,6 +79,17 @@ interface InputDetail {
79
79
  }
80
80
  /** Resolves the entered text's direction (MAUI `ResolveInputFlowDirection`). */
81
81
  export declare function resolveInputTextDirection(inputTextDirection: G9TextInputDirection, inputType: G9InputType, isPassword: boolean, cultureDirection: 'ltr' | 'rtl'): 'ltr' | 'rtl';
82
+ /** What the native field draws for its ASCII digits: `g9-digits` / `g9-decimal-separator` (lynxcontrols-native). */
83
+ export interface G9FieldDigits {
84
+ readonly system: G9NumberingSystem;
85
+ readonly decimalSeparator: string;
86
+ }
87
+ /**
88
+ * The digits a field DRAWS (MAUI: the culture's FaNum font draws «15» as «۱۵» in every entry): the culture's numbering
89
+ * system, and «٫» for the '.' of a decimal field. The text stays ASCII — what is typed, the value events and what is
90
+ * stored never change (AgriPad owner, 2026-11-02). A custom font or a password draws ASCII, as in MAUI.
91
+ */
92
+ export declare function resolveFieldDigits(numberingSystem: G9NumberingSystem, inputType: G9InputType, hasCustomFont: boolean, isPassword: boolean): G9FieldDigits;
82
93
  /** Calls a UI method on a node; a missing node or a failing call is ignored (the element is gone). */
83
94
  export declare function invokeNode(ref: {
84
95
  current: G9NodeRef | null;
@@ -139,6 +150,8 @@ export declare function useTextInput(props: G9TextInputProps, options: G9TextInp
139
150
  bindfocus: () => void;
140
151
  bindblur: () => void;
141
152
  bindconfirm: () => void | undefined;
153
+ 'g9-digits': G9NumberingSystem;
154
+ 'g9-decimal-separator': string;
142
155
  id?: string;
143
156
  ref: (node: NodesRef | null) => void;
144
157
  'data-g9keyboard': "target";
@@ -1 +1 @@
1
- {"version":3,"file":"use-text-input.d.ts","sourceRoot":"","sources":["../../src/fields/use-text-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-text-input.d.ts","sourceRoot":"","sources":["../../src/fields/use-text-input.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,cAAc,EACnB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAW/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAErE,yDAAyD;AACzD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,cAAc,CAAC;AAElF,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC;AAED,mHAAmH;AACnH,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB;IAC5D,sGAAsG;IACtG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAChF,oHAAoH;IACpH,QAAQ,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;IACvC,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IACjC,uFAAuF;IACvF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,kHAAkH;IAClH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,kHAAkH;IAClH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IACnD,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,2GAA2G;IAC3G,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,yGAAyG;IACzG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,sDAAsD;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,KAAK,IAAI,IAAI,CAAC;IACd,0CAA0C;IAC1C,IAAI,IAAI,IAAI,CAAC;IACb,+GAA+G;IAC/G,QAAQ,IAAI,OAAO,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,+BAA+B;IAC/B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,8BAA8B;IAC9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,qDAAqD;IACrD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,6GAA6G;IAC7G,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;CACpC;AAED,oDAAoD;AACpD,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,+BAA+B;AAC/B,UAAU,WAAW;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,CACvC,kBAAkB,EAAE,oBAAoB,EACxC,SAAS,EAAE,WAAW,EACtB,UAAU,EAAE,OAAO,EACnB,gBAAgB,EAAE,KAAK,GAAG,KAAK,GAC9B,KAAK,GAAG,KAAK,CAKf;AAED,oHAAoH;AACpH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,iBAAiB,EAClC,SAAS,EAAE,WAAW,EACtB,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,OAAO,GAClB,aAAa,CAMf;AAED,sGAAsG;AACtG,wBAAgB,UAAU,CACxB,GAAG,EAAE;IAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAiBT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,SAAI,GACX,IAAI,CAGN;AASD,uCAAuC;AACvC,MAAM,WAAW,sBAAsB;IACrC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC;IACpG,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,sEAAsE;IACtE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,iDAAiD;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,sBAAsB;;;;;;;;;;;;;;;;IA+MjF,4EAA4E;;;;;;2BA3GtD;YAAE,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE;;;;;;;oBAnBnB,QAAQ,GAAG,IAAI;;;;;EAiJ7C"}
@@ -1,4 +1,4 @@
1
- import { G9InputType, G9TextInputDirection } from "@g9tm/lynxcontrols-foundation";
1
+ import { G9InputType, G9NumberingSystem, G9TextInputDirection } from "@g9tm/lynxcontrols-foundation";
2
2
  import { KeyboardAwareTriggerContext } from "@lynx-js/lynx-ui-input";
3
3
  import { useContext, useEffect, useRef, useState } from "@lynx-js/react";
4
4
  import { startTimer } from "../base/timers.jsx";
@@ -14,6 +14,17 @@ function resolveInputTextDirection(inputTextDirection, inputType, isPassword, cu
14
14
  if (inputTypePrefersLeftToRight(inputType) || isPassword) return 'ltr';
15
15
  return cultureDirection;
16
16
  }
17
+ function resolveFieldDigits(numberingSystem, inputType, hasCustomFont, isPassword) {
18
+ if (hasCustomFont || isPassword || numberingSystem === G9NumberingSystem.Latin) return {
19
+ system: G9NumberingSystem.Latin,
20
+ decimalSeparator: ''
21
+ };
22
+ const decimal = inputType === G9InputType.Decimal || inputType === G9InputType.SignedDecimal;
23
+ return {
24
+ system: numberingSystem,
25
+ decimalSeparator: decimal ? '٫' : ''
26
+ };
27
+ }
17
28
  function invokeNode(ref, method, params) {
18
29
  const node = ref.current;
19
30
  if (!node) return false;
@@ -193,6 +204,7 @@ function useTextInput(props, options) {
193
204
  };
194
205
  const direction = resolveInputTextDirection(null != (_props_inputTextDirection = props.inputTextDirection) ? _props_inputTextDirection : G9TextInputDirection.MatchParent, inputType, true === options.isPassword, culture.direction);
195
206
  const font = props.customFont && '' !== props.customFont.trim() ? props.customFont : 'rtl' === culture.direction ? culture.rtlFontFamily : culture.ltrFontFamily;
207
+ const digits = resolveFieldDigits(culture.numberingSystem, inputType, Boolean(props.customFont && '' !== props.customFont.trim()), true === options.isPassword);
196
208
  const handle = {
197
209
  focus,
198
210
  blur,
@@ -236,12 +248,14 @@ function useTextInput(props, options) {
236
248
  bindinput: onInput,
237
249
  bindfocus: onFocus,
238
250
  bindblur: onBlur,
239
- bindconfirm: onConfirm
251
+ bindconfirm: onConfirm,
252
+ 'g9-digits': digits.system,
253
+ 'g9-decimal-separator': digits.decimalSeparator
240
254
  },
241
255
  textDirection: direction,
242
256
  font
243
257
  };
244
258
  }
245
- export { invokeNode, invokeNodeWhenReady, resolveInputTextDirection, useTextInput };
259
+ export { invokeNode, invokeNodeWhenReady, resolveFieldDigits, resolveInputTextDirection, useTextInput };
246
260
 
247
261
  //# sourceMappingURL=use-text-input.jsx.map