@g9tm/lynxcontrols 0.0.0-stage → 1.4.0
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.
- package/README.md +22 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/base/base.css +16 -0
- package/dist/base/base.css.map +1 -0
- package/dist/base/control.d.ts +44 -0
- package/dist/base/control.d.ts.map +1 -0
- package/dist/base/control.jsx +24 -0
- package/dist/base/control.jsx.map +1 -0
- package/dist/base/corner-badge.d.ts +35 -0
- package/dist/base/corner-badge.d.ts.map +1 -0
- package/dist/base/corner-badge.jsx +45 -0
- package/dist/base/corner-badge.jsx.map +1 -0
- package/dist/base/disposer.d.ts +28 -0
- package/dist/base/disposer.d.ts.map +1 -0
- package/dist/base/disposer.jsx +61 -0
- package/dist/base/disposer.jsx.map +1 -0
- package/dist/base/index.d.ts +10 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.jsx +9 -0
- package/dist/base/press.d.ts +38 -0
- package/dist/base/press.d.ts.map +1 -0
- package/dist/base/press.jsx +73 -0
- package/dist/base/press.jsx.map +1 -0
- package/dist/base/pressable.d.ts +25 -0
- package/dist/base/pressable.d.ts.map +1 -0
- package/dist/base/pressable.jsx +38 -0
- package/dist/base/pressable.jsx.map +1 -0
- package/dist/base/selection-item.d.ts +29 -0
- package/dist/base/selection-item.d.ts.map +1 -0
- package/dist/base/selection-item.jsx +6 -0
- package/dist/base/selection-item.jsx.map +1 -0
- package/dist/base/timers.d.ts +7 -0
- package/dist/base/timers.d.ts.map +1 -0
- package/dist/base/timers.jsx +10 -0
- package/dist/base/timers.jsx.map +1 -0
- package/dist/base/use-controllable-state.d.ts +30 -0
- package/dist/base/use-controllable-state.d.ts.map +1 -0
- package/dist/base/use-controllable-state.jsx +49 -0
- package/dist/base/use-controllable-state.jsx.map +1 -0
- package/dist/base/use-stable-callback.d.ts +8 -0
- package/dist/base/use-stable-callback.d.ts.map +1 -0
- package/dist/base/use-stable-callback.jsx +12 -0
- package/dist/base/use-stable-callback.jsx.map +1 -0
- package/dist/button/button.css +162 -0
- package/dist/button/button.css.map +1 -0
- package/dist/button/button.d.ts +52 -0
- package/dist/button/button.d.ts.map +1 -0
- package/dist/button/button.jsx +87 -0
- package/dist/button/button.jsx.map +1 -0
- package/dist/button/header-action-button.d.ts +34 -0
- package/dist/button/header-action-button.d.ts.map +1 -0
- package/dist/button/header-action-button.jsx +51 -0
- package/dist/button/header-action-button.jsx.map +1 -0
- package/dist/button/icon-button.d.ts +46 -0
- package/dist/button/icon-button.d.ts.map +1 -0
- package/dist/button/icon-button.jsx +69 -0
- package/dist/button/icon-button.jsx.map +1 -0
- package/dist/button/index.d.ts +9 -0
- package/dist/button/index.d.ts.map +1 -0
- package/dist/button/index.jsx +8 -0
- package/dist/button/nav-card.d.ts +58 -0
- package/dist/button/nav-card.d.ts.map +1 -0
- package/dist/button/nav-card.jsx +95 -0
- package/dist/button/nav-card.jsx.map +1 -0
- package/dist/button/safe-tap.d.ts +27 -0
- package/dist/button/safe-tap.d.ts.map +1 -0
- package/dist/button/safe-tap.jsx +46 -0
- package/dist/button/safe-tap.jsx.map +1 -0
- package/dist/button/safe.d.ts +84 -0
- package/dist/button/safe.d.ts.map +1 -0
- package/dist/button/safe.jsx +116 -0
- package/dist/button/safe.jsx.map +1 -0
- package/dist/button/vertical-icon-text-button.d.ts +18 -0
- package/dist/button/vertical-icon-text-button.d.ts.map +1 -0
- package/dist/button/vertical-icon-text-button.jsx +21 -0
- package/dist/button/vertical-icon-text-button.jsx.map +1 -0
- package/dist/button/visuals.d.ts +53 -0
- package/dist/button/visuals.d.ts.map +1 -0
- package/dist/button/visuals.jsx +92 -0
- package/dist/button/visuals.jsx.map +1 -0
- package/dist/cascade/cascade-panel.d.ts +80 -0
- package/dist/cascade/cascade-panel.d.ts.map +1 -0
- package/dist/cascade/cascade-panel.jsx +179 -0
- package/dist/cascade/cascade-panel.jsx.map +1 -0
- package/dist/cascade/cascade.css +70 -0
- package/dist/cascade/cascade.css.map +1 -0
- package/dist/cascade/index.d.ts +3 -0
- package/dist/cascade/index.d.ts.map +1 -0
- package/dist/cascade/index.jsx +2 -0
- package/dist/cascade/model.d.ts +68 -0
- package/dist/cascade/model.d.ts.map +1 -0
- package/dist/cascade/model.jsx +161 -0
- package/dist/cascade/model.jsx.map +1 -0
- package/dist/deferred/deferred-content.d.ts +82 -0
- package/dist/deferred/deferred-content.d.ts.map +1 -0
- package/dist/deferred/deferred-content.jsx +263 -0
- package/dist/deferred/deferred-content.jsx.map +1 -0
- package/dist/deferred/deferred.css +62 -0
- package/dist/deferred/deferred.css.map +1 -0
- package/dist/deferred/index.d.ts +3 -0
- package/dist/deferred/index.d.ts.map +1 -0
- package/dist/deferred/index.jsx +2 -0
- package/dist/deferred/readiness-signal.d.ts +16 -0
- package/dist/deferred/readiness-signal.d.ts.map +1 -0
- package/dist/deferred/readiness-signal.jsx +29 -0
- package/dist/deferred/readiness-signal.jsx.map +1 -0
- package/dist/display/activity-indicator.d.ts +21 -0
- package/dist/display/activity-indicator.d.ts.map +1 -0
- package/dist/display/activity-indicator.jsx +22 -0
- package/dist/display/activity-indicator.jsx.map +1 -0
- package/dist/display/culture-date-time-label.d.ts +64 -0
- package/dist/display/culture-date-time-label.d.ts.map +1 -0
- package/dist/display/culture-date-time-label.jsx +71 -0
- package/dist/display/culture-date-time-label.jsx.map +1 -0
- package/dist/display/display.css +217 -0
- package/dist/display/display.css.map +1 -0
- package/dist/display/index.d.ts +7 -0
- package/dist/display/index.d.ts.map +1 -0
- package/dist/display/index.jsx +6 -0
- package/dist/display/progress-bar.d.ts +38 -0
- package/dist/display/progress-bar.d.ts.map +1 -0
- package/dist/display/progress-bar.jsx +57 -0
- package/dist/display/progress-bar.jsx.map +1 -0
- package/dist/display/separator.d.ts +30 -0
- package/dist/display/separator.d.ts.map +1 -0
- package/dist/display/separator.jsx +55 -0
- package/dist/display/separator.jsx.map +1 -0
- package/dist/display/shimmer.d.ts +41 -0
- package/dist/display/shimmer.d.ts.map +1 -0
- package/dist/display/shimmer.jsx +41 -0
- package/dist/display/shimmer.jsx.map +1 -0
- package/dist/display/title-with-line.d.ts +13 -0
- package/dist/display/title-with-line.d.ts.map +1 -0
- package/dist/display/title-with-line.jsx +21 -0
- package/dist/display/title-with-line.jsx.map +1 -0
- package/dist/edge-panel/edge-panel.css +132 -0
- package/dist/edge-panel/edge-panel.css.map +1 -0
- package/dist/edge-panel/edge-panel.d.ts +87 -0
- package/dist/edge-panel/edge-panel.d.ts.map +1 -0
- package/dist/edge-panel/edge-panel.jsx +326 -0
- package/dist/edge-panel/edge-panel.jsx.map +1 -0
- package/dist/edge-panel/helper.d.ts +27 -0
- package/dist/edge-panel/helper.d.ts.map +1 -0
- package/dist/edge-panel/helper.jsx +118 -0
- package/dist/edge-panel/helper.jsx.map +1 -0
- package/dist/edge-panel/index.d.ts +4 -0
- package/dist/edge-panel/index.d.ts.map +1 -0
- package/dist/edge-panel/index.jsx +3 -0
- package/dist/edge-panel/types.d.ts +155 -0
- package/dist/edge-panel/types.d.ts.map +1 -0
- package/dist/edge-panel/types.jsx +139 -0
- package/dist/edge-panel/types.jsx.map +1 -0
- package/dist/expander/expander.css +54 -0
- package/dist/expander/expander.css.map +1 -0
- package/dist/expander/expander.d.ts +46 -0
- package/dist/expander/expander.d.ts.map +1 -0
- package/dist/expander/expander.jsx +110 -0
- package/dist/expander/expander.jsx.map +1 -0
- package/dist/expander/index.d.ts +2 -0
- package/dist/expander/index.d.ts.map +1 -0
- package/dist/expander/index.jsx +1 -0
- package/dist/fields/dictation.d.ts +43 -0
- package/dist/fields/dictation.d.ts.map +1 -0
- package/dist/fields/dictation.jsx +124 -0
- package/dist/fields/dictation.jsx.map +1 -0
- package/dist/fields/editor.d.ts +26 -0
- package/dist/fields/editor.d.ts.map +1 -0
- package/dist/fields/editor.jsx +46 -0
- package/dist/fields/editor.jsx.map +1 -0
- package/dist/fields/fields.css +156 -0
- package/dist/fields/fields.css.map +1 -0
- package/dist/fields/index.d.ts +12 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.jsx +11 -0
- package/dist/fields/input-policy.d.ts +48 -0
- package/dist/fields/input-policy.d.ts.map +1 -0
- package/dist/fields/input-policy.jsx +215 -0
- package/dist/fields/input-policy.jsx.map +1 -0
- package/dist/fields/outlined-field.d.ts +146 -0
- package/dist/fields/outlined-field.d.ts.map +1 -0
- package/dist/fields/outlined-field.jsx +196 -0
- package/dist/fields/outlined-field.jsx.map +1 -0
- package/dist/fields/pin-entry.d.ts +63 -0
- package/dist/fields/pin-entry.d.ts.map +1 -0
- package/dist/fields/pin-entry.jsx +293 -0
- package/dist/fields/pin-entry.jsx.map +1 -0
- package/dist/fields/search-entry.d.ts +35 -0
- package/dist/fields/search-entry.d.ts.map +1 -0
- package/dist/fields/search-entry.jsx +118 -0
- package/dist/fields/search-entry.jsx.map +1 -0
- package/dist/fields/slot-layout.d.ts +33 -0
- package/dist/fields/slot-layout.d.ts.map +1 -0
- package/dist/fields/slot-layout.jsx +33 -0
- package/dist/fields/slot-layout.jsx.map +1 -0
- package/dist/fields/text-entry.d.ts +62 -0
- package/dist/fields/text-entry.d.ts.map +1 -0
- package/dist/fields/text-entry.jsx +72 -0
- package/dist/fields/text-entry.jsx.map +1 -0
- package/dist/fields/use-dictation.d.ts +34 -0
- package/dist/fields/use-dictation.d.ts.map +1 -0
- package/dist/fields/use-dictation.jsx +80 -0
- package/dist/fields/use-dictation.jsx.map +1 -0
- package/dist/fields/use-text-input.d.ts +150 -0
- package/dist/fields/use-text-input.d.ts.map +1 -0
- package/dist/fields/use-text-input.jsx +237 -0
- package/dist/fields/use-text-input.jsx.map +1 -0
- package/dist/fields/validator.d.ts +14 -0
- package/dist/fields/validator.d.ts.map +1 -0
- package/dist/fields/validator.jsx +20 -0
- package/dist/fields/validator.jsx.map +1 -0
- package/dist/host/back.d.ts +42 -0
- package/dist/host/back.d.ts.map +1 -0
- package/dist/host/back.jsx +47 -0
- package/dist/host/back.jsx.map +1 -0
- package/dist/host/hooks.d.ts +85 -0
- package/dist/host/hooks.d.ts.map +1 -0
- package/dist/host/hooks.jsx +163 -0
- package/dist/host/hooks.jsx.map +1 -0
- package/dist/host/host.css +81 -0
- package/dist/host/host.css.map +1 -0
- package/dist/host/host.d.ts +70 -0
- package/dist/host/host.d.ts.map +1 -0
- package/dist/host/host.jsx +229 -0
- package/dist/host/host.jsx.map +1 -0
- package/dist/host/index.d.ts +9 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.jsx +8 -0
- package/dist/host/keyboard.d.ts +24 -0
- package/dist/host/keyboard.d.ts.map +1 -0
- package/dist/host/keyboard.jsx +28 -0
- package/dist/host/keyboard.jsx.map +1 -0
- package/dist/host/layers.d.ts +69 -0
- package/dist/host/layers.d.ts.map +1 -0
- package/dist/host/layers.jsx +111 -0
- package/dist/host/layers.jsx.map +1 -0
- package/dist/host/page-loading-overlay.d.ts +17 -0
- package/dist/host/page-loading-overlay.d.ts.map +1 -0
- package/dist/host/page-loading-overlay.jsx +16 -0
- package/dist/host/page-loading-overlay.jsx.map +1 -0
- package/dist/host/readiness.d.ts +57 -0
- package/dist/host/readiness.d.ts.map +1 -0
- package/dist/host/readiness.jsx +138 -0
- package/dist/host/readiness.jsx.map +1 -0
- package/dist/host/registry.d.ts +106 -0
- package/dist/host/registry.d.ts.map +1 -0
- package/dist/host/registry.jsx +93 -0
- package/dist/host/registry.jsx.map +1 -0
- package/dist/icon/icon.css +39 -0
- package/dist/icon/icon.css.map +1 -0
- package/dist/icon/icon.d.ts +57 -0
- package/dist/icon/icon.d.ts.map +1 -0
- package/dist/icon/icon.jsx +115 -0
- package/dist/icon/icon.jsx.map +1 -0
- package/dist/icon/index.d.ts +4 -0
- package/dist/icon/index.d.ts.map +1 -0
- package/dist/icon/index.jsx +3 -0
- package/dist/icon/slot.d.ts +45 -0
- package/dist/icon/slot.d.ts.map +1 -0
- package/dist/icon/slot.jsx +61 -0
- package/dist/icon/slot.jsx.map +1 -0
- package/dist/icon/swatch.d.ts +29 -0
- package/dist/icon/swatch.d.ts.map +1 -0
- package/dist/icon/swatch.jsx +25 -0
- package/dist/icon/swatch.jsx.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.jsx +1 -0
- package/dist/pickers/combo-box.d.ts +42 -0
- package/dist/pickers/combo-box.d.ts.map +1 -0
- package/dist/pickers/combo-box.jsx +129 -0
- package/dist/pickers/combo-box.jsx.map +1 -0
- package/dist/pickers/date-time-picker.d.ts +63 -0
- package/dist/pickers/date-time-picker.d.ts.map +1 -0
- package/dist/pickers/date-time-picker.jsx +141 -0
- package/dist/pickers/date-time-picker.jsx.map +1 -0
- package/dist/pickers/date-time.d.ts +82 -0
- package/dist/pickers/date-time.d.ts.map +1 -0
- package/dist/pickers/date-time.jsx +130 -0
- package/dist/pickers/date-time.jsx.map +1 -0
- package/dist/pickers/index.d.ts +10 -0
- package/dist/pickers/index.d.ts.map +1 -0
- package/dist/pickers/index.jsx +9 -0
- package/dist/pickers/picker-sheet.d.ts +21 -0
- package/dist/pickers/picker-sheet.d.ts.map +1 -0
- package/dist/pickers/picker-sheet.jsx +61 -0
- package/dist/pickers/picker-sheet.jsx.map +1 -0
- package/dist/pickers/picker.d.ts +32 -0
- package/dist/pickers/picker.d.ts.map +1 -0
- package/dist/pickers/picker.jsx +72 -0
- package/dist/pickers/picker.jsx.map +1 -0
- package/dist/pickers/pickers.css +219 -0
- package/dist/pickers/pickers.css.map +1 -0
- package/dist/pickers/timespan-picker.d.ts +36 -0
- package/dist/pickers/timespan-picker.d.ts.map +1 -0
- package/dist/pickers/timespan-picker.jsx +99 -0
- package/dist/pickers/timespan-picker.jsx.map +1 -0
- package/dist/pickers/timespan.d.ts +38 -0
- package/dist/pickers/timespan.d.ts.map +1 -0
- package/dist/pickers/timespan.jsx +49 -0
- package/dist/pickers/timespan.jsx.map +1 -0
- package/dist/pickers/trigger.d.ts +34 -0
- package/dist/pickers/trigger.d.ts.map +1 -0
- package/dist/pickers/trigger.jsx +77 -0
- package/dist/pickers/trigger.jsx.map +1 -0
- package/dist/pickers/wheel-column.d.ts +32 -0
- package/dist/pickers/wheel-column.d.ts.map +1 -0
- package/dist/pickers/wheel-column.jsx +99 -0
- package/dist/pickers/wheel-column.jsx.map +1 -0
- package/dist/plus-button/index.d.ts +3 -0
- package/dist/plus-button/index.d.ts.map +1 -0
- package/dist/plus-button/index.jsx +2 -0
- package/dist/plus-button/model.d.ts +65 -0
- package/dist/plus-button/model.d.ts.map +1 -0
- package/dist/plus-button/model.jsx +86 -0
- package/dist/plus-button/model.jsx.map +1 -0
- package/dist/plus-button/plus-button.css +67 -0
- package/dist/plus-button/plus-button.css.map +1 -0
- package/dist/plus-button/plus-button.d.ts +38 -0
- package/dist/plus-button/plus-button.d.ts.map +1 -0
- package/dist/plus-button/plus-button.jsx +155 -0
- package/dist/plus-button/plus-button.jsx.map +1 -0
- package/dist/popup/frame.d.ts +101 -0
- package/dist/popup/frame.d.ts.map +1 -0
- package/dist/popup/frame.jsx +244 -0
- package/dist/popup/frame.jsx.map +1 -0
- package/dist/popup/index.d.ts +8 -0
- package/dist/popup/index.d.ts.map +1 -0
- package/dist/popup/index.jsx +7 -0
- package/dist/popup/input-form.d.ts +35 -0
- package/dist/popup/input-form.d.ts.map +1 -0
- package/dist/popup/input-form.jsx +160 -0
- package/dist/popup/input-form.jsx.map +1 -0
- package/dist/popup/input.d.ts +175 -0
- package/dist/popup/input.d.ts.map +1 -0
- package/dist/popup/input.jsx +176 -0
- package/dist/popup/input.jsx.map +1 -0
- package/dist/popup/popup-view.d.ts +25 -0
- package/dist/popup/popup-view.d.ts.map +1 -0
- package/dist/popup/popup-view.jsx +67 -0
- package/dist/popup/popup-view.jsx.map +1 -0
- package/dist/popup/popup.css +203 -0
- package/dist/popup/popup.css.map +1 -0
- package/dist/popup/queue.d.ts +90 -0
- package/dist/popup/queue.d.ts.map +1 -0
- package/dist/popup/queue.jsx +309 -0
- package/dist/popup/queue.jsx.map +1 -0
- package/dist/popup/service.d.ts +60 -0
- package/dist/popup/service.d.ts.map +1 -0
- package/dist/popup/service.jsx +342 -0
- package/dist/popup/service.jsx.map +1 -0
- package/dist/popup/types.d.ts +211 -0
- package/dist/popup/types.d.ts.map +1 -0
- package/dist/popup/types.jsx +218 -0
- package/dist/popup/types.jsx.map +1 -0
- package/dist/provider/contexts.d.ts +41 -0
- package/dist/provider/contexts.d.ts.map +1 -0
- package/dist/provider/contexts.jsx +11 -0
- package/dist/provider/contexts.jsx.map +1 -0
- package/dist/provider/global-events.d.ts +8 -0
- package/dist/provider/global-events.d.ts.map +1 -0
- package/dist/provider/global-events.jsx +17 -0
- package/dist/provider/global-events.jsx.map +1 -0
- package/dist/provider/hooks.d.ts +49 -0
- package/dist/provider/hooks.d.ts.map +1 -0
- package/dist/provider/hooks.jsx +72 -0
- package/dist/provider/hooks.jsx.map +1 -0
- package/dist/provider/index.d.ts +5 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.jsx +3 -0
- package/dist/provider/provider.css +18 -0
- package/dist/provider/provider.css.map +1 -0
- package/dist/provider/provider.d.ts +51 -0
- package/dist/provider/provider.d.ts.map +1 -0
- package/dist/provider/provider.jsx +290 -0
- package/dist/provider/provider.jsx.map +1 -0
- package/dist/provider/settings.d.ts +99 -0
- package/dist/provider/settings.d.ts.map +1 -0
- package/dist/provider/settings.jsx +45 -0
- package/dist/provider/settings.jsx.map +1 -0
- package/dist/provider/theme-css.d.ts +12 -0
- package/dist/provider/theme-css.d.ts.map +1 -0
- package/dist/provider/theme-css.jsx +19 -0
- package/dist/provider/theme-css.jsx.map +1 -0
- package/dist/provider/theme-root.d.ts +10 -0
- package/dist/provider/theme-root.d.ts.map +1 -0
- package/dist/provider/theme-root.jsx +24 -0
- package/dist/provider/theme-root.jsx.map +1 -0
- package/dist/provider/theme.css +473 -0
- package/dist/provider/theme.css.map +1 -0
- package/dist/range-slider/index.d.ts +3 -0
- package/dist/range-slider/index.d.ts.map +1 -0
- package/dist/range-slider/index.jsx +2 -0
- package/dist/range-slider/math.d.ts +23 -0
- package/dist/range-slider/math.d.ts.map +1 -0
- package/dist/range-slider/math.jsx +71 -0
- package/dist/range-slider/math.jsx.map +1 -0
- package/dist/range-slider/range-slider.css +90 -0
- package/dist/range-slider/range-slider.css.map +1 -0
- package/dist/range-slider/range-slider.d.ts +52 -0
- package/dist/range-slider/range-slider.d.ts.map +1 -0
- package/dist/range-slider/range-slider.jsx +159 -0
- package/dist/range-slider/range-slider.jsx.map +1 -0
- package/dist/selection/index.d.ts +5 -0
- package/dist/selection/index.d.ts.map +1 -0
- package/dist/selection/index.jsx +3 -0
- package/dist/selection/model.d.ts +53 -0
- package/dist/selection/model.d.ts.map +1 -0
- package/dist/selection/model.jsx +69 -0
- package/dist/selection/model.jsx.map +1 -0
- package/dist/selection/selection-sheet.d.ts +80 -0
- package/dist/selection/selection-sheet.d.ts.map +1 -0
- package/dist/selection/selection-sheet.jsx +362 -0
- package/dist/selection/selection-sheet.jsx.map +1 -0
- package/dist/selection/selection.css +75 -0
- package/dist/selection/selection.css.map +1 -0
- package/dist/selection/use-selection-model.d.ts +9 -0
- package/dist/selection/use-selection-model.d.ts.map +1 -0
- package/dist/selection/use-selection-model.jsx +22 -0
- package/dist/selection/use-selection-model.jsx.map +1 -0
- package/dist/sheet/frame.d.ts +45 -0
- package/dist/sheet/frame.d.ts.map +1 -0
- package/dist/sheet/frame.jsx +205 -0
- package/dist/sheet/frame.jsx.map +1 -0
- package/dist/sheet/header.d.ts +35 -0
- package/dist/sheet/header.d.ts.map +1 -0
- package/dist/sheet/header.jsx +145 -0
- package/dist/sheet/header.jsx.map +1 -0
- package/dist/sheet/height-memo.d.ts +47 -0
- package/dist/sheet/height-memo.d.ts.map +1 -0
- package/dist/sheet/height-memo.jsx +100 -0
- package/dist/sheet/height-memo.jsx.map +1 -0
- package/dist/sheet/index.d.ts +11 -0
- package/dist/sheet/index.d.ts.map +1 -0
- package/dist/sheet/index.jsx +10 -0
- package/dist/sheet/loadable.d.ts +35 -0
- package/dist/sheet/loadable.d.ts.map +1 -0
- package/dist/sheet/loadable.jsx +65 -0
- package/dist/sheet/loadable.jsx.map +1 -0
- package/dist/sheet/options.d.ts +220 -0
- package/dist/sheet/options.d.ts.map +1 -0
- package/dist/sheet/options.jsx +91 -0
- package/dist/sheet/options.jsx.map +1 -0
- package/dist/sheet/processing.d.ts +22 -0
- package/dist/sheet/processing.d.ts.map +1 -0
- package/dist/sheet/processing.jsx +66 -0
- package/dist/sheet/processing.jsx.map +1 -0
- package/dist/sheet/service.d.ts +55 -0
- package/dist/sheet/service.d.ts.map +1 -0
- package/dist/sheet/service.jsx +143 -0
- package/dist/sheet/service.jsx.map +1 -0
- package/dist/sheet/sheet.css +195 -0
- package/dist/sheet/sheet.css.map +1 -0
- package/dist/sheet/sheet.d.ts +19 -0
- package/dist/sheet/sheet.d.ts.map +1 -0
- package/dist/sheet/sheet.jsx +40 -0
- package/dist/sheet/sheet.jsx.map +1 -0
- package/dist/sheet/sizing.d.ts +69 -0
- package/dist/sheet/sizing.d.ts.map +1 -0
- package/dist/sheet/sizing.jsx +146 -0
- package/dist/sheet/sizing.jsx.map +1 -0
- package/dist/sheet/stack.d.ts +161 -0
- package/dist/sheet/stack.d.ts.map +1 -0
- package/dist/sheet/stack.jsx +378 -0
- package/dist/sheet/stack.jsx.map +1 -0
- package/dist/swipe/index.d.ts +3 -0
- package/dist/swipe/index.d.ts.map +1 -0
- package/dist/swipe/index.jsx +2 -0
- package/dist/swipe/model.d.ts +72 -0
- package/dist/swipe/model.d.ts.map +1 -0
- package/dist/swipe/model.jsx +66 -0
- package/dist/swipe/model.jsx.map +1 -0
- package/dist/swipe/swipe-view.d.ts +40 -0
- package/dist/swipe/swipe-view.d.ts.map +1 -0
- package/dist/swipe/swipe-view.jsx +163 -0
- package/dist/swipe/swipe-view.jsx.map +1 -0
- package/dist/swipe/swipe.css +34 -0
- package/dist/swipe/swipe.css.map +1 -0
- package/dist/tab-bar/index.d.ts +4 -0
- package/dist/tab-bar/index.d.ts.map +1 -0
- package/dist/tab-bar/index.jsx +3 -0
- package/dist/tab-bar/metrics.d.ts +230 -0
- package/dist/tab-bar/metrics.d.ts.map +1 -0
- package/dist/tab-bar/metrics.jsx +221 -0
- package/dist/tab-bar/metrics.jsx.map +1 -0
- package/dist/tab-bar/model.d.ts +170 -0
- package/dist/tab-bar/model.d.ts.map +1 -0
- package/dist/tab-bar/model.jsx +349 -0
- package/dist/tab-bar/model.jsx.map +1 -0
- package/dist/tab-bar/tab-bar.css +173 -0
- package/dist/tab-bar/tab-bar.css.map +1 -0
- package/dist/tab-bar/tab-bar.d.ts +56 -0
- package/dist/tab-bar/tab-bar.d.ts.map +1 -0
- package/dist/tab-bar/tab-bar.jsx +343 -0
- package/dist/tab-bar/tab-bar.jsx.map +1 -0
- package/dist/tabs/index.d.ts +3 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/tabs/index.jsx +2 -0
- package/dist/tabs/model.d.ts +83 -0
- package/dist/tabs/model.d.ts.map +1 -0
- package/dist/tabs/model.jsx +113 -0
- package/dist/tabs/model.jsx.map +1 -0
- package/dist/tabs/tab-view.d.ts +47 -0
- package/dist/tabs/tab-view.d.ts.map +1 -0
- package/dist/tabs/tab-view.jsx +227 -0
- package/dist/tabs/tab-view.jsx.map +1 -0
- package/dist/tabs/tabs.css +182 -0
- package/dist/tabs/tabs.css.map +1 -0
- package/dist/toast/index.d.ts +3 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toast/index.jsx +2 -0
- package/dist/toast/service.d.ts +48 -0
- package/dist/toast/service.d.ts.map +1 -0
- package/dist/toast/service.jsx +201 -0
- package/dist/toast/service.jsx.map +1 -0
- package/dist/toast/store.d.ts +174 -0
- package/dist/toast/store.d.ts.map +1 -0
- package/dist/toast/store.jsx +353 -0
- package/dist/toast/store.jsx.map +1 -0
- package/dist/toast/toast.css +152 -0
- package/dist/toast/toast.css.map +1 -0
- package/dist/toggle/checkbox-math.d.ts +52 -0
- package/dist/toggle/checkbox-math.d.ts.map +1 -0
- package/dist/toggle/checkbox-math.jsx +111 -0
- package/dist/toggle/checkbox-math.jsx.map +1 -0
- package/dist/toggle/checkbox.d.ts +56 -0
- package/dist/toggle/checkbox.d.ts.map +1 -0
- package/dist/toggle/checkbox.jsx +152 -0
- package/dist/toggle/checkbox.jsx.map +1 -0
- package/dist/toggle/chip-group.d.ts +50 -0
- package/dist/toggle/chip-group.d.ts.map +1 -0
- package/dist/toggle/chip-group.jsx +107 -0
- package/dist/toggle/chip-group.jsx.map +1 -0
- package/dist/toggle/index.d.ts +5 -0
- package/dist/toggle/index.d.ts.map +1 -0
- package/dist/toggle/index.jsx +4 -0
- package/dist/toggle/switch.d.ts +52 -0
- package/dist/toggle/switch.d.ts.map +1 -0
- package/dist/toggle/switch.jsx +192 -0
- package/dist/toggle/switch.jsx.map +1 -0
- package/dist/toggle/toggle.css +189 -0
- package/dist/toggle/toggle.css.map +1 -0
- package/package.json +155 -4
- package/rspeedy/index.d.ts +21 -0
- package/rspeedy/index.mjs +75 -0
- package/rspeedy/index.test.mjs +52 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import "./selection.css";
|
|
2
|
+
import { G9StringKey, formatColor, withAlpha } from "@g9tm/lynxcontrols-foundation";
|
|
3
|
+
import { useEffect, useRef, useState, useSyncExternalStore } from "@lynx-js/react";
|
|
4
|
+
import { g9RowStyle, g9TextStart } from "../base/control.jsx";
|
|
5
|
+
import { useG9Press } from "../base/press.jsx";
|
|
6
|
+
import { startTimer, stopTimer } from "../base/timers.jsx";
|
|
7
|
+
import { G9Button } from "../button/button.jsx";
|
|
8
|
+
import { G9SearchEntry } from "../fields/search-entry.jsx";
|
|
9
|
+
import { G9TextEntry } from "../fields/text-entry.jsx";
|
|
10
|
+
import { G9IconSlot, hasIconSlot } from "../icon/slot.jsx";
|
|
11
|
+
import { G9Swatch } from "../icon/swatch.jsx";
|
|
12
|
+
import { useG9Direction, useG9Settings, useG9Strings, useG9Theme } from "../provider/hooks.jsx";
|
|
13
|
+
import { fitToContentSheetOptions, fullScreenWithoutHandleSheetOptions } from "../sheet/options.jsx";
|
|
14
|
+
import { createSelectionModel } from "./model.jsx";
|
|
15
|
+
const g9SelectionEagerBuildItemLimit = 40;
|
|
16
|
+
const g9SelectionRowHeight = 52;
|
|
17
|
+
const g9SelectionSearchDebounceMs = 150;
|
|
18
|
+
const g9SelectionCloseDelayMs = 120;
|
|
19
|
+
function selectionIdentities(items) {
|
|
20
|
+
const counts = new Map();
|
|
21
|
+
for (const item of items){
|
|
22
|
+
var _counts_get;
|
|
23
|
+
if (null == item.key || '' === item.key.trim()) counts.set(item.text, (null != (_counts_get = counts.get(item.text)) ? _counts_get : 0) + 1);
|
|
24
|
+
}
|
|
25
|
+
return items.map((item, i)=>{
|
|
26
|
+
var _counts_get;
|
|
27
|
+
return null != item.key && '' !== item.key.trim() ? `k:${item.key}` : (null != (_counts_get = counts.get(item.text)) ? _counts_get : 0) > 1 ? `i:${i}` : `t:${item.text}`;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function estimateSelectionHeight(count, showSearch) {
|
|
31
|
+
const chrome = (showSearch ? 64 : 0) + 18;
|
|
32
|
+
return Math.min(520, Math.max(2 * g9SelectionRowHeight + chrome, count * g9SelectionRowHeight + chrome));
|
|
33
|
+
}
|
|
34
|
+
function SelectionRow(props) {
|
|
35
|
+
var _item_iconTintColor;
|
|
36
|
+
var _item_swatchFirstColor, _item_swatchSecondColor;
|
|
37
|
+
const palette = useG9Theme().palette;
|
|
38
|
+
const glyphs = useG9Settings().glyphs;
|
|
39
|
+
const { item, selected } = props;
|
|
40
|
+
const press = useG9Press(props.onTap, {
|
|
41
|
+
blocked: false === item.isEnabled,
|
|
42
|
+
source: 'G9SelectionSheet',
|
|
43
|
+
guardMs: 0
|
|
44
|
+
});
|
|
45
|
+
const icon = {
|
|
46
|
+
emoji: item.emoji,
|
|
47
|
+
icon: item.icon,
|
|
48
|
+
imagePath: item.iconPath,
|
|
49
|
+
image: item.iconImage
|
|
50
|
+
};
|
|
51
|
+
const iconColor = null != (_item_iconTintColor = item.iconTintColor) ? _item_iconTintColor : selected ? palette.Primary : palette.TextSecondary;
|
|
52
|
+
return <view className={`g9-selection-row${selected ? ' g9-selection-row--selected' : ''}`} style={selected ? {
|
|
53
|
+
backgroundColor: formatColor(withAlpha(palette.Primary, 0.1))
|
|
54
|
+
} : {}} accessibility-element={true} accessibility-traits="button" accessibility-label={item.text} {...selected ? {
|
|
55
|
+
'accessibility-value': 'selected'
|
|
56
|
+
} : {}} bindtap={press}>
|
|
57
|
+
<view className={`g9-selection-row__inner g9-dir-${props.direction}`} style={{
|
|
58
|
+
...g9RowStyle(props.direction),
|
|
59
|
+
...false === item.isEnabled ? {
|
|
60
|
+
opacity: 0.45
|
|
61
|
+
} : {}
|
|
62
|
+
}}>
|
|
63
|
+
{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}
|
|
64
|
+
<text className="g9-selection-row__text" text-maxline="1" style={{
|
|
65
|
+
color: selected ? palette.Primary : palette.TextPrimary,
|
|
66
|
+
fontWeight: selected ? 'bold' : 'normal',
|
|
67
|
+
...g9TextStart(props.direction)
|
|
68
|
+
}}>
|
|
69
|
+
{item.text}
|
|
70
|
+
</text>
|
|
71
|
+
<view style={{
|
|
72
|
+
opacity: selected ? 1 : 0
|
|
73
|
+
}}>
|
|
74
|
+
<G9IconSlot icon={glyphs.check} size={18} color={palette.Primary}/>
|
|
75
|
+
</view>
|
|
76
|
+
</view>
|
|
77
|
+
</view>;
|
|
78
|
+
}
|
|
79
|
+
function SelectionBody(props) {
|
|
80
|
+
var _request_emptyText;
|
|
81
|
+
const strings = useG9Strings();
|
|
82
|
+
const parentDir = useG9Direction();
|
|
83
|
+
const { request, ids } = props;
|
|
84
|
+
const [model, setModel] = useState(props.initial);
|
|
85
|
+
const [query, setQuery] = useState('');
|
|
86
|
+
const [applied, setApplied] = useState('');
|
|
87
|
+
const timer = useRef(null);
|
|
88
|
+
const picking = useRef(false);
|
|
89
|
+
useEffect(()=>()=>{
|
|
90
|
+
if (null !== timer.current) stopTimer(timer.current);
|
|
91
|
+
}, []);
|
|
92
|
+
const visible = request.showSearch ? model.withItems(request.items).filter(applied) : request.items;
|
|
93
|
+
const visibleIds = new Set(visible.map((item)=>ids[request.items.indexOf(item)]));
|
|
94
|
+
const dir = 'leftToRight' === request.itemTextDirection ? 'ltr' : 'rightToLeft' === request.itemTextDirection ? 'rtl' : parentDir;
|
|
95
|
+
const multiple = true === request.allowMultiple;
|
|
96
|
+
const onQuery = (value)=>{
|
|
97
|
+
setQuery(value);
|
|
98
|
+
if (null !== timer.current) stopTimer(timer.current);
|
|
99
|
+
if ('' === value.trim()) return void setApplied(value);
|
|
100
|
+
timer.current = startTimer(()=>setApplied(value), g9SelectionSearchDebounceMs);
|
|
101
|
+
};
|
|
102
|
+
const tap = (id)=>{
|
|
103
|
+
if (props.done.current || picking.current) return;
|
|
104
|
+
const next = model.toggle(id);
|
|
105
|
+
if (next === model) return;
|
|
106
|
+
setModel(next);
|
|
107
|
+
props.onDraft(next);
|
|
108
|
+
if (!multiple && false !== request.closeOnSingleSelection) {
|
|
109
|
+
picking.current = true;
|
|
110
|
+
startTimer(()=>props.onComplete(next.selectedKeys, true), g9SelectionCloseDelayMs);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
return <view className="g9-selection">
|
|
114
|
+
{request.showSearch ? <view className="g9-selection__search">
|
|
115
|
+
<G9TextEntry placeholder={strings.get(G9StringKey.Search)} leadingIcon="search" value={query} onValueChange={onQuery}/>
|
|
116
|
+
</view> : null}
|
|
117
|
+
{request.items.map((item, i)=>{
|
|
118
|
+
const id = ids[i];
|
|
119
|
+
if (!visibleIds.has(id)) return null;
|
|
120
|
+
return <SelectionRow key={id} item={item} selected={model.isSelected(id)} direction={dir} onTap={()=>tap(id)}/>;
|
|
121
|
+
})}
|
|
122
|
+
{0 === visible.length ? <text className="g9-selection__empty">{null != (_request_emptyText = request.emptyText) ? _request_emptyText : strings.get(G9StringKey.NoResults)}</text> : null}
|
|
123
|
+
</view>;
|
|
124
|
+
}
|
|
125
|
+
function showSelectionSheet(sheets, request) {
|
|
126
|
+
var _request_selectedItems;
|
|
127
|
+
const items = [
|
|
128
|
+
...request.items
|
|
129
|
+
];
|
|
130
|
+
const ids = selectionIdentities(items);
|
|
131
|
+
const opening = null != (_request_selectedItems = request.selectedItems) ? _request_selectedItems : [];
|
|
132
|
+
const openingIds = selectionIdentities([
|
|
133
|
+
...items,
|
|
134
|
+
...opening
|
|
135
|
+
]).slice(items.length);
|
|
136
|
+
const listedIds = new Set(ids);
|
|
137
|
+
const initialKeys = openingIds.filter((id)=>listedIds.has(id));
|
|
138
|
+
const unlisted = opening.filter((_, i)=>!listedIds.has(openingIds[i]));
|
|
139
|
+
const multiple = true === request.allowMultiple;
|
|
140
|
+
const initial = createSelectionModel({
|
|
141
|
+
items,
|
|
142
|
+
getKey: (item)=>ids[items.indexOf(item)],
|
|
143
|
+
getText: (item)=>item.text,
|
|
144
|
+
mode: multiple ? 'multiple' : 'single',
|
|
145
|
+
selectedKeys: initialKeys,
|
|
146
|
+
isEnabled: (item)=>false !== item.isEnabled
|
|
147
|
+
});
|
|
148
|
+
return new Promise((resolve)=>{
|
|
149
|
+
let draft = initial;
|
|
150
|
+
const draftListeners = new Set();
|
|
151
|
+
const draftStore = {
|
|
152
|
+
subscribe: (l)=>{
|
|
153
|
+
draftListeners.add(l);
|
|
154
|
+
return ()=>{
|
|
155
|
+
draftListeners.delete(l);
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
count: ()=>draft.selectedKeys.length
|
|
159
|
+
};
|
|
160
|
+
let settled = false;
|
|
161
|
+
const done = {
|
|
162
|
+
current: false
|
|
163
|
+
};
|
|
164
|
+
const startKeys = new Set(initialKeys);
|
|
165
|
+
const collect = (keys)=>{
|
|
166
|
+
const set = new Set(keys);
|
|
167
|
+
return [
|
|
168
|
+
...items.filter((_, i)=>set.has(ids[i])),
|
|
169
|
+
...unlisted
|
|
170
|
+
];
|
|
171
|
+
};
|
|
172
|
+
const settle = (keys, accepted, explicit)=>{
|
|
173
|
+
if (settled) return;
|
|
174
|
+
settled = true;
|
|
175
|
+
done.current = true;
|
|
176
|
+
const result = null != explicit ? explicit : collect(keys);
|
|
177
|
+
const changed = void 0 !== explicit || keys.length !== startKeys.size || keys.some((k)=>!startKeys.has(k));
|
|
178
|
+
resolve({
|
|
179
|
+
wasAccepted: accepted,
|
|
180
|
+
selectionChanged: changed,
|
|
181
|
+
items: result
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
let handle = null;
|
|
185
|
+
const complete = (keys, accepted)=>{
|
|
186
|
+
settle(keys, accepted);
|
|
187
|
+
null == handle || handle.close();
|
|
188
|
+
};
|
|
189
|
+
const reset = request.resetSelection && request.resetSelection.length > 0 ? request.resetSelection : null;
|
|
190
|
+
const body = ()=><SelectionBody request={request} ids={ids} initial={initial} done={done} onDraft={(m)=>{
|
|
191
|
+
draft = m;
|
|
192
|
+
for (const l of [
|
|
193
|
+
...draftListeners
|
|
194
|
+
])l();
|
|
195
|
+
}} onComplete={complete}/>;
|
|
196
|
+
const options = {
|
|
197
|
+
...fitToContentSheetOptions(),
|
|
198
|
+
deferContent: items.length > g9SelectionEagerBuildItemLimit,
|
|
199
|
+
deferredLoadingPlaceholderHeight: estimateSelectionHeight(items.length, true === request.showSearch),
|
|
200
|
+
loadingSkeleton: 'listRows',
|
|
201
|
+
loadingSkeletonRowCount: items.length,
|
|
202
|
+
backgroundColor: 'var(--g9-surface)',
|
|
203
|
+
showToolbar: true,
|
|
204
|
+
showCloseButton: true,
|
|
205
|
+
title: request.title,
|
|
206
|
+
headerTitlePlacement: 'nearBack',
|
|
207
|
+
...multiple || reset ? {
|
|
208
|
+
headerTrailingView: <SelectionHeaderActions multiple={multiple} draft={draftStore} {...request.countLabel ? {
|
|
209
|
+
countLabel: request.countLabel
|
|
210
|
+
} : {}} onDone={()=>complete(draft.selectedKeys, true)} {...reset ? {
|
|
211
|
+
onReset: ()=>{
|
|
212
|
+
settle([], true, reset);
|
|
213
|
+
null == handle || handle.close();
|
|
214
|
+
}
|
|
215
|
+
} : {}}/>
|
|
216
|
+
} : {},
|
|
217
|
+
...request.options,
|
|
218
|
+
onClosed: ()=>{
|
|
219
|
+
var _request_options_onClosed, _request_options;
|
|
220
|
+
null == (_request_options = request.options) || null == (_request_options_onClosed = _request_options.onClosed) || _request_options_onClosed.call(_request_options);
|
|
221
|
+
settle(draft.selectedKeys, false);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
handle = sheets.show(items.length > g9SelectionEagerBuildItemLimit ? body : body(), options);
|
|
225
|
+
if (!handle) settle(initialKeys, false);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function SelectionHeaderActions(props) {
|
|
229
|
+
const strings = useG9Strings();
|
|
230
|
+
const direction = useG9Direction();
|
|
231
|
+
const n = useSyncExternalStore(props.draft.subscribe, props.draft.count);
|
|
232
|
+
return <view className="g9-selection__actions" style={g9RowStyle(direction)}>
|
|
233
|
+
{props.onReset ? <G9Button text={strings.get(G9StringKey.Reset)} variant="text" size="small" onPress={props.onReset}/> : null}
|
|
234
|
+
{props.multiple && n > 0 ? <view className="g9-selection__count">
|
|
235
|
+
<text className="g9-selection__count-text">
|
|
236
|
+
{props.countLabel ? props.countLabel(n) : `${n} ${strings.get(G9StringKey.Selected)}`}
|
|
237
|
+
</text>
|
|
238
|
+
</view> : null}
|
|
239
|
+
{props.multiple ? <G9Button text={strings.get(G9StringKey.Done)} variant="text" size="small" onPress={props.onDone}/> : null}
|
|
240
|
+
</view>;
|
|
241
|
+
}
|
|
242
|
+
function showListSheet(sheets, request) {
|
|
243
|
+
var _request_selected;
|
|
244
|
+
const items = [
|
|
245
|
+
...request.items
|
|
246
|
+
];
|
|
247
|
+
const keyOf = (item)=>null != item.key && '' !== item.key.trim() ? item.key : item.text;
|
|
248
|
+
const multiple = true === request.multiple;
|
|
249
|
+
const initial = createSelectionModel({
|
|
250
|
+
items,
|
|
251
|
+
getKey: keyOf,
|
|
252
|
+
getText: (item)=>item.text,
|
|
253
|
+
mode: multiple ? 'multiple' : 'single',
|
|
254
|
+
selectedKeys: (null != (_request_selected = request.selected) ? _request_selected : []).map(keyOf),
|
|
255
|
+
isEnabled: (item)=>false !== item.isEnabled
|
|
256
|
+
});
|
|
257
|
+
return new Promise((resolve)=>{
|
|
258
|
+
var _request_options;
|
|
259
|
+
let draft = initial;
|
|
260
|
+
let settled = false;
|
|
261
|
+
let handle = null;
|
|
262
|
+
const settle = ()=>{
|
|
263
|
+
if (settled) return;
|
|
264
|
+
settled = true;
|
|
265
|
+
resolve(draft.selectedItems());
|
|
266
|
+
};
|
|
267
|
+
const complete = ()=>{
|
|
268
|
+
settle();
|
|
269
|
+
null == handle || handle.close();
|
|
270
|
+
};
|
|
271
|
+
const body = ()=><ListPickerBody request={request} initial={initial} keyOf={keyOf} onDraft={(m)=>{
|
|
272
|
+
draft = m;
|
|
273
|
+
}} onComplete={complete}/>;
|
|
274
|
+
const base = null != (_request_options = request.options) ? _request_options : fullScreenWithoutHandleSheetOptions();
|
|
275
|
+
const fit = 'fitToContent' === base.sizeMode;
|
|
276
|
+
const options = {
|
|
277
|
+
...base,
|
|
278
|
+
...fit ? {} : {
|
|
279
|
+
states: [
|
|
280
|
+
'large'
|
|
281
|
+
],
|
|
282
|
+
currentState: 'large',
|
|
283
|
+
hasHandle: false,
|
|
284
|
+
isDraggable: true,
|
|
285
|
+
useFullScreenLoadingPlaceholder: true
|
|
286
|
+
},
|
|
287
|
+
showToolbar: true,
|
|
288
|
+
showCloseButton: true,
|
|
289
|
+
title: request.title,
|
|
290
|
+
headerTitlePlacement: 'nearBack',
|
|
291
|
+
deferContent: true,
|
|
292
|
+
onClosed: ()=>{
|
|
293
|
+
var _base_onClosed;
|
|
294
|
+
null == (_base_onClosed = base.onClosed) || _base_onClosed.call(base);
|
|
295
|
+
settle();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
handle = sheets.show(body, options);
|
|
299
|
+
if (!handle) {
|
|
300
|
+
settled = true;
|
|
301
|
+
resolve([]);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
function ListPickerBody(props) {
|
|
306
|
+
var _request_applyButtonText;
|
|
307
|
+
const strings = useG9Strings();
|
|
308
|
+
const palette = useG9Theme().palette;
|
|
309
|
+
const [model, setModel] = useState(props.initial);
|
|
310
|
+
const [query, setQuery] = useState('');
|
|
311
|
+
const picking = useRef(false);
|
|
312
|
+
const { request } = props;
|
|
313
|
+
const visible = model.filter(query, {
|
|
314
|
+
trim: true
|
|
315
|
+
});
|
|
316
|
+
const tap = (item)=>{
|
|
317
|
+
if (picking.current || false === item.isEnabled) return;
|
|
318
|
+
const next = model.toggle(props.keyOf(item));
|
|
319
|
+
setModel(next);
|
|
320
|
+
props.onDraft(next);
|
|
321
|
+
if (!request.multiple && false !== request.closeOnSingleSelection) {
|
|
322
|
+
picking.current = true;
|
|
323
|
+
startTimer(props.onComplete, g9SelectionCloseDelayMs);
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
return <view className="g9-list-picker">
|
|
327
|
+
{request.searchPlaceholder ? <view className="g9-selection__search">
|
|
328
|
+
<G9SearchEntry placeholder={request.searchPlaceholder} voiceEnabled={false} onDebouncedValueChange={setQuery}/>
|
|
329
|
+
</view> : null}
|
|
330
|
+
{visible.map((item)=><ListPickerRow key={props.keyOf(item)} item={item} selected={model.isSelected(props.keyOf(item))} tint={palette.PrimaryContainer} onTap={()=>tap(item)}/>)}
|
|
331
|
+
{request.multiple ? <view className="g9-list-picker__apply">
|
|
332
|
+
<G9Button text={null != (_request_applyButtonText = request.applyButtonText) ? _request_applyButtonText : strings.get(G9StringKey.Save)} size="hero" onPress={props.onComplete}/>
|
|
333
|
+
</view> : null}
|
|
334
|
+
</view>;
|
|
335
|
+
}
|
|
336
|
+
function ListPickerRow(props) {
|
|
337
|
+
const press = useG9Press(props.onTap, {
|
|
338
|
+
source: 'G9ListPicker',
|
|
339
|
+
guardMs: 0,
|
|
340
|
+
blocked: false === props.item.isEnabled
|
|
341
|
+
});
|
|
342
|
+
const icon = {
|
|
343
|
+
icon: props.item.icon,
|
|
344
|
+
imagePath: props.item.iconPath,
|
|
345
|
+
image: props.item.iconImage
|
|
346
|
+
};
|
|
347
|
+
const direction = useG9Direction();
|
|
348
|
+
return <view className={`g9-list-picker__row${props.selected ? ' g9-list-picker__row--selected' : ''}`} style={{
|
|
349
|
+
...g9RowStyle(direction),
|
|
350
|
+
...props.selected ? {
|
|
351
|
+
backgroundColor: props.tint
|
|
352
|
+
} : {}
|
|
353
|
+
}} accessibility-element={true} accessibility-traits="button" accessibility-label={props.item.text} bindtap={press}>
|
|
354
|
+
{hasIconSlot(icon) ? <G9IconSlot {...icon} size={20} color="var(--g9-on-surface-variant)"/> : null}
|
|
355
|
+
<text className="g9-list-picker__text" text-maxline="1" style={g9TextStart(direction)}>
|
|
356
|
+
{props.item.text}
|
|
357
|
+
</text>
|
|
358
|
+
</view>;
|
|
359
|
+
}
|
|
360
|
+
export { estimateSelectionHeight, g9SelectionCloseDelayMs, g9SelectionEagerBuildItemLimit, g9SelectionRowHeight, g9SelectionSearchDebounceMs, selectionIdentities, showListSheet, showSelectionSheet };
|
|
361
|
+
|
|
362
|
+
//# sourceMappingURL=selection-sheet.jsx.map
|
|
@@ -0,0 +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 { 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 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 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 key={id} item={item} selected={model.isSelected(id)} direction={dir} onTap={() => tap(id)} />\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","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","_request_options","direction","n","useSyncExternalStore","G9Button","showListSheet","_request_selected","keyOf","ListPickerBody","base","fullScreenWithoutHandleSheetOptions","fit","_request_applyButtonText","G9SearchEntry","ListPickerRow"],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
.g9-selection, .g9-list-picker {
|
|
2
|
+
flex-direction: column;
|
|
3
|
+
display: flex;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.g9-selection__search {
|
|
7
|
+
padding: 8px 12px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.g9-selection-row {
|
|
11
|
+
justify-content: center;
|
|
12
|
+
min-height: 52px;
|
|
13
|
+
display: flex;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.g9-selection-row__inner {
|
|
17
|
+
flex-direction: row;
|
|
18
|
+
align-items: center;
|
|
19
|
+
column-gap: 12px;
|
|
20
|
+
padding: 0 16px;
|
|
21
|
+
display: flex;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.g9-selection-row__text {
|
|
25
|
+
text-overflow: ellipsis;
|
|
26
|
+
flex: 1;
|
|
27
|
+
font-size: 14px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.g9-selection__empty {
|
|
31
|
+
text-align: center;
|
|
32
|
+
color: var(--g9-text-tertiary);
|
|
33
|
+
padding: 28px 16px;
|
|
34
|
+
font-size: 13px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.g9-selection__actions {
|
|
38
|
+
flex-direction: row;
|
|
39
|
+
align-items: center;
|
|
40
|
+
column-gap: 8px;
|
|
41
|
+
display: flex;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.g9-selection__count {
|
|
45
|
+
background-color: var(--g9-primary-container);
|
|
46
|
+
border-radius: 10px;
|
|
47
|
+
padding: 2px 8px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.g9-selection__count-text {
|
|
51
|
+
color: var(--g9-on-primary-container);
|
|
52
|
+
font-size: 12px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.g9-list-picker__row {
|
|
56
|
+
flex-direction: row;
|
|
57
|
+
align-items: center;
|
|
58
|
+
column-gap: 10px;
|
|
59
|
+
min-height: 52px;
|
|
60
|
+
padding: 0 16px;
|
|
61
|
+
display: flex;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.g9-list-picker__text {
|
|
65
|
+
color: var(--g9-text-primary);
|
|
66
|
+
flex: 1;
|
|
67
|
+
font-size: 14px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.g9-list-picker__apply {
|
|
71
|
+
padding: 12px 16px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
/*# sourceMappingURL=selection.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack://./src/selection/selection.css"],"names":[],"mappings":"AACA;EAAE,sBAAsB;EACtB,aAAa;AACf;;AAIA;EADE,iBAAiB;AACnB;;AAIA;EADE,uBAAuB;EACvB,gBAAgB;EAChB,aAAa;AACf;;AAIA;EADE,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,eAAe;EACf,aAAa;AACf;;AAIA;EADE,uBAAuB;EACvB,OAAO;EACP,eAAe;AACjB;;AAIA;EADE,kBAAkB;EAClB,8BAA8B;EAC9B,kBAAkB;EAClB,eAAe;AACjB;;AAIA;EADE,mBAAmB;EACnB,mBAAmB;EACnB,eAAe;EACf,aAAa;AACf;;AAIA;EADE,6CAA6C;EAC7C,mBAAmB;EACnB,gBAAgB;AAClB;;AAIA;EADE,qCAAqC;EACrC,eAAe;AACjB;;AAIA;EADE,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,aAAa;AACf;;AAIA;EADE,6BAA6B;EAC7B,OAAO;EACP,eAAe;AACjB;;AAIA;EADE,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.g9-selection-row {\n min-height: 52px;\n display: flex;\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":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type G9SelectionModel, type G9SelectionModelOptions } from './model.js';
|
|
2
|
+
/** Options of {@link useSelectionModel}. */
|
|
3
|
+
export type G9SelectionModelHookOptions<T> = G9SelectionModelOptions<T>;
|
|
4
|
+
/**
|
|
5
|
+
* A selection draft as React state (plan/specs/03 §5 `useSelectionModel({ items, getKey, mode })`): new `items` keep
|
|
6
|
+
* the selected keys; returns the model and its setter (models are immutable: `set(model.toggle(key))`).
|
|
7
|
+
*/
|
|
8
|
+
export declare function useSelectionModel<T>(options: G9SelectionModelHookOptions<T>): [G9SelectionModel<T>, (model: G9SelectionModel<T>) => void];
|
|
9
|
+
//# sourceMappingURL=use-selection-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-selection-model.d.ts","sourceRoot":"","sources":["../../src/selection/use-selection-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEpG,4CAA4C;AAC5C,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACtC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAU7D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useRef, useState } from "@lynx-js/react";
|
|
2
|
+
import { createSelectionModel } from "./model.jsx";
|
|
3
|
+
function useSelectionModel(options) {
|
|
4
|
+
const [model, setModel] = useState(()=>createSelectionModel(options));
|
|
5
|
+
const items = useRef(options.items);
|
|
6
|
+
if (items.current !== options.items) {
|
|
7
|
+
items.current = options.items;
|
|
8
|
+
const next = model.withItems(options.items);
|
|
9
|
+
setModel(next);
|
|
10
|
+
return [
|
|
11
|
+
next,
|
|
12
|
+
setModel
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
return [
|
|
16
|
+
model,
|
|
17
|
+
setModel
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
export { useSelectionModel };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=use-selection-model.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection/use-selection-model.jsx","sources":["../../src/selection/use-selection-model.ts"],"sourcesContent":["import { useRef, useState } from '@lynx-js/react';\nimport { createSelectionModel, type G9SelectionModel, type G9SelectionModelOptions } from './model';\n\n/** Options of {@link useSelectionModel}. */\nexport type G9SelectionModelHookOptions<T> = G9SelectionModelOptions<T>;\n\n/**\n * A selection draft as React state (plan/specs/03 §5 `useSelectionModel({ items, getKey, mode })`): new `items` keep\n * the selected keys; returns the model and its setter (models are immutable: `set(model.toggle(key))`).\n */\nexport function useSelectionModel<T>(\n options: G9SelectionModelHookOptions<T>,\n): [G9SelectionModel<T>, (model: G9SelectionModel<T>) => void] {\n const [model, setModel] = useState(() => createSelectionModel(options));\n const items = useRef(options.items);\n if (items.current !== options.items) {\n items.current = options.items;\n const next = model.withItems(options.items);\n setModel(next);\n return [next, setModel];\n }\n return [model, setModel];\n}\n"],"names":["useSelectionModel","options","model","setModel","useState","createSelectionModel","items","useRef","next"],"mappings":";;AAUO,SAASA,kBACdC,OAAuC;IAEvC,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAS,IAAMC,qBAAqBJ;IAC9D,MAAMK,QAAQC,OAAON,QAAQ,KAAK;IAClC,IAAIK,MAAM,OAAO,KAAKL,QAAQ,KAAK,EAAE;QACnCK,MAAM,OAAO,GAAGL,QAAQ,KAAK;QAC7B,MAAMO,OAAON,MAAM,SAAS,CAACD,QAAQ,KAAK;QAC1CE,SAASK;QACT,OAAO;YAACA;YAAML;SAAS;IACzB;IACA,OAAO;QAACD;QAAOC;KAAS;AAC1B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import './sheet.css';
|
|
2
|
+
import { type G9AbortSignal } from '@g9tm/lynxcontrols-foundation';
|
|
3
|
+
import { type ReactNode } from '@lynx-js/react';
|
|
4
|
+
import type { G9SheetHeightMemo } from './height-memo.js';
|
|
5
|
+
import type { G9SheetSettings } from './options.js';
|
|
6
|
+
import type { G9SheetEntry, G9SheetHandle, G9SheetStack } from './stack.js';
|
|
7
|
+
/** What content inside a sheet can read (MAUI `IG9BottomSheetAwareView` + deferred load signals). */
|
|
8
|
+
export interface G9SheetContextValue {
|
|
9
|
+
/** The sheet-scoped handle: `close()` closes only this sheet. */
|
|
10
|
+
readonly handle: G9SheetHandle;
|
|
11
|
+
/** Aborted when the sheet starts closing (cancel loads with it). */
|
|
12
|
+
readonly signal: G9AbortSignal;
|
|
13
|
+
/** The open motion has finished. */
|
|
14
|
+
readonly opened: boolean;
|
|
15
|
+
/** The sheet is closing. */
|
|
16
|
+
readonly closing: boolean;
|
|
17
|
+
/** Resting body cap of a fit sheet (px), else `null`. */
|
|
18
|
+
readonly maxBodyHeight: number | null;
|
|
19
|
+
}
|
|
20
|
+
/** The enclosing sheet, or `null` outside one. */
|
|
21
|
+
export declare function useG9SheetContext(): G9SheetContextValue | null;
|
|
22
|
+
/** Props of {@link G9SheetFrame}. */
|
|
23
|
+
export interface G9SheetFrameProps {
|
|
24
|
+
readonly entry: G9SheetEntry;
|
|
25
|
+
readonly stack: G9SheetStack;
|
|
26
|
+
/** Host height (px): percentage detents and caps resolve against it. */
|
|
27
|
+
readonly hostHeight: number;
|
|
28
|
+
readonly hostWidth: number;
|
|
29
|
+
readonly topInset: number;
|
|
30
|
+
readonly settings: Required<G9SheetSettings>;
|
|
31
|
+
readonly memo: G9SheetHeightMemo | null;
|
|
32
|
+
/** Culture tag of the memo key. */
|
|
33
|
+
readonly culture: string;
|
|
34
|
+
/** The sheet is the top of the stack (receives scrim input). */
|
|
35
|
+
readonly isTop: boolean;
|
|
36
|
+
/** The sheet came to rest at a new height (px); drives the page recede threshold. */
|
|
37
|
+
readonly onRest?: (heightPx: number) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* One sheet of the stack on lynx-ui `SheetRoot` (motion, drag, snap points from lynx-ui; G9 adds detent mapping,
|
|
41
|
+
* scrim, header/footer, deferred content, recede and results). Rendered by the sheet service in the host's sheets
|
|
42
|
+
* layer; use `useG9Sheets()` to open sheets.
|
|
43
|
+
*/
|
|
44
|
+
export declare function G9SheetFrame(props: G9SheetFrameProps): ReactNode;
|
|
45
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +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,EAGnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAiB,KAAK,SAAS,EAA2C,MAAM,gBAAgB,CAAC;AAKxG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAajD,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,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;AASD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAyNhE"}
|