@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,113 @@
|
|
|
1
|
+
import { formatNumber } from "@g9tm/lynxcontrols-foundation";
|
|
2
|
+
function _define_property(obj, key, value) {
|
|
3
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
else obj[key] = value;
|
|
10
|
+
return obj;
|
|
11
|
+
}
|
|
12
|
+
const g9TabViewMetrics = Object.freeze({
|
|
13
|
+
tabHeight: 52,
|
|
14
|
+
barInnerPadding: 4,
|
|
15
|
+
barRadius: 26,
|
|
16
|
+
pillVerticalInset: 2,
|
|
17
|
+
pillRadius: 18,
|
|
18
|
+
barToContentGap: 8,
|
|
19
|
+
underlineThickness: 2.5,
|
|
20
|
+
edgeLineThickness: 1,
|
|
21
|
+
separatorVerticalInset: 12,
|
|
22
|
+
indicatorMoveMs: 240,
|
|
23
|
+
contentTransitionMs: 160,
|
|
24
|
+
contentSlidePx: 6,
|
|
25
|
+
lazyRealizeDelayMs: 240,
|
|
26
|
+
contentPadding: Object.freeze([
|
|
27
|
+
10,
|
|
28
|
+
10,
|
|
29
|
+
10,
|
|
30
|
+
0
|
|
31
|
+
])
|
|
32
|
+
});
|
|
33
|
+
function effectiveTabIndex(selectedIndex, count) {
|
|
34
|
+
if (count <= 0) return -1;
|
|
35
|
+
if (!Number.isFinite(selectedIndex)) return 0;
|
|
36
|
+
return Math.min(Math.max(Math.trunc(selectedIndex), 0), count - 1);
|
|
37
|
+
}
|
|
38
|
+
function tabKey(item, index) {
|
|
39
|
+
var _item_key;
|
|
40
|
+
return null != (_item_key = item.key) ? _item_key : `#${index}`;
|
|
41
|
+
}
|
|
42
|
+
function tabBadge(item, numberingSystem) {
|
|
43
|
+
var _item_badgeCount;
|
|
44
|
+
if (null != item.badgeText && '' !== item.badgeText.trim()) return item.badgeText;
|
|
45
|
+
const count = null != (_item_badgeCount = item.badgeCount) ? _item_badgeCount : 0;
|
|
46
|
+
if (Number.isFinite(count) && count > 0) return formatNumber(Math.trunc(count), {
|
|
47
|
+
numberingSystem
|
|
48
|
+
});
|
|
49
|
+
return item.badgeDot ? 'dot' : null;
|
|
50
|
+
}
|
|
51
|
+
function tabVisualOrder(count, rtl) {
|
|
52
|
+
const order = [];
|
|
53
|
+
for(let i = 0; i < count; i++)order.push(rtl ? count - 1 - i : i);
|
|
54
|
+
return order;
|
|
55
|
+
}
|
|
56
|
+
function tabContentSlideFrom(previous, next, rtl) {
|
|
57
|
+
const forward = previous < 0 || next > previous;
|
|
58
|
+
const sign = (forward ? 1 : -1) * (rtl ? -1 : 1);
|
|
59
|
+
return g9TabViewMetrics.contentSlidePx * sign;
|
|
60
|
+
}
|
|
61
|
+
function thicknessCss(value) {
|
|
62
|
+
const parts = 'number' == typeof value ? [
|
|
63
|
+
value
|
|
64
|
+
] : value;
|
|
65
|
+
const [l = 0, t = l, r = l, b = t] = 2 === parts.length ? [
|
|
66
|
+
parts[0],
|
|
67
|
+
parts[1],
|
|
68
|
+
parts[0],
|
|
69
|
+
parts[1]
|
|
70
|
+
] : parts;
|
|
71
|
+
return `${t}px ${r}px ${b}px ${l}px`;
|
|
72
|
+
}
|
|
73
|
+
class G9TabRealizer {
|
|
74
|
+
isRealized(key) {
|
|
75
|
+
return this.eager() || this.realized.has(key);
|
|
76
|
+
}
|
|
77
|
+
activate(key) {
|
|
78
|
+
if (this.isRealized(key)) {
|
|
79
|
+
this.pending = null;
|
|
80
|
+
return 'shown';
|
|
81
|
+
}
|
|
82
|
+
this.pending = key;
|
|
83
|
+
this.generation += 1;
|
|
84
|
+
return this.generation;
|
|
85
|
+
}
|
|
86
|
+
realize(token) {
|
|
87
|
+
if (token !== this.generation || null === this.pending) return false;
|
|
88
|
+
this.realized.add(this.pending);
|
|
89
|
+
this.pending = null;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
retain(keys) {
|
|
93
|
+
const live = new Set(keys);
|
|
94
|
+
for (const key of Array.from(this.realized))if (!live.has(key)) this.realized.delete(key);
|
|
95
|
+
if (null !== this.pending && !live.has(this.pending)) this.pending = null;
|
|
96
|
+
}
|
|
97
|
+
get pendingKey() {
|
|
98
|
+
return this.pending;
|
|
99
|
+
}
|
|
100
|
+
constructor(eager){
|
|
101
|
+
_define_property(this, "eager", void 0);
|
|
102
|
+
_define_property(this, "realized", void 0);
|
|
103
|
+
_define_property(this, "pending", void 0);
|
|
104
|
+
_define_property(this, "generation", void 0);
|
|
105
|
+
this.eager = eager;
|
|
106
|
+
this.realized = new Set();
|
|
107
|
+
this.pending = null;
|
|
108
|
+
this.generation = 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export { G9TabRealizer, effectiveTabIndex, g9TabViewMetrics, tabBadge, tabContentSlideFrom, tabKey, tabVisualOrder, thicknessCss };
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=model.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs/model.jsx","sources":["../../src/tabs/model.ts"],"sourcesContent":["import { formatNumber, type G9ImageSource, type G9NumberingSystem } from '@g9tm/lynxcontrols-foundation';\nimport type { ReactNode } from '@lynx-js/react';\nimport type { G9IconInput } from '../icon/icon';\n\n/** Visual treatment of the bar (MAUI `G9TabStyle`). */\nexport type G9TabStyle = 'underlined' | 'pill';\n/** Cell sizing (MAUI `G9TabMode`): equal full-width cells, or auto-width cells in a horizontal scroller. */\nexport type G9TabMode = 'fixed' | 'scrollable';\n/** Where the bar sits relative to the content (MAUI `G9TabBarPosition`). */\nexport type G9TabBarPosition = 'top' | 'bottom';\n\n/**\n * One tab (MAUI `G9TabItem`). A plain descriptor: change a field and re-render, and only that cell updates (MAUI\n * `VisualChanged` + in-place `UpdateCellContent`). Icon slot precedence as everywhere: emoji → icon → image path →\n * image source.\n */\nexport interface G9TabItem {\n /** Stable identity; keeps a realized body (and its state) with its tab across reorders. Default: the index. */\n readonly key?: string;\n readonly text?: string | null;\n readonly emoji?: string | null;\n readonly icon?: G9IconInput;\n readonly imagePath?: string | null;\n readonly image?: G9ImageSource | null;\n /** Inline pill badge with the formatted count; 0 = none. */\n readonly badgeCount?: number;\n /** Inline pill badge with custom text; wins over `badgeCount`. */\n readonly badgeText?: string | null;\n /** A 7×7 dot instead of a pill. */\n readonly badgeDot?: boolean;\n /** Badge fill. Default `var(--g9-error)`. */\n readonly badgeColor?: string | null;\n /** The body shown while this tab is active (MAUI `TabContent`); a function is called when the tab realizes. */\n readonly content?: ReactNode | (() => ReactNode);\n}\n\n/** Tab view metrics (MAUI `G9Metrics` tab constants and `G9TabView` private constants). */\nexport const g9TabViewMetrics = Object.freeze({\n tabHeight: 52,\n barInnerPadding: 4,\n barRadius: 26,\n pillVerticalInset: 2,\n pillRadius: 18,\n barToContentGap: 8,\n underlineThickness: 2.5,\n edgeLineThickness: 1,\n separatorVerticalInset: 12,\n indicatorMoveMs: 240,\n contentTransitionMs: 160,\n contentSlidePx: 6,\n lazyRealizeDelayMs: 240,\n contentPadding: Object.freeze([10, 10, 10, 0] as const),\n});\n\n/** The index actually shown: the selection clamped into the items (MAUI `EffectiveIndex`); -1 with no items. */\nexport function effectiveTabIndex(selectedIndex: number, count: number): number {\n if (count <= 0) return -1;\n if (!Number.isFinite(selectedIndex)) return 0;\n return Math.min(Math.max(Math.trunc(selectedIndex), 0), count - 1);\n}\n\n/** The identity of a tab: its `key`, else its index. */\nexport function tabKey(item: G9TabItem, index: number): string {\n return item.key ?? `#${index}`;\n}\n\n/** The inline badge of a tab: `null`, `'dot'`, or the pill text (custom text wins; counts are `N0`-grouped). */\nexport function tabBadge(item: G9TabItem, numberingSystem: G9NumberingSystem): 'dot' | string | null {\n if (item.badgeText != null && item.badgeText.trim() !== '') return item.badgeText;\n const count = item.badgeCount ?? 0;\n if (Number.isFinite(count) && count > 0) return formatNumber(Math.trunc(count), { numberingSystem });\n return item.badgeDot ? 'dot' : null;\n}\n\n/** Visual (left-to-right) order of the cells: reversed in RTL so the first tab sits at the reading start. */\nexport function tabVisualOrder(count: number, rtl: boolean): number[] {\n const order: number[] = [];\n for (let i = 0; i < count; i++) order.push(rtl ? count - 1 - i : i);\n return order;\n}\n\n/** Content slide start offset: forward arrives from the trailing edge, back from the leading edge; RTL mirrors. */\nexport function tabContentSlideFrom(previous: number, next: number, rtl: boolean): number {\n const forward = previous < 0 || next > previous;\n const sign = (forward ? 1 : -1) * (rtl ? -1 : 1);\n return g9TabViewMetrics.contentSlidePx * sign;\n}\n\n/** CSS padding from a MAUI-style thickness: one value, `[h, v]` or `[l, t, r, b]`. */\nexport function thicknessCss(value: number | readonly number[]): string {\n const parts = typeof value === 'number' ? [value] : value;\n const [l = 0, t = l, r = l, b = t] = parts.length === 2 ? [parts[0], parts[1], parts[0], parts[1]] : parts;\n return `${t}px ${r}px ${b}px ${l}px`;\n}\n\n/**\n * Lazy-once realization (MAUI \"Lazy tab-body rendering\"): a body is built on its first activation, after\n * `lazyRealizeDelayMs` (a spinner meanwhile), and then stays built, hidden while inactive, so its state survives. A\n * pending token makes rapid switches realize only the latest selection. `eager` builds everything up front.\n */\nexport class G9TabRealizer {\n private readonly realized = new Set<string>();\n private pending: string | null = null;\n private generation = 0;\n\n constructor(private readonly eager: () => boolean) {}\n\n isRealized(key: string): boolean {\n return this.eager() || this.realized.has(key);\n }\n\n /** Marks `key` active: returns `'shown'` when it is already built, else a token to pass to {@link realize}. */\n activate(key: string): 'shown' | number {\n if (this.isRealized(key)) {\n this.pending = null;\n return 'shown';\n }\n this.pending = key;\n this.generation += 1;\n return this.generation;\n }\n\n /** Realizes the pending key when `token` is still the latest activation; returns whether it did. */\n realize(token: number): boolean {\n if (token !== this.generation || this.pending === null) return false;\n this.realized.add(this.pending);\n this.pending = null;\n return true;\n }\n\n /** Drops keys that are no longer in the items (a removed tab's body is released). */\n retain(keys: readonly string[]): void {\n const live = new Set(keys);\n for (const key of Array.from(this.realized)) if (!live.has(key)) this.realized.delete(key);\n if (this.pending !== null && !live.has(this.pending)) this.pending = null;\n }\n\n get pendingKey(): string | null {\n return this.pending;\n }\n}\n"],"names":["g9TabViewMetrics","Object","effectiveTabIndex","selectedIndex","count","Number","Math","tabKey","item","index","_item_key","tabBadge","numberingSystem","_item_badgeCount","formatNumber","tabVisualOrder","rtl","order","i","tabContentSlideFrom","previous","next","forward","sign","thicknessCss","value","parts","l","t","r","b","G9TabRealizer","key","token","keys","live","Set","Array","eager"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import './tabs.css';
|
|
2
|
+
import { type ReactNode } from '@lynx-js/react';
|
|
3
|
+
import { type G9TabBarPosition, type G9TabItem, type G9TabMode, type G9TabStyle } from './model.js';
|
|
4
|
+
/** Props of {@link G9TabView}. */
|
|
5
|
+
export interface G9TabViewProps {
|
|
6
|
+
/** The tabs (MAUI `Items`). Add, remove or reorder freely; give tabs a `key` so their bodies follow them. */
|
|
7
|
+
readonly items: readonly G9TabItem[];
|
|
8
|
+
/** Controlled selection (MAUI `SelectedIndex`, two-way). Out-of-range values show the nearest tab. */
|
|
9
|
+
readonly selectedIndex?: number;
|
|
10
|
+
/** Initial selection while uncontrolled. Default 0. */
|
|
11
|
+
readonly defaultSelectedIndex?: number;
|
|
12
|
+
/** A tab was chosen by a tap or a swipe (MAUI `SelectionChanged`). */
|
|
13
|
+
readonly onSelectionChange?: (index: number) => void;
|
|
14
|
+
/** Bar height (MAUI `TabHeight`). Default 52. */
|
|
15
|
+
readonly tabHeight?: number;
|
|
16
|
+
/** Bar background (MAUI `TabBarBackground`). Default transparent (underlined) / surface-container-low (pill). */
|
|
17
|
+
readonly tabBarBackground?: string | null;
|
|
18
|
+
/** Underline colour (underlined) or active text colour (pill) (MAUI `IndicatorColor`). Default primary. */
|
|
19
|
+
readonly indicatorColor?: string | null;
|
|
20
|
+
/** `'fixed'` (default): equal full-width cells. `'scrollable'`: auto-width cells that scroll. */
|
|
21
|
+
readonly mode?: G9TabMode;
|
|
22
|
+
/** `'top'` (default) or `'bottom'`. */
|
|
23
|
+
readonly barPosition?: G9TabBarPosition;
|
|
24
|
+
/** `'underlined'` (default) or `'pill'` (MAUI `Style`). */
|
|
25
|
+
readonly tabStyle?: G9TabStyle;
|
|
26
|
+
/** Only the bar: no content panel; drive your own host from `onSelectionChange` (MAUI `HeaderOnly`). */
|
|
27
|
+
readonly headerOnly?: boolean;
|
|
28
|
+
/** Border and rounded corners around the content (MAUI `ShowFrame`). Default false. */
|
|
29
|
+
readonly showFrame?: boolean;
|
|
30
|
+
/** Content border radius when `showFrame` (MAUI `FrameCornerRadius`). Default 0. */
|
|
31
|
+
readonly frameCornerRadius?: number;
|
|
32
|
+
/** Inset around the active body (MAUI `ContentPadding`): one value, `[h, v]` or `[l, t, r, b]`. Default 10,10,10,0. */
|
|
33
|
+
readonly contentPadding?: number | readonly number[];
|
|
34
|
+
/** Build every body up front instead of lazily on first activation (MAUI `EagerContent`). Default false. */
|
|
35
|
+
readonly eagerContent?: boolean;
|
|
36
|
+
/** Swipe between bodies (lynx-ui ViewPager). A Lynx addition; default false, as in MAUI. */
|
|
37
|
+
readonly swipeEnabled?: boolean;
|
|
38
|
+
readonly className?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Tabs with a bar and lazily realized bodies (MAUI `G9TabView`). Underlined (default) or pill style, fixed or
|
|
42
|
+
* scrollable cells, bar on top or bottom, header-only; the indicator slides between cells; bodies are built on first
|
|
43
|
+
* activation (spinner, then {@link g9TabViewMetrics} `lazyRealizeDelayMs`) and kept, hidden, so scroll and form state
|
|
44
|
+
* survive; RTL reverses the cell order. With `swipeEnabled` the bodies sit in a lynx-ui ViewPager.
|
|
45
|
+
*/
|
|
46
|
+
export declare function G9TabView(props: G9TabViewProps): ReactNode;
|
|
47
|
+
//# sourceMappingURL=tab-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-view.d.ts","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,SAAS,EAAwC,MAAM,gBAAgB,CAAC;AAQtF,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,SAAS,EAEd,KAAK,UAAU,EAOhB,MAAM,SAAS,CAAC;AAEjB,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,6GAA6G;IAC7G,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,sGAAsG;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,uDAAuD;IACvD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,sEAAsE;IACtE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iHAAiH;IACjH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,2GAA2G;IAC3G,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,iGAAiG;IACjG,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,wGAAwG;IACxG,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,uFAAuF;IACvF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,uHAAuH;IACvH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACrD,4GAA4G;IAC5G,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,4FAA4F;IAC5F,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAsK1D"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import "./tabs.css";
|
|
2
|
+
import { ViewPager } from "@lynx-js/lynx-ui-view-pager";
|
|
3
|
+
import { useEffect, useMemo, useRef, useState } from "@lynx-js/react";
|
|
4
|
+
import { g9RowStyle } from "../base/control.jsx";
|
|
5
|
+
import { startTimer, stopTimer } from "../base/timers.jsx";
|
|
6
|
+
import { useControllableState } from "../base/use-controllable-state.jsx";
|
|
7
|
+
import { G9ActivityIndicator } from "../display/activity-indicator.jsx";
|
|
8
|
+
import { invokeNodeWhenReady } from "../fields/use-text-input.jsx";
|
|
9
|
+
import { G9IconSlot } from "../icon/slot.jsx";
|
|
10
|
+
import { useG9Culture, useG9Direction } from "../provider/hooks.jsx";
|
|
11
|
+
import { G9TabRealizer, effectiveTabIndex, g9TabViewMetrics, tabBadge, tabContentSlideFrom, tabKey, tabVisualOrder, thicknessCss } from "./model.jsx";
|
|
12
|
+
function G9TabView(props) {
|
|
13
|
+
var _props_tabStyle, _props_mode, _props_barPosition, _props_tabHeight, _props_defaultSelectedIndex, _props_tabBarBackground, _props_indicatorColor, _props_frameCornerRadius, _props_contentPadding, _props_className;
|
|
14
|
+
const items = props.items;
|
|
15
|
+
const tabStyle = null != (_props_tabStyle = props.tabStyle) ? _props_tabStyle : 'underlined';
|
|
16
|
+
const mode = null != (_props_mode = props.mode) ? _props_mode : 'fixed';
|
|
17
|
+
const barPosition = null != (_props_barPosition = props.barPosition) ? _props_barPosition : 'top';
|
|
18
|
+
const tabHeight = null != (_props_tabHeight = props.tabHeight) ? _props_tabHeight : g9TabViewMetrics.tabHeight;
|
|
19
|
+
const rtl = 'rtl' === useG9Direction();
|
|
20
|
+
const culture = useG9Culture();
|
|
21
|
+
const [selected, setSelected] = useControllableState({
|
|
22
|
+
value: props.selectedIndex,
|
|
23
|
+
defaultValue: null != (_props_defaultSelectedIndex = props.defaultSelectedIndex) ? _props_defaultSelectedIndex : 0,
|
|
24
|
+
onChange: props.onSelectionChange,
|
|
25
|
+
name: 'G9TabView.selectedIndex'
|
|
26
|
+
});
|
|
27
|
+
const count = items.length;
|
|
28
|
+
const effective = effectiveTabIndex(selected, count);
|
|
29
|
+
const keys = items.map((item, i)=>tabKey(item, i));
|
|
30
|
+
const activeKey = effective >= 0 ? keys[effective] : null;
|
|
31
|
+
const eager = true === props.eagerContent;
|
|
32
|
+
const eagerRef = useRef(eager);
|
|
33
|
+
eagerRef.current = eager;
|
|
34
|
+
const realizer = useMemo(()=>new G9TabRealizer(()=>eagerRef.current), []);
|
|
35
|
+
realizer.retain(keys);
|
|
36
|
+
const [, setVersion] = useState(0);
|
|
37
|
+
const [pending, setPending] = useState(null);
|
|
38
|
+
useEffect(()=>{
|
|
39
|
+
if (null === activeKey || props.headerOnly) return void setPending(null);
|
|
40
|
+
const token = realizer.activate(activeKey);
|
|
41
|
+
if ('shown' === token) return void setPending(null);
|
|
42
|
+
setPending(activeKey);
|
|
43
|
+
const t = startTimer(()=>{
|
|
44
|
+
if (realizer.realize(token)) {
|
|
45
|
+
setPending(null);
|
|
46
|
+
setVersion((v)=>v + 1);
|
|
47
|
+
}
|
|
48
|
+
}, g9TabViewMetrics.lazyRealizeDelayMs);
|
|
49
|
+
return ()=>stopTimer(t);
|
|
50
|
+
}, [
|
|
51
|
+
activeKey,
|
|
52
|
+
props.headerOnly
|
|
53
|
+
]);
|
|
54
|
+
const previous = useRef(-1);
|
|
55
|
+
const [reveal, setReveal] = useState({
|
|
56
|
+
key: activeKey,
|
|
57
|
+
from: 0,
|
|
58
|
+
settled: true
|
|
59
|
+
});
|
|
60
|
+
useEffect(()=>{
|
|
61
|
+
const prev = previous.current;
|
|
62
|
+
previous.current = effective;
|
|
63
|
+
if (prev === effective || prev < 0) return;
|
|
64
|
+
setReveal({
|
|
65
|
+
key: activeKey,
|
|
66
|
+
from: tabContentSlideFrom(prev, effective, rtl),
|
|
67
|
+
settled: false
|
|
68
|
+
});
|
|
69
|
+
const t = startTimer(()=>setReveal((r)=>({
|
|
70
|
+
...r,
|
|
71
|
+
settled: true
|
|
72
|
+
})), 16);
|
|
73
|
+
return ()=>stopTimer(t);
|
|
74
|
+
}, [
|
|
75
|
+
effective
|
|
76
|
+
]);
|
|
77
|
+
const select = (index)=>{
|
|
78
|
+
if (index !== effective) setSelected(index);
|
|
79
|
+
};
|
|
80
|
+
const pager = useRef(null);
|
|
81
|
+
const swipe = true === props.swipeEnabled && !props.headerOnly;
|
|
82
|
+
const order = tabVisualOrder(count, rtl);
|
|
83
|
+
const visualIndex = order.indexOf(effective);
|
|
84
|
+
useEffect(()=>{
|
|
85
|
+
if (!swipe || visualIndex < 0) return;
|
|
86
|
+
try {
|
|
87
|
+
var _pager_current;
|
|
88
|
+
null == (_pager_current = pager.current) || _pager_current.scrollToPage(visualIndex, true);
|
|
89
|
+
} catch {}
|
|
90
|
+
}, [
|
|
91
|
+
visualIndex,
|
|
92
|
+
swipe
|
|
93
|
+
]);
|
|
94
|
+
const bar = <TabBarStrip items={items} order={order} effective={effective} tabStyle={tabStyle} mode={mode} tabHeight={tabHeight} background={null != (_props_tabBarBackground = props.tabBarBackground) ? _props_tabBarBackground : null} indicatorColor={null != (_props_indicatorColor = props.indicatorColor) ? _props_indicatorColor : null} numbering={culture.numberingSystem} onSelect={select}/>;
|
|
95
|
+
const bodyOf = (index)=>{
|
|
96
|
+
const item = items[index];
|
|
97
|
+
const key = keys[index];
|
|
98
|
+
const active = index === effective;
|
|
99
|
+
if (!realizer.isRealized(key)) return active && pending === key ? <Spinner/> : null;
|
|
100
|
+
const revealing = active && reveal.key === key && !reveal.settled;
|
|
101
|
+
const style = {
|
|
102
|
+
display: active || swipe ? 'flex' : 'none',
|
|
103
|
+
transform: `translateX(${revealing ? reveal.from : 0}px)`,
|
|
104
|
+
opacity: revealing ? 0 : 1,
|
|
105
|
+
transition: revealing || swipe ? 'none' : `transform ${g9TabViewMetrics.contentTransitionMs}ms ease-out, opacity ${g9TabViewMetrics.contentTransitionMs}ms ease-out`
|
|
106
|
+
};
|
|
107
|
+
const content = 'function' == typeof item.content ? item.content() : item.content;
|
|
108
|
+
return <view key={key} className={`g9-tabs__panel${active ? ' g9-tabs__panel--active' : ''}`} style={style}>
|
|
109
|
+
{content}
|
|
110
|
+
</view>;
|
|
111
|
+
};
|
|
112
|
+
const frame = props.showFrame ? {
|
|
113
|
+
borderWidth: '1px',
|
|
114
|
+
borderStyle: 'solid',
|
|
115
|
+
borderColor: 'var(--g9-outline-variant)',
|
|
116
|
+
borderRadius: `${null != (_props_frameCornerRadius = props.frameCornerRadius) ? _props_frameCornerRadius : 0}px`
|
|
117
|
+
} : {};
|
|
118
|
+
const content = props.headerOnly ? null : <view className="g9-tabs__content" style={{
|
|
119
|
+
padding: thicknessCss(null != (_props_contentPadding = props.contentPadding) ? _props_contentPadding : g9TabViewMetrics.contentPadding),
|
|
120
|
+
...frame
|
|
121
|
+
}}>
|
|
122
|
+
{swipe ? <ViewPager ref={pager} className="g9-tabs__pager" data={order} getItemKey={(index)=>keys[index]} initialSelectIndex={Math.max(visualIndex, 0)} onPageChange={(event)=>{
|
|
123
|
+
const next = order[Number(event.detail.index)];
|
|
124
|
+
if (void 0 !== next) select(next);
|
|
125
|
+
}}>
|
|
126
|
+
{(index)=><view className="g9-tabs__page">{bodyOf(index)}</view>}
|
|
127
|
+
</ViewPager> : <>
|
|
128
|
+
{items.map((_, i)=>bodyOf(i))}
|
|
129
|
+
{null !== pending && pending === activeKey ? <Spinner/> : null}
|
|
130
|
+
</>}
|
|
131
|
+
</view>;
|
|
132
|
+
return <view className={`g9-tabs g9-tabs--${tabStyle} g9-tabs--${barPosition}${props.headerOnly ? ' g9-tabs--header-only' : ''} ${null != (_props_className = props.className) ? _props_className : ''}`}>
|
|
133
|
+
{'bottom' === barPosition ? content : null}
|
|
134
|
+
{bar}
|
|
135
|
+
{'top' === barPosition ? content : null}
|
|
136
|
+
</view>;
|
|
137
|
+
}
|
|
138
|
+
function Spinner() {
|
|
139
|
+
return <view className="g9-tabs__spinner">
|
|
140
|
+
<G9ActivityIndicator running size={24}/>
|
|
141
|
+
</view>;
|
|
142
|
+
}
|
|
143
|
+
function TabBarStrip(props) {
|
|
144
|
+
var _props_indicatorColor, _props_background;
|
|
145
|
+
const { items, order, effective, tabStyle, mode } = props;
|
|
146
|
+
const count = order.length;
|
|
147
|
+
const pill = 'pill' === tabStyle;
|
|
148
|
+
const direction = useG9Direction();
|
|
149
|
+
const indicator = null != (_props_indicatorColor = props.indicatorColor) ? _props_indicatorColor : 'var(--g9-primary)';
|
|
150
|
+
const fixed = 'fixed' === mode;
|
|
151
|
+
const cellRefs = useRef([]);
|
|
152
|
+
useEffect(()=>{
|
|
153
|
+
var _cellRefs_current_effective;
|
|
154
|
+
if (fixed || effective < 0) return;
|
|
155
|
+
invokeNodeWhenReady({
|
|
156
|
+
current: null != (_cellRefs_current_effective = cellRefs.current[effective]) ? _cellRefs_current_effective : null
|
|
157
|
+
}, 'scrollIntoView', {
|
|
158
|
+
scrollIntoViewOptions: {
|
|
159
|
+
behavior: 'smooth',
|
|
160
|
+
block: 'center',
|
|
161
|
+
inline: 'center'
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}, [
|
|
165
|
+
effective,
|
|
166
|
+
fixed
|
|
167
|
+
]);
|
|
168
|
+
const cells = order.map((index, position)=>{
|
|
169
|
+
var _props_indicatorColor, _item_text, _item_badgeColor, _item_badgeColor1;
|
|
170
|
+
const item = items[index];
|
|
171
|
+
const active = index === effective;
|
|
172
|
+
const badge = tabBadge(item, props.numbering);
|
|
173
|
+
const textColor = active ? pill ? null != (_props_indicatorColor = props.indicatorColor) ? _props_indicatorColor : 'var(--g9-on-primary-container)' : 'var(--g9-on-surface)' : 'var(--g9-on-surface-variant)';
|
|
174
|
+
return <view key={tabKey(item, index)} ref={(node)=>{
|
|
175
|
+
cellRefs.current[index] = node;
|
|
176
|
+
}} className={`g9-tabs__cell${active ? ' g9-tabs__cell--active' : ''}`} style={fixed ? {
|
|
177
|
+
flex: '1'
|
|
178
|
+
} : {}} accessibility-element accessibility-traits="button" accessibility-label={null != (_item_text = item.text) ? _item_text : ''} bindtap={()=>props.onSelect(index)}>
|
|
179
|
+
{}
|
|
180
|
+
{!fixed && active ? <view className={pill ? 'g9-tabs__cell-pill' : 'g9-tabs__cell-underline'} style={pill ? {} : {
|
|
181
|
+
backgroundColor: indicator
|
|
182
|
+
}}/> : null}
|
|
183
|
+
{position > 0 && !pill ? <view className="g9-tabs__separator"/> : null}
|
|
184
|
+
<view className="g9-tabs__cell-row" style={g9RowStyle(direction)}>
|
|
185
|
+
<G9IconSlot emoji={item.emoji} icon={item.icon} imagePath={item.imagePath} image={item.image} size={18} color={textColor}/>
|
|
186
|
+
{item.text ? <text className="g9-tabs__label" style={{
|
|
187
|
+
color: textColor,
|
|
188
|
+
fontWeight: active ? '600' : '400'
|
|
189
|
+
}}>
|
|
190
|
+
{item.text}
|
|
191
|
+
</text> : null}
|
|
192
|
+
{'dot' === badge ? <view className="g9-tabs__badge-dot" style={{
|
|
193
|
+
backgroundColor: null != (_item_badgeColor = item.badgeColor) ? _item_badgeColor : 'var(--g9-error)'
|
|
194
|
+
}}/> : null !== badge ? <view className="g9-tabs__badge" style={{
|
|
195
|
+
backgroundColor: null != (_item_badgeColor1 = item.badgeColor) ? _item_badgeColor1 : 'var(--g9-error)'
|
|
196
|
+
}}>
|
|
197
|
+
<text className="g9-tabs__badge-text">{badge}</text>
|
|
198
|
+
</view> : null}
|
|
199
|
+
</view>
|
|
200
|
+
</view>;
|
|
201
|
+
});
|
|
202
|
+
const position = order.indexOf(effective);
|
|
203
|
+
const slider = fixed && position >= 0 ? <view className={pill ? 'g9-tabs__pill' : 'g9-tabs__underline'} style={{
|
|
204
|
+
left: `${100 * position / count}%`,
|
|
205
|
+
width: `${100 / count}%`,
|
|
206
|
+
transition: `left ${g9TabViewMetrics.indicatorMoveMs}ms cubic-bezier(0.215, 0.61, 0.355, 1)`
|
|
207
|
+
}}>
|
|
208
|
+
<view className={pill ? 'g9-tabs__pill-fill' : 'g9-tabs__underline-fill'} style={pill ? {} : {
|
|
209
|
+
backgroundColor: indicator
|
|
210
|
+
}}/>
|
|
211
|
+
</view> : null;
|
|
212
|
+
const barStyle = {
|
|
213
|
+
height: `${props.tabHeight}px`,
|
|
214
|
+
backgroundColor: null != (_props_background = props.background) ? _props_background : pill ? 'var(--g9-surface-container-low)' : 'transparent'
|
|
215
|
+
};
|
|
216
|
+
return <view className="g9-tabs__bar" style={barStyle}>
|
|
217
|
+
{fixed ? <view className="g9-tabs__cells">
|
|
218
|
+
{slider}
|
|
219
|
+
{cells}
|
|
220
|
+
</view> : <scroll-view className="g9-tabs__scroller" scroll-orientation="horizontal">
|
|
221
|
+
<view className="g9-tabs__cells g9-tabs__cells--scrollable">{cells}</view>
|
|
222
|
+
</scroll-view>}
|
|
223
|
+
</view>;
|
|
224
|
+
}
|
|
225
|
+
export { G9TabView };
|
|
226
|
+
|
|
227
|
+
//# sourceMappingURL=tab-view.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs/tab-view.jsx","sources":["../../src/tabs/tab-view.tsx"],"sourcesContent":["import './tabs.css';\nimport { ViewPager, type ViewPagerRef } from '@lynx-js/lynx-ui-view-pager';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from '@lynx-js/react';\nimport { g9RowStyle } from '../base/control';\nimport { startTimer, stopTimer } from '../base/timers';\nimport { useControllableState } from '../base/use-controllable-state';\nimport { G9ActivityIndicator } from '../display/activity-indicator';\nimport { type G9NodeRef, invokeNodeWhenReady } from '../fields/use-text-input';\nimport { G9IconSlot } from '../icon/slot';\nimport { useG9Culture, useG9Direction } from '../provider/hooks';\nimport {\n effectiveTabIndex,\n type G9TabBarPosition,\n type G9TabItem,\n type G9TabMode,\n G9TabRealizer,\n type G9TabStyle,\n g9TabViewMetrics,\n tabBadge,\n tabContentSlideFrom,\n tabKey,\n tabVisualOrder,\n thicknessCss,\n} from './model';\n\n/** Props of {@link G9TabView}. */\nexport interface G9TabViewProps {\n /** The tabs (MAUI `Items`). Add, remove or reorder freely; give tabs a `key` so their bodies follow them. */\n readonly items: readonly G9TabItem[];\n /** Controlled selection (MAUI `SelectedIndex`, two-way). Out-of-range values show the nearest tab. */\n readonly selectedIndex?: number;\n /** Initial selection while uncontrolled. Default 0. */\n readonly defaultSelectedIndex?: number;\n /** A tab was chosen by a tap or a swipe (MAUI `SelectionChanged`). */\n readonly onSelectionChange?: (index: number) => void;\n /** Bar height (MAUI `TabHeight`). Default 52. */\n readonly tabHeight?: number;\n /** Bar background (MAUI `TabBarBackground`). Default transparent (underlined) / surface-container-low (pill). */\n readonly tabBarBackground?: string | null;\n /** Underline colour (underlined) or active text colour (pill) (MAUI `IndicatorColor`). Default primary. */\n readonly indicatorColor?: string | null;\n /** `'fixed'` (default): equal full-width cells. `'scrollable'`: auto-width cells that scroll. */\n readonly mode?: G9TabMode;\n /** `'top'` (default) or `'bottom'`. */\n readonly barPosition?: G9TabBarPosition;\n /** `'underlined'` (default) or `'pill'` (MAUI `Style`). */\n readonly tabStyle?: G9TabStyle;\n /** Only the bar: no content panel; drive your own host from `onSelectionChange` (MAUI `HeaderOnly`). */\n readonly headerOnly?: boolean;\n /** Border and rounded corners around the content (MAUI `ShowFrame`). Default false. */\n readonly showFrame?: boolean;\n /** Content border radius when `showFrame` (MAUI `FrameCornerRadius`). Default 0. */\n readonly frameCornerRadius?: number;\n /** Inset around the active body (MAUI `ContentPadding`): one value, `[h, v]` or `[l, t, r, b]`. Default 10,10,10,0. */\n readonly contentPadding?: number | readonly number[];\n /** Build every body up front instead of lazily on first activation (MAUI `EagerContent`). Default false. */\n readonly eagerContent?: boolean;\n /** Swipe between bodies (lynx-ui ViewPager). A Lynx addition; default false, as in MAUI. */\n readonly swipeEnabled?: boolean;\n readonly className?: string;\n}\n\n/**\n * Tabs with a bar and lazily realized bodies (MAUI `G9TabView`). Underlined (default) or pill style, fixed or\n * scrollable cells, bar on top or bottom, header-only; the indicator slides between cells; bodies are built on first\n * activation (spinner, then {@link g9TabViewMetrics} `lazyRealizeDelayMs`) and kept, hidden, so scroll and form state\n * survive; RTL reverses the cell order. With `swipeEnabled` the bodies sit in a lynx-ui ViewPager.\n */\nexport function G9TabView(props: G9TabViewProps): ReactNode {\n const items = props.items;\n const tabStyle = props.tabStyle ?? 'underlined';\n const mode = props.mode ?? 'fixed';\n const barPosition = props.barPosition ?? 'top';\n const tabHeight = props.tabHeight ?? g9TabViewMetrics.tabHeight;\n const rtl = useG9Direction() === 'rtl';\n const culture = useG9Culture();\n const [selected, setSelected] = useControllableState<number>({\n value: props.selectedIndex,\n defaultValue: props.defaultSelectedIndex ?? 0,\n onChange: props.onSelectionChange,\n name: 'G9TabView.selectedIndex',\n });\n const count = items.length;\n const effective = effectiveTabIndex(selected, count);\n const keys = items.map((item, i) => tabKey(item, i));\n const activeKey = effective >= 0 ? (keys[effective] as string) : null;\n\n const eager = props.eagerContent === true;\n const eagerRef = useRef(eager);\n eagerRef.current = eager;\n const realizer = useMemo(() => new G9TabRealizer(() => eagerRef.current), []);\n realizer.retain(keys);\n const [, setVersion] = useState(0);\n const [pending, setPending] = useState<string | null>(null);\n\n // Lazy-once realization of the active body; rapid switches realize only the latest.\n useEffect(() => {\n if (activeKey === null || props.headerOnly) {\n setPending(null);\n return;\n }\n const token = realizer.activate(activeKey);\n if (token === 'shown') {\n setPending(null);\n return;\n }\n setPending(activeKey);\n const t = startTimer(() => {\n if (realizer.realize(token)) {\n setPending(null);\n setVersion((v) => v + 1);\n }\n }, g9TabViewMetrics.lazyRealizeDelayMs);\n return () => stopTimer(t);\n }, [activeKey, props.headerOnly]);\n\n // Directional reveal of the newly active body (6 px slide + fade, 160 ms CubicOut).\n const previous = useRef(-1);\n const [reveal, setReveal] = useState<{ key: string | null; from: number; settled: boolean }>({\n key: activeKey,\n from: 0,\n settled: true,\n });\n useEffect(() => {\n const prev = previous.current;\n previous.current = effective;\n if (prev === effective || prev < 0) return;\n setReveal({ key: activeKey, from: tabContentSlideFrom(prev, effective, rtl), settled: false });\n const t = startTimer(() => setReveal((r) => ({ ...r, settled: true })), 16);\n return () => stopTimer(t);\n }, [effective]);\n\n const select = (index: number) => {\n if (index !== effective) setSelected(index);\n };\n\n const pager = useRef<ViewPagerRef | null>(null);\n const swipe = props.swipeEnabled === true && !props.headerOnly;\n const order = tabVisualOrder(count, rtl);\n const visualIndex = order.indexOf(effective);\n useEffect(() => {\n if (!swipe || visualIndex < 0) return;\n try {\n pager.current?.scrollToPage(visualIndex, true);\n } catch {\n // The pager is gone (unmounted mid-switch).\n }\n }, [visualIndex, swipe]);\n\n const bar = (\n <TabBarStrip\n items={items}\n order={order}\n effective={effective}\n tabStyle={tabStyle}\n mode={mode}\n tabHeight={tabHeight}\n background={props.tabBarBackground ?? null}\n indicatorColor={props.indicatorColor ?? null}\n numbering={culture.numberingSystem}\n onSelect={select}\n />\n );\n\n const bodyOf = (index: number): ReactNode => {\n const item = items[index] as G9TabItem;\n const key = keys[index] as string;\n const active = index === effective;\n if (!realizer.isRealized(key)) {\n return active && pending === key ? <Spinner /> : null;\n }\n const revealing = active && reveal.key === key && !reveal.settled;\n const style = {\n display: (active || swipe ? 'flex' : 'none') as 'flex' | 'none',\n transform: `translateX(${revealing ? reveal.from : 0}px)`,\n opacity: revealing ? 0 : 1,\n transition:\n revealing || swipe\n ? 'none'\n : `transform ${g9TabViewMetrics.contentTransitionMs}ms ease-out, opacity ${g9TabViewMetrics.contentTransitionMs}ms ease-out`,\n };\n const content = typeof item.content === 'function' ? (item.content as () => ReactNode)() : item.content;\n return (\n <view key={key} className={`g9-tabs__panel${active ? ' g9-tabs__panel--active' : ''}`} style={style}>\n {content}\n </view>\n );\n };\n\n const frame = props.showFrame\n ? {\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'var(--g9-outline-variant)',\n borderRadius: `${props.frameCornerRadius ?? 0}px`,\n }\n : {};\n const content = props.headerOnly ? null : (\n <view\n className=\"g9-tabs__content\"\n style={{ padding: thicknessCss(props.contentPadding ?? g9TabViewMetrics.contentPadding), ...frame }}\n >\n {swipe ? (\n <ViewPager\n ref={pager}\n className=\"g9-tabs__pager\"\n data={order}\n getItemKey={(index: number) => keys[index] as string}\n initialSelectIndex={Math.max(visualIndex, 0)}\n onPageChange={(event) => {\n const next = order[Number(event.detail.index)];\n if (next !== undefined) select(next);\n }}\n >\n {(index: number) => <view className=\"g9-tabs__page\">{bodyOf(index)}</view>}\n </ViewPager>\n ) : (\n <>\n {items.map((_, i) => bodyOf(i))}\n {pending !== null && pending === activeKey ? <Spinner /> : null}\n </>\n )}\n </view>\n );\n\n return (\n <view\n className={`g9-tabs g9-tabs--${tabStyle} g9-tabs--${barPosition}${props.headerOnly ? ' g9-tabs--header-only' : ''} ${props.className ?? ''}`}\n >\n {barPosition === 'bottom' ? content : null}\n {bar}\n {barPosition === 'top' ? content : null}\n </view>\n );\n}\n\nfunction Spinner(): ReactNode {\n return (\n <view className=\"g9-tabs__spinner\">\n <G9ActivityIndicator running size={24} />\n </view>\n );\n}\n\ninterface StripProps {\n readonly items: readonly G9TabItem[];\n readonly order: readonly number[];\n readonly effective: number;\n readonly tabStyle: G9TabStyle;\n readonly mode: G9TabMode;\n readonly tabHeight: number;\n readonly background: string | null;\n readonly indicatorColor: string | null;\n readonly numbering: Parameters<typeof tabBadge>[1];\n readonly onSelect: (index: number) => void;\n}\n\nfunction TabBarStrip(props: StripProps): ReactNode {\n const { items, order, effective, tabStyle, mode } = props;\n const count = order.length;\n const pill = tabStyle === 'pill';\n const direction = useG9Direction();\n const indicator = props.indicatorColor ?? 'var(--g9-primary)';\n const fixed = mode === 'fixed';\n const cellRefs = useRef<Array<G9NodeRef | null>>([]);\n useEffect(() => {\n if (fixed || effective < 0) return;\n invokeNodeWhenReady({ current: cellRefs.current[effective] ?? null }, 'scrollIntoView', {\n scrollIntoViewOptions: { behavior: 'smooth', block: 'center', inline: 'center' },\n });\n }, [effective, fixed]);\n\n const cells = order.map((index, position) => {\n const item = items[index] as G9TabItem;\n const active = index === effective;\n const badge = tabBadge(item, props.numbering);\n const textColor = active\n ? pill\n ? (props.indicatorColor ?? 'var(--g9-on-primary-container)')\n : 'var(--g9-on-surface)'\n : 'var(--g9-on-surface-variant)';\n return (\n <view\n key={tabKey(item, index)}\n ref={(node: G9NodeRef | null) => {\n cellRefs.current[index] = node;\n }}\n className={`g9-tabs__cell${active ? ' g9-tabs__cell--active' : ''}`}\n style={fixed ? { flex: '1' } : {}}\n accessibility-element\n accessibility-traits=\"button\"\n accessibility-label={item.text ?? ''}\n bindtap={() => props.onSelect(index)}\n >\n {/* Sibling order is paint order in Lynx: the active pill goes first, behind the label. */}\n {!fixed && active ? (\n <view\n className={pill ? 'g9-tabs__cell-pill' : 'g9-tabs__cell-underline'}\n style={pill ? {} : { backgroundColor: indicator }}\n />\n ) : null}\n {position > 0 && !pill ? <view className=\"g9-tabs__separator\" /> : null}\n <view className=\"g9-tabs__cell-row\" style={g9RowStyle(direction)}>\n <G9IconSlot\n emoji={item.emoji}\n icon={item.icon}\n imagePath={item.imagePath}\n image={item.image}\n size={18}\n color={textColor}\n />\n {item.text ? (\n <text className=\"g9-tabs__label\" style={{ color: textColor, fontWeight: active ? '600' : '400' }}>\n {item.text}\n </text>\n ) : null}\n {badge === 'dot' ? (\n <view className=\"g9-tabs__badge-dot\" style={{ backgroundColor: item.badgeColor ?? 'var(--g9-error)' }} />\n ) : badge !== null ? (\n <view className=\"g9-tabs__badge\" style={{ backgroundColor: item.badgeColor ?? 'var(--g9-error)' }}>\n <text className=\"g9-tabs__badge-text\">{badge}</text>\n </view>\n ) : null}\n </view>\n </view>\n );\n });\n\n const position = order.indexOf(effective);\n const slider =\n fixed && position >= 0 ? (\n <view\n className={pill ? 'g9-tabs__pill' : 'g9-tabs__underline'}\n style={{\n left: `${(position * 100) / count}%`,\n width: `${100 / count}%`,\n transition: `left ${g9TabViewMetrics.indicatorMoveMs}ms cubic-bezier(0.215, 0.61, 0.355, 1)`,\n }}\n >\n <view\n className={pill ? 'g9-tabs__pill-fill' : 'g9-tabs__underline-fill'}\n style={pill ? {} : { backgroundColor: indicator }}\n />\n </view>\n ) : null;\n\n const barStyle = {\n height: `${props.tabHeight}px`,\n backgroundColor: props.background ?? (pill ? 'var(--g9-surface-container-low)' : 'transparent'),\n };\n return (\n <view className=\"g9-tabs__bar\" style={barStyle}>\n {fixed ? (\n <view className=\"g9-tabs__cells\">\n {slider}\n {cells}\n </view>\n ) : (\n <scroll-view className=\"g9-tabs__scroller\" scroll-orientation=\"horizontal\">\n <view className=\"g9-tabs__cells g9-tabs__cells--scrollable\">{cells}</view>\n </scroll-view>\n )}\n </view>\n );\n}\n"],"names":["G9TabView","props","_props_tabStyle","_props_mode","_props_barPosition","_props_tabHeight","_props_defaultSelectedIndex","_props_tabBarBackground","_props_indicatorColor","_props_frameCornerRadius","_props_contentPadding","_props_className","items","tabStyle","mode","barPosition","tabHeight","g9TabViewMetrics","rtl","useG9Direction","culture","useG9Culture","selected","setSelected","useControllableState","count","effective","effectiveTabIndex","keys","item","i","tabKey","activeKey","eager","eagerRef","useRef","realizer","useMemo","G9TabRealizer","setVersion","useState","pending","setPending","useEffect","token","t","startTimer","v","stopTimer","previous","reveal","setReveal","prev","tabContentSlideFrom","r","select","index","pager","swipe","order","tabVisualOrder","visualIndex","_pager_current","bar","TabBarStrip","bodyOf","key","active","Spinner","revealing","style","content","view","frame","thicknessCss","ViewPager","Math","event","next","Number","undefined","_","G9ActivityIndicator","_props_background","pill","direction","indicator","fixed","cellRefs","_cellRefs_current_effective","invokeNodeWhenReady","cells","position","_item_text","_item_badgeColor","_item_badgeColor1","badge","tabBadge","textColor","node","g9RowStyle","G9IconSlot","text","slider","barStyle","scroll-view"],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
.g9-tabs {
|
|
2
|
+
flex-direction: column;
|
|
3
|
+
width: 100%;
|
|
4
|
+
display: flex;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.g9-tabs--header-only {
|
|
8
|
+
flex: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.g9-tabs__bar {
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
width: 100%;
|
|
14
|
+
position: relative;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.g9-tabs__content {
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
flex: 1;
|
|
20
|
+
display: flex;
|
|
21
|
+
position: relative;
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.g9-tabs--underlined .g9-tabs__bar {
|
|
26
|
+
border-top: 1px solid var(--g9-divider);
|
|
27
|
+
border-bottom: 1px solid var(--g9-divider);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.g9-tabs--pill .g9-tabs__bar {
|
|
31
|
+
border-radius: 26px;
|
|
32
|
+
padding: 4px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.g9-tabs--pill.g9-tabs--top .g9-tabs__content {
|
|
36
|
+
margin-top: 8px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.g9-tabs--pill.g9-tabs--bottom .g9-tabs__content {
|
|
40
|
+
margin-bottom: 8px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.g9-tabs__cells {
|
|
44
|
+
flex-direction: row;
|
|
45
|
+
width: 100%;
|
|
46
|
+
height: 100%;
|
|
47
|
+
display: flex;
|
|
48
|
+
position: relative;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.g9-tabs__cells--scrollable {
|
|
52
|
+
width: auto;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.g9-tabs__scroller {
|
|
56
|
+
width: 100%;
|
|
57
|
+
height: 100%;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.g9-tabs__cell {
|
|
61
|
+
justify-content: center;
|
|
62
|
+
align-items: center;
|
|
63
|
+
height: 100%;
|
|
64
|
+
padding: 0 14px;
|
|
65
|
+
display: flex;
|
|
66
|
+
position: relative;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.g9-tabs__cell-row {
|
|
70
|
+
flex-direction: row;
|
|
71
|
+
justify-content: center;
|
|
72
|
+
align-items: center;
|
|
73
|
+
gap: 6px;
|
|
74
|
+
display: flex;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.g9-tabs__label {
|
|
78
|
+
font-size: 14px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.g9-tabs__separator {
|
|
82
|
+
background-color: var(--g9-divider);
|
|
83
|
+
width: 1px;
|
|
84
|
+
position: absolute;
|
|
85
|
+
top: 12px;
|
|
86
|
+
bottom: 12px;
|
|
87
|
+
left: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.g9-tabs__badge {
|
|
91
|
+
border-radius: 9px;
|
|
92
|
+
justify-content: center;
|
|
93
|
+
align-items: center;
|
|
94
|
+
min-width: 18px;
|
|
95
|
+
height: 18px;
|
|
96
|
+
padding: 0 5px;
|
|
97
|
+
display: flex;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.g9-tabs__badge-text {
|
|
101
|
+
color: var(--g9-on-error);
|
|
102
|
+
font-size: 11px;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.g9-tabs__badge-dot {
|
|
107
|
+
border-radius: 3.5px;
|
|
108
|
+
width: 7px;
|
|
109
|
+
height: 7px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.g9-tabs__underline {
|
|
113
|
+
flex-direction: row;
|
|
114
|
+
justify-content: center;
|
|
115
|
+
height: 2.5px;
|
|
116
|
+
display: flex;
|
|
117
|
+
position: absolute;
|
|
118
|
+
bottom: 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.g9-tabs__underline-fill, .g9-tabs__cell-underline {
|
|
122
|
+
width: 100%;
|
|
123
|
+
height: 2.5px;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.g9-tabs__cell-underline {
|
|
127
|
+
position: absolute;
|
|
128
|
+
bottom: 0;
|
|
129
|
+
left: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.g9-tabs__pill {
|
|
133
|
+
display: flex;
|
|
134
|
+
position: absolute;
|
|
135
|
+
top: 2px;
|
|
136
|
+
bottom: 2px;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.g9-tabs__pill-fill, .g9-tabs__cell-pill {
|
|
140
|
+
background-color: var(--g9-primary-container);
|
|
141
|
+
border: 1px solid var(--g9-primary-border);
|
|
142
|
+
border-radius: 18px;
|
|
143
|
+
width: 100%;
|
|
144
|
+
height: 100%;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.g9-tabs__cell-pill {
|
|
148
|
+
height: auto;
|
|
149
|
+
position: absolute;
|
|
150
|
+
top: 2px;
|
|
151
|
+
bottom: 2px;
|
|
152
|
+
left: 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.g9-tabs__panel {
|
|
156
|
+
flex-direction: column;
|
|
157
|
+
flex: 1;
|
|
158
|
+
width: 100%;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.g9-tabs__pager {
|
|
162
|
+
flex: 1;
|
|
163
|
+
height: 100%;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.g9-tabs__page {
|
|
167
|
+
flex-direction: column;
|
|
168
|
+
flex: 1;
|
|
169
|
+
width: 100%;
|
|
170
|
+
display: flex;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.g9-tabs__spinner {
|
|
174
|
+
justify-content: center;
|
|
175
|
+
align-items: center;
|
|
176
|
+
width: 100%;
|
|
177
|
+
min-height: 72px;
|
|
178
|
+
display: flex;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
/*# sourceMappingURL=tabs.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack://./src/tabs/tabs.css"],"names":[],"mappings":"AACA;EAAE,sBAAsB;EACtB,WAAW;EACX,aAAa;AACf;;AAGA;EAAE,UAAU;AACZ;;AAGA;EAAE,cAAc;EACd,WAAW;EACX,kBAAkB;AACpB;;AAGA;EAAE,sBAAsB;EACtB,OAAO;EACP,aAAa;EACb,kBAAkB;EAClB,gBAAgB;AAClB;;AAGA;EAAE,uCAAuC;EACvC,0CAA0C;AAC5C;;AAGA;EAAE,mBAAmB;EACnB,YAAY;AACd;;AAGA;EAAE,eAAe;AACjB;;AAGA;EAAE,kBAAkB;AACpB;;AAGA;EAAE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;EACb,kBAAkB;AACpB;;AAGA;EAAE,WAAW;AACb;;AAGA;EAAE,WAAW;EACX,YAAY;AACd;;AAGA;EAAE,uBAAuB;EACvB,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,aAAa;EACb,kBAAkB;AACpB;;AAGA;EAAE,mBAAmB;EACnB,uBAAuB;EACvB,mBAAmB;EACnB,QAAQ;EACR,aAAa;AACf;;AAGA;EAAE,eAAe;AACjB;;AAGA;EAAE,mCAAmC;EACnC,UAAU;EACV,kBAAkB;EAClB,SAAS;EACT,YAAY;EACZ,OAAO;AACT;;AAGA;EAAE,kBAAkB;EAClB,uBAAuB;EACvB,mBAAmB;EACnB,eAAe;EACf,YAAY;EACZ,cAAc;EACd,aAAa;AACf;;AAGA;EAAE,yBAAyB;EACzB,eAAe;EACf,gBAAgB;AAClB;;AAGA;EAAE,oBAAoB;EACpB,UAAU;EACV,WAAW;AACb;;AAGA;EAAE,mBAAmB;EACnB,uBAAuB;EACvB,aAAa;EACb,aAAa;EACb,kBAAkB;EAClB,SAAS;AACX;;AAGA;EAAE,WAAW;EACX,aAAa;AACf;;AAIA;EADE,kBAAkB;EAClB,SAAS;EACT,OAAO;AACT;;AAIA;EADE,aAAa;EACb,kBAAkB;EAClB,QAAQ;EACR,WAAW;AACb;;AAIA;EADE,6CAA6C;EAC7C,0CAA0C;EAC1C,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAKA;EAFE,YAAY;EACZ,kBAAkB;EAClB,QAAQ;EACR,WAAW;EACX,OAAO;AACT;;AAKA;EAFE,sBAAsB;EACtB,OAAO;EACP,WAAW;AACb;;AAKA;EAFE,OAAO;EACP,YAAY;AACd;;AAKA;EAFE,sBAAsB;EACtB,OAAO;EACP,WAAW;EACX,aAAa;AACf;;AAKA;EAFE,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,gBAAgB;EAChB,aAAa;AACf","sourcesContent":["/* G9TabView (MAUI G9TabView): bar, sliding indicator, lazily realized bodies. No shadows (plan/specs/02 §2). */\n.g9-tabs {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.g9-tabs--header-only {\n flex: 0 0 auto;\n}\n\n.g9-tabs__bar {\n position: relative;\n width: 100%;\n flex-shrink: 0;\n}\n\n.g9-tabs__content {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.g9-tabs--underlined .g9-tabs__bar {\n border-top: 1px solid var(--g9-divider);\n border-bottom: 1px solid var(--g9-divider);\n}\n\n.g9-tabs--pill .g9-tabs__bar {\n border-radius: 26px;\n padding: 4px;\n}\n\n.g9-tabs--pill.g9-tabs--top .g9-tabs__content {\n margin-top: 8px;\n}\n\n.g9-tabs--pill.g9-tabs--bottom .g9-tabs__content {\n margin-bottom: 8px;\n}\n\n.g9-tabs__cells {\n position: relative;\n display: flex;\n flex-direction: row;\n height: 100%;\n width: 100%;\n}\n\n.g9-tabs__cells--scrollable {\n width: auto;\n}\n\n.g9-tabs__scroller {\n height: 100%;\n width: 100%;\n}\n\n.g9-tabs__cell {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 14px;\n}\n\n.g9-tabs__cell-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 6px;\n}\n\n.g9-tabs__label {\n font-size: 14px;\n}\n\n.g9-tabs__separator {\n position: absolute;\n left: 0;\n top: 12px;\n bottom: 12px;\n width: 1px;\n background-color: var(--g9-divider);\n}\n\n.g9-tabs__badge {\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.g9-tabs__badge-text {\n font-size: 11px;\n font-weight: 600;\n color: var(--g9-on-error);\n}\n\n.g9-tabs__badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 3.5px;\n}\n\n.g9-tabs__underline {\n position: absolute;\n bottom: 0;\n height: 2.5px;\n display: flex;\n flex-direction: row;\n justify-content: center;\n}\n\n.g9-tabs__underline-fill,\n.g9-tabs__cell-underline {\n height: 2.5px;\n width: 100%;\n}\n\n.g9-tabs__cell-underline {\n position: absolute;\n left: 0;\n bottom: 0;\n}\n\n.g9-tabs__pill {\n position: absolute;\n top: 2px;\n bottom: 2px;\n display: flex;\n}\n\n.g9-tabs__pill-fill,\n.g9-tabs__cell-pill {\n width: 100%;\n height: 100%;\n border-radius: 18px;\n background-color: var(--g9-primary-container);\n border: 1px solid var(--g9-primary-border);\n}\n\n.g9-tabs__cell-pill {\n position: absolute;\n top: 2px;\n bottom: 2px;\n left: 0;\n height: auto;\n}\n\n.g9-tabs__panel {\n flex: 1;\n flex-direction: column;\n width: 100%;\n}\n\n.g9-tabs__pager {\n flex: 1;\n height: 100%;\n}\n\n.g9-tabs__page {\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.g9-tabs__spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 72px;\n width: 100%;\n}\n"],"sourceRoot":""}
|