@g9tm/lynxcontrols 1.4.3 → 1.4.5

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 (73) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/button/button.css +1 -0
  3. package/dist/button/button.css.map +1 -1
  4. package/dist/button/button.d.ts +2 -0
  5. package/dist/button/button.d.ts.map +1 -1
  6. package/dist/button/button.jsx +3 -2
  7. package/dist/button/button.jsx.map +1 -1
  8. package/dist/fields/index.d.ts +1 -1
  9. package/dist/fields/index.d.ts.map +1 -1
  10. package/dist/fields/index.jsx +1 -1
  11. package/dist/fields/outlined-field.d.ts +1 -1
  12. package/dist/fields/outlined-field.d.ts.map +1 -1
  13. package/dist/fields/outlined-field.jsx +13 -3
  14. package/dist/fields/outlined-field.jsx.map +1 -1
  15. package/dist/fields/use-text-input.d.ts +14 -1
  16. package/dist/fields/use-text-input.d.ts.map +1 -1
  17. package/dist/fields/use-text-input.jsx +19 -5
  18. package/dist/fields/use-text-input.jsx.map +1 -1
  19. package/dist/pickers/date-time-picker.d.ts.map +1 -1
  20. package/dist/pickers/date-time-picker.jsx +13 -4
  21. package/dist/pickers/date-time-picker.jsx.map +1 -1
  22. package/dist/pickers/picker-sheet.d.ts +5 -1
  23. package/dist/pickers/picker-sheet.d.ts.map +1 -1
  24. package/dist/pickers/picker-sheet.jsx +3 -17
  25. package/dist/pickers/picker-sheet.jsx.map +1 -1
  26. package/dist/pickers/pickers.css +32 -43
  27. package/dist/pickers/pickers.css.map +1 -1
  28. package/dist/pickers/wheel-column.d.ts +3 -1
  29. package/dist/pickers/wheel-column.d.ts.map +1 -1
  30. package/dist/pickers/wheel-column.jsx +17 -3
  31. package/dist/pickers/wheel-column.jsx.map +1 -1
  32. package/dist/popup/frame.d.ts +6 -0
  33. package/dist/popup/frame.d.ts.map +1 -1
  34. package/dist/popup/frame.jsx +8 -6
  35. package/dist/popup/frame.jsx.map +1 -1
  36. package/dist/popup/popup.css +23 -16
  37. package/dist/popup/popup.css.map +1 -1
  38. package/dist/popup/service.d.ts.map +1 -1
  39. package/dist/popup/service.jsx +3 -2
  40. package/dist/popup/service.jsx.map +1 -1
  41. package/dist/range-slider/range-slider.css +5 -0
  42. package/dist/range-slider/range-slider.css.map +1 -1
  43. package/dist/range-slider/range-slider.jsx +1 -1
  44. package/dist/range-slider/range-slider.jsx.map +1 -1
  45. package/dist/selection/selection-sheet.d.ts.map +1 -1
  46. package/dist/selection/selection-sheet.jsx +4 -2
  47. package/dist/selection/selection-sheet.jsx.map +1 -1
  48. package/dist/selection/selection.css +15 -0
  49. package/dist/selection/selection.css.map +1 -1
  50. package/dist/sheet/frame.d.ts.map +1 -1
  51. package/dist/sheet/frame.jsx +26 -19
  52. package/dist/sheet/frame.jsx.map +1 -1
  53. package/dist/sheet/options.d.ts +7 -0
  54. package/dist/sheet/options.d.ts.map +1 -1
  55. package/dist/sheet/options.jsx.map +1 -1
  56. package/dist/sheet/sheet.css +10 -0
  57. package/dist/sheet/sheet.css.map +1 -1
  58. package/dist/sheet/sizing.d.ts +1 -1
  59. package/dist/sheet/sizing.d.ts.map +1 -1
  60. package/dist/sheet/sizing.jsx +2 -2
  61. package/dist/sheet/sizing.jsx.map +1 -1
  62. package/dist/tabs/model.d.ts +1 -1
  63. package/dist/tabs/model.d.ts.map +1 -1
  64. package/dist/tabs/model.jsx.map +1 -1
  65. package/dist/tabs/tab-view.jsx +1 -1
  66. package/dist/tabs/tab-view.jsx.map +1 -1
  67. package/dist/toggle/chip-group.jsx +8 -2
  68. package/dist/toggle/chip-group.jsx.map +1 -1
  69. package/dist/toggle/switch.jsx +2 -1
  70. package/dist/toggle/switch.jsx.map +1 -1
  71. package/dist/toggle/toggle.css +5 -2
  72. package/dist/toggle/toggle.css.map +1 -1
  73. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"range-slider/range-slider.jsx","sources":["../../src/range-slider/range-slider.tsx"],"sourcesContent":["import './range-slider.css';\nimport { formatColor, G9RangeSliderMode, lighten } from '@g9tm/lynxcontrols-foundation';\nimport { SliderIndicator, SliderRoot, SliderThumb, SliderTrack } from '@lynx-js/lynx-ui-slider';\nimport { type ReactNode, useRef, useState } from '@lynx-js/react';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Culture, useG9Direction, useG9Theme } from '../provider/hooks';\nimport {\n coerceSliderRange,\n formatSliderValue,\n sliderBounds,\n sliderRatio,\n sliderValueAt,\n snapSliderValue,\n} from './math';\n\n/** Layout tokens (MAUI `G9Metrics.Slider*`). */\nexport const g9SliderMetrics = Object.freeze({\n height: 104,\n heightCompact: 36,\n trackHeight: 8,\n thumbRadius: 14,\n horizontalInset: 16,\n});\n\n/** Props of {@link G9RangeSlider}. */\nexport interface G9RangeSliderProps {\n /** Default 0. */\n readonly minimum?: number;\n /** Default 100. */\n readonly maximum?: number;\n /** `'single'` (one thumb, `value`) or `'range'` (two thumbs, `rangeStart`/`rangeEnd`). Default `'range'`. */\n readonly mode?: G9RangeSliderMode;\n /** Single mode value (MAUI `Value`). */\n readonly value?: number;\n readonly defaultValue?: number;\n readonly onValueChange?: (value: number) => void;\n /** Range mode thumbs (MAUI `RangeStart`/`RangeEnd`). */\n readonly rangeStart?: number;\n readonly rangeEnd?: number;\n readonly defaultRangeStart?: number;\n readonly defaultRangeEnd?: number;\n readonly onRangeChange?: (start: number, end: number) => void;\n /** Snap interval; 0 = continuous. Default 1. */\n readonly step?: number;\n /** Min/max edge labels and the drag tooltip (false = compact 36 px). Default true. */\n readonly showLabels?: boolean;\n /** .NET-style number format of labels and tooltip (`\"0\"`, `\"0.0\"`, `\"0°\"`). Default `\"0\"`. */\n readonly valueFormat?: string | null;\n readonly disabled?: boolean;\n /** After the user changed a value: the single value, or the range end (MAUI `ValueChanged`). */\n readonly onValueChanged?: (value: number) => void;\n readonly accessibilityLabel?: string;\n readonly className?: string;\n}\n\n/** Arrow/Home/End handling of the desktop keyboard: the new value, or `null` for another key. */\nexport function sliderKeyStep(\n key: string,\n value: number,\n min: number,\n max: number,\n step: number,\n rtl: boolean,\n): number | null {\n const b = sliderBounds(min, max);\n const delta = step > 0 ? step : (b.max - b.min) / 100;\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (key === forward || key === 'ArrowUp') return snapSliderValue(value + delta, min, max, step);\n if (key === back || key === 'ArrowDown') return snapSliderValue(value - delta, min, max, step);\n if (key === 'Home') return b.min;\n if (key === 'End') return b.max;\n return null;\n}\n\n/**\n * One- or two-thumb slider (MAUI `G9RangeSlider`) on lynx-ui `SliderRoot`: lynx-ui owns the gesture (main-thread\n * drag, thumbs that meet but never cross); G9 maps minimum/maximum/step onto its normalized value, snaps with the\n * MAUI formula, keeps the stored values as given until the user moves them (display is always coerced; MAUI's\n * deferred write-back), paints the fill between the thumbs, shows min/max labels (swapped in RTL) and a tooltip\n * while dragging, and moves with the arrow keys on desktop.\n */\nexport function G9RangeSlider(props: G9RangeSliderProps): ReactNode {\n const culture = useG9Culture();\n const rtl = useG9Direction() === 'rtl';\n const primary = useG9Theme().palette.Primary;\n // MAUI G9RangeSliderDrawable: saturated at the minimum end, 22 % lighter towards the value, in reading direction.\n const fill = `linear-gradient(to ${rtl ? 'left' : 'right'}, ${formatColor(primary)}, ${formatColor(lighten(primary, 0.22))})`;\n const min = props.minimum ?? 0;\n const max = props.maximum ?? 100;\n const step = props.step ?? 1;\n const single = props.mode === G9RangeSliderMode.Single;\n const labels = props.showLabels !== false;\n const bounds = sliderBounds(min, max);\n const [value, setValue] = useControllableState<number>({\n value: props.value,\n defaultValue: props.defaultValue ?? 0,\n onChange: props.onValueChange,\n name: 'G9RangeSlider.value',\n });\n const [range, setRange] = useControllableState<readonly [number, number], []>({\n value:\n props.rangeStart !== undefined && props.rangeEnd !== undefined ? [props.rangeStart, props.rangeEnd] : undefined,\n defaultValue: [props.defaultRangeStart ?? 0, props.defaultRangeEnd ?? 100],\n onChange: (r) => props.onRangeChange?.(r[0], r[1]),\n name: 'G9RangeSlider.range',\n equals: (a, b) => a[0] === b[0] && a[1] === b[1],\n });\n const [dragging, setDragging] = useState<{ index: 0 | 1 } | null>(null);\n const shown = single ? snapSliderValue(value, min, max, step) : null;\n const shownRange = coerceSliderRange(range[0], range[1], min, max, step);\n const latest = useRef({ props, shownRange, shown });\n latest.current = { props, shownRange, shown };\n const fmt = (v: number) => formatSliderValue(v, props.valueFormat ?? '0', culture);\n\n const applySingle = (next: number) => {\n if (next === latest.current.shown) return;\n setValue(next);\n latest.current.props.onValueChanged?.(next);\n };\n const applyRange = (next: readonly [number, number]) => {\n const [s, e] = latest.current.shownRange;\n if (next[0] === s && next[1] === e) return;\n if (next[0] !== s) setDragging((d) => (d ? { index: 0 } : d));\n else setDragging((d) => (d ? { index: 1 } : d));\n setRange(next);\n latest.current.props.onValueChanged?.(next[1]);\n };\n const onValueChange = (v: number | readonly [number, number], source: 'external' | 'drag') => {\n if (source !== 'drag' || props.disabled) return;\n if (typeof v === 'number') applySingle(snapSliderValue(sliderValueAt(v, min, max), min, max, step));\n else applyRange(coerceSliderRange(sliderValueAt(v[0], min, max), sliderValueAt(v[1], min, max), min, max, step));\n };\n // lynx-ui reports the drag start and end through `onDragging`; the commit closes it for sure.\n const onDragging = () => setDragging((d) => (d ? null : { index: 1 }));\n const onCommit = () => setDragging(null);\n const onKey = (e: { detail?: { key?: string } }) => {\n if (props.disabled) return;\n const key = e.detail?.key ?? '';\n if (single) {\n const next = sliderKeyStep(key, shown as number, min, max, step, rtl);\n if (next !== null) applySingle(next);\n return;\n }\n // Keys move the end thumb, never past the start (and vice versa with Shift-less Home).\n const [s, end] = shownRange;\n const next = sliderKeyStep(key, end, min, max, step, rtl);\n if (next !== null) applyRange([Math.min(s, next), Math.max(s, next)]);\n };\n\n const sliderValue = single\n ? sliderRatio(shown as number, min, max)\n : ([sliderRatio(shownRange[0], min, max), sliderRatio(shownRange[1], min, max)] as const);\n const tooltipValue = single ? (shown as number) : shownRange[dragging?.index ?? 1];\n const tooltipRatio = sliderRatio(tooltipValue, min, max);\n const thumb = (index: 0 | 1) => (\n <SliderThumb key={index} index={index} className=\"g9-slider__thumb\">\n <view\n className={`g9-slider__thumb-dot${dragging && dragging.index === index ? ' g9-slider__thumb-dot--active' : ''}`}\n />\n </SliderThumb>\n );\n return (\n <view\n className={`g9-slider${labels ? '' : ' g9-slider--compact'}${props.disabled ? ' g9-slider--disabled' : ''}${props.className ? ` ${props.className}` : ''}`}\n style={{ height: `${labels ? g9SliderMetrics.height : g9SliderMetrics.heightCompact}px` }}\n accessibility-element={true}\n accessibility-label={props.accessibilityLabel ?? ''}\n accessibility-value={single ? fmt(shown as number) : `${fmt(shownRange[0])} – ${fmt(shownRange[1])}`}\n bindkeydown={onKey}\n >\n {labels && dragging ? (\n <view className=\"g9-slider__tooltip\" style={{ left: `${(rtl ? 1 - tooltipRatio : tooltipRatio) * 100}%` }}>\n <text className=\"g9-slider__tooltip-text\">{fmt(tooltipValue)}</text>\n </view>\n ) : null}\n <SliderRoot\n className=\"g9-slider__root\"\n value={sliderValue as number}\n {...(step > 0 ? { step: step / (bounds.max - bounds.min) } : {})}\n disabled={props.disabled === true}\n enableRTL={rtl}\n onValueChange={onValueChange as (v: number, s: 'external' | 'drag') => void}\n onDragging={onDragging}\n onValueCommit={onCommit}\n >\n <SliderTrack className=\"g9-slider__track\">\n <SliderIndicator className=\"g9-slider__fill\" style={{ background: fill }} />\n {single ? thumb(0) : [thumb(0), thumb(1)]}\n </SliderTrack>\n </SliderRoot>\n {labels ? (\n <view className=\"g9-slider__labels\">\n <text className=\"g9-slider__label\">{fmt(rtl ? bounds.max : bounds.min)}</text>\n <text className=\"g9-slider__label\">{fmt(rtl ? bounds.min : bounds.max)}</text>\n </view>\n ) : null}\n </view>\n );\n}\n"],"names":["g9SliderMetrics","Object","sliderKeyStep","key","value","min","max","step","rtl","b","sliderBounds","delta","forward","back","snapSliderValue","G9RangeSlider","props","_props_minimum","_props_maximum","_props_step","_props_defaultValue","_props_defaultRangeStart","_props_defaultRangeEnd","_props_accessibilityLabel","culture","useG9Culture","useG9Direction","primary","useG9Theme","fill","formatColor","lighten","single","G9RangeSliderMode","labels","bounds","setValue","useControllableState","range","setRange","undefined","r","a","dragging","setDragging","useState","shown","shownRange","coerceSliderRange","latest","useRef","fmt","v","_props_valueFormat","formatSliderValue","applySingle","next","_latest_current_props","applyRange","s","e","d","onValueChange","source","sliderValueAt","onDragging","onCommit","onKey","_e_detail","end","Math","sliderValue","sliderRatio","tooltipValue","tooltipRatio","thumb","index","SliderThumb","view","text","SliderRoot","SliderTrack","SliderIndicator"],"mappings":"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"}
1
+ {"version":3,"file":"range-slider/range-slider.jsx","sources":["../../src/range-slider/range-slider.tsx"],"sourcesContent":["import './range-slider.css';\nimport { formatColor, G9RangeSliderMode, lighten } from '@g9tm/lynxcontrols-foundation';\nimport { SliderIndicator, SliderRoot, SliderThumb, SliderTrack } from '@lynx-js/lynx-ui-slider';\nimport { type ReactNode, useRef, useState } from '@lynx-js/react';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { useG9Culture, useG9Direction, useG9Theme } from '../provider/hooks';\nimport {\n coerceSliderRange,\n formatSliderValue,\n sliderBounds,\n sliderRatio,\n sliderValueAt,\n snapSliderValue,\n} from './math';\n\n/** Layout tokens (MAUI `G9Metrics.Slider*`). */\nexport const g9SliderMetrics = Object.freeze({\n height: 104,\n heightCompact: 36,\n trackHeight: 8,\n thumbRadius: 14,\n horizontalInset: 16,\n});\n\n/** Props of {@link G9RangeSlider}. */\nexport interface G9RangeSliderProps {\n /** Default 0. */\n readonly minimum?: number;\n /** Default 100. */\n readonly maximum?: number;\n /** `'single'` (one thumb, `value`) or `'range'` (two thumbs, `rangeStart`/`rangeEnd`). Default `'range'`. */\n readonly mode?: G9RangeSliderMode;\n /** Single mode value (MAUI `Value`). */\n readonly value?: number;\n readonly defaultValue?: number;\n readonly onValueChange?: (value: number) => void;\n /** Range mode thumbs (MAUI `RangeStart`/`RangeEnd`). */\n readonly rangeStart?: number;\n readonly rangeEnd?: number;\n readonly defaultRangeStart?: number;\n readonly defaultRangeEnd?: number;\n readonly onRangeChange?: (start: number, end: number) => void;\n /** Snap interval; 0 = continuous. Default 1. */\n readonly step?: number;\n /** Min/max edge labels and the drag tooltip (false = compact 36 px). Default true. */\n readonly showLabels?: boolean;\n /** .NET-style number format of labels and tooltip (`\"0\"`, `\"0.0\"`, `\"0°\"`). Default `\"0\"`. */\n readonly valueFormat?: string | null;\n readonly disabled?: boolean;\n /** After the user changed a value: the single value, or the range end (MAUI `ValueChanged`). */\n readonly onValueChanged?: (value: number) => void;\n readonly accessibilityLabel?: string;\n readonly className?: string;\n}\n\n/** Arrow/Home/End handling of the desktop keyboard: the new value, or `null` for another key. */\nexport function sliderKeyStep(\n key: string,\n value: number,\n min: number,\n max: number,\n step: number,\n rtl: boolean,\n): number | null {\n const b = sliderBounds(min, max);\n const delta = step > 0 ? step : (b.max - b.min) / 100;\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (key === forward || key === 'ArrowUp') return snapSliderValue(value + delta, min, max, step);\n if (key === back || key === 'ArrowDown') return snapSliderValue(value - delta, min, max, step);\n if (key === 'Home') return b.min;\n if (key === 'End') return b.max;\n return null;\n}\n\n/**\n * One- or two-thumb slider (MAUI `G9RangeSlider`) on lynx-ui `SliderRoot`: lynx-ui owns the gesture (main-thread\n * drag, thumbs that meet but never cross); G9 maps minimum/maximum/step onto its normalized value, snaps with the\n * MAUI formula, keeps the stored values as given until the user moves them (display is always coerced; MAUI's\n * deferred write-back), paints the fill between the thumbs, shows min/max labels (swapped in RTL) and a tooltip\n * while dragging, and moves with the arrow keys on desktop.\n */\nexport function G9RangeSlider(props: G9RangeSliderProps): ReactNode {\n const culture = useG9Culture();\n const rtl = useG9Direction() === 'rtl';\n const primary = useG9Theme().palette.Primary;\n // MAUI G9RangeSliderDrawable: saturated at the minimum end, 22 % lighter towards the value, in reading direction.\n const fill = `linear-gradient(to ${rtl ? 'left' : 'right'}, ${formatColor(primary)}, ${formatColor(lighten(primary, 0.22))})`;\n const min = props.minimum ?? 0;\n const max = props.maximum ?? 100;\n const step = props.step ?? 1;\n const single = props.mode === G9RangeSliderMode.Single;\n const labels = props.showLabels !== false;\n const bounds = sliderBounds(min, max);\n const [value, setValue] = useControllableState<number>({\n value: props.value,\n defaultValue: props.defaultValue ?? 0,\n onChange: props.onValueChange,\n name: 'G9RangeSlider.value',\n });\n const [range, setRange] = useControllableState<readonly [number, number], []>({\n value:\n props.rangeStart !== undefined && props.rangeEnd !== undefined ? [props.rangeStart, props.rangeEnd] : undefined,\n defaultValue: [props.defaultRangeStart ?? 0, props.defaultRangeEnd ?? 100],\n onChange: (r) => props.onRangeChange?.(r[0], r[1]),\n name: 'G9RangeSlider.range',\n equals: (a, b) => a[0] === b[0] && a[1] === b[1],\n });\n const [dragging, setDragging] = useState<{ index: 0 | 1 } | null>(null);\n const shown = single ? snapSliderValue(value, min, max, step) : null;\n const shownRange = coerceSliderRange(range[0], range[1], min, max, step);\n const latest = useRef({ props, shownRange, shown });\n latest.current = { props, shownRange, shown };\n const fmt = (v: number) => formatSliderValue(v, props.valueFormat ?? '0', culture);\n\n const applySingle = (next: number) => {\n if (next === latest.current.shown) return;\n setValue(next);\n latest.current.props.onValueChanged?.(next);\n };\n const applyRange = (next: readonly [number, number]) => {\n const [s, e] = latest.current.shownRange;\n if (next[0] === s && next[1] === e) return;\n if (next[0] !== s) setDragging((d) => (d ? { index: 0 } : d));\n else setDragging((d) => (d ? { index: 1 } : d));\n setRange(next);\n latest.current.props.onValueChanged?.(next[1]);\n };\n const onValueChange = (v: number | readonly [number, number], source: 'external' | 'drag') => {\n if (source !== 'drag' || props.disabled) return;\n if (typeof v === 'number') applySingle(snapSliderValue(sliderValueAt(v, min, max), min, max, step));\n else applyRange(coerceSliderRange(sliderValueAt(v[0], min, max), sliderValueAt(v[1], min, max), min, max, step));\n };\n // lynx-ui reports the drag start and end through `onDragging`; the commit closes it for sure.\n const onDragging = () => setDragging((d) => (d ? null : { index: 1 }));\n const onCommit = () => setDragging(null);\n const onKey = (e: { detail?: { key?: string } }) => {\n if (props.disabled) return;\n const key = e.detail?.key ?? '';\n if (single) {\n const next = sliderKeyStep(key, shown as number, min, max, step, rtl);\n if (next !== null) applySingle(next);\n return;\n }\n // Keys move the end thumb, never past the start (and vice versa with Shift-less Home).\n const [s, end] = shownRange;\n const next = sliderKeyStep(key, end, min, max, step, rtl);\n if (next !== null) applyRange([Math.min(s, next), Math.max(s, next)]);\n };\n\n const sliderValue = single\n ? sliderRatio(shown as number, min, max)\n : ([sliderRatio(shownRange[0], min, max), sliderRatio(shownRange[1], min, max)] as const);\n const tooltipValue = single ? (shown as number) : shownRange[dragging?.index ?? 1];\n const tooltipRatio = sliderRatio(tooltipValue, min, max);\n const thumb = (index: 0 | 1) => (\n <SliderThumb key={index} index={index} className=\"g9-slider__thumb\">\n <view\n className={`g9-slider__thumb-dot${dragging && dragging.index === index ? ' g9-slider__thumb-dot--active' : ''}`}\n />\n </SliderThumb>\n );\n return (\n <view\n className={`g9-slider${labels ? ' g9-slider--labels' : ' g9-slider--compact'}${props.disabled ? ' g9-slider--disabled' : ''}${props.className ? ` ${props.className}` : ''}`}\n style={{ height: `${labels ? g9SliderMetrics.height : g9SliderMetrics.heightCompact}px` }}\n accessibility-element={true}\n accessibility-label={props.accessibilityLabel ?? ''}\n accessibility-value={single ? fmt(shown as number) : `${fmt(shownRange[0])} – ${fmt(shownRange[1])}`}\n bindkeydown={onKey}\n >\n {labels && dragging ? (\n <view className=\"g9-slider__tooltip\" style={{ left: `${(rtl ? 1 - tooltipRatio : tooltipRatio) * 100}%` }}>\n <text className=\"g9-slider__tooltip-text\">{fmt(tooltipValue)}</text>\n </view>\n ) : null}\n <SliderRoot\n className=\"g9-slider__root\"\n value={sliderValue as number}\n {...(step > 0 ? { step: step / (bounds.max - bounds.min) } : {})}\n disabled={props.disabled === true}\n enableRTL={rtl}\n onValueChange={onValueChange as (v: number, s: 'external' | 'drag') => void}\n onDragging={onDragging}\n onValueCommit={onCommit}\n >\n <SliderTrack className=\"g9-slider__track\">\n <SliderIndicator className=\"g9-slider__fill\" style={{ background: fill }} />\n {single ? thumb(0) : [thumb(0), thumb(1)]}\n </SliderTrack>\n </SliderRoot>\n {labels ? (\n <view className=\"g9-slider__labels\">\n <text className=\"g9-slider__label\">{fmt(rtl ? bounds.max : bounds.min)}</text>\n <text className=\"g9-slider__label\">{fmt(rtl ? bounds.min : bounds.max)}</text>\n </view>\n ) : null}\n </view>\n );\n}\n"],"names":["g9SliderMetrics","Object","sliderKeyStep","key","value","min","max","step","rtl","b","sliderBounds","delta","forward","back","snapSliderValue","G9RangeSlider","props","_props_minimum","_props_maximum","_props_step","_props_defaultValue","_props_defaultRangeStart","_props_defaultRangeEnd","_props_accessibilityLabel","culture","useG9Culture","useG9Direction","primary","useG9Theme","fill","formatColor","lighten","single","G9RangeSliderMode","labels","bounds","setValue","useControllableState","range","setRange","undefined","r","a","dragging","setDragging","useState","shown","shownRange","coerceSliderRange","latest","useRef","fmt","v","_props_valueFormat","formatSliderValue","applySingle","next","_latest_current_props","applyRange","s","e","d","onValueChange","source","sliderValueAt","onDragging","onCommit","onKey","_e_detail","end","Math","sliderValue","sliderRatio","tooltipValue","tooltipRatio","thumb","index","SliderThumb","view","text","SliderRoot","SliderTrack","SliderIndicator"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"selection-sheet.d.ts","sourceRoot":"","sources":["../../src/selection/selection-sheet.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selection-sheet.d.ts","sourceRoot":"","sources":["../../src/selection/selection-sheet.tsx"],"names":[],"mappings":"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"}
@@ -62,7 +62,7 @@ function SelectionRow(props) {
62
62
  opacity: 0.45
63
63
  } : {}
64
64
  }}>
65
- {hasIconSlot(icon) ? <G9IconSlot {...icon} size={18} color={iconColor}/> : (null == (_item_swatchFirstColor = item.swatchFirstColor) ? void 0 : _item_swatchFirstColor.trim()) || (null == (_item_swatchSecondColor = item.swatchSecondColor) ? void 0 : _item_swatchSecondColor.trim()) ? <G9Swatch first={item.swatchFirstColor} second={item.swatchSecondColor} direction={props.direction}/> : null}
65
+ {hasIconSlot(icon) ? <G9IconSlot {...icon} size={18} color={iconColor}/> : (null == (_item_swatchFirstColor = item.swatchFirstColor) ? void 0 : _item_swatchFirstColor.trim()) || (null == (_item_swatchSecondColor = item.swatchSecondColor) ? void 0 : _item_swatchSecondColor.trim()) ? <G9Swatch first={item.swatchFirstColor} second={item.swatchSecondColor} direction={props.direction}/> : <view className="g9-selection-row__icon-gap"/>}
66
66
  <text className="g9-selection-row__text" text-maxline="1" style={{
67
67
  color: selected ? palette.Primary : palette.TextPrimary,
68
68
  fontWeight: selected ? 'bold' : 'normal',
@@ -116,13 +116,15 @@ function SelectionBody(props) {
116
116
  {request.showSearch ? <view className="g9-selection__search">
117
117
  <G9TextEntry placeholder={strings.get(G9StringKey.Search)} leadingIcon="search" value={query} onValueChange={onQuery}/>
118
118
  </view> : null}
119
- {request.items.map((item, i)=>{
119
+ {visible.length > 0 ? <view className="g9-selection__items">
120
+ {request.items.map((item, i)=>{
120
121
  var _item_key;
121
122
  var _request_options;
122
123
  const id = ids[i];
123
124
  if (!visibleIds.has(id)) return null;
124
125
  return <SelectionRow key={id} item={item} elementId={g9ChildId(null == (_request_options = request.options) ? void 0 : _request_options.automationId, `Item_${null != (_item_key = item.key) ? _item_key : i}`)} selected={model.isSelected(id)} direction={dir} onTap={()=>tap(id)}/>;
125
126
  })}
127
+ </view> : null}
126
128
  {0 === visible.length ? <text className="g9-selection__empty">{null != (_request_emptyText = request.emptyText) ? _request_emptyText : strings.get(G9StringKey.NoResults)}</text> : null}
127
129
  </view>;
128
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"selection/selection-sheet.jsx","sources":["../../src/selection/selection-sheet.tsx"],"sourcesContent":["import './selection.css';\nimport { formatColor, G9StringKey, type G9TextInputDirection, withAlpha } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useRef, useState, useSyncExternalStore } from '@lynx-js/react';\nimport { g9ChildId, g9RowStyle, g9TextStart } from '../base/control';\nimport { useG9Press } from '../base/press';\nimport type { G9SelectionItem } from '../base/selection-item';\nimport { type G9TimerHandle, startTimer, stopTimer } from '../base/timers';\nimport { G9Button } from '../button/button';\nimport { G9SearchEntry } from '../fields/search-entry';\nimport { G9TextEntry } from '../fields/text-entry';\nimport { G9IconSlot, hasIconSlot } from '../icon/slot';\nimport { G9Swatch } from '../icon/swatch';\nimport { useG9Direction, useG9Settings, useG9Strings, useG9Theme } from '../provider/hooks';\nimport { fitToContentSheetOptions, fullScreenWithoutHandleSheetOptions, type G9SheetOptions } from '../sheet/options';\nimport type { G9SheetService } from '../sheet/service';\nimport type { G9SheetHandle } from '../sheet/stack';\nimport { createSelectionModel, type G9SelectionModel } from './model';\n\n/** MAUI `G9SelectionSheet.EagerBuildItemLimit`: lists up to 40 items are built at once; longer lists defer. */\nexport const g9SelectionEagerBuildItemLimit = 40;\n/** Row height of the selection sheet (MAUI 52). */\nexport const g9SelectionRowHeight = 52;\n/** Search debounce of the selection sheet (MAUI 150 ms). */\nexport const g9SelectionSearchDebounceMs = 150;\n/** Wait after a close-on-select pick before closing (MAUI 120 ms). */\nexport const g9SelectionCloseDelayMs = 120;\n\n/** The outcome of a selection sheet (MAUI `G9SelectionSheetResult`). */\nexport interface G9SelectionSheetResult<T extends G9SelectionItem = G9SelectionItem> {\n /** A pick on a close-on-select sheet, Done, or Reset; `false` for every dismissal. */\n readonly wasAccepted: boolean;\n /** The selection differs from the opening one. */\n readonly selectionChanged: boolean;\n /** The final selection (opening items that are not listed or disabled stay unless deselected). */\n readonly items: ReadonlyArray<T>;\n}\n\n/**\n * The selection identity of an item inside one list (MAUI `G9SelectionSheet.KeyOf`): `k:<key>` when the key is set,\n * else `t:<text>` when the text is unique among key-less items, else the position (`i:<n>`). Keys and texts never\n * match each other.\n */\nexport function selectionIdentities(items: ReadonlyArray<G9SelectionItem>): string[] {\n const counts = new Map<string, number>();\n for (const item of items) {\n if (item.key == null || item.key.trim() === '') counts.set(item.text, (counts.get(item.text) ?? 0) + 1);\n }\n return items.map((item, i) =>\n item.key != null && item.key.trim() !== ''\n ? `k:${item.key}`\n : (counts.get(item.text) ?? 0) > 1\n ? `i:${i}`\n : `t:${item.text}`,\n );\n}\n\n/** Estimated body height (MAUI `EstimateContentHeight`): rows × 52 + chrome, clamped to [2 rows + chrome, 520]. */\nexport function estimateSelectionHeight(count: number, showSearch: boolean): number {\n const chrome = (showSearch ? 64 : 0) + 18;\n return Math.min(520, Math.max(2 * g9SelectionRowHeight + chrome, count * g9SelectionRowHeight + chrome));\n}\n\n/** Arguments of {@link showSelectionSheet} (MAUI `ShowForResultAsync`). */\nexport interface G9SelectionSheetRequest<T extends G9SelectionItem> {\n readonly title: string;\n readonly items: ReadonlyArray<T>;\n readonly selectedItems?: ReadonlyArray<T>;\n readonly allowMultiple?: boolean;\n /** Single mode: a pick completes and closes after 120 ms. Default true. */\n readonly closeOnSingleSelection?: boolean;\n readonly showSearch?: boolean;\n /** No-results text. Default the `noResults` string. */\n readonly emptyText?: string | null;\n /** Row text direction. Default `'matchParent'`. */\n readonly itemTextDirection?: G9TextInputDirection;\n /** A non-empty reset selection adds a Reset toolbar item that completes with it. */\n readonly resetSelection?: ReadonlyArray<T> | null;\n /** Count pill label (multi). Default `\"{n} {selected}\"`. */\n readonly countLabel?: (count: number) => string;\n /** Extra sheet options (merged over the defaults). */\n readonly options?: G9SheetOptions;\n}\n\ninterface BodyProps<T extends G9SelectionItem> {\n readonly request: G9SelectionSheetRequest<T>;\n readonly ids: ReadonlyArray<string>;\n readonly initial: G9SelectionModel<T>;\n readonly onComplete: (keys: ReadonlyArray<string>, accepted: boolean) => void;\n readonly onDraft: (model: G9SelectionModel<T>) => void;\n readonly done: { current: boolean };\n}\n\nfunction SelectionRow(props: {\n readonly item: G9SelectionItem;\n /** Element id (`${sheet automationId}_Item_${key}`), so automation finds the row like a person sees it. */\n readonly elementId?: string | undefined;\n readonly selected: boolean;\n readonly direction: 'ltr' | 'rtl';\n readonly onTap: () => void;\n}): ReactNode {\n const palette = useG9Theme().palette;\n const glyphs = useG9Settings().glyphs;\n const { item, selected } = props;\n const press = useG9Press(props.onTap, { blocked: item.isEnabled === false, source: 'G9SelectionSheet', guardMs: 0 });\n const icon = { emoji: item.emoji, icon: item.icon, imagePath: item.iconPath, image: item.iconImage };\n const iconColor = item.iconTintColor ?? (selected ? palette.Primary : palette.TextSecondary);\n return (\n <view\n {...(props.elementId ? { id: props.elementId } : {})}\n className={`g9-selection-row${selected ? ' g9-selection-row--selected' : ''}`}\n style={selected ? { backgroundColor: formatColor(withAlpha(palette.Primary, 0.1)) } : {}}\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={item.text}\n {...(selected ? { 'accessibility-value': 'selected' } : {})}\n bindtap={press}\n >\n <view\n className={`g9-selection-row__inner g9-dir-${props.direction}`}\n style={{ ...g9RowStyle(props.direction), ...(item.isEnabled === false ? { opacity: 0.45 } : {}) }}\n >\n {hasIconSlot(icon) ? (\n <G9IconSlot {...icon} size={18} color={iconColor} />\n ) : item.swatchFirstColor?.trim() || item.swatchSecondColor?.trim() ? (\n <G9Swatch first={item.swatchFirstColor} second={item.swatchSecondColor} direction={props.direction} />\n ) : null}\n <text\n className=\"g9-selection-row__text\"\n text-maxline=\"1\"\n style={{\n color: selected ? palette.Primary : palette.TextPrimary,\n fontWeight: selected ? 'bold' : 'normal',\n ...g9TextStart(props.direction),\n }}\n >\n {item.text}\n </text>\n <view style={{ opacity: selected ? 1 : 0 }}>\n <G9IconSlot icon={glyphs.check} size={18} color={palette.Primary} />\n </view>\n </view>\n </view>\n );\n}\n\nfunction SelectionBody<T extends G9SelectionItem>(props: BodyProps<T>): ReactNode {\n const strings = useG9Strings();\n const parentDir = useG9Direction();\n const { request, ids } = props;\n const [model, setModel] = useState(props.initial);\n const [query, setQuery] = useState('');\n const [applied, setApplied] = useState('');\n const timer = useRef<G9TimerHandle | null>(null);\n const picking = useRef(false);\n useEffect(\n () => () => {\n if (timer.current !== null) stopTimer(timer.current);\n },\n [],\n );\n const visible = request.showSearch ? model.withItems(request.items).filter(applied) : request.items;\n const visibleIds = new Set(visible.map((item) => ids[request.items.indexOf(item)]));\n const dir =\n request.itemTextDirection === 'leftToRight'\n ? 'ltr'\n : request.itemTextDirection === 'rightToLeft'\n ? 'rtl'\n : parentDir;\n const multiple = request.allowMultiple === true;\n const onQuery = (value: string) => {\n setQuery(value);\n if (timer.current !== null) stopTimer(timer.current);\n if (value.trim() === '') {\n setApplied(value);\n return;\n }\n timer.current = startTimer(() => setApplied(value), g9SelectionSearchDebounceMs);\n };\n const tap = (id: string) => {\n if (props.done.current || picking.current) return;\n const next = model.toggle(id);\n if (next === model) return;\n setModel(next);\n props.onDraft(next);\n if (!multiple && request.closeOnSingleSelection !== false) {\n picking.current = true;\n startTimer(() => props.onComplete(next.selectedKeys, true), g9SelectionCloseDelayMs);\n }\n };\n return (\n <view className=\"g9-selection\">\n {request.showSearch ? (\n <view className=\"g9-selection__search\">\n <G9TextEntry\n placeholder={strings.get(G9StringKey.Search)}\n leadingIcon=\"search\"\n value={query}\n onValueChange={onQuery}\n />\n </view>\n ) : null}\n {request.items.map((item, i) => {\n const id = ids[i] as string;\n if (!visibleIds.has(id)) return null;\n return (\n <SelectionRow\n key={id}\n item={item}\n elementId={g9ChildId(request.options?.automationId, `Item_${item.key ?? i}`)}\n selected={model.isSelected(id)}\n direction={dir}\n onTap={() => tap(id)}\n />\n );\n })}\n {visible.length === 0 ? (\n <text className=\"g9-selection__empty\">{request.emptyText ?? strings.get(G9StringKey.NoResults)}</text>\n ) : null}\n </view>\n );\n}\n\n/**\n * Shows the selection sheet (MAUI `G9SelectionSheet.ShowForResultAsync`): a fit sheet with a header (title near the\n * close button), optional search (150 ms debounce, text match, hidden selected rows stay selected), rows with icon or\n * swatch, check mark and selection tint. Single mode with `closeOnSingleSelection` completes on a pick; multi mode\n * shows a count pill and Done; a reset selection adds Reset. Any dismissal resolves `wasAccepted: false` with the\n * current draft (or the opening selection when the sheet never built).\n */\nexport function showSelectionSheet<T extends G9SelectionItem>(\n sheets: G9SheetService,\n request: G9SelectionSheetRequest<T>,\n): Promise<G9SelectionSheetResult<T>> {\n const items = [...request.items];\n const ids = selectionIdentities(items);\n const opening = request.selectedItems ?? [];\n // Opening items match listed items by identity; the rest are kept as \"not listed\".\n const openingIds = selectionIdentities([...items, ...opening]).slice(items.length);\n const listedIds = new Set(ids);\n const initialKeys = openingIds.filter((id) => listedIds.has(id));\n const unlisted = opening.filter((_, i) => !listedIds.has(openingIds[i] as string));\n const multiple = request.allowMultiple === true;\n const initial = createSelectionModel<T>({\n items,\n getKey: (item) => ids[items.indexOf(item)] as string,\n getText: (item) => item.text,\n mode: multiple ? 'multiple' : 'single',\n selectedKeys: initialKeys,\n isEnabled: (item) => item.isEnabled !== false,\n });\n return new Promise((resolve) => {\n let draft = initial;\n const draftListeners = new Set<() => void>();\n const draftStore = {\n subscribe: (l: () => void) => {\n draftListeners.add(l);\n return () => {\n draftListeners.delete(l);\n };\n },\n count: () => draft.selectedKeys.length,\n };\n let settled = false;\n const done = { current: false };\n const startKeys = new Set(initialKeys);\n const collect = (keys: ReadonlyArray<string>): T[] => {\n const set = new Set(keys);\n return [...items.filter((_, i) => set.has(ids[i] as string)), ...unlisted];\n };\n const settle = (keys: ReadonlyArray<string>, accepted: boolean, explicit?: ReadonlyArray<T>) => {\n if (settled) return;\n settled = true;\n done.current = true;\n const result = explicit ?? collect(keys);\n const changed = explicit !== undefined || keys.length !== startKeys.size || keys.some((k) => !startKeys.has(k));\n resolve({ wasAccepted: accepted, selectionChanged: changed, items: result });\n };\n let handle: G9SheetHandle | null = null;\n const complete = (keys: ReadonlyArray<string>, accepted: boolean) => {\n settle(keys, accepted);\n handle?.close();\n };\n const reset = request.resetSelection && request.resetSelection.length > 0 ? request.resetSelection : null;\n const body = () => (\n <SelectionBody\n request={request}\n ids={ids}\n initial={initial}\n done={done}\n onDraft={(m) => {\n draft = m;\n for (const l of [...draftListeners]) l();\n }}\n onComplete={complete}\n />\n );\n const options: G9SheetOptions = {\n ...fitToContentSheetOptions(),\n deferContent: items.length > g9SelectionEagerBuildItemLimit,\n deferredLoadingPlaceholderHeight: estimateSelectionHeight(items.length, request.showSearch === true),\n loadingSkeleton: 'listRows',\n loadingSkeletonRowCount: items.length,\n backgroundColor: 'var(--g9-surface)',\n showToolbar: true,\n showCloseButton: true,\n title: request.title,\n headerTitlePlacement: 'nearBack',\n ...(multiple || reset\n ? {\n headerTrailingView: (\n <SelectionHeaderActions\n multiple={multiple}\n draft={draftStore}\n {...(request.countLabel ? { countLabel: request.countLabel } : {})}\n onDone={() => complete(draft.selectedKeys, true)}\n {...(reset\n ? {\n onReset: () => {\n settle([], true, reset);\n handle?.close();\n },\n }\n : {})}\n />\n ),\n }\n : {}),\n ...request.options,\n onClosed: () => {\n request.options?.onClosed?.();\n settle(draft.selectedKeys, false);\n },\n };\n handle = sheets.show(items.length > g9SelectionEagerBuildItemLimit ? body : body(), options);\n if (!handle) settle(initialKeys, false);\n });\n}\n\nfunction SelectionHeaderActions(props: {\n readonly multiple: boolean;\n readonly draft: { subscribe(listener: () => void): () => void; count(): number };\n readonly countLabel?: (n: number) => string;\n readonly onDone: () => void;\n readonly onReset?: () => void;\n}): ReactNode {\n const strings = useG9Strings();\n const direction = useG9Direction();\n const n = useSyncExternalStore(props.draft.subscribe, props.draft.count);\n return (\n <view className=\"g9-selection__actions\" style={g9RowStyle(direction)}>\n {props.onReset ? (\n <G9Button text={strings.get(G9StringKey.Reset)} variant=\"text\" size=\"small\" onPress={props.onReset} />\n ) : null}\n {props.multiple && n > 0 ? (\n <view className=\"g9-selection__count\">\n <text className=\"g9-selection__count-text\">\n {props.countLabel ? props.countLabel(n) : `${n} ${strings.get(G9StringKey.Selected)}`}\n </text>\n </view>\n ) : null}\n {props.multiple ? (\n <G9Button text={strings.get(G9StringKey.Done)} variant=\"text\" size=\"small\" onPress={props.onDone} />\n ) : null}\n </view>\n );\n}\n\n/** Arguments of {@link showListSheet} (MAUI `ShowListG9BottomSheetAsync`). */\nexport interface G9ListSheetRequest<T extends G9SelectionItem> {\n readonly title: string;\n readonly items: ReadonlyArray<T>;\n readonly selected?: ReadonlyArray<T>;\n readonly multiple?: boolean;\n /** Default true. */\n readonly closeOnSingleSelection?: boolean;\n /** Shows the search field (250 ms debounce, trimmed) with this placeholder. */\n readonly searchPlaceholder?: string | null;\n /** Default full screen without a handle (MAUI). A fit-to-content `sizeMode` keeps the sheet compact. */\n readonly options?: G9SheetOptions;\n /** Apply button text (multi). Default the `save` string. */\n readonly applyButtonText?: string;\n}\n\n/**\n * The shared list picker (MAUI `ShowListG9BottomSheetAsync` / `G9BottomSheetListPickerModal`): search field with\n * placeholder, rows with a selection tint (no check mark), Apply in multi mode, close-on-select after 120 ms. Resolves\n * with the selection when it completes or closes (no accepted/dismissed distinction, as MAUI); `[]` when throttled.\n */\nexport function showListSheet<T extends G9SelectionItem>(\n sheets: G9SheetService,\n request: G9ListSheetRequest<T>,\n): Promise<T[]> {\n const items = [...request.items];\n const keyOf = (item: G9SelectionItem) => (item.key != null && item.key.trim() !== '' ? item.key : item.text);\n const multiple = request.multiple === true;\n const initial = createSelectionModel<T>({\n items,\n getKey: keyOf,\n getText: (item) => item.text,\n mode: multiple ? 'multiple' : 'single',\n selectedKeys: (request.selected ?? []).map(keyOf),\n isEnabled: (item) => item.isEnabled !== false,\n });\n return new Promise((resolve) => {\n let draft = initial;\n let settled = false;\n let handle: G9SheetHandle | null = null;\n const settle = () => {\n if (settled) return;\n settled = true;\n resolve(draft.selectedItems());\n };\n const complete = () => {\n settle();\n handle?.close();\n };\n const body = () => (\n <ListPickerBody\n request={request}\n initial={initial}\n keyOf={keyOf}\n onDraft={(m) => {\n draft = m;\n }}\n onComplete={complete}\n />\n );\n const base = request.options ?? fullScreenWithoutHandleSheetOptions();\n const fit = base.sizeMode === 'fitToContent';\n const options: G9SheetOptions = {\n ...base,\n ...(fit\n ? {}\n : {\n states: ['large'],\n currentState: 'large',\n hasHandle: false,\n isDraggable: true,\n useFullScreenLoadingPlaceholder: true,\n }),\n showToolbar: true,\n showCloseButton: true,\n title: request.title,\n headerTitlePlacement: 'nearBack',\n deferContent: true,\n onClosed: () => {\n base.onClosed?.();\n settle();\n },\n };\n handle = sheets.show(body, options);\n if (!handle) {\n settled = true;\n resolve([]);\n }\n });\n}\n\nfunction ListPickerBody<T extends G9SelectionItem>(props: {\n readonly request: G9ListSheetRequest<T>;\n readonly initial: G9SelectionModel<T>;\n readonly keyOf: (item: G9SelectionItem) => string;\n readonly onDraft: (model: G9SelectionModel<T>) => void;\n readonly onComplete: () => void;\n}): ReactNode {\n const strings = useG9Strings();\n const palette = useG9Theme().palette;\n const [model, setModel] = useState(props.initial);\n const [query, setQuery] = useState('');\n const picking = useRef(false);\n const { request } = props;\n const visible = model.filter(query, { trim: true });\n const tap = (item: T) => {\n if (picking.current || item.isEnabled === false) return;\n const next = model.toggle(props.keyOf(item));\n setModel(next);\n props.onDraft(next);\n if (!request.multiple && request.closeOnSingleSelection !== false) {\n picking.current = true;\n startTimer(props.onComplete, g9SelectionCloseDelayMs);\n }\n };\n return (\n <view className=\"g9-list-picker\">\n {request.searchPlaceholder ? (\n <view className=\"g9-selection__search\">\n <G9SearchEntry\n placeholder={request.searchPlaceholder}\n voiceEnabled={false}\n onDebouncedValueChange={setQuery}\n />\n </view>\n ) : null}\n {visible.map((item) => (\n <ListPickerRow\n key={props.keyOf(item)}\n item={item}\n selected={model.isSelected(props.keyOf(item))}\n tint={palette.PrimaryContainer}\n onTap={() => tap(item)}\n />\n ))}\n {request.multiple ? (\n <view className=\"g9-list-picker__apply\">\n <G9Button\n text={request.applyButtonText ?? strings.get(G9StringKey.Save)}\n size=\"hero\"\n onPress={props.onComplete}\n />\n </view>\n ) : null}\n </view>\n );\n}\n\nfunction ListPickerRow(props: {\n readonly item: G9SelectionItem;\n readonly selected: boolean;\n readonly tint: string;\n readonly onTap: () => void;\n}): ReactNode {\n const press = useG9Press(props.onTap, {\n source: 'G9ListPicker',\n guardMs: 0,\n blocked: props.item.isEnabled === false,\n });\n const icon = { icon: props.item.icon, imagePath: props.item.iconPath, image: props.item.iconImage };\n const direction = useG9Direction();\n return (\n <view\n className={`g9-list-picker__row${props.selected ? ' g9-list-picker__row--selected' : ''}`}\n style={{ ...g9RowStyle(direction), ...(props.selected ? { backgroundColor: props.tint } : {}) }}\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={props.item.text}\n bindtap={press}\n >\n {hasIconSlot(icon) ? <G9IconSlot {...icon} size={20} color=\"var(--g9-on-surface-variant)\" /> : null}\n <text className=\"g9-list-picker__text\" text-maxline=\"1\" style={g9TextStart(direction)}>\n {props.item.text}\n </text>\n </view>\n );\n}\n"],"names":["g9SelectionEagerBuildItemLimit","g9SelectionRowHeight","g9SelectionSearchDebounceMs","g9SelectionCloseDelayMs","selectionIdentities","items","counts","Map","item","_counts_get","i","estimateSelectionHeight","count","showSearch","chrome","Math","SelectionRow","props","_item_iconTintColor","_item_swatchFirstColor","_item_swatchSecondColor","palette","useG9Theme","glyphs","useG9Settings","selected","press","useG9Press","icon","iconColor","view","formatColor","withAlpha","g9RowStyle","hasIconSlot","G9IconSlot","G9Swatch","text","g9TextStart","SelectionBody","_request_emptyText","strings","useG9Strings","parentDir","useG9Direction","request","ids","model","setModel","useState","query","setQuery","applied","setApplied","timer","useRef","picking","useEffect","stopTimer","visible","visibleIds","Set","dir","multiple","onQuery","value","startTimer","tap","id","next","G9TextEntry","G9StringKey","_item_key","_request_options","g9ChildId","showSelectionSheet","sheets","_request_selectedItems","opening","openingIds","listedIds","initialKeys","unlisted","_","initial","createSelectionModel","Promise","resolve","draft","draftListeners","draftStore","l","settled","done","startKeys","collect","keys","set","settle","accepted","explicit","result","changed","undefined","k","handle","complete","reset","body","m","options","fitToContentSheetOptions","SelectionHeaderActions","direction","n","useSyncExternalStore","G9Button","showListSheet","_request_selected","keyOf","ListPickerBody","base","fullScreenWithoutHandleSheetOptions","fit","_request_applyButtonText","G9SearchEntry","ListPickerRow"],"mappings":"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"}
1
+ {"version":3,"file":"selection/selection-sheet.jsx","sources":["../../src/selection/selection-sheet.tsx"],"sourcesContent":["import './selection.css';\nimport { formatColor, G9StringKey, type G9TextInputDirection, withAlpha } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useRef, useState, useSyncExternalStore } from '@lynx-js/react';\nimport { g9ChildId, g9RowStyle, g9TextStart } from '../base/control';\nimport { useG9Press } from '../base/press';\nimport type { G9SelectionItem } from '../base/selection-item';\nimport { type G9TimerHandle, startTimer, stopTimer } from '../base/timers';\nimport { G9Button } from '../button/button';\nimport { G9SearchEntry } from '../fields/search-entry';\nimport { G9TextEntry } from '../fields/text-entry';\nimport { G9IconSlot, hasIconSlot } from '../icon/slot';\nimport { G9Swatch } from '../icon/swatch';\nimport { useG9Direction, useG9Settings, useG9Strings, useG9Theme } from '../provider/hooks';\nimport { fitToContentSheetOptions, fullScreenWithoutHandleSheetOptions, type G9SheetOptions } from '../sheet/options';\nimport type { G9SheetService } from '../sheet/service';\nimport type { G9SheetHandle } from '../sheet/stack';\nimport { createSelectionModel, type G9SelectionModel } from './model';\n\n/** MAUI `G9SelectionSheet.EagerBuildItemLimit`: lists up to 40 items are built at once; longer lists defer. */\nexport const g9SelectionEagerBuildItemLimit = 40;\n/** Row height of the selection sheet (MAUI 52). */\nexport const g9SelectionRowHeight = 52;\n/** Search debounce of the selection sheet (MAUI 150 ms). */\nexport const g9SelectionSearchDebounceMs = 150;\n/** Wait after a close-on-select pick before closing (MAUI 120 ms). */\nexport const g9SelectionCloseDelayMs = 120;\n\n/** The outcome of a selection sheet (MAUI `G9SelectionSheetResult`). */\nexport interface G9SelectionSheetResult<T extends G9SelectionItem = G9SelectionItem> {\n /** A pick on a close-on-select sheet, Done, or Reset; `false` for every dismissal. */\n readonly wasAccepted: boolean;\n /** The selection differs from the opening one. */\n readonly selectionChanged: boolean;\n /** The final selection (opening items that are not listed or disabled stay unless deselected). */\n readonly items: ReadonlyArray<T>;\n}\n\n/**\n * The selection identity of an item inside one list (MAUI `G9SelectionSheet.KeyOf`): `k:<key>` when the key is set,\n * else `t:<text>` when the text is unique among key-less items, else the position (`i:<n>`). Keys and texts never\n * match each other.\n */\nexport function selectionIdentities(items: ReadonlyArray<G9SelectionItem>): string[] {\n const counts = new Map<string, number>();\n for (const item of items) {\n if (item.key == null || item.key.trim() === '') counts.set(item.text, (counts.get(item.text) ?? 0) + 1);\n }\n return items.map((item, i) =>\n item.key != null && item.key.trim() !== ''\n ? `k:${item.key}`\n : (counts.get(item.text) ?? 0) > 1\n ? `i:${i}`\n : `t:${item.text}`,\n );\n}\n\n/** Estimated body height (MAUI `EstimateContentHeight`): rows × 52 + chrome, clamped to [2 rows + chrome, 520]. */\nexport function estimateSelectionHeight(count: number, showSearch: boolean): number {\n const chrome = (showSearch ? 64 : 0) + 18;\n return Math.min(520, Math.max(2 * g9SelectionRowHeight + chrome, count * g9SelectionRowHeight + chrome));\n}\n\n/** Arguments of {@link showSelectionSheet} (MAUI `ShowForResultAsync`). */\nexport interface G9SelectionSheetRequest<T extends G9SelectionItem> {\n readonly title: string;\n readonly items: ReadonlyArray<T>;\n readonly selectedItems?: ReadonlyArray<T>;\n readonly allowMultiple?: boolean;\n /** Single mode: a pick completes and closes after 120 ms. Default true. */\n readonly closeOnSingleSelection?: boolean;\n readonly showSearch?: boolean;\n /** No-results text. Default the `noResults` string. */\n readonly emptyText?: string | null;\n /** Row text direction. Default `'matchParent'`. */\n readonly itemTextDirection?: G9TextInputDirection;\n /** A non-empty reset selection adds a Reset toolbar item that completes with it. */\n readonly resetSelection?: ReadonlyArray<T> | null;\n /** Count pill label (multi). Default `\"{n} {selected}\"`. */\n readonly countLabel?: (count: number) => string;\n /** Extra sheet options (merged over the defaults). */\n readonly options?: G9SheetOptions;\n}\n\ninterface BodyProps<T extends G9SelectionItem> {\n readonly request: G9SelectionSheetRequest<T>;\n readonly ids: ReadonlyArray<string>;\n readonly initial: G9SelectionModel<T>;\n readonly onComplete: (keys: ReadonlyArray<string>, accepted: boolean) => void;\n readonly onDraft: (model: G9SelectionModel<T>) => void;\n readonly done: { current: boolean };\n}\n\nfunction SelectionRow(props: {\n readonly item: G9SelectionItem;\n /** Element id (`${sheet automationId}_Item_${key}`), so automation finds the row like a person sees it. */\n readonly elementId?: string | undefined;\n readonly selected: boolean;\n readonly direction: 'ltr' | 'rtl';\n readonly onTap: () => void;\n}): ReactNode {\n const palette = useG9Theme().palette;\n const glyphs = useG9Settings().glyphs;\n const { item, selected } = props;\n const press = useG9Press(props.onTap, { blocked: item.isEnabled === false, source: 'G9SelectionSheet', guardMs: 0 });\n const icon = { emoji: item.emoji, icon: item.icon, imagePath: item.iconPath, image: item.iconImage };\n const iconColor = item.iconTintColor ?? (selected ? palette.Primary : palette.TextSecondary);\n return (\n <view\n {...(props.elementId ? { id: props.elementId } : {})}\n className={`g9-selection-row${selected ? ' g9-selection-row--selected' : ''}`}\n style={selected ? { backgroundColor: formatColor(withAlpha(palette.Primary, 0.1)) } : {}}\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={item.text}\n {...(selected ? { 'accessibility-value': 'selected' } : {})}\n bindtap={press}\n >\n <view\n className={`g9-selection-row__inner g9-dir-${props.direction}`}\n style={{ ...g9RowStyle(props.direction), ...(item.isEnabled === false ? { opacity: 0.45 } : {}) }}\n >\n {hasIconSlot(icon) ? (\n <G9IconSlot {...icon} size={18} color={iconColor} />\n ) : item.swatchFirstColor?.trim() || item.swatchSecondColor?.trim() ? (\n <G9Swatch first={item.swatchFirstColor} second={item.swatchSecondColor} direction={props.direction} />\n ) : (\n // MAUI's row is a Grid of ColumnSpacing 12 whose icon column stays when empty: its spacing still sits before\n // the text, so an icon-less row's text starts 16 + 12 dp in, level with nothing but the same in every picker.\n <view className=\"g9-selection-row__icon-gap\" />\n )}\n <text\n className=\"g9-selection-row__text\"\n text-maxline=\"1\"\n style={{\n color: selected ? palette.Primary : palette.TextPrimary,\n fontWeight: selected ? 'bold' : 'normal',\n ...g9TextStart(props.direction),\n }}\n >\n {item.text}\n </text>\n <view style={{ opacity: selected ? 1 : 0 }}>\n <G9IconSlot icon={glyphs.check} size={18} color={palette.Primary} />\n </view>\n </view>\n </view>\n );\n}\n\nfunction SelectionBody<T extends G9SelectionItem>(props: BodyProps<T>): ReactNode {\n const strings = useG9Strings();\n const parentDir = useG9Direction();\n const { request, ids } = props;\n const [model, setModel] = useState(props.initial);\n const [query, setQuery] = useState('');\n const [applied, setApplied] = useState('');\n const timer = useRef<G9TimerHandle | null>(null);\n const picking = useRef(false);\n useEffect(\n () => () => {\n if (timer.current !== null) stopTimer(timer.current);\n },\n [],\n );\n const visible = request.showSearch ? model.withItems(request.items).filter(applied) : request.items;\n const visibleIds = new Set(visible.map((item) => ids[request.items.indexOf(item)]));\n const dir =\n request.itemTextDirection === 'leftToRight'\n ? 'ltr'\n : request.itemTextDirection === 'rightToLeft'\n ? 'rtl'\n : parentDir;\n const multiple = request.allowMultiple === true;\n const onQuery = (value: string) => {\n setQuery(value);\n if (timer.current !== null) stopTimer(timer.current);\n if (value.trim() === '') {\n setApplied(value);\n return;\n }\n timer.current = startTimer(() => setApplied(value), g9SelectionSearchDebounceMs);\n };\n const tap = (id: string) => {\n if (props.done.current || picking.current) return;\n const next = model.toggle(id);\n if (next === model) return;\n setModel(next);\n props.onDraft(next);\n if (!multiple && request.closeOnSingleSelection !== false) {\n picking.current = true;\n startTimer(() => props.onComplete(next.selectedKeys, true), g9SelectionCloseDelayMs);\n }\n };\n return (\n <view className=\"g9-selection\">\n {request.showSearch ? (\n <view className=\"g9-selection__search\">\n <G9TextEntry\n placeholder={strings.get(G9StringKey.Search)}\n leadingIcon=\"search\"\n value={query}\n onValueChange={onQuery}\n />\n </view>\n ) : null}\n {visible.length > 0 ? (\n <view className=\"g9-selection__items\">\n {request.items.map((item, i) => {\n const id = ids[i] as string;\n if (!visibleIds.has(id)) return null;\n return (\n <SelectionRow\n key={id}\n item={item}\n elementId={g9ChildId(request.options?.automationId, `Item_${item.key ?? i}`)}\n selected={model.isSelected(id)}\n direction={dir}\n onTap={() => tap(id)}\n />\n );\n })}\n </view>\n ) : null}\n {visible.length === 0 ? (\n <text className=\"g9-selection__empty\">{request.emptyText ?? strings.get(G9StringKey.NoResults)}</text>\n ) : null}\n </view>\n );\n}\n\n/**\n * Shows the selection sheet (MAUI `G9SelectionSheet.ShowForResultAsync`): a fit sheet with a header (title near the\n * close button), optional search (150 ms debounce, text match, hidden selected rows stay selected), rows with icon or\n * swatch, check mark and selection tint. Single mode with `closeOnSingleSelection` completes on a pick; multi mode\n * shows a count pill and Done; a reset selection adds Reset. Any dismissal resolves `wasAccepted: false` with the\n * current draft (or the opening selection when the sheet never built).\n */\nexport function showSelectionSheet<T extends G9SelectionItem>(\n sheets: G9SheetService,\n request: G9SelectionSheetRequest<T>,\n): Promise<G9SelectionSheetResult<T>> {\n const items = [...request.items];\n const ids = selectionIdentities(items);\n const opening = request.selectedItems ?? [];\n // Opening items match listed items by identity; the rest are kept as \"not listed\".\n const openingIds = selectionIdentities([...items, ...opening]).slice(items.length);\n const listedIds = new Set(ids);\n const initialKeys = openingIds.filter((id) => listedIds.has(id));\n const unlisted = opening.filter((_, i) => !listedIds.has(openingIds[i] as string));\n const multiple = request.allowMultiple === true;\n const initial = createSelectionModel<T>({\n items,\n getKey: (item) => ids[items.indexOf(item)] as string,\n getText: (item) => item.text,\n mode: multiple ? 'multiple' : 'single',\n selectedKeys: initialKeys,\n isEnabled: (item) => item.isEnabled !== false,\n });\n return new Promise((resolve) => {\n let draft = initial;\n const draftListeners = new Set<() => void>();\n const draftStore = {\n subscribe: (l: () => void) => {\n draftListeners.add(l);\n return () => {\n draftListeners.delete(l);\n };\n },\n count: () => draft.selectedKeys.length,\n };\n let settled = false;\n const done = { current: false };\n const startKeys = new Set(initialKeys);\n const collect = (keys: ReadonlyArray<string>): T[] => {\n const set = new Set(keys);\n return [...items.filter((_, i) => set.has(ids[i] as string)), ...unlisted];\n };\n const settle = (keys: ReadonlyArray<string>, accepted: boolean, explicit?: ReadonlyArray<T>) => {\n if (settled) return;\n settled = true;\n done.current = true;\n const result = explicit ?? collect(keys);\n const changed = explicit !== undefined || keys.length !== startKeys.size || keys.some((k) => !startKeys.has(k));\n resolve({ wasAccepted: accepted, selectionChanged: changed, items: result });\n };\n let handle: G9SheetHandle | null = null;\n const complete = (keys: ReadonlyArray<string>, accepted: boolean) => {\n settle(keys, accepted);\n handle?.close();\n };\n const reset = request.resetSelection && request.resetSelection.length > 0 ? request.resetSelection : null;\n const body = () => (\n <SelectionBody\n request={request}\n ids={ids}\n initial={initial}\n done={done}\n onDraft={(m) => {\n draft = m;\n for (const l of [...draftListeners]) l();\n }}\n onComplete={complete}\n />\n );\n const options: G9SheetOptions = {\n ...fitToContentSheetOptions(),\n deferContent: items.length > g9SelectionEagerBuildItemLimit,\n deferredLoadingPlaceholderHeight: estimateSelectionHeight(items.length, request.showSearch === true),\n loadingSkeleton: 'listRows',\n loadingSkeletonRowCount: items.length,\n backgroundColor: 'var(--g9-surface)',\n showToolbar: true,\n showCloseButton: true,\n title: request.title,\n headerTitlePlacement: 'nearBack',\n ...(multiple || reset\n ? {\n headerTrailingView: (\n <SelectionHeaderActions\n multiple={multiple}\n draft={draftStore}\n {...(request.countLabel ? { countLabel: request.countLabel } : {})}\n onDone={() => complete(draft.selectedKeys, true)}\n {...(reset\n ? {\n onReset: () => {\n settle([], true, reset);\n handle?.close();\n },\n }\n : {})}\n />\n ),\n }\n : {}),\n ...request.options,\n onClosed: () => {\n request.options?.onClosed?.();\n settle(draft.selectedKeys, false);\n },\n };\n handle = sheets.show(items.length > g9SelectionEagerBuildItemLimit ? body : body(), options);\n if (!handle) settle(initialKeys, false);\n });\n}\n\nfunction SelectionHeaderActions(props: {\n readonly multiple: boolean;\n readonly draft: { subscribe(listener: () => void): () => void; count(): number };\n readonly countLabel?: (n: number) => string;\n readonly onDone: () => void;\n readonly onReset?: () => void;\n}): ReactNode {\n const strings = useG9Strings();\n const direction = useG9Direction();\n const n = useSyncExternalStore(props.draft.subscribe, props.draft.count);\n return (\n <view className=\"g9-selection__actions\" style={g9RowStyle(direction)}>\n {props.onReset ? (\n <G9Button text={strings.get(G9StringKey.Reset)} variant=\"text\" size=\"small\" onPress={props.onReset} />\n ) : null}\n {props.multiple && n > 0 ? (\n <view className=\"g9-selection__count\">\n <text className=\"g9-selection__count-text\">\n {props.countLabel ? props.countLabel(n) : `${n} ${strings.get(G9StringKey.Selected)}`}\n </text>\n </view>\n ) : null}\n {props.multiple ? (\n <G9Button text={strings.get(G9StringKey.Done)} variant=\"text\" size=\"small\" onPress={props.onDone} />\n ) : null}\n </view>\n );\n}\n\n/** Arguments of {@link showListSheet} (MAUI `ShowListG9BottomSheetAsync`). */\nexport interface G9ListSheetRequest<T extends G9SelectionItem> {\n readonly title: string;\n readonly items: ReadonlyArray<T>;\n readonly selected?: ReadonlyArray<T>;\n readonly multiple?: boolean;\n /** Default true. */\n readonly closeOnSingleSelection?: boolean;\n /** Shows the search field (250 ms debounce, trimmed) with this placeholder. */\n readonly searchPlaceholder?: string | null;\n /** Default full screen without a handle (MAUI). A fit-to-content `sizeMode` keeps the sheet compact. */\n readonly options?: G9SheetOptions;\n /** Apply button text (multi). Default the `save` string. */\n readonly applyButtonText?: string;\n}\n\n/**\n * The shared list picker (MAUI `ShowListG9BottomSheetAsync` / `G9BottomSheetListPickerModal`): search field with\n * placeholder, rows with a selection tint (no check mark), Apply in multi mode, close-on-select after 120 ms. Resolves\n * with the selection when it completes or closes (no accepted/dismissed distinction, as MAUI); `[]` when throttled.\n */\nexport function showListSheet<T extends G9SelectionItem>(\n sheets: G9SheetService,\n request: G9ListSheetRequest<T>,\n): Promise<T[]> {\n const items = [...request.items];\n const keyOf = (item: G9SelectionItem) => (item.key != null && item.key.trim() !== '' ? item.key : item.text);\n const multiple = request.multiple === true;\n const initial = createSelectionModel<T>({\n items,\n getKey: keyOf,\n getText: (item) => item.text,\n mode: multiple ? 'multiple' : 'single',\n selectedKeys: (request.selected ?? []).map(keyOf),\n isEnabled: (item) => item.isEnabled !== false,\n });\n return new Promise((resolve) => {\n let draft = initial;\n let settled = false;\n let handle: G9SheetHandle | null = null;\n const settle = () => {\n if (settled) return;\n settled = true;\n resolve(draft.selectedItems());\n };\n const complete = () => {\n settle();\n handle?.close();\n };\n const body = () => (\n <ListPickerBody\n request={request}\n initial={initial}\n keyOf={keyOf}\n onDraft={(m) => {\n draft = m;\n }}\n onComplete={complete}\n />\n );\n const base = request.options ?? fullScreenWithoutHandleSheetOptions();\n const fit = base.sizeMode === 'fitToContent';\n const options: G9SheetOptions = {\n ...base,\n ...(fit\n ? {}\n : {\n states: ['large'],\n currentState: 'large',\n hasHandle: false,\n isDraggable: true,\n useFullScreenLoadingPlaceholder: true,\n }),\n showToolbar: true,\n showCloseButton: true,\n title: request.title,\n headerTitlePlacement: 'nearBack',\n deferContent: true,\n onClosed: () => {\n base.onClosed?.();\n settle();\n },\n };\n handle = sheets.show(body, options);\n if (!handle) {\n settled = true;\n resolve([]);\n }\n });\n}\n\nfunction ListPickerBody<T extends G9SelectionItem>(props: {\n readonly request: G9ListSheetRequest<T>;\n readonly initial: G9SelectionModel<T>;\n readonly keyOf: (item: G9SelectionItem) => string;\n readonly onDraft: (model: G9SelectionModel<T>) => void;\n readonly onComplete: () => void;\n}): ReactNode {\n const strings = useG9Strings();\n const palette = useG9Theme().palette;\n const [model, setModel] = useState(props.initial);\n const [query, setQuery] = useState('');\n const picking = useRef(false);\n const { request } = props;\n const visible = model.filter(query, { trim: true });\n const tap = (item: T) => {\n if (picking.current || item.isEnabled === false) return;\n const next = model.toggle(props.keyOf(item));\n setModel(next);\n props.onDraft(next);\n if (!request.multiple && request.closeOnSingleSelection !== false) {\n picking.current = true;\n startTimer(props.onComplete, g9SelectionCloseDelayMs);\n }\n };\n return (\n <view className=\"g9-list-picker\">\n {request.searchPlaceholder ? (\n <view className=\"g9-selection__search\">\n <G9SearchEntry\n placeholder={request.searchPlaceholder}\n voiceEnabled={false}\n onDebouncedValueChange={setQuery}\n />\n </view>\n ) : null}\n {visible.map((item) => (\n <ListPickerRow\n key={props.keyOf(item)}\n item={item}\n selected={model.isSelected(props.keyOf(item))}\n tint={palette.PrimaryContainer}\n onTap={() => tap(item)}\n />\n ))}\n {request.multiple ? (\n <view className=\"g9-list-picker__apply\">\n <G9Button\n text={request.applyButtonText ?? strings.get(G9StringKey.Save)}\n size=\"hero\"\n onPress={props.onComplete}\n />\n </view>\n ) : null}\n </view>\n );\n}\n\nfunction ListPickerRow(props: {\n readonly item: G9SelectionItem;\n readonly selected: boolean;\n readonly tint: string;\n readonly onTap: () => void;\n}): ReactNode {\n const press = useG9Press(props.onTap, {\n source: 'G9ListPicker',\n guardMs: 0,\n blocked: props.item.isEnabled === false,\n });\n const icon = { icon: props.item.icon, imagePath: props.item.iconPath, image: props.item.iconImage };\n const direction = useG9Direction();\n return (\n <view\n className={`g9-list-picker__row${props.selected ? ' g9-list-picker__row--selected' : ''}`}\n style={{ ...g9RowStyle(direction), ...(props.selected ? { backgroundColor: props.tint } : {}) }}\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={props.item.text}\n bindtap={press}\n >\n {hasIconSlot(icon) ? <G9IconSlot {...icon} size={20} color=\"var(--g9-on-surface-variant)\" /> : null}\n <text className=\"g9-list-picker__text\" text-maxline=\"1\" style={g9TextStart(direction)}>\n {props.item.text}\n </text>\n </view>\n );\n}\n"],"names":["g9SelectionEagerBuildItemLimit","g9SelectionRowHeight","g9SelectionSearchDebounceMs","g9SelectionCloseDelayMs","selectionIdentities","items","counts","Map","item","_counts_get","i","estimateSelectionHeight","count","showSearch","chrome","Math","SelectionRow","props","_item_iconTintColor","_item_swatchFirstColor","_item_swatchSecondColor","palette","useG9Theme","glyphs","useG9Settings","selected","press","useG9Press","icon","iconColor","view","formatColor","withAlpha","g9RowStyle","hasIconSlot","G9IconSlot","G9Swatch","text","g9TextStart","SelectionBody","_request_emptyText","strings","useG9Strings","parentDir","useG9Direction","request","ids","model","setModel","useState","query","setQuery","applied","setApplied","timer","useRef","picking","useEffect","stopTimer","visible","visibleIds","Set","dir","multiple","onQuery","value","startTimer","tap","id","next","G9TextEntry","G9StringKey","_item_key","_request_options","g9ChildId","showSelectionSheet","sheets","_request_selectedItems","opening","openingIds","listedIds","initialKeys","unlisted","_","initial","createSelectionModel","Promise","resolve","draft","draftListeners","draftStore","l","settled","done","startKeys","collect","keys","set","settle","accepted","explicit","result","changed","undefined","k","handle","complete","reset","body","m","options","fitToContentSheetOptions","SelectionHeaderActions","direction","n","useSyncExternalStore","G9Button","showListSheet","_request_selected","keyOf","ListPickerBody","base","fullScreenWithoutHandleSheetOptions","fit","_request_applyButtonText","G9SearchEntry","ListPickerRow"],"mappings":"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"}
@@ -3,6 +3,16 @@
3
3
  display: flex;
4
4
  }
5
5
 
6
+ .g9-selection {
7
+ padding-bottom: 4px;
8
+ }
9
+
10
+ .g9-selection__items {
11
+ flex-direction: column;
12
+ padding: 4px 0;
13
+ display: flex;
14
+ }
15
+
6
16
  .g9-selection__search {
7
17
  padding: 8px 12px;
8
18
  }
@@ -22,6 +32,11 @@
22
32
  display: flex;
23
33
  }
24
34
 
35
+ .g9-selection-row__icon-gap {
36
+ width: 0;
37
+ height: 1px;
38
+ }
39
+
25
40
  .g9-selection-row__text {
26
41
  text-overflow: ellipsis;
27
42
  flex: 1;
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/selection/selection.css"],"names":[],"mappings":"AACA;EAAE,sBAAsB;EACtB,aAAa;AACf;;AAIA;EADE,iBAAiB;AACnB;;AAMA;EAHE,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,aAAa;AACf;;AAMA;EAHE,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,eAAe;EACf,aAAa;AACf;;AAMA;EAHE,uBAAuB;EACvB,OAAO;EACP,eAAe;AACjB;;AAMA;EAHE,kBAAkB;EAClB,8BAA8B;EAC9B,kBAAkB;EAClB,eAAe;AACjB;;AAMA;EAHE,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,aAAa;AACf;;AAMA;EAHE,6CAA6C;EAC7C,mBAAmB;EACnB,gBAAgB;AAClB;;AAMA;EAHE,qCAAqC;EACrC,eAAe;AACjB;;AAMA;EAHE,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,aAAa;AACf;;AAMA;EAHE,6BAA6B;EAC7B,OAAO;EACP,eAAe;AACjB;;AAMA;EAHE,kBAAkB;AACpB","sourcesContent":["/* Selection sheet and list picker (MAUI G9SelectionSheet, G9BottomSheetListPickerModal). */\n.g9-selection,\n.g9-list-picker {\n display: flex;\n flex-direction: column;\n}\n\n.g9-selection__search {\n padding: 8px 12px;\n}\n\n/* A column: the inner row stretches to the full width and is centred VERTICALLY (as a row container, the inner row\n was centred horizontally — icon, text and check bunched in the middle of the sheet). */\n.g9-selection-row {\n min-height: 52px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.g9-selection-row__inner {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n padding: 0px 16px;\n}\n\n.g9-selection-row__text {\n flex: 1;\n font-size: 14px;\n text-overflow: ellipsis;\n}\n\n.g9-selection__empty {\n padding: 28px 16px;\n font-size: 13px;\n text-align: center;\n color: var(--g9-text-tertiary);\n}\n\n.g9-selection__actions {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 8px;\n}\n\n.g9-selection__count {\n padding: 2px 8px;\n border-radius: 10px;\n background-color: var(--g9-primary-container);\n}\n\n.g9-selection__count-text {\n font-size: 12px;\n color: var(--g9-on-primary-container);\n}\n\n.g9-list-picker__row {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 10px;\n min-height: 52px;\n padding: 0px 16px;\n}\n\n.g9-list-picker__text {\n flex: 1;\n font-size: 14px;\n color: var(--g9-text-primary);\n}\n\n.g9-list-picker__apply {\n padding: 12px 16px;\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/selection/selection.css"],"names":[],"mappings":"AACA;EAAE,sBAAsB;EACtB,aAAa;AACf;;AAMA;EAHE,mBAAmB;AACrB;;AAMA;EAHE,sBAAsB;EACtB,cAAc;EACd,aAAa;AACf;;AAMA;EAHE,iBAAiB;AACnB;;AAQA;EALE,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,aAAa;AACf;;AAQA;EALE,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,eAAe;EACf,aAAa;AACf;;AAQA;EALE,QAAQ;EACR,WAAW;AACb;;AAQA;EALE,uBAAuB;EACvB,OAAO;EACP,eAAe;AACjB;;AAQA;EALE,kBAAkB;EAClB,8BAA8B;EAC9B,kBAAkB;EAClB,eAAe;AACjB;;AAQA;EALE,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,aAAa;AACf;;AAQA;EALE,6CAA6C;EAC7C,mBAAmB;EACnB,gBAAgB;AAClB;;AAQA;EALE,qCAAqC;EACrC,eAAe;AACjB;;AAQA;EALE,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,aAAa;AACf;;AAQA;EALE,6BAA6B;EAC7B,OAAO;EACP,eAAe;AACjB;;AAQA;EALE,kBAAkB;AACpB","sourcesContent":["/* Selection sheet and list picker (MAUI G9SelectionSheet, G9BottomSheetListPickerModal). */\n.g9-selection,\n.g9-list-picker {\n display: flex;\n flex-direction: column;\n}\n\n/* MAUI G9SelectionSheet: the sheet's Padding (0, 0, 0, 4) and the rows host's Padding (0, 4, 0, 4) — 4 dp between the\n header and the first row, 8 dp under the last. */\n.g9-selection {\n padding-bottom: 4px;\n}\n\n.g9-selection__items {\n display: flex;\n flex-direction: column;\n padding: 4px 0px;\n}\n\n.g9-selection__search {\n padding: 8px 12px;\n}\n\n/* A column: the inner row stretches to the full width and is centred VERTICALLY (as a row container, the inner row\n was centred horizontally — icon, text and check bunched in the middle of the sheet). */\n.g9-selection-row {\n min-height: 52px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.g9-selection-row__inner {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n padding: 0px 16px;\n}\n\n.g9-selection-row__icon-gap {\n width: 0px;\n height: 1px;\n}\n\n.g9-selection-row__text {\n flex: 1;\n font-size: 14px;\n text-overflow: ellipsis;\n}\n\n.g9-selection__empty {\n padding: 28px 16px;\n font-size: 13px;\n text-align: center;\n color: var(--g9-text-tertiary);\n}\n\n.g9-selection__actions {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 8px;\n}\n\n.g9-selection__count {\n padding: 2px 8px;\n border-radius: 10px;\n background-color: var(--g9-primary-container);\n}\n\n.g9-selection__count-text {\n font-size: 12px;\n color: var(--g9-on-primary-container);\n}\n\n.g9-list-picker__row {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 10px;\n min-height: 52px;\n padding: 0px 16px;\n}\n\n.g9-list-picker__text {\n flex: 1;\n font-size: 14px;\n color: var(--g9-text-primary);\n}\n\n.g9-list-picker__apply {\n padding: 12px 16px;\n}\n"],"sourceRoot":""}
@@ -1 +1 @@
1
- {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/sheet/frame.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,aAAa,EAInB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAiB,KAAK,SAAS,EAA2C,MAAM,gBAAgB,CAAC;AASxG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,WAAW,CAAC;AAahE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEzE,qGAAqG;AACrG,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAID,kDAAkD;AAClD,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAE9D;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AA4BD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAoThE"}
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/sheet/frame.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,aAAa,EAInB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAiB,KAAK,SAAS,EAA2C,MAAM,gBAAgB,CAAC;AASxG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,WAAW,CAAC;AAchE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEzE,qGAAqG;AACrG,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAID,kDAAkD;AAClD,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAE9D;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AA4BD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CA8UhE"}
@@ -9,9 +9,9 @@ import { G9SheetSkeleton } from "../display/shimmer.jsx";
9
9
  import { g9FieldNotchStyle } from "../fields/notch.jsx";
10
10
  import { useG9Theme } from "../provider/hooks.jsx";
11
11
  import { G9SheetGestureFrame, useSheetBodyGesture, useSheetGestureRefs } from "./gesture.jsx";
12
- import { G9SheetFooter, G9SheetHeader, g9SheetHeaderMetrics } from "./header.jsx";
12
+ import { G9SheetFooter, G9SheetHeader } from "./header.jsx";
13
13
  import { resolveSheetMotion } from "./motion.jsx";
14
- import { clampFitHeight, currentPlatform, g9SheetDragCloseThreshold, g9SheetFitLoadingMinHeight, parentRecedeOffset, platformSheetConstraints, resolveSheetLayout, sheetOverlayOpacity, sheetSurfaceBottomPadding, sheetSurfaceTopPadding } from "./sizing.jsx";
14
+ import { clampFitHeight, currentPlatform, g9SheetDragCloseThreshold, g9SheetFitLoadingMinHeight, g9SheetFitMinHeight, parentRecedeOffset, platformSheetConstraints, resolveSheetLayout, sheetOverlayOpacity, sheetSurfaceBottomPadding, sheetSurfaceTopPadding } from "./sizing.jsx";
15
15
  const SheetContext = createContext(null);
16
16
  function useG9SheetContext() {
17
17
  return useContext(SheetContext);
@@ -102,6 +102,12 @@ function G9SheetFrame(props) {
102
102
  const placeholderHeight = o.useFullScreenLoadingPlaceholder ? props.hostHeight : null != (_ref = null != (_o_deferredLoadingPlaceholderHeight = o.deferredLoadingPlaceholderHeight) ? _o_deferredLoadingPlaceholderHeight : memoKey ? null == (_props_memo = props.memo) ? void 0 : _props_memo.lookup(memoKey) : void 0) ? _ref : g9SheetFitLoadingMinHeight;
103
103
  const [bodyHeight, setBodyHeight] = useState(0);
104
104
  const [footerHeight, setFooterHeight] = useState(0);
105
+ const [chromeTopHeight, setChromeTopHeight] = useState(0);
106
+ const onChromeTopLayout = (e)=>{
107
+ var _ref;
108
+ var _e_detail;
109
+ return setChromeTopHeight(Math.max(0, null != (_ref = null == (_e_detail = e.detail) ? void 0 : _e_detail.height) ? _ref : 0));
110
+ };
105
111
  const onFooterLayout = (e)=>{
106
112
  var _ref;
107
113
  var _e_detail;
@@ -125,17 +131,10 @@ function G9SheetFrame(props) {
125
131
  <G9ActivityIndicator running size={32}/>
126
132
  </view>;
127
133
  const body = revealed ? factory ? entry.content() : entry.content : null;
128
- const maxBody = layout.fitMaxHeight;
129
- const contextValue = {
130
- handle,
131
- signal: controller.current.signal,
132
- opened: 'open' === entry.status,
133
- closing,
134
- maxBodyHeight: maxBody
135
- };
136
134
  const ratios = layout.snapPoints.map((p)=>'number' == typeof p ? p / Math.max(1, props.hostHeight) : 'fit' === p ? 0.5 : Number.parseFloat(p) / 100);
137
135
  const restingRatio = null != (_ratios_layout_initialSnap = ratios[layout.initialSnap]) ? _ratios_layout_initialSnap : 1;
138
- const contentRatio = bodyHeight > 0 ? Math.min(1, bodyHeight / Math.max(1, props.hostHeight)) : 0.5;
136
+ const shown = null !== layout.fitMaxHeight ? Math.min(bodyHeight, layout.fitMaxHeight) : bodyHeight;
137
+ const contentRatio = bodyHeight > 0 ? Math.min(1, shown / Math.max(1, props.hostHeight)) : 0.5;
139
138
  const opacity = entry.handingOff ? 0 : layout.fit ? contentRatio >= 0.99 ? settings.modalOverlayMaximumOpacity : settings.modalOverlayMinimumOpacity : sheetOverlayOpacity(restingRatio, ratios, settings.modalOverlayMinimumOpacity, settings.modalOverlayMaximumOpacity);
140
139
  const modal = false !== o.isModal;
141
140
  const recede = entry.receded ? {
@@ -166,6 +165,14 @@ function G9SheetFrame(props) {
166
165
  ]);
167
166
  const topPadding = sheetSurfaceTopPadding(o, layout, resting, props.topInset, props.hostHeight);
168
167
  const bottomPadding = sheetSurfaceBottomPadding(o, null != (_props_bottomInset = props.bottomInset) ? _props_bottomInset : 0);
168
+ const maxBody = null === layout.fitMaxHeight ? null : Math.max(g9SheetFitMinHeight, layout.fitMaxHeight - chromeTopHeight - footerHeight - topPadding - bottomPadding);
169
+ const contextValue = {
170
+ handle,
171
+ signal: controller.current.signal,
172
+ opened: 'open' === entry.status,
173
+ closing,
174
+ maxBodyHeight: maxBody
175
+ };
169
176
  const platform = currentPlatform();
170
177
  const phone = 'android' === platform || 'ios' === platform;
171
178
  const openMs = null != (_o_openAnimationDurationMs = o.openAnimationDurationMs) ? _o_openAnimationDurationMs : settings.openAnimationDurationMs;
@@ -211,7 +218,7 @@ function G9SheetFrame(props) {
211
218
  <SheetView className={`g9-sheet__view${modal ? '' : ' g9-sheet__view--passthrough'}`} nativeProps={{
212
219
  'event-through': modal
213
220
  }}>
214
- {modal ? <view event-through={false} className={`g9-sheet__scrim${props.isTop && !closing ? '' : ' g9-sheet__scrim--covered'}`} style={{
221
+ {modal ? <view event-through={false} flatten={false} className={`g9-sheet__scrim${props.isTop && !closing ? '' : ' g9-sheet__scrim--covered'}`} style={{
215
222
  backgroundColor: scrimColor(entry, settings, opacity),
216
223
  transition: 'ios' === platform && false === o.animateOverlayToColorOnIos ? 'none' : `background-color ${closing ? closeMs : openMs}ms`
217
224
  }} bindtap={()=>{
@@ -232,13 +239,13 @@ function G9SheetFrame(props) {
232
239
  ...notch
233
240
  }}>
234
241
  <SheetContext.Provider value={contextValue}>
235
- {layout.showHandle || layout.fullScreen && o.showToolbar && false !== o.showFullScreenDragHandle && !layout.dragDisabled ? <view className="g9-sheet__grabber-area">
236
- <view className="g9-sheet__grabber"/>
237
- </view> : null}
238
- <G9SheetHeader options={o} onBack={()=>void stack.requestBack(entry.id, 'toolbarButton')}/>
239
- {o.showToolbar && false !== o.useStandardBodyTopGap ? <view className="g9-sheet__body-gap" style={{
240
- height: `${g9SheetHeaderMetrics.bodyTopGap}px`
241
- }}/> : null}
242
+ <view className="g9-sheet__chrome-top" bindlayoutchange={onChromeTopLayout}>
243
+ {layout.showHandle || layout.fullScreen && o.showToolbar && false !== o.showFullScreenDragHandle && !layout.dragDisabled ? <view className="g9-sheet__grabber-area">
244
+ <view className="g9-sheet__grabber"/>
245
+ </view> : null}
246
+ <G9SheetHeader options={o} onBack={()=>void stack.requestBack(entry.id, 'toolbarButton')}/>
247
+ {o.showToolbar && false !== o.useStandardBodyTopGap ? <view className="g9-sheet__body-gap"/> : null}
248
+ </view>
242
249
  {false === o.scrollBody ? <view className={`g9-sheet__body g9-sheet__body--static${layout.fillBody ? ' g9-sheet__body--fill' : ''}`} style={{
243
250
  padding: `${null != (_o_padding = o.padding) ? _o_padding : 0}px`
244
251
  }}>