@g9tm/lynxcontrols 0.0.0-stage → 1.4.2
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 +29 -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 +68 -0
- package/dist/base/control.d.ts.map +1 -0
- package/dist/base/control.jsx +36 -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 +88 -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 +96 -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 +73 -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 +112 -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 +164 -0
- package/dist/fields/fields.css.map +1 -0
- package/dist/fields/index.d.ts +13 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.jsx +12 -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/notch.d.ts +10 -0
- package/dist/fields/notch.d.ts.map +1 -0
- package/dist/fields/notch.jsx +9 -0
- package/dist/fields/notch.jsx.map +1 -0
- package/dist/fields/outlined-field.d.ts +152 -0
- package/dist/fields/outlined-field.d.ts.map +1 -0
- package/dist/fields/outlined-field.jsx +199 -0
- package/dist/fields/outlined-field.jsx.map +1 -0
- package/dist/fields/pin-entry.d.ts +65 -0
- package/dist/fields/pin-entry.d.ts.map +1 -0
- package/dist/fields/pin-entry.jsx +294 -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 +82 -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 +247 -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 +90 -0
- package/dist/host/hooks.d.ts.map +1 -0
- package/dist/host/hooks.jsx +166 -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 +252 -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 +350 -0
- package/dist/popup/service.jsx.map +1 -0
- package/dist/popup/types.d.ts +222 -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 +366 -0
- package/dist/selection/selection-sheet.jsx.map +1 -0
- package/dist/selection/selection.css +76 -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 +47 -0
- package/dist/sheet/frame.d.ts.map +1 -0
- package/dist/sheet/frame.jsx +270 -0
- package/dist/sheet/frame.jsx.map +1 -0
- package/dist/sheet/gesture.d.ts +51 -0
- package/dist/sheet/gesture.d.ts.map +1 -0
- package/dist/sheet/gesture.jsx +107 -0
- package/dist/sheet/gesture.jsx.map +1 -0
- package/dist/sheet/handoff.d.ts +32 -0
- package/dist/sheet/handoff.d.ts.map +1 -0
- package/dist/sheet/handoff.jsx +33 -0
- package/dist/sheet/handoff.jsx.map +1 -0
- package/dist/sheet/header.d.ts +46 -0
- package/dist/sheet/header.d.ts.map +1 -0
- package/dist/sheet/header.jsx +158 -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 +12 -0
- package/dist/sheet/index.d.ts.map +1 -0
- package/dist/sheet/index.jsx +11 -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/motion.d.ts +59 -0
- package/dist/sheet/motion.d.ts.map +1 -0
- package/dist/sheet/motion.jsx +59 -0
- package/dist/sheet/motion.jsx.map +1 -0
- package/dist/sheet/options.d.ts +252 -0
- package/dist/sheet/options.d.ts.map +1 -0
- package/dist/sheet/options.jsx +92 -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 +246 -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 +87 -0
- package/dist/sheet/sizing.d.ts.map +1 -0
- package/dist/sheet/sizing.jsx +159 -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 +61 -0
- package/dist/tab-bar/tab-bar.d.ts.map +1 -0
- package/dist/tab-bar/tab-bar.jsx +346 -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 +238 -0
- package/dist/toast/service.jsx.map +1 -0
- package/dist/toast/store.d.ts +176 -0
- package/dist/toast/store.d.ts.map +1 -0
- package/dist/toast/store.jsx +355 -0
- package/dist/toast/store.jsx.map +1 -0
- package/dist/toast/toast.css +159 -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 +188 -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 @@
|
|
|
1
|
+
{"version":3,"file":"visuals.d.ts","sourceRoot":"","sources":["../../src/button/visuals.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,aAAa,EAElB,KAAK,eAAe,EAKrB,MAAM,+BAA+B,CAAC;AAEvC,sHAAsH;AACtH,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CA4C3E;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAmCxE;AAED,6BAA6B;AAC7B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEzE,wCAAwC;AACxC,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG;IACjE,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC,CAKA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { G9Metrics, buildSolidOrGradient, createBorderColor, fillToCss, formatColor, getContrastingTextColor, resolveButtonVariant, toRgba, tryParseColor } from "@g9tm/lynxcontrols-foundation";
|
|
2
|
+
function resolveButtonPaint(input) {
|
|
3
|
+
var _input_textColor;
|
|
4
|
+
const variant = resolveButtonVariant(input.variant, input.palette);
|
|
5
|
+
const opacity = input.enabled ? input.loading ? 0.7 : 1 : 0.38;
|
|
6
|
+
const base = input.baseBackgroundColor;
|
|
7
|
+
if (null != base) {
|
|
8
|
+
var _input_textColor1;
|
|
9
|
+
const parsed = tryParseColor(base);
|
|
10
|
+
if (parsed && 0 === parsed.a) {
|
|
11
|
+
var _input_textColor2;
|
|
12
|
+
return {
|
|
13
|
+
background: 'transparent',
|
|
14
|
+
text: null != (_input_textColor2 = input.textColor) ? _input_textColor2 : variant.text,
|
|
15
|
+
stroke: 'transparent',
|
|
16
|
+
strokeWidth: 0,
|
|
17
|
+
opacity
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (!parsed) {
|
|
21
|
+
var _input_textColor3;
|
|
22
|
+
return {
|
|
23
|
+
background: base,
|
|
24
|
+
text: null != (_input_textColor3 = input.textColor) ? _input_textColor3 : variant.text,
|
|
25
|
+
stroke: 'transparent',
|
|
26
|
+
strokeWidth: 0,
|
|
27
|
+
opacity
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const stroke = createBorderColor(parsed);
|
|
31
|
+
return {
|
|
32
|
+
background: formatColor(parsed),
|
|
33
|
+
text: null != (_input_textColor1 = input.textColor) ? _input_textColor1 : formatColor(getContrastingTextColor(parsed)),
|
|
34
|
+
stroke: formatColor(stroke),
|
|
35
|
+
strokeWidth: toRgba(stroke).a > 0 ? 1 : 0,
|
|
36
|
+
opacity
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const outlined = 'outline' === input.variant || 'text' === input.variant || 'button' === input.kind && 'tonal' === input.variant;
|
|
40
|
+
return {
|
|
41
|
+
background: fillToCss(buildSolidOrGradient(variant.background, variant.usesGradient && input.enabled && !input.loading)),
|
|
42
|
+
text: null != (_input_textColor = input.textColor) ? _input_textColor : variant.text,
|
|
43
|
+
stroke: variant.stroke,
|
|
44
|
+
strokeWidth: outlined ? 1.5 : 0,
|
|
45
|
+
opacity
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buttonSizePreset(size) {
|
|
49
|
+
switch(size){
|
|
50
|
+
case 'small':
|
|
51
|
+
return {
|
|
52
|
+
height: G9Metrics.ButtonHeightSmall,
|
|
53
|
+
paddingHorizontal: 12,
|
|
54
|
+
paddingVertical: 8,
|
|
55
|
+
fontSize: G9Metrics.ButtonFontSmall,
|
|
56
|
+
fill: false
|
|
57
|
+
};
|
|
58
|
+
case 'large':
|
|
59
|
+
return {
|
|
60
|
+
height: G9Metrics.ButtonHeightLarge,
|
|
61
|
+
paddingHorizontal: 20,
|
|
62
|
+
paddingVertical: 14,
|
|
63
|
+
fontSize: G9Metrics.ButtonFontLarge,
|
|
64
|
+
fill: false
|
|
65
|
+
};
|
|
66
|
+
case 'hero':
|
|
67
|
+
return {
|
|
68
|
+
height: G9Metrics.ButtonHeightHero,
|
|
69
|
+
paddingHorizontal: 16,
|
|
70
|
+
paddingVertical: 16,
|
|
71
|
+
fontSize: G9Metrics.ButtonFontHero,
|
|
72
|
+
fill: true
|
|
73
|
+
};
|
|
74
|
+
default:
|
|
75
|
+
return {
|
|
76
|
+
height: G9Metrics.ButtonHeightMedium,
|
|
77
|
+
paddingHorizontal: 16,
|
|
78
|
+
paddingVertical: 12,
|
|
79
|
+
fontSize: G9Metrics.ButtonFontMedium,
|
|
80
|
+
fill: false
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function fontAttributesStyle(attributes) {
|
|
85
|
+
return {
|
|
86
|
+
fontWeight: 'bold' === attributes || 'boldItalic' === attributes ? 'bold' : 'normal',
|
|
87
|
+
fontStyle: 'italic' === attributes || 'boldItalic' === attributes ? 'italic' : 'normal'
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export { buttonSizePreset, fontAttributesStyle, resolveButtonPaint };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=visuals.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button/visuals.jsx","sources":["../../src/button/visuals.ts"],"sourcesContent":["import {\n buildSolidOrGradient,\n createBorderColor,\n fillToCss,\n formatColor,\n type G9ButtonVariant,\n type G9ControlSize,\n G9Metrics,\n type G9PaletteValues,\n getContrastingTextColor,\n resolveButtonVariant,\n toRgba,\n tryParseColor,\n} from '@g9tm/lynxcontrols-foundation';\n\n/** What a button paints (MAUI `G9Visuals.ButtonVisualResult` + the stroke/opacity rules of G9Button/G9IconButton). */\nexport interface G9ButtonPaint {\n /** CSS `background` (a colour or a vertical gradient). */\n readonly background: string;\n readonly text: string;\n readonly stroke: string;\n readonly strokeWidth: number;\n /** 0.38 when not effectively enabled, 0.70 while loading, else 1. */\n readonly opacity: number;\n}\n\n/** Inputs of {@link resolveButtonPaint}. */\nexport interface G9ButtonPaintInput {\n readonly variant: G9ButtonVariant;\n readonly palette: G9PaletteValues;\n /** `IsEnabled && !blocked`. */\n readonly enabled: boolean;\n readonly loading: boolean;\n readonly baseBackgroundColor?: string | null | undefined;\n readonly textColor?: string | null | undefined;\n /** `'button'`: tonal has a 1.5 stroke; `'icon'`: only outline/text do (MAUI G9IconButton). */\n readonly kind: 'button' | 'icon';\n}\n\n/**\n * Resolves the paint of a button (MAUI `G9Button.OnApplyVisuals` / `G9IconButton.OnApplyVisuals`):\n * - variant colours from `resolveButtonVariant`; the gradient only while enabled and not loading;\n * - `baseBackgroundColor`: fully transparent → no fill, no border; otherwise a flat fill, contrasting text and a\n * darkened border (stroke 1 when visible);\n * - `textColor` always wins for text/icon/spinner;\n * - stroke 1.5 for outline/text (and tonal on `G9Button`), else 0.\n * A colour that is not a parseable literal (e.g. a `var(--…)` token) is used as given: flat fill, the variant's text\n * colour unless `textColor` is set, and no derived border.\n */\nexport function resolveButtonPaint(input: G9ButtonPaintInput): G9ButtonPaint {\n const variant = resolveButtonVariant(input.variant, input.palette);\n const opacity = !input.enabled ? 0.38 : input.loading ? 0.7 : 1;\n const base = input.baseBackgroundColor;\n if (base != null) {\n const parsed = tryParseColor(base);\n if (parsed && parsed.a === 0) {\n return {\n background: 'transparent',\n text: input.textColor ?? variant.text,\n stroke: 'transparent',\n strokeWidth: 0,\n opacity,\n };\n }\n if (!parsed) {\n return {\n background: base,\n text: input.textColor ?? variant.text,\n stroke: 'transparent',\n strokeWidth: 0,\n opacity,\n };\n }\n const stroke = createBorderColor(parsed);\n return {\n background: formatColor(parsed),\n text: input.textColor ?? formatColor(getContrastingTextColor(parsed)),\n stroke: formatColor(stroke),\n strokeWidth: toRgba(stroke).a > 0 ? 1 : 0,\n opacity,\n };\n }\n const outlined =\n input.variant === 'outline' || input.variant === 'text' || (input.kind === 'button' && input.variant === 'tonal');\n return {\n background: fillToCss(\n buildSolidOrGradient(variant.background, variant.usesGradient && input.enabled && !input.loading),\n ),\n text: input.textColor ?? variant.text,\n stroke: variant.stroke,\n strokeWidth: outlined ? 1.5 : 0,\n opacity,\n };\n}\n\n/** Size preset of `G9Button` (MAUI `ApplySizePreset`). */\nexport interface G9ButtonSizePreset {\n readonly height: number;\n readonly paddingHorizontal: number;\n readonly paddingVertical: number;\n readonly fontSize: number;\n /** Hero buttons fill the width. */\n readonly fill: boolean;\n}\n\n/** MAUI G9Button size presets: small 36 / medium 44 / large 48 / hero 52. */\nexport function buttonSizePreset(size: G9ControlSize): G9ButtonSizePreset {\n switch (size) {\n case 'small':\n return {\n height: G9Metrics.ButtonHeightSmall,\n paddingHorizontal: 12,\n paddingVertical: 8,\n fontSize: G9Metrics.ButtonFontSmall,\n fill: false,\n };\n case 'large':\n return {\n height: G9Metrics.ButtonHeightLarge,\n paddingHorizontal: 20,\n paddingVertical: 14,\n fontSize: G9Metrics.ButtonFontLarge,\n fill: false,\n };\n case 'hero':\n return {\n height: G9Metrics.ButtonHeightHero,\n paddingHorizontal: 16,\n paddingVertical: 16,\n fontSize: G9Metrics.ButtonFontHero,\n fill: true,\n };\n default:\n return {\n height: G9Metrics.ButtonHeightMedium,\n paddingHorizontal: 16,\n paddingVertical: 12,\n fontSize: G9Metrics.ButtonFontMedium,\n fill: false,\n };\n }\n}\n\n/** MAUI `FontAttributes`. */\nexport type G9FontAttributes = 'none' | 'bold' | 'italic' | 'boldItalic';\n\n/** CSS for {@link G9FontAttributes}. */\nexport function fontAttributesStyle(attributes: G9FontAttributes): {\n fontWeight: 'bold' | 'normal';\n fontStyle: 'italic' | 'normal';\n} {\n return {\n fontWeight: attributes === 'bold' || attributes === 'boldItalic' ? 'bold' : 'normal',\n fontStyle: attributes === 'italic' || attributes === 'boldItalic' ? 'italic' : 'normal',\n };\n}\n"],"names":["resolveButtonPaint","input","_input_textColor","variant","resolveButtonVariant","opacity","base","_input_textColor1","parsed","tryParseColor","_input_textColor2","_input_textColor3","stroke","createBorderColor","formatColor","getContrastingTextColor","toRgba","outlined","fillToCss","buildSolidOrGradient","buttonSizePreset","size","G9Metrics","fontAttributesStyle","attributes"],"mappings":";AAiDO,SAASA,mBAAmBC,KAAyB;QAuClDC;IAtCR,MAAMC,UAAUC,qBAAqBH,MAAM,OAAO,EAAEA,MAAM,OAAO;IACjE,MAAMI,UAAU,AAACJ,MAAM,OAAO,GAAUA,MAAM,OAAO,GAAG,MAAM,IAA7B;IACjC,MAAMK,OAAOL,MAAM,mBAAmB;IACtC,IAAIK,AAAQ,QAARA,MAAc;YAuBRC;QAtBR,MAAMC,SAASC,cAAcH;QAC7B,IAAIE,UAAUA,AAAa,MAAbA,OAAO,CAAC,EAAQ;gBAGpBE;YAFR,OAAO;gBACL,YAAY;gBACZ,MAAM,QAAAA,CAAAA,oBAAAA,MAAM,SAAS,AAAD,IAAdA,oBAAmBP,QAAQ,IAAI;gBACrC,QAAQ;gBACR,aAAa;gBACbE;YACF;QACF;QACA,IAAI,CAACG,QAAQ;gBAGHG;YAFR,OAAO;gBACL,YAAYL;gBACZ,MAAM,QAAAK,CAAAA,oBAAAA,MAAM,SAAS,AAAD,IAAdA,oBAAmBR,QAAQ,IAAI;gBACrC,QAAQ;gBACR,aAAa;gBACbE;YACF;QACF;QACA,MAAMO,SAASC,kBAAkBL;QACjC,OAAO;YACL,YAAYM,YAAYN;YACxB,MAAM,QAAAD,CAAAA,oBAAAA,MAAM,SAAS,AAAD,IAAdA,oBAAmBO,YAAYC,wBAAwBP;YAC7D,QAAQM,YAAYF;YACpB,aAAaI,OAAOJ,QAAQ,CAAC,GAAG,IAAI,IAAI;YACxCP;QACF;IACF;IACA,MAAMY,WACJhB,AAAkB,cAAlBA,MAAM,OAAO,IAAkBA,AAAkB,WAAlBA,MAAM,OAAO,IAAgBA,AAAe,aAAfA,MAAM,IAAI,IAAiBA,AAAkB,YAAlBA,MAAM,OAAO;IACtG,OAAO;QACL,YAAYiB,UACVC,qBAAqBhB,QAAQ,UAAU,EAAEA,QAAQ,YAAY,IAAIF,MAAM,OAAO,IAAI,CAACA,MAAM,OAAO;QAElG,MAAM,QAAAC,CAAAA,mBAAAA,MAAM,SAAS,AAAD,IAAdA,mBAAmBC,QAAQ,IAAI;QACrC,QAAQA,QAAQ,MAAM;QACtB,aAAac,WAAW,MAAM;QAC9BZ;IACF;AACF;AAaO,SAASe,iBAAiBC,IAAmB;IAClD,OAAQA;QACN,KAAK;YACH,OAAO;gBACL,QAAQC,UAAU,iBAAiB;gBACnC,mBAAmB;gBACnB,iBAAiB;gBACjB,UAAUA,UAAU,eAAe;gBACnC,MAAM;YACR;QACF,KAAK;YACH,OAAO;gBACL,QAAQA,UAAU,iBAAiB;gBACnC,mBAAmB;gBACnB,iBAAiB;gBACjB,UAAUA,UAAU,eAAe;gBACnC,MAAM;YACR;QACF,KAAK;YACH,OAAO;gBACL,QAAQA,UAAU,gBAAgB;gBAClC,mBAAmB;gBACnB,iBAAiB;gBACjB,UAAUA,UAAU,cAAc;gBAClC,MAAM;YACR;QACF;YACE,OAAO;gBACL,QAAQA,UAAU,kBAAkB;gBACpC,mBAAmB;gBACnB,iBAAiB;gBACjB,UAAUA,UAAU,gBAAgB;gBACpC,MAAM;YACR;IACJ;AACF;AAMO,SAASC,oBAAoBC,UAA4B;IAI9D,OAAO;QACL,YAAYA,AAAe,WAAfA,cAAyBA,AAAe,iBAAfA,aAA8B,SAAS;QAC5E,WAAWA,AAAe,aAAfA,cAA2BA,AAAe,iBAAfA,aAA8B,WAAW;IACjF;AACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import './cascade.css';
|
|
2
|
+
import { G9CascadeDirection, G9CascadeTransition } from '@g9tm/lynxcontrols-foundation';
|
|
3
|
+
import { type ReactNode } from '@lynx-js/react';
|
|
4
|
+
import { type G9CascadeContent, type G9CascadePushOptions, G9CascadeStack } from './model.js';
|
|
5
|
+
/** Slide duration (MAUI `G9Metrics.CascadePanelAnimationMs`). */
|
|
6
|
+
export declare const g9CascadeAnimationMs = 280;
|
|
7
|
+
/** How far a covered panel parallaxes (share of the slide) and how much it dims, in `overlay` mode. */
|
|
8
|
+
export declare const g9CascadeParallax: Readonly<{
|
|
9
|
+
shift: 0.3;
|
|
10
|
+
dim: 0.12;
|
|
11
|
+
}>;
|
|
12
|
+
/** Imperative API of a cascade panel (MAUI `G9CascadePanel` methods), from {@link useCascadePanel}. */
|
|
13
|
+
export interface G9CascadeController {
|
|
14
|
+
/** Push a built view, or a factory built after the slide (spinner meanwhile). Resolves when it slid in. */
|
|
15
|
+
push(content: G9CascadeContent, options?: G9CascadePushOptions): Promise<boolean>;
|
|
16
|
+
/** Pop the top panel (no-op at the root). Resolves when it slid out. */
|
|
17
|
+
pop(): Promise<boolean>;
|
|
18
|
+
/** Pop every panel back to the root (after a slide in flight). */
|
|
19
|
+
popToRoot(): Promise<boolean>;
|
|
20
|
+
/** Current nesting depth; 0 = only the root. */
|
|
21
|
+
readonly depth: number;
|
|
22
|
+
/** @internal the stack the panel renders */
|
|
23
|
+
readonly stack: G9CascadeStack;
|
|
24
|
+
}
|
|
25
|
+
interface ControllerState {
|
|
26
|
+
durationMs: number;
|
|
27
|
+
onPushed?: ((depth: number) => void) | undefined;
|
|
28
|
+
onPopped?: ((depth: number) => void) | undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Creates a cascade controller outside React (tests, view models). */
|
|
31
|
+
export declare function createCascadeController(): G9CascadeController & {
|
|
32
|
+
readonly state: ControllerState;
|
|
33
|
+
};
|
|
34
|
+
/** A stable controller for a `G9CascadePanel` (pass it as `controller`). */
|
|
35
|
+
export declare function useCascadePanel(): G9CascadeController;
|
|
36
|
+
/** Props of {@link G9CascadePanel}. */
|
|
37
|
+
export interface G9CascadePanelProps {
|
|
38
|
+
readonly controller?: G9CascadeController;
|
|
39
|
+
/** The view at depth 0; swapping it replaces the root without touching the nested stack. */
|
|
40
|
+
readonly rootContent?: ReactNode;
|
|
41
|
+
/** Lazy root (used when `rootContent` is absent): spinner, then built one tick after mount. */
|
|
42
|
+
readonly rootContentFactory?: (() => ReactNode) | null;
|
|
43
|
+
readonly rootTitle?: string | null;
|
|
44
|
+
/** Default entry direction; `'auto'` follows the reading direction (L→R in LTR, R→L in RTL). */
|
|
45
|
+
readonly direction?: G9CascadeDirection;
|
|
46
|
+
/** `'overlay'` (default) slides over a stationary base; `'push'` slides the base out. */
|
|
47
|
+
readonly transition?: G9CascadeTransition;
|
|
48
|
+
/** Fade the root in on first appearance. Default false. */
|
|
49
|
+
readonly animateRoot?: boolean;
|
|
50
|
+
/** Back + title header on nested panels. Default true. */
|
|
51
|
+
readonly showHeader?: boolean;
|
|
52
|
+
/** A (back-less) header on the root too. Default false. */
|
|
53
|
+
readonly showRootHeader?: boolean;
|
|
54
|
+
/** Default 280. */
|
|
55
|
+
readonly animationDurationMs?: number;
|
|
56
|
+
/** Overlay mode: the covered panel parallaxes and dims. Default true. */
|
|
57
|
+
readonly enableParallax?: boolean;
|
|
58
|
+
/** Default 16 (MAUI `RadiusLg`). */
|
|
59
|
+
readonly cornerRadius?: number;
|
|
60
|
+
/** After a panel slid in, with the new depth (MAUI `PanelPushed`). */
|
|
61
|
+
readonly onPanelPushed?: (depth: number) => void;
|
|
62
|
+
/** After a panel slid out, with the new depth (MAUI `PanelPopped`). */
|
|
63
|
+
readonly onPanelPopped?: (depth: number) => void;
|
|
64
|
+
readonly className?: string;
|
|
65
|
+
}
|
|
66
|
+
type Physical = 'leftToRight' | 'rightToLeft' | 'topToBottom' | 'bottomToTop';
|
|
67
|
+
/** Resolves `'auto'` to the reading direction. */
|
|
68
|
+
export declare function resolveCascadeDirection(direction: G9CascadeDirection | null | undefined, rtl: boolean): Physical;
|
|
69
|
+
/** The transform of a panel `amount` (0…1) of the way off-screen against its entry direction. */
|
|
70
|
+
export declare function cascadeOffset(direction: Physical, amount: number): string;
|
|
71
|
+
/**
|
|
72
|
+
* In-place drill-down navigation (MAUI `G9CascadePanel`): `controller.push(view, { title })` slides a panel in over
|
|
73
|
+
* the current one from any edge, `pop()` slides it back; panels stack to any depth inside whatever container holds the
|
|
74
|
+
* panel (clipped to its bounds, opaque `Surface` panels). `overlay` keeps the base still (parallax + dim with
|
|
75
|
+
* `enableParallax`); `push` slides it out. Lazy panels show a spinner and build after the slide. One slide runs at a
|
|
76
|
+
* time: same-kind repeats are dropped, the other kind waits (see `G9CascadeStack`).
|
|
77
|
+
*/
|
|
78
|
+
export declare function G9CascadePanel(props: G9CascadePanelProps): ReactNode;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=cascade-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade-panel.d.ts","sourceRoot":"","sources":["../../src/cascade/cascade-panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import "./cascade.css";
|
|
2
|
+
import { G9CascadeDirection, G9CascadeTransition, G9StringKey } from "@g9tm/lynxcontrols-foundation";
|
|
3
|
+
import { useEffect, useRef, useState, useSyncExternalStore } from "@lynx-js/react";
|
|
4
|
+
import { useG9Press } from "../base/press.jsx";
|
|
5
|
+
import { startTimer, stopTimer } from "../base/timers.jsx";
|
|
6
|
+
import { G9ActivityIndicator } from "../display/activity-indicator.jsx";
|
|
7
|
+
import { G9IconSlot } from "../icon/slot.jsx";
|
|
8
|
+
import { useG9Direction, useG9Settings, useG9Strings } from "../provider/hooks.jsx";
|
|
9
|
+
import { G9CascadeStack } from "./model.jsx";
|
|
10
|
+
const g9CascadeAnimationMs = 280;
|
|
11
|
+
const g9CascadeParallax = Object.freeze({
|
|
12
|
+
shift: 0.3,
|
|
13
|
+
dim: 0.12
|
|
14
|
+
});
|
|
15
|
+
function createCascadeController() {
|
|
16
|
+
const state = {
|
|
17
|
+
durationMs: g9CascadeAnimationMs
|
|
18
|
+
};
|
|
19
|
+
const stack = new G9CascadeStack({
|
|
20
|
+
setTimer: (cb, ms)=>startTimer(cb, ms),
|
|
21
|
+
clearTimer: (h)=>stopTimer(h),
|
|
22
|
+
durationMs: ()=>state.durationMs,
|
|
23
|
+
onPushed: (d)=>{
|
|
24
|
+
var _state_onPushed;
|
|
25
|
+
return null == (_state_onPushed = state.onPushed) ? void 0 : _state_onPushed.call(state, d);
|
|
26
|
+
},
|
|
27
|
+
onPopped: (d)=>{
|
|
28
|
+
var _state_onPopped;
|
|
29
|
+
return null == (_state_onPopped = state.onPopped) ? void 0 : _state_onPopped.call(state, d);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
state,
|
|
34
|
+
stack,
|
|
35
|
+
push: (content, options)=>stack.push(content, options),
|
|
36
|
+
pop: ()=>stack.pop(),
|
|
37
|
+
popToRoot: ()=>stack.popToRoot(),
|
|
38
|
+
get depth () {
|
|
39
|
+
return stack.depth;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function useCascadePanel() {
|
|
44
|
+
const ref = useRef(null);
|
|
45
|
+
if (null === ref.current) ref.current = createCascadeController();
|
|
46
|
+
return ref.current;
|
|
47
|
+
}
|
|
48
|
+
function resolveCascadeDirection(direction, rtl) {
|
|
49
|
+
if (!direction || direction === G9CascadeDirection.Auto) return rtl ? 'rightToLeft' : 'leftToRight';
|
|
50
|
+
return direction;
|
|
51
|
+
}
|
|
52
|
+
function cascadeOffset(direction, amount) {
|
|
53
|
+
const pct = `${Math.round(1000 * amount) / 10}%`;
|
|
54
|
+
const neg = `-${pct}`;
|
|
55
|
+
switch(direction){
|
|
56
|
+
case 'leftToRight':
|
|
57
|
+
return `translateX(${0 === amount ? '0%' : neg})`;
|
|
58
|
+
case 'rightToLeft':
|
|
59
|
+
return `translateX(${pct})`;
|
|
60
|
+
case 'topToBottom':
|
|
61
|
+
return `translateY(${0 === amount ? '0%' : neg})`;
|
|
62
|
+
default:
|
|
63
|
+
return `translateY(${pct})`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function Header(props) {
|
|
67
|
+
var _props_title;
|
|
68
|
+
const rtl = 'rtl' === useG9Direction();
|
|
69
|
+
const glyphs = useG9Settings().glyphs;
|
|
70
|
+
const strings = useG9Strings();
|
|
71
|
+
const back = useG9Press(()=>{
|
|
72
|
+
var _props_onBack;
|
|
73
|
+
return null == (_props_onBack = props.onBack) ? void 0 : _props_onBack.call(props);
|
|
74
|
+
}, {
|
|
75
|
+
source: 'G9CascadePanel',
|
|
76
|
+
guardMs: 0
|
|
77
|
+
});
|
|
78
|
+
return <view className={`g9-cascade__header g9-dir-${rtl ? 'rtl' : 'ltr'}`}>
|
|
79
|
+
{props.onBack ? <view className="g9-cascade__back" accessibility-element={true} accessibility-traits="button" accessibility-label={strings.get(G9StringKey.Back)} bindtap={back}>
|
|
80
|
+
<G9IconSlot icon={rtl ? glyphs.chevronForward : glyphs.chevronBack} size={24} color="var(--g9-on-surface)"/>
|
|
81
|
+
</view> : null}
|
|
82
|
+
<text className="g9-cascade__title" text-maxline="1">
|
|
83
|
+
{null != (_props_title = props.title) ? _props_title : ''}
|
|
84
|
+
</text>
|
|
85
|
+
</view>;
|
|
86
|
+
}
|
|
87
|
+
function Body(props) {
|
|
88
|
+
const lazy = 'function' == typeof props.content;
|
|
89
|
+
const node = lazy ? props.ready ? props.content() : null : props.content;
|
|
90
|
+
const inner = lazy && !props.ready ? <view className="g9-cascade__loading">
|
|
91
|
+
<G9ActivityIndicator running size={32}/>
|
|
92
|
+
</view> : node;
|
|
93
|
+
return props.wrap ? <scroll-view className="g9-cascade__body" scroll-orientation="vertical">
|
|
94
|
+
{inner}
|
|
95
|
+
</scroll-view> : <view className="g9-cascade__body">{inner}</view>;
|
|
96
|
+
}
|
|
97
|
+
function G9CascadePanel(props) {
|
|
98
|
+
var _props_controller, _props_animationDurationMs, _props_transition, _ref, _props_rootContent, _props_cornerRadius, _props_rootTitle;
|
|
99
|
+
const own = useCascadePanel();
|
|
100
|
+
const controller = null != (_props_controller = props.controller) ? _props_controller : own;
|
|
101
|
+
const duration = null != (_props_animationDurationMs = props.animationDurationMs) ? _props_animationDurationMs : g9CascadeAnimationMs;
|
|
102
|
+
controller.state.durationMs = duration;
|
|
103
|
+
controller.state.onPushed = props.onPanelPushed;
|
|
104
|
+
controller.state.onPopped = props.onPanelPopped;
|
|
105
|
+
const stack = controller.stack;
|
|
106
|
+
const panels = useSyncExternalStore((l)=>stack.subscribe(l), ()=>stack.getSnapshot());
|
|
107
|
+
const rtl = 'rtl' === useG9Direction();
|
|
108
|
+
const overlay = (null != (_props_transition = props.transition) ? _props_transition : G9CascadeTransition.Overlay) === G9CascadeTransition.Overlay;
|
|
109
|
+
const parallax = false !== props.enableParallax;
|
|
110
|
+
useEffect(()=>()=>stack.dispose(), [
|
|
111
|
+
stack
|
|
112
|
+
]);
|
|
113
|
+
const [rootReady, setRootReady] = useState(false);
|
|
114
|
+
const [rootShown, setRootShown] = useState(true !== props.animateRoot);
|
|
115
|
+
useEffect(()=>{
|
|
116
|
+
const t = startTimer(()=>{
|
|
117
|
+
setRootReady(true);
|
|
118
|
+
setRootShown(true);
|
|
119
|
+
}, 16);
|
|
120
|
+
return ()=>stopTimer(t);
|
|
121
|
+
}, []);
|
|
122
|
+
const topIndex = (id)=>'root' === id ? 0 : panels.findIndex((p)=>p.id === id) + 1;
|
|
123
|
+
const coverOf = (level)=>{
|
|
124
|
+
const above = panels[level];
|
|
125
|
+
if (!above) return null;
|
|
126
|
+
const amount = 'entering' === above.status || 'shown' === above.status ? 1 : 0;
|
|
127
|
+
return {
|
|
128
|
+
entry: above,
|
|
129
|
+
amount
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
const style = (level, entry)=>{
|
|
133
|
+
var _entry_direction;
|
|
134
|
+
const own = entry ? resolveCascadeDirection(null != (_entry_direction = entry.direction) ? _entry_direction : props.direction, rtl) : null;
|
|
135
|
+
const out = entry && ('staged' === entry.status || 'leaving' === entry.status);
|
|
136
|
+
let transform = own && out ? cascadeOffset(own, 1) : 'translateX(0%)';
|
|
137
|
+
let dim = 0;
|
|
138
|
+
const cover = coverOf(level);
|
|
139
|
+
if (cover && !out) {
|
|
140
|
+
var _cover_entry_direction;
|
|
141
|
+
const dir = resolveCascadeDirection(null != (_cover_entry_direction = cover.entry.direction) ? _cover_entry_direction : props.direction, rtl);
|
|
142
|
+
const opposite = {
|
|
143
|
+
leftToRight: 'rightToLeft',
|
|
144
|
+
rightToLeft: 'leftToRight',
|
|
145
|
+
topToBottom: 'bottomToTop',
|
|
146
|
+
bottomToTop: 'topToBottom'
|
|
147
|
+
};
|
|
148
|
+
const amount = cover.amount * (overlay ? parallax ? g9CascadeParallax.shift : 0 : 1);
|
|
149
|
+
transform = cascadeOffset(opposite[dir], amount);
|
|
150
|
+
dim = overlay && parallax ? cover.amount * g9CascadeParallax.dim : 0;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
transform,
|
|
154
|
+
transition: (null == entry ? void 0 : entry.status) === 'staged' ? 'none' : `transform ${duration}ms ease-out, opacity ${duration}ms`,
|
|
155
|
+
zIndex: level,
|
|
156
|
+
...dim > 0 ? {
|
|
157
|
+
opacity: 1 - dim
|
|
158
|
+
} : {
|
|
159
|
+
opacity: 0 !== level || rootShown ? 1 : 0
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
const rootContent = null != (_ref = null != (_props_rootContent = props.rootContent) ? _props_rootContent : props.rootContentFactory) ? _ref : null;
|
|
164
|
+
return <view className={`g9-cascade${props.className ? ` ${props.className}` : ''}`} style={{
|
|
165
|
+
borderRadius: `${null != (_props_cornerRadius = props.cornerRadius) ? _props_cornerRadius : 16}px`
|
|
166
|
+
}}>
|
|
167
|
+
<view className="g9-cascade__panel" style={style(0, null)}>
|
|
168
|
+
{props.showRootHeader ? <Header title={null != (_props_rootTitle = props.rootTitle) ? _props_rootTitle : null} onBack={null}/> : null}
|
|
169
|
+
<Body content={rootContent} wrap ready={rootReady}/>
|
|
170
|
+
</view>
|
|
171
|
+
{panels.map((entry)=><view key={entry.id} className={`g9-cascade__panel g9-cascade__panel--${entry.status}`} style={style(topIndex(entry.id), entry)}>
|
|
172
|
+
{false !== props.showHeader ? <Header title={entry.title} onBack={()=>void stack.pop()}/> : null}
|
|
173
|
+
<Body content={entry.content} wrap={entry.wrap} ready={'shown' === entry.status || 'leaving' === entry.status}/>
|
|
174
|
+
</view>)}
|
|
175
|
+
</view>;
|
|
176
|
+
}
|
|
177
|
+
export { G9CascadePanel, cascadeOffset, createCascadeController, g9CascadeAnimationMs, g9CascadeParallax, resolveCascadeDirection, useCascadePanel };
|
|
178
|
+
|
|
179
|
+
//# sourceMappingURL=cascade-panel.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascade/cascade-panel.jsx","sources":["../../src/cascade/cascade-panel.tsx"],"sourcesContent":["import './cascade.css';\nimport { G9CascadeDirection, G9CascadeTransition, G9StringKey } from '@g9tm/lynxcontrols-foundation';\nimport { type ReactNode, useEffect, useRef, useState, useSyncExternalStore } from '@lynx-js/react';\nimport { useG9Press } from '../base/press';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { G9ActivityIndicator } from '../display/activity-indicator';\nimport { G9IconSlot } from '../icon/slot';\nimport { useG9Direction, useG9Settings, useG9Strings } from '../provider/hooks';\nimport { type G9CascadeContent, type G9CascadePanelEntry, type G9CascadePushOptions, G9CascadeStack } from './model';\n\n/** Slide duration (MAUI `G9Metrics.CascadePanelAnimationMs`). */\nexport const g9CascadeAnimationMs = 280;\n/** How far a covered panel parallaxes (share of the slide) and how much it dims, in `overlay` mode. */\nexport const g9CascadeParallax = Object.freeze({ shift: 0.3, dim: 0.12 });\n\n/** Imperative API of a cascade panel (MAUI `G9CascadePanel` methods), from {@link useCascadePanel}. */\nexport interface G9CascadeController {\n /** Push a built view, or a factory built after the slide (spinner meanwhile). Resolves when it slid in. */\n push(content: G9CascadeContent, options?: G9CascadePushOptions): Promise<boolean>;\n /** Pop the top panel (no-op at the root). Resolves when it slid out. */\n pop(): Promise<boolean>;\n /** Pop every panel back to the root (after a slide in flight). */\n popToRoot(): Promise<boolean>;\n /** Current nesting depth; 0 = only the root. */\n readonly depth: number;\n /** @internal the stack the panel renders */\n readonly stack: G9CascadeStack;\n}\n\ninterface ControllerState {\n durationMs: number;\n onPushed?: ((depth: number) => void) | undefined;\n onPopped?: ((depth: number) => void) | undefined;\n}\n\n/** Creates a cascade controller outside React (tests, view models). */\nexport function createCascadeController(): G9CascadeController & { readonly state: ControllerState } {\n const state: ControllerState = { durationMs: g9CascadeAnimationMs };\n const stack = new G9CascadeStack({\n setTimer: (cb, ms) => startTimer(cb, ms),\n clearTimer: (h) => stopTimer(h as never),\n durationMs: () => state.durationMs,\n onPushed: (d) => state.onPushed?.(d),\n onPopped: (d) => state.onPopped?.(d),\n });\n return {\n state,\n stack,\n push: (content, options) => stack.push(content, options),\n pop: () => stack.pop(),\n popToRoot: () => stack.popToRoot(),\n get depth() {\n return stack.depth;\n },\n };\n}\n\n/** A stable controller for a `G9CascadePanel` (pass it as `controller`). */\nexport function useCascadePanel(): G9CascadeController {\n const ref = useRef<G9CascadeController | null>(null);\n if (ref.current === null) ref.current = createCascadeController();\n return ref.current;\n}\n\n/** Props of {@link G9CascadePanel}. */\nexport interface G9CascadePanelProps {\n readonly controller?: G9CascadeController;\n /** The view at depth 0; swapping it replaces the root without touching the nested stack. */\n readonly rootContent?: ReactNode;\n /** Lazy root (used when `rootContent` is absent): spinner, then built one tick after mount. */\n readonly rootContentFactory?: (() => ReactNode) | null;\n readonly rootTitle?: string | null;\n /** Default entry direction; `'auto'` follows the reading direction (L→R in LTR, R→L in RTL). */\n readonly direction?: G9CascadeDirection;\n /** `'overlay'` (default) slides over a stationary base; `'push'` slides the base out. */\n readonly transition?: G9CascadeTransition;\n /** Fade the root in on first appearance. Default false. */\n readonly animateRoot?: boolean;\n /** Back + title header on nested panels. Default true. */\n readonly showHeader?: boolean;\n /** A (back-less) header on the root too. Default false. */\n readonly showRootHeader?: boolean;\n /** Default 280. */\n readonly animationDurationMs?: number;\n /** Overlay mode: the covered panel parallaxes and dims. Default true. */\n readonly enableParallax?: boolean;\n /** Default 16 (MAUI `RadiusLg`). */\n readonly cornerRadius?: number;\n /** After a panel slid in, with the new depth (MAUI `PanelPushed`). */\n readonly onPanelPushed?: (depth: number) => void;\n /** After a panel slid out, with the new depth (MAUI `PanelPopped`). */\n readonly onPanelPopped?: (depth: number) => void;\n readonly className?: string;\n}\n\ntype Physical = 'leftToRight' | 'rightToLeft' | 'topToBottom' | 'bottomToTop';\n\n/** Resolves `'auto'` to the reading direction. */\nexport function resolveCascadeDirection(direction: G9CascadeDirection | null | undefined, rtl: boolean): Physical {\n if (!direction || direction === G9CascadeDirection.Auto) return rtl ? 'rightToLeft' : 'leftToRight';\n return direction;\n}\n\n/** The transform of a panel `amount` (0…1) of the way off-screen against its entry direction. */\nexport function cascadeOffset(direction: Physical, amount: number): string {\n const pct = `${Math.round(amount * 1000) / 10}%`;\n const neg = `-${pct}`;\n switch (direction) {\n case 'leftToRight':\n return `translateX(${amount === 0 ? '0%' : neg})`;\n case 'rightToLeft':\n return `translateX(${pct})`;\n case 'topToBottom':\n return `translateY(${amount === 0 ? '0%' : neg})`;\n default:\n return `translateY(${pct})`;\n }\n}\n\nfunction Header(props: { readonly title: string | null; readonly onBack: (() => void) | null }): ReactNode {\n const rtl = useG9Direction() === 'rtl';\n const glyphs = useG9Settings().glyphs;\n const strings = useG9Strings();\n const back = useG9Press(() => props.onBack?.(), { source: 'G9CascadePanel', guardMs: 0 });\n return (\n <view className={`g9-cascade__header g9-dir-${rtl ? 'rtl' : 'ltr'}`}>\n {props.onBack ? (\n <view\n className=\"g9-cascade__back\"\n accessibility-element={true}\n accessibility-traits=\"button\"\n accessibility-label={strings.get(G9StringKey.Back)}\n bindtap={back}\n >\n <G9IconSlot icon={rtl ? glyphs.chevronForward : glyphs.chevronBack} size={24} color=\"var(--g9-on-surface)\" />\n </view>\n ) : null}\n <text className=\"g9-cascade__title\" text-maxline=\"1\">\n {props.title ?? ''}\n </text>\n </view>\n );\n}\n\nfunction Body(props: {\n readonly content: G9CascadeContent;\n readonly wrap: boolean;\n readonly ready: boolean;\n}): ReactNode {\n const lazy = typeof props.content === 'function';\n const node = lazy ? (props.ready ? (props.content as () => ReactNode)() : null) : (props.content as ReactNode);\n const inner =\n lazy && !props.ready ? (\n <view className=\"g9-cascade__loading\">\n <G9ActivityIndicator running size={32} />\n </view>\n ) : (\n node\n );\n return props.wrap ? (\n <scroll-view className=\"g9-cascade__body\" scroll-orientation=\"vertical\">\n {inner}\n </scroll-view>\n ) : (\n <view className=\"g9-cascade__body\">{inner}</view>\n );\n}\n\n/**\n * In-place drill-down navigation (MAUI `G9CascadePanel`): `controller.push(view, { title })` slides a panel in over\n * the current one from any edge, `pop()` slides it back; panels stack to any depth inside whatever container holds the\n * panel (clipped to its bounds, opaque `Surface` panels). `overlay` keeps the base still (parallax + dim with\n * `enableParallax`); `push` slides it out. Lazy panels show a spinner and build after the slide. One slide runs at a\n * time: same-kind repeats are dropped, the other kind waits (see `G9CascadeStack`).\n */\nexport function G9CascadePanel(props: G9CascadePanelProps): ReactNode {\n const own = useCascadePanel();\n const controller = (props.controller ?? own) as ReturnType<typeof createCascadeController>;\n const duration = props.animationDurationMs ?? g9CascadeAnimationMs;\n controller.state.durationMs = duration;\n controller.state.onPushed = props.onPanelPushed;\n controller.state.onPopped = props.onPanelPopped;\n const stack = controller.stack;\n const panels = useSyncExternalStore(\n (l) => stack.subscribe(l),\n () => stack.getSnapshot(),\n );\n const rtl = useG9Direction() === 'rtl';\n const overlay = (props.transition ?? G9CascadeTransition.Overlay) === G9CascadeTransition.Overlay;\n const parallax = props.enableParallax !== false;\n useEffect(() => () => stack.dispose(), [stack]);\n\n // Lazy root: built one tick after mount. Root fade: visible after the first frame.\n const [rootReady, setRootReady] = useState(false);\n const [rootShown, setRootShown] = useState(props.animateRoot !== true);\n useEffect(() => {\n const t = startTimer(() => {\n setRootReady(true);\n setRootShown(true);\n }, 16);\n return () => stopTimer(t);\n }, []);\n\n const topIndex = (id: number | 'root') => (id === 'root' ? 0 : panels.findIndex((p) => p.id === id) + 1);\n // The panel that covers a given level, if any, and how far it is in.\n const coverOf = (level: number): { entry: G9CascadePanelEntry; amount: number } | null => {\n const above = panels[level];\n if (!above) return null;\n const amount = above.status === 'entering' || above.status === 'shown' ? 1 : 0;\n return { entry: above, amount };\n };\n const style = (level: number, entry: G9CascadePanelEntry | null) => {\n const own = entry ? resolveCascadeDirection(entry.direction ?? props.direction, rtl) : null;\n // Own slide: off-screen while staged/leaving, in place otherwise.\n const out = entry && (entry.status === 'staged' || entry.status === 'leaving');\n let transform = own && out ? cascadeOffset(own, 1) : 'translateX(0%)';\n let dim = 0;\n const cover = coverOf(level);\n if (cover && !out) {\n const dir = resolveCascadeDirection(cover.entry.direction ?? props.direction, rtl);\n // A covered level moves the other way: by the parallax share (overlay) or all the way (push).\n const opposite: Record<Physical, Physical> = {\n leftToRight: 'rightToLeft',\n rightToLeft: 'leftToRight',\n topToBottom: 'bottomToTop',\n bottomToTop: 'topToBottom',\n };\n const amount = cover.amount * (overlay ? (parallax ? g9CascadeParallax.shift : 0) : 1);\n transform = cascadeOffset(opposite[dir], amount);\n dim = overlay && parallax ? cover.amount * g9CascadeParallax.dim : 0;\n }\n return {\n transform,\n transition: entry?.status === 'staged' ? 'none' : `transform ${duration}ms ease-out, opacity ${duration}ms`,\n zIndex: level,\n ...(dim > 0 ? { opacity: 1 - dim } : { opacity: level === 0 && !rootShown ? 0 : 1 }),\n };\n };\n\n const rootContent = props.rootContent ?? props.rootContentFactory ?? null;\n return (\n <view\n className={`g9-cascade${props.className ? ` ${props.className}` : ''}`}\n style={{ borderRadius: `${props.cornerRadius ?? 16}px` }}\n >\n <view className=\"g9-cascade__panel\" style={style(0, null)}>\n {props.showRootHeader ? <Header title={props.rootTitle ?? null} onBack={null} /> : null}\n <Body content={rootContent} wrap ready={rootReady} />\n </view>\n {panels.map((entry) => (\n <view\n key={entry.id}\n className={`g9-cascade__panel g9-cascade__panel--${entry.status}`}\n style={style(topIndex(entry.id), entry)}\n >\n {props.showHeader !== false ? <Header title={entry.title} onBack={() => void stack.pop()} /> : null}\n <Body\n content={entry.content}\n wrap={entry.wrap}\n ready={entry.status === 'shown' || entry.status === 'leaving'}\n />\n </view>\n ))}\n </view>\n );\n}\n"],"names":["g9CascadeAnimationMs","g9CascadeParallax","Object","createCascadeController","state","stack","G9CascadeStack","cb","ms","startTimer","h","stopTimer","d","content","options","useCascadePanel","ref","useRef","resolveCascadeDirection","direction","rtl","G9CascadeDirection","cascadeOffset","amount","pct","Math","neg","Header","props","_props_title","useG9Direction","glyphs","useG9Settings","strings","useG9Strings","back","useG9Press","view","G9StringKey","G9IconSlot","text","Body","lazy","node","inner","G9ActivityIndicator","scroll-view","G9CascadePanel","_props_controller","_props_animationDurationMs","_props_transition","_ref","_props_cornerRadius","_props_rootTitle","own","controller","duration","panels","useSyncExternalStore","l","overlay","G9CascadeTransition","parallax","useEffect","rootReady","setRootReady","useState","rootShown","setRootShown","t","topIndex","id","p","coverOf","level","above","style","entry","_entry_direction","out","transform","dim","cover","_cover_entry_direction","dir","opposite","rootContent"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
.g9-cascade {
|
|
2
|
+
background-color: var(--g9-surface);
|
|
3
|
+
flex: 1;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: 100%;
|
|
6
|
+
position: relative;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.g9-cascade__panel {
|
|
11
|
+
background-color: var(--g9-surface);
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
display: flex;
|
|
14
|
+
position: absolute;
|
|
15
|
+
top: 0;
|
|
16
|
+
bottom: 0;
|
|
17
|
+
left: 0;
|
|
18
|
+
right: 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.g9-cascade__header {
|
|
22
|
+
flex-direction: row;
|
|
23
|
+
align-items: center;
|
|
24
|
+
height: 52px;
|
|
25
|
+
padding-left: 8px;
|
|
26
|
+
padding-right: 16px;
|
|
27
|
+
display: flex;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.g9-cascade__header.g9-dir-rtl {
|
|
31
|
+
direction: ltr;
|
|
32
|
+
flex-direction: row-reverse;
|
|
33
|
+
padding-left: 16px;
|
|
34
|
+
padding-right: 8px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.g9-cascade__back {
|
|
38
|
+
justify-content: center;
|
|
39
|
+
align-items: center;
|
|
40
|
+
width: 40px;
|
|
41
|
+
height: 40px;
|
|
42
|
+
display: flex;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.g9-cascade__title {
|
|
46
|
+
color: var(--g9-on-surface);
|
|
47
|
+
flex: 1;
|
|
48
|
+
margin-left: 4px;
|
|
49
|
+
margin-right: 4px;
|
|
50
|
+
font-size: 16.2px;
|
|
51
|
+
font-weight: 700;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.g9-cascade__header.g9-dir-rtl .g9-cascade__title {
|
|
55
|
+
text-align: right;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.g9-cascade__body {
|
|
59
|
+
flex: 1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.g9-cascade__loading {
|
|
63
|
+
justify-content: center;
|
|
64
|
+
align-items: center;
|
|
65
|
+
height: 160px;
|
|
66
|
+
display: flex;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
/*# sourceMappingURL=cascade.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack://./src/cascade/cascade.css"],"names":[],"mappings":"AACA;EAAE,mCAAmC;EACnC,OAAO;EACP,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,gBAAgB;AAClB;;AAGA;EAAE,mCAAmC;EACnC,sBAAsB;EACtB,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;AACV;;AAGA;EAAE,mBAAmB;EACnB,mBAAmB;EACnB,YAAY;EACZ,iBAAiB;EACjB,mBAAmB;EACnB,aAAa;AACf;;AAIA;EADE,cAAc;EACd,2BAA2B;EAC3B,kBAAkB;EAClB,kBAAkB;AACpB;;AAIA;EADE,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;AACf;;AAIA;EADE,2BAA2B;EAC3B,OAAO;EACP,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB;EACjB,gBAAgB;AAClB;;AAIA;EADE,iBAAiB;AACnB;;AAIA;EADE,OAAO;AACT;;AAIA;EADE,uBAAuB;EACvB,mBAAmB;EACnB,aAAa;EACb,aAAa;AACf","sourcesContent":["/* Fills its parent in a flex parent (flex: 1) and in Lynx's default linear layout (100 %), where flex does not grow. */\n.g9-cascade {\n position: relative;\n overflow: hidden;\n flex: 1;\n width: 100%;\n height: 100%;\n background-color: var(--g9-surface);\n}\n\n.g9-cascade__panel {\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n display: flex;\n flex-direction: column;\n background-color: var(--g9-surface);\n}\n\n.g9-cascade__header {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 52px;\n padding-left: 8px;\n padding-right: 16px;\n}\n\n/* Mirrored explicitly with its own direction pinned to ltr (no second reversal where `direction` is honoured, E22). */\n.g9-cascade__header.g9-dir-rtl {\n direction: ltr;\n flex-direction: row-reverse;\n padding-left: 16px;\n padding-right: 8px;\n}\n\n.g9-cascade__back {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.g9-cascade__title {\n flex: 1;\n font-size: 16.2px;\n font-weight: 700;\n color: var(--g9-on-surface);\n margin-left: 4px;\n margin-right: 4px;\n}\n\n.g9-cascade__header.g9-dir-rtl .g9-cascade__title {\n text-align: right;\n}\n\n.g9-cascade__body {\n flex: 1;\n}\n\n.g9-cascade__loading {\n height: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { cascadeOffset, createCascadeController, type G9CascadeController, G9CascadePanel, type G9CascadePanelProps, g9CascadeAnimationMs, g9CascadeParallax, resolveCascadeDirection, useCascadePanel, } from './cascade-panel.js';
|
|
2
|
+
export { type G9CascadeConfig, type G9CascadeContent, type G9CascadePanelEntry, type G9CascadePanelStatus, type G9CascadePushOptions, G9CascadeStack, } from './model.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cascade/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,cAAc,EACd,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { G9CascadeDirection } from '@g9tm/lynxcontrols-foundation';
|
|
2
|
+
import type { ReactNode } from '@lynx-js/react';
|
|
3
|
+
/** A nested panel's content: built, or built lazily after its slide (spinner meanwhile). */
|
|
4
|
+
export type G9CascadeContent = ReactNode | (() => ReactNode);
|
|
5
|
+
/** Options of one push (MAUI `Push(content, title, direction, wrapInScrollView)`). */
|
|
6
|
+
export interface G9CascadePushOptions {
|
|
7
|
+
readonly title?: string | null;
|
|
8
|
+
/** Entry direction of this panel; default the panel's `direction`. */
|
|
9
|
+
readonly direction?: G9CascadeDirection;
|
|
10
|
+
/** Wrap the content in a vertical scroll view (false for content that scrolls itself, e.g. a list). Default true. */
|
|
11
|
+
readonly wrapInScrollView?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Where a panel is in its life. `staged` = mounted off-screen for one frame so the slide can start from there. */
|
|
14
|
+
export type G9CascadePanelStatus = 'staged' | 'entering' | 'shown' | 'leaving';
|
|
15
|
+
/** One nested panel (depth ≥ 1). */
|
|
16
|
+
export interface G9CascadePanelEntry {
|
|
17
|
+
readonly id: number;
|
|
18
|
+
readonly content: G9CascadeContent;
|
|
19
|
+
readonly title: string | null;
|
|
20
|
+
readonly direction: G9CascadeDirection | null;
|
|
21
|
+
readonly wrap: boolean;
|
|
22
|
+
readonly status: G9CascadePanelStatus;
|
|
23
|
+
}
|
|
24
|
+
/** Timing and callbacks of the stack. */
|
|
25
|
+
export interface G9CascadeConfig {
|
|
26
|
+
setTimer(callback: () => void, ms: number): unknown;
|
|
27
|
+
clearTimer(handle: unknown): void;
|
|
28
|
+
durationMs(): number;
|
|
29
|
+
onPushed?(depth: number): void;
|
|
30
|
+
onPopped?(depth: number): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* One slide at a time (MAUI re-entrancy guard): a second operation of the SAME kind during a slide is dropped (two
|
|
34
|
+
* taps never push two panels or pop two levels); one of the OTHER kind is parked and runs when the slide ends (a newer
|
|
35
|
+
* parked one replaces it). `popToRoot` waits out a slide in flight. Every operation resolves `true` when its slide
|
|
36
|
+
* finished, `false` when it was dropped, displaced or had nothing to do.
|
|
37
|
+
*/
|
|
38
|
+
export declare class G9CascadeStack {
|
|
39
|
+
private readonly config;
|
|
40
|
+
private panels;
|
|
41
|
+
private nextId;
|
|
42
|
+
private running;
|
|
43
|
+
private parked;
|
|
44
|
+
private timers;
|
|
45
|
+
private readonly listeners;
|
|
46
|
+
private snapshot;
|
|
47
|
+
private disposed;
|
|
48
|
+
constructor(config: G9CascadeConfig);
|
|
49
|
+
/** Nested depth: 0 = only the root (MAUI `Depth`); a leaving panel no longer counts. */
|
|
50
|
+
get depth(): number;
|
|
51
|
+
getSnapshot(): ReadonlyArray<G9CascadePanelEntry>;
|
|
52
|
+
subscribe(listener: () => void): () => void;
|
|
53
|
+
/** Pushes a panel; resolves when it slid in (MAUI `PushAsync`). */
|
|
54
|
+
push(content: G9CascadeContent, options?: G9CascadePushOptions): Promise<boolean>;
|
|
55
|
+
/** Pops the top panel; resolves when it slid out. No-op at the root (MAUI `PopAsync`). */
|
|
56
|
+
pop(): Promise<boolean>;
|
|
57
|
+
/** Pops every panel back to the root, after a slide in flight (MAUI `PopToRootAsync`). */
|
|
58
|
+
popToRoot(): Promise<boolean>;
|
|
59
|
+
/** Cancels every timer; pending operations resolve `false`. */
|
|
60
|
+
dispose(): void;
|
|
61
|
+
private request;
|
|
62
|
+
private start;
|
|
63
|
+
private finish;
|
|
64
|
+
private set;
|
|
65
|
+
private later;
|
|
66
|
+
private emit;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/cascade/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,4FAA4F;AAC5F,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;AAE7D,sFAAsF;AACtF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,qHAAqH;IACrH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,mHAAmH;AACnH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/E,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,UAAU,IAAI,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AASD;;;;;GAKG;AACH,qBAAa,cAAc;IAUb,OAAO,CAAC,QAAQ,CAAC,MAAM;IATnC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,QAAQ,CAAS;gBAEI,MAAM,EAAE,eAAe;IAEpD,wFAAwF;IACxF,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,WAAW,IAAI,aAAa,CAAC,mBAAmB,CAAC;IAIjD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK3C,mEAAmE;IACnE,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrF,0FAA0F;IAC1F,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;IAIvB,0FAA0F;IACpF,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,+DAA+D;IAC/D,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,KAAK;IAqCb,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,IAAI;CAIb"}
|