@textui/widgets 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/dist/chart/area-chart.d.ts +4 -0
- package/dist/chart/area-chart.d.ts.map +1 -0
- package/dist/chart/area-chart.js +3 -0
- package/dist/chart/bar-chart.d.ts +32 -0
- package/dist/chart/bar-chart.d.ts.map +1 -0
- package/dist/chart/bar-chart.js +32 -0
- package/dist/chart/gauge.d.ts +26 -0
- package/dist/chart/gauge.d.ts.map +1 -0
- package/dist/chart/gauge.js +26 -0
- package/dist/chart/heatmap.d.ts +13 -0
- package/dist/chart/heatmap.d.ts.map +1 -0
- package/dist/chart/heatmap.js +27 -0
- package/dist/chart/histogram.d.ts +12 -0
- package/dist/chart/histogram.d.ts.map +1 -0
- package/dist/chart/histogram.js +22 -0
- package/dist/chart/index.d.ts +20 -0
- package/dist/chart/index.d.ts.map +1 -0
- package/dist/chart/index.js +32 -0
- package/dist/chart/line-chart.d.ts +7 -0
- package/dist/chart/line-chart.d.ts.map +1 -0
- package/dist/chart/line-chart.js +75 -0
- package/dist/chart/shared.d.ts +34 -0
- package/dist/chart/shared.d.ts.map +1 -0
- package/dist/chart/shared.js +78 -0
- package/dist/chart/sparkline.d.ts +15 -0
- package/dist/chart/sparkline.d.ts.map +1 -0
- package/dist/chart/sparkline.js +22 -0
- package/dist/control/button.d.ts +27 -0
- package/dist/control/button.d.ts.map +1 -0
- package/dist/control/button.js +130 -0
- package/dist/control/checkbox.d.ts +10 -0
- package/dist/control/checkbox.d.ts.map +1 -0
- package/dist/control/checkbox.js +31 -0
- package/dist/control/index.d.ts +20 -0
- package/dist/control/index.d.ts.map +1 -0
- package/dist/control/index.js +36 -0
- package/dist/control/radio-group.d.ts +17 -0
- package/dist/control/radio-group.d.ts.map +1 -0
- package/dist/control/radio-group.js +32 -0
- package/dist/control/search-box.d.ts +7 -0
- package/dist/control/search-box.d.ts.map +1 -0
- package/dist/control/search-box.js +3 -0
- package/dist/control/select.d.ts +42 -0
- package/dist/control/select.d.ts.map +1 -0
- package/dist/control/select.js +166 -0
- package/dist/control/shared.d.ts +41 -0
- package/dist/control/shared.d.ts.map +1 -0
- package/dist/control/shared.js +1 -0
- package/dist/control/slider.d.ts +14 -0
- package/dist/control/slider.d.ts.map +1 -0
- package/dist/control/slider.js +45 -0
- package/dist/control/switch.d.ts +10 -0
- package/dist/control/switch.d.ts.map +1 -0
- package/dist/control/switch.js +32 -0
- package/dist/control/text-area.d.ts +87 -0
- package/dist/control/text-area.d.ts.map +1 -0
- package/dist/control/text-area.js +299 -0
- package/dist/control/text-input.d.ts +10 -0
- package/dist/control/text-input.d.ts.map +1 -0
- package/dist/control/text-input.js +129 -0
- package/dist/data/code-viewer.d.ts +71 -0
- package/dist/data/code-viewer.d.ts.map +1 -0
- package/dist/data/code-viewer.js +232 -0
- package/dist/data/feed.d.ts +43 -0
- package/dist/data/feed.d.ts.map +1 -0
- package/dist/data/feed.js +178 -0
- package/dist/data/index.d.ts +54 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +187 -0
- package/dist/data/list.d.ts +31 -0
- package/dist/data/list.d.ts.map +1 -0
- package/dist/data/list.js +104 -0
- package/dist/data/log-viewer.d.ts +26 -0
- package/dist/data/log-viewer.d.ts.map +1 -0
- package/dist/data/log-viewer.js +69 -0
- package/dist/data/markdown-view.d.ts +31 -0
- package/dist/data/markdown-view.d.ts.map +1 -0
- package/dist/data/markdown-view.js +139 -0
- package/dist/data/pagination.d.ts +9 -0
- package/dist/data/pagination.d.ts.map +1 -0
- package/dist/data/pagination.js +18 -0
- package/dist/data/scroll-thumb.d.ts +15 -0
- package/dist/data/scroll-thumb.d.ts.map +1 -0
- package/dist/data/scroll-thumb.js +32 -0
- package/dist/data/shared.d.ts +12 -0
- package/dist/data/shared.d.ts.map +1 -0
- package/dist/data/shared.js +17 -0
- package/dist/data/tree.d.ts +35 -0
- package/dist/data/tree.d.ts.map +1 -0
- package/dist/data/tree.js +158 -0
- package/dist/decorations.d.ts +88 -0
- package/dist/decorations.d.ts.map +1 -0
- package/dist/decorations.js +135 -0
- package/dist/display/alert.d.ts +8 -0
- package/dist/display/alert.d.ts.map +1 -0
- package/dist/display/alert.js +12 -0
- package/dist/display/badge.d.ts +10 -0
- package/dist/display/badge.d.ts.map +1 -0
- package/dist/display/badge.js +21 -0
- package/dist/display/card.d.ts +8 -0
- package/dist/display/card.d.ts.map +1 -0
- package/dist/display/card.js +12 -0
- package/dist/display/empty-state.d.ts +10 -0
- package/dist/display/empty-state.d.ts.map +1 -0
- package/dist/display/empty-state.js +5 -0
- package/dist/display/error-state.d.ts +9 -0
- package/dist/display/error-state.d.ts.map +1 -0
- package/dist/display/error-state.js +7 -0
- package/dist/display/heading.d.ts +6 -0
- package/dist/display/heading.d.ts.map +1 -0
- package/dist/display/heading.js +8 -0
- package/dist/display/index.d.ts +25 -0
- package/dist/display/index.d.ts.map +1 -0
- package/dist/display/index.js +52 -0
- package/dist/display/key-value.d.ts +14 -0
- package/dist/display/key-value.d.ts.map +1 -0
- package/dist/display/key-value.js +11 -0
- package/dist/display/label.d.ts +6 -0
- package/dist/display/label.d.ts.map +1 -0
- package/dist/display/label.js +3 -0
- package/dist/display/marquee.d.ts +36 -0
- package/dist/display/marquee.d.ts.map +1 -0
- package/dist/display/marquee.js +55 -0
- package/dist/display/progress.d.ts +39 -0
- package/dist/display/progress.d.ts.map +1 -0
- package/dist/display/progress.js +46 -0
- package/dist/display/skeleton.d.ts +20 -0
- package/dist/display/skeleton.d.ts.map +1 -0
- package/dist/display/skeleton.js +20 -0
- package/dist/display/spinner.d.ts +7 -0
- package/dist/display/spinner.d.ts.map +1 -0
- package/dist/display/spinner.js +9 -0
- package/dist/display/status-dot.d.ts +8 -0
- package/dist/display/status-dot.d.ts.map +1 -0
- package/dist/display/status-dot.js +13 -0
- package/dist/display/timeline.d.ts +12 -0
- package/dist/display/timeline.d.ts.map +1 -0
- package/dist/display/timeline.js +22 -0
- package/dist/find.d.ts +74 -0
- package/dist/find.d.ts.map +1 -0
- package/dist/find.js +102 -0
- package/dist/form/danger-zone.d.ts +11 -0
- package/dist/form/danger-zone.d.ts.map +1 -0
- package/dist/form/danger-zone.js +15 -0
- package/dist/form/field.d.ts +19 -0
- package/dist/form/field.d.ts.map +1 -0
- package/dist/form/field.js +35 -0
- package/dist/form/form-actions.d.ts +11 -0
- package/dist/form/form-actions.d.ts.map +1 -0
- package/dist/form/form-actions.js +16 -0
- package/dist/form/form-section.d.ts +7 -0
- package/dist/form/form-section.d.ts.map +1 -0
- package/dist/form/form-section.js +5 -0
- package/dist/form/form.d.ts +7 -0
- package/dist/form/form.d.ts.map +1 -0
- package/dist/form/form.js +3 -0
- package/dist/form/index.d.ts +42 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/form/index.js +140 -0
- package/dist/form/shared.d.ts +25 -0
- package/dist/form/shared.d.ts.map +1 -0
- package/dist/form/shared.js +9 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/layout/center.d.ts +7 -0
- package/dist/layout/center.d.ts.map +1 -0
- package/dist/layout/center.js +8 -0
- package/dist/layout/column.d.ts +3 -0
- package/dist/layout/column.d.ts.map +1 -0
- package/dist/layout/column.js +2 -0
- package/dist/layout/divider.d.ts +11 -0
- package/dist/layout/divider.d.ts.map +1 -0
- package/dist/layout/divider.js +13 -0
- package/dist/layout/grid.d.ts +10 -0
- package/dist/layout/grid.d.ts.map +1 -0
- package/dist/layout/grid.js +22 -0
- package/dist/layout/index.d.ts +19 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +36 -0
- package/dist/layout/panel.d.ts +37 -0
- package/dist/layout/panel.d.ts.map +1 -0
- package/dist/layout/panel.js +71 -0
- package/dist/layout/row.d.ts +7 -0
- package/dist/layout/row.d.ts.map +1 -0
- package/dist/layout/row.js +2 -0
- package/dist/layout/scroll-view.d.ts +27 -0
- package/dist/layout/scroll-view.d.ts.map +1 -0
- package/dist/layout/scroll-view.js +93 -0
- package/dist/layout/splitter.d.ts +10 -0
- package/dist/layout/splitter.d.ts.map +1 -0
- package/dist/layout/splitter.js +9 -0
- package/dist/layout/stack.d.ts +7 -0
- package/dist/layout/stack.d.ts.map +1 -0
- package/dist/layout/stack.js +5 -0
- package/dist/navigation/breadcrumb.d.ts +14 -0
- package/dist/navigation/breadcrumb.d.ts.map +1 -0
- package/dist/navigation/breadcrumb.js +24 -0
- package/dist/navigation/index.d.ts +17 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +30 -0
- package/dist/navigation/key-hints.d.ts +11 -0
- package/dist/navigation/key-hints.d.ts.map +1 -0
- package/dist/navigation/key-hints.js +13 -0
- package/dist/navigation/menu.d.ts +35 -0
- package/dist/navigation/menu.d.ts.map +1 -0
- package/dist/navigation/menu.js +88 -0
- package/dist/navigation/status-bar.d.ts +18 -0
- package/dist/navigation/status-bar.d.ts.map +1 -0
- package/dist/navigation/status-bar.js +12 -0
- package/dist/navigation/tabs.d.ts +20 -0
- package/dist/navigation/tabs.d.ts.map +1 -0
- package/dist/navigation/tabs.js +41 -0
- package/dist/navigation/toolbar.d.ts +14 -0
- package/dist/navigation/toolbar.d.ts.map +1 -0
- package/dist/navigation/toolbar.js +10 -0
- package/dist/navigation/wizard.d.ts +15 -0
- package/dist/navigation/wizard.d.ts.map +1 -0
- package/dist/navigation/wizard.js +17 -0
- package/dist/overlay/command-palette.d.ts +63 -0
- package/dist/overlay/command-palette.d.ts.map +1 -0
- package/dist/overlay/command-palette.js +415 -0
- package/dist/overlay/dialog.d.ts +16 -0
- package/dist/overlay/dialog.d.ts.map +1 -0
- package/dist/overlay/dialog.js +44 -0
- package/dist/overlay/index.d.ts +84 -0
- package/dist/overlay/index.d.ts.map +1 -0
- package/dist/overlay/index.js +157 -0
- package/dist/overlay/layer-scope.d.ts +21 -0
- package/dist/overlay/layer-scope.d.ts.map +1 -0
- package/dist/overlay/layer-scope.js +5 -0
- package/dist/overlay/path-picker.d.ts +14 -0
- package/dist/overlay/path-picker.d.ts.map +1 -0
- package/dist/overlay/path-picker.js +200 -0
- package/dist/overlay/prompt-dialog.d.ts +12 -0
- package/dist/overlay/prompt-dialog.d.ts.map +1 -0
- package/dist/overlay/prompt-dialog.js +29 -0
- package/dist/overlay/shared.d.ts +17 -0
- package/dist/overlay/shared.d.ts.map +1 -0
- package/dist/overlay/shared.js +17 -0
- package/dist/overlay/toast-host.d.ts +8 -0
- package/dist/overlay/toast-host.d.ts.map +1 -0
- package/dist/overlay/toast-host.js +19 -0
- package/dist/overlay/toast.d.ts +9 -0
- package/dist/overlay/toast.d.ts.map +1 -0
- package/dist/overlay/toast.js +20 -0
- package/dist/overlay/tooltip.d.ts +6 -0
- package/dist/overlay/tooltip.d.ts.map +1 -0
- package/dist/overlay/tooltip.js +11 -0
- package/dist/panel/index.d.ts +79 -0
- package/dist/panel/index.d.ts.map +1 -0
- package/dist/panel/index.js +256 -0
- package/dist/panel/resource-panel.d.ts +93 -0
- package/dist/panel/resource-panel.d.ts.map +1 -0
- package/dist/panel/resource-panel.js +213 -0
- package/dist/panel/shared.d.ts +6 -0
- package/dist/panel/shared.d.ts.map +1 -0
- package/dist/panel/shared.js +4 -0
- package/dist/shells/console-shell.d.ts +8 -0
- package/dist/shells/console-shell.d.ts.map +1 -0
- package/dist/shells/console-shell.js +30 -0
- package/dist/shells/index.d.ts +20 -0
- package/dist/shells/index.d.ts.map +1 -0
- package/dist/shells/index.js +61 -0
- package/dist/shells/paper-shell.d.ts +9 -0
- package/dist/shells/paper-shell.d.ts.map +1 -0
- package/dist/shells/paper-shell.js +23 -0
- package/dist/shells/plain-shell.d.ts +3 -0
- package/dist/shells/plain-shell.d.ts.map +1 -0
- package/dist/shells/plain-shell.js +11 -0
- package/dist/shells/shared.d.ts +12 -0
- package/dist/shells/shared.d.ts.map +1 -0
- package/dist/shells/shared.js +21 -0
- package/dist/shells/workbench-shell.d.ts +9 -0
- package/dist/shells/workbench-shell.d.ts.map +1 -0
- package/dist/shells/workbench-shell.js +43 -0
- package/dist/surface/bar-layout.d.ts +4 -0
- package/dist/surface/bar-layout.d.ts.map +1 -0
- package/dist/surface/bar-layout.js +7 -0
- package/dist/surface/index.d.ts +58 -0
- package/dist/surface/index.d.ts.map +1 -0
- package/dist/surface/index.js +48 -0
- package/dist/surface/inline-layout.d.ts +4 -0
- package/dist/surface/inline-layout.d.ts.map +1 -0
- package/dist/surface/inline-layout.js +7 -0
- package/dist/surface/mount-view.d.ts +7 -0
- package/dist/surface/mount-view.d.ts.map +1 -0
- package/dist/surface/mount-view.js +19 -0
- package/dist/surface/rail-layout.d.ts +4 -0
- package/dist/surface/rail-layout.d.ts.map +1 -0
- package/dist/surface/rail-layout.js +19 -0
- package/dist/surface/shared.d.ts +7 -0
- package/dist/surface/shared.d.ts.map +1 -0
- package/dist/surface/shared.js +1 -0
- package/dist/surface/single-layout.d.ts +4 -0
- package/dist/surface/single-layout.d.ts.map +1 -0
- package/dist/surface/single-layout.js +18 -0
- package/dist/surface/split-layout.d.ts +4 -0
- package/dist/surface/split-layout.d.ts.map +1 -0
- package/dist/surface/split-layout.js +7 -0
- package/dist/surface/stack-layout.d.ts +4 -0
- package/dist/surface/stack-layout.d.ts.map +1 -0
- package/dist/surface/stack-layout.js +22 -0
- package/dist/surface/surface-area.d.ts +16 -0
- package/dist/surface/surface-area.d.ts.map +1 -0
- package/dist/surface/surface-area.js +32 -0
- package/dist/surface/tabs-layout.d.ts +4 -0
- package/dist/surface/tabs-layout.d.ts.map +1 -0
- package/dist/surface/tabs-layout.js +24 -0
- package/dist/tone.d.ts +16 -0
- package/dist/tone.d.ts.map +1 -0
- package/dist/tone.js +45 -0
- package/dist/viewport.d.ts +30 -0
- package/dist/viewport.d.ts.map +1 -0
- package/dist/viewport.js +17 -0
- package/package.json +54 -0
- package/src/chart/area-chart.ts +9 -0
- package/src/chart/bar-chart.ts +74 -0
- package/src/chart/gauge.ts +60 -0
- package/src/chart/heatmap.ts +49 -0
- package/src/chart/histogram.ts +36 -0
- package/src/chart/index.ts +36 -0
- package/src/chart/line-chart.ts +100 -0
- package/src/chart/shared.ts +112 -0
- package/src/chart/sparkline.ts +46 -0
- package/src/control/button.ts +184 -0
- package/src/control/checkbox.ts +48 -0
- package/src/control/index.ts +40 -0
- package/src/control/radio-group.ts +60 -0
- package/src/control/search-box.ts +15 -0
- package/src/control/select.ts +230 -0
- package/src/control/shared.ts +41 -0
- package/src/control/slider.ts +63 -0
- package/src/control/switch.ts +39 -0
- package/src/control/text-area.ts +390 -0
- package/src/control/text-input.ts +150 -0
- package/src/data/code-viewer.ts +337 -0
- package/src/data/feed.ts +204 -0
- package/src/data/index.ts +243 -0
- package/src/data/list.ts +149 -0
- package/src/data/log-viewer.ts +105 -0
- package/src/data/markdown-view.ts +182 -0
- package/src/data/pagination.ts +31 -0
- package/src/data/scroll-thumb.ts +40 -0
- package/src/data/shared.ts +23 -0
- package/src/data/tree.ts +215 -0
- package/src/decorations.ts +176 -0
- package/src/display/alert.ts +28 -0
- package/src/display/badge.ts +40 -0
- package/src/display/card.ts +23 -0
- package/src/display/empty-state.ts +21 -0
- package/src/display/error-state.ts +23 -0
- package/src/display/heading.ts +17 -0
- package/src/display/index.ts +55 -0
- package/src/display/key-value.ts +32 -0
- package/src/display/label.ts +11 -0
- package/src/display/marquee.ts +88 -0
- package/src/display/progress.ts +92 -0
- package/src/display/skeleton.ts +34 -0
- package/src/display/spinner.ts +20 -0
- package/src/display/status-dot.ts +24 -0
- package/src/display/timeline.ts +47 -0
- package/src/find.ts +138 -0
- package/src/form/danger-zone.ts +34 -0
- package/src/form/field.ts +61 -0
- package/src/form/form-actions.ts +35 -0
- package/src/form/form-section.ts +16 -0
- package/src/form/form.ts +13 -0
- package/src/form/index.ts +191 -0
- package/src/form/shared.ts +36 -0
- package/src/index.ts +63 -0
- package/src/layout/center.ts +17 -0
- package/src/layout/column.ts +6 -0
- package/src/layout/divider.ts +31 -0
- package/src/layout/grid.ts +34 -0
- package/src/layout/index.ts +39 -0
- package/src/layout/panel.ts +114 -0
- package/src/layout/row.ts +11 -0
- package/src/layout/scroll-view.ts +115 -0
- package/src/layout/splitter.ts +24 -0
- package/src/layout/stack.ts +12 -0
- package/src/navigation/breadcrumb.ts +43 -0
- package/src/navigation/index.ts +33 -0
- package/src/navigation/key-hints.ts +25 -0
- package/src/navigation/menu.ts +134 -0
- package/src/navigation/status-bar.ts +43 -0
- package/src/navigation/tabs.ts +73 -0
- package/src/navigation/toolbar.ts +25 -0
- package/src/navigation/wizard.ts +43 -0
- package/src/overlay/command-palette.ts +485 -0
- package/src/overlay/dialog.ts +65 -0
- package/src/overlay/index.ts +232 -0
- package/src/overlay/layer-scope.ts +26 -0
- package/src/overlay/path-picker.ts +215 -0
- package/src/overlay/prompt-dialog.ts +45 -0
- package/src/overlay/shared.ts +19 -0
- package/src/overlay/toast-host.ts +30 -0
- package/src/overlay/toast.ts +35 -0
- package/src/overlay/tooltip.ts +17 -0
- package/src/panel/index.ts +317 -0
- package/src/panel/resource-panel.ts +304 -0
- package/src/panel/shared.ts +8 -0
- package/src/shells/console-shell.ts +47 -0
- package/src/shells/index.ts +66 -0
- package/src/shells/paper-shell.ts +31 -0
- package/src/shells/plain-shell.ts +19 -0
- package/src/shells/shared.ts +24 -0
- package/src/shells/workbench-shell.ts +62 -0
- package/src/surface/bar-layout.ts +11 -0
- package/src/surface/index.ts +53 -0
- package/src/surface/inline-layout.ts +11 -0
- package/src/surface/mount-view.ts +30 -0
- package/src/surface/rail-layout.ts +27 -0
- package/src/surface/shared.ts +7 -0
- package/src/surface/single-layout.ts +25 -0
- package/src/surface/split-layout.ts +11 -0
- package/src/surface/stack-layout.ts +32 -0
- package/src/surface/surface-area.ts +46 -0
- package/src/surface/tabs-layout.ts +30 -0
- package/src/tone.ts +48 -0
- package/src/viewport.ts +45 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { defineComponent, h, useFocus, useInput, useState, useTheme } from '@textui/core';
|
|
2
|
+
import { Marquee } from '../display/index.js';
|
|
3
|
+
import { TONE } from '../tone.js';
|
|
4
|
+
export const Menu = defineComponent('Menu', (props) => {
|
|
5
|
+
const theme = useTheme();
|
|
6
|
+
const { items, onSelect, visibleRows, activeId, autoFocus, interactive = true, ...rest } = props;
|
|
7
|
+
const focus = useFocus({ autoFocus, disabled: !interactive });
|
|
8
|
+
const selectable = items.filter((i) => !i.disabled);
|
|
9
|
+
const [internalHighlight, setHighlight] = useState(Math.max(0, items.findIndex((i) => i.id === activeId)));
|
|
10
|
+
// When something else drives the list, `activeId` is the whole truth.
|
|
11
|
+
const highlight = interactive
|
|
12
|
+
? internalHighlight
|
|
13
|
+
: Math.max(0, items.findIndex((i) => i.id === activeId));
|
|
14
|
+
useInput((event) => {
|
|
15
|
+
switch (event.name) {
|
|
16
|
+
case 'up':
|
|
17
|
+
setHighlight((highlight - 1 + items.length) % items.length);
|
|
18
|
+
return true;
|
|
19
|
+
case 'down':
|
|
20
|
+
setHighlight((highlight + 1) % items.length);
|
|
21
|
+
return true;
|
|
22
|
+
case 'home':
|
|
23
|
+
setHighlight(0);
|
|
24
|
+
return true;
|
|
25
|
+
case 'end':
|
|
26
|
+
setHighlight(items.length - 1);
|
|
27
|
+
return true;
|
|
28
|
+
case 'enter': {
|
|
29
|
+
const item = items[highlight];
|
|
30
|
+
if (item && !item.disabled)
|
|
31
|
+
onSelect?.(item.id, item);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
default: return false;
|
|
35
|
+
}
|
|
36
|
+
}, { focusId: focus.id, enabled: interactive });
|
|
37
|
+
const rows = visibleRows ?? items.length;
|
|
38
|
+
const start = Math.max(0, Math.min(highlight - Math.floor(rows / 2), items.length - rows));
|
|
39
|
+
const window = items.slice(start, start + rows);
|
|
40
|
+
// One switch in the menu gives every row the column, blank on the rows that
|
|
41
|
+
// are not switches. Per-row would left-align the labels differently
|
|
42
|
+
// depending on what happened to be a toggle, which reads as a broken menu.
|
|
43
|
+
const switches = items.some((item) => item.checked !== undefined);
|
|
44
|
+
return h('box', { id: focus.id, role: 'menu', direction: 'column', ...rest }, ...window.flatMap((item, i) => {
|
|
45
|
+
const active = start + i === highlight;
|
|
46
|
+
const row = h('box', {
|
|
47
|
+
key: item.id,
|
|
48
|
+
role: 'menuitem',
|
|
49
|
+
label: item.label,
|
|
50
|
+
selected: active,
|
|
51
|
+
direction: 'row',
|
|
52
|
+
gap: 1,
|
|
53
|
+
bg: active ? 'selected' : undefined,
|
|
54
|
+
fg: item.disabled ? 'disabled' : active ? 'inverted' : item.tone ? TONE[item.tone] : undefined,
|
|
55
|
+
onClick: () => { if (!item.disabled)
|
|
56
|
+
onSelect?.(item.id, item); },
|
|
57
|
+
}, h('text', { content: active ? theme.glyphs.chevronRight : ' ', shrink: 0 }), switches
|
|
58
|
+
? h('text', { content: item.checked === true ? theme.glyphs.check : ' ', shrink: 0 })
|
|
59
|
+
: null,
|
|
60
|
+
// The mark never gives up room. It is the shortest thing on the row
|
|
61
|
+
// and the one that stays legible when everything else is an ellipsis.
|
|
62
|
+
item.icon ? h('text', { content: item.icon, shrink: 0 }) : null,
|
|
63
|
+
// The row under the cursor reads itself out. Everything else is
|
|
64
|
+
// truncated and still, which is what you want of nineteen rows you
|
|
65
|
+
// are scanning past - and useless for the one you have stopped on.
|
|
66
|
+
h(Marquee, { content: item.label, active }), h('spacer', { flex: 1 }),
|
|
67
|
+
// The description yields first, and by a lot. It is the elaboration;
|
|
68
|
+
// the label is the thing being chosen, and a row reading "Accept ed…"
|
|
69
|
+
// beside a full sentence has given up the wrong half.
|
|
70
|
+
item.description
|
|
71
|
+
? h(Marquee, {
|
|
72
|
+
content: item.description,
|
|
73
|
+
active,
|
|
74
|
+
fg: active ? 'inverted' : 'muted',
|
|
75
|
+
shrink: 8,
|
|
76
|
+
})
|
|
77
|
+
: null, item.shortcut ? h('text', { content: item.shortcut, fg: active ? 'inverted' : 'subtle' }) : null,
|
|
78
|
+
// Present but empty means "this opens something, contents unknown" -
|
|
79
|
+
// which is what the command palette knows about an argument whose
|
|
80
|
+
// choices it has not resolved yet.
|
|
81
|
+
item.children ? h('text', { content: theme.glyphs.chevronRight }) : null);
|
|
82
|
+
return item.separatorBefore
|
|
83
|
+
? [h('box', { key: `${item.id}-sep`, height: 1, fill: theme.borderChars().top, fg: 'borderSubtle' }), row]
|
|
84
|
+
: [row];
|
|
85
|
+
}), selectable.length === 0
|
|
86
|
+
? h('text', { content: ' no matches', fg: 'subtle' })
|
|
87
|
+
: null);
|
|
88
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BoxProps, SemanticVariant } from '@textui/core';
|
|
2
|
+
export interface StatusSegment {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
icon?: string;
|
|
6
|
+
tone?: SemanticVariant;
|
|
7
|
+
}
|
|
8
|
+
export interface StatusBarProps extends BoxProps {
|
|
9
|
+
/**
|
|
10
|
+
* Segments before the gap and after it. Named `leading`/`trailing` rather
|
|
11
|
+
* than `left`/`right` because those are style props on every node.
|
|
12
|
+
*/
|
|
13
|
+
leading?: StatusSegment[];
|
|
14
|
+
trailing?: StatusSegment[];
|
|
15
|
+
separator?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const StatusBar: (props: StatusBarProps) => import("@textui/core").RenderOutput;
|
|
18
|
+
//# sourceMappingURL=status-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-bar.d.ts","sourceRoot":"","sources":["../../src/navigation/status-bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI9D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,gEAqBpB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineComponent, h, useTheme } from '@textui/core';
|
|
2
|
+
import { TONE } from '../tone.js';
|
|
3
|
+
export const StatusBar = defineComponent('StatusBar', (props) => {
|
|
4
|
+
const theme = useTheme();
|
|
5
|
+
const { leading = [], trailing = [], separator, ...rest } = props;
|
|
6
|
+
const sep = separator ?? ` ${theme.glyphs.separator} `;
|
|
7
|
+
const segment = (item) => h('box', { key: item.id, direction: 'row', gap: item.icon ? 1 : 0 }, item.icon ? h('text', { content: item.icon, fg: item.tone ? TONE[item.tone] : undefined }) : null, h('text', { content: item.label, fg: item.tone ? TONE[item.tone] : 'muted' }));
|
|
8
|
+
const join = (items) => items.flatMap((item, i) => i === items.length - 1
|
|
9
|
+
? [segment(item)]
|
|
10
|
+
: [segment(item), h('text', { key: `${item.id}-s`, content: sep, fg: 'subtle' })]);
|
|
11
|
+
return h('box', { role: 'contentinfo', direction: 'row', height: 1, ...rest }, ...join(leading), h('spacer', { flex: 1 }), ...join(trailing));
|
|
12
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BoxProps } from '@textui/core';
|
|
2
|
+
export interface TabItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
icon?: string;
|
|
6
|
+
badge?: string | number;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface TabsProps extends BoxProps {
|
|
10
|
+
items: TabItem[];
|
|
11
|
+
activeId?: string;
|
|
12
|
+
onChange?(id: string): void;
|
|
13
|
+
/** Underline the active tab instead of inverting it. */
|
|
14
|
+
variant?: 'underline' | 'solid' | 'plain';
|
|
15
|
+
separator?: string;
|
|
16
|
+
/** Take focus on mount, so the keyboard has somewhere to be. */
|
|
17
|
+
autoFocus?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare const Tabs: (props: TabsProps) => import("@textui/core").RenderOutput;
|
|
20
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/navigation/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,2DAiDf,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { defineComponent, h, useFocus, useInput } from '@textui/core';
|
|
2
|
+
export const Tabs = defineComponent('Tabs', (props) => {
|
|
3
|
+
const { items, activeId, onChange, variant = 'underline', separator, autoFocus, ...rest } = props;
|
|
4
|
+
const focus = useFocus({ autoFocus });
|
|
5
|
+
const index = Math.max(0, items.findIndex((t) => t.id === activeId));
|
|
6
|
+
useInput((event) => {
|
|
7
|
+
const step = event.name === 'right' ? 1 : event.name === 'left' ? -1 : 0;
|
|
8
|
+
if (step === 0)
|
|
9
|
+
return false;
|
|
10
|
+
const next = items[(index + step + items.length) % items.length];
|
|
11
|
+
if (next && !next.disabled)
|
|
12
|
+
onChange?.(next.id);
|
|
13
|
+
return true;
|
|
14
|
+
}, { focusId: focus.id });
|
|
15
|
+
const gap = separator ? 0 : 1;
|
|
16
|
+
return h('box', { id: focus.id, role: 'tablist', direction: 'row', gap, ...rest }, ...items.flatMap((item, i) => {
|
|
17
|
+
const active = item.id === activeId;
|
|
18
|
+
const tab = h('box', {
|
|
19
|
+
key: item.id,
|
|
20
|
+
role: 'tab',
|
|
21
|
+
label: item.label,
|
|
22
|
+
selected: active,
|
|
23
|
+
direction: 'row',
|
|
24
|
+
gap: 1,
|
|
25
|
+
padding: variant === 'solid' ? [0, 1] : 0,
|
|
26
|
+
bg: variant === 'solid' && active ? 'selected' : undefined,
|
|
27
|
+
fg: item.disabled ? 'disabled' : active ? (variant === 'solid' ? 'inverted' : 'accent') : 'muted',
|
|
28
|
+
bold: active,
|
|
29
|
+
underline: variant === 'underline' && active,
|
|
30
|
+
onClick: () => { if (!item.disabled)
|
|
31
|
+
onChange?.(item.id); },
|
|
32
|
+
}, item.icon ? h('text', { content: item.icon }) : null, h('text', { content: item.label }), item.badge !== undefined
|
|
33
|
+
// No colour of its own on the active tab: `muted` against the
|
|
34
|
+
// selected background is the one pairing that never reads.
|
|
35
|
+
? h('text', { content: String(item.badge), fg: active ? undefined : 'muted' })
|
|
36
|
+
: null);
|
|
37
|
+
return separator && i < items.length - 1
|
|
38
|
+
? [tab, h('text', { key: `${item.id}-sep`, content: separator, fg: 'borderSubtle' })]
|
|
39
|
+
: [tab];
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BoxProps, SemanticVariant } from '@textui/core';
|
|
2
|
+
export interface ToolbarProps extends BoxProps {
|
|
3
|
+
items: {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
icon?: string;
|
|
7
|
+
shortcut?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
tone?: SemanticVariant;
|
|
10
|
+
}[];
|
|
11
|
+
onSelect?(id: string): void;
|
|
12
|
+
}
|
|
13
|
+
export declare const Toolbar: (props: ToolbarProps) => import("@textui/core").RenderOutput;
|
|
14
|
+
//# sourceMappingURL=toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/navigation/toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI9D,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,eAAe,CAAA;KAAE,EAAE,CAAC;IACrH,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,OAAO,8DAenB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { defineComponent, h } from '@textui/core';
|
|
2
|
+
import { TONE } from '../tone.js';
|
|
3
|
+
export const Toolbar = defineComponent('Toolbar', ({ items, onSelect, ...rest }) => h('box', { role: 'toolbar', direction: 'row', gap: 2, ...rest }, ...items.map((item) => h('box', {
|
|
4
|
+
key: item.id,
|
|
5
|
+
direction: 'row',
|
|
6
|
+
gap: 1,
|
|
7
|
+
fg: item.disabled ? 'disabled' : item.tone ? TONE[item.tone] : undefined,
|
|
8
|
+
onClick: () => { if (!item.disabled)
|
|
9
|
+
onSelect?.(item.id); },
|
|
10
|
+
}, item.shortcut ? h('text', { content: item.shortcut, fg: 'accent', bold: true }) : null, item.icon ? h('text', { content: item.icon }) : null, h('text', { content: item.label, fg: 'muted' })))));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BoxProps } from '@textui/core';
|
|
2
|
+
export interface WizardStep {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WizardProps extends BoxProps {
|
|
8
|
+
steps: WizardStep[];
|
|
9
|
+
activeId: string;
|
|
10
|
+
/** Steps already completed. */
|
|
11
|
+
completedIds?: string[];
|
|
12
|
+
orientation?: 'horizontal' | 'vertical';
|
|
13
|
+
}
|
|
14
|
+
export declare const Wizard: (props: WizardProps) => import("@textui/core").RenderOutput;
|
|
15
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/navigation/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACzC;AAED,eAAO,MAAM,MAAM,6DAyBjB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineComponent, h, useTheme } from '@textui/core';
|
|
2
|
+
export const Wizard = defineComponent('Wizard', (props) => {
|
|
3
|
+
const theme = useTheme();
|
|
4
|
+
const { steps, activeId, completedIds = [], orientation = 'horizontal', ...rest } = props;
|
|
5
|
+
const activeIndex = steps.findIndex((s) => s.id === activeId);
|
|
6
|
+
return h('box', { direction: orientation === 'horizontal' ? 'row' : 'column', gap: orientation === 'horizontal' ? 2 : 0, ...rest }, ...steps.map((step, i) => {
|
|
7
|
+
const done = completedIds.includes(step.id);
|
|
8
|
+
const active = step.id === activeId;
|
|
9
|
+
const glyph = done ? theme.glyphs.check : active ? theme.glyphs.bulletFilled : theme.glyphs.bulletHollow;
|
|
10
|
+
const tone = done ? 'success' : active ? 'accent' : 'subtle';
|
|
11
|
+
return h('box', { key: step.id, direction: 'row', gap: 1 }, h('text', { content: glyph, fg: tone }), h('box', { direction: 'column' }, h('text', { content: `${i + 1}. ${step.label}`, bold: active, fg: active ? 'text' : 'muted' }), step.description && active
|
|
12
|
+
? h('text', { content: step.description, fg: 'subtle' })
|
|
13
|
+
: null), orientation === 'horizontal' && i < steps.length - 1
|
|
14
|
+
? h('text', { content: theme.glyphs.chevronRight, fg: i < activeIndex ? 'success' : 'subtle' })
|
|
15
|
+
: null);
|
|
16
|
+
}));
|
|
17
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ArgSpec, BoxProps, CommandDefinition } from '@textui/core';
|
|
2
|
+
export interface CommandPaletteProps extends BoxProps {
|
|
3
|
+
/**
|
|
4
|
+
* Rows to search. Defaults to every enabled command in the `palette` slot.
|
|
5
|
+
*
|
|
6
|
+
* A function is re-read every render, which is what a list of switches
|
|
7
|
+
* needs: after one is flipped the row has to show its new state, and a
|
|
8
|
+
* snapshot taken when the palette opened cannot.
|
|
9
|
+
*/
|
|
10
|
+
commands?: CommandDefinition[] | (() => CommandDefinition[]);
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
/** Notified after a command runs. The palette runs it itself. */
|
|
13
|
+
onRun?(id: string, args?: Record<string, unknown>): void;
|
|
14
|
+
onClose?(): void;
|
|
15
|
+
/** Off makes this a picker: it reports the choice and runs nothing. */
|
|
16
|
+
execute?: boolean;
|
|
17
|
+
/** Group the list by `category`, with a rule between groups. */
|
|
18
|
+
grouped?: boolean;
|
|
19
|
+
visibleRows?: number;
|
|
20
|
+
width?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Open already drilled into this command's choices.
|
|
23
|
+
*
|
|
24
|
+
* For a caller that has decided *which* question is being asked and only
|
|
25
|
+
* wants the palette to ask it - a menu item for "Theme" should offer the
|
|
26
|
+
* themes, not the whole command list with "Theme" typed into the search box.
|
|
27
|
+
*/
|
|
28
|
+
openAt?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The command palette.
|
|
32
|
+
*
|
|
33
|
+
* It searches the command registry rather than a list someone maintained, so
|
|
34
|
+
* a command registered anywhere is reachable here the moment it exists - which
|
|
35
|
+
* is the payoff for insisting actions are commands. It also *runs* what it
|
|
36
|
+
* finds, so choosing "Open dialog" here and pressing the button that opens a
|
|
37
|
+
* dialog are the same act, reaching the same code.
|
|
38
|
+
*
|
|
39
|
+
* A command that declares an argument with `choices` gets a second level:
|
|
40
|
+
* choosing it lists the choices, and picking one runs the command with it.
|
|
41
|
+
* That is where sub-items come from - the command says what it needs and the
|
|
42
|
+
* palette asks, rather than every caller inventing its own submenu.
|
|
43
|
+
*/
|
|
44
|
+
export declare const CommandPalette: (props: CommandPaletteProps) => import("@textui/core").RenderOutput;
|
|
45
|
+
/**
|
|
46
|
+
* The argument the palette should ask about, if there is one.
|
|
47
|
+
*
|
|
48
|
+
* A fixed set of choices, or something required that nothing has supplied.
|
|
49
|
+
* Only the first kind used to count, which meant a command declaring "I need a
|
|
50
|
+
* title" ran with no title and did nothing - the one failure mode that looks
|
|
51
|
+
* exactly like a broken key.
|
|
52
|
+
*
|
|
53
|
+
* Exported because "will this command ask something?" is a question other
|
|
54
|
+
* chrome has to answer too - a menu row wants a chevron and wants to hand off
|
|
55
|
+
* rather than run - and the menu bar had written its own version that
|
|
56
|
+
* *called* the `choices` function to find out. A function is allowed to be
|
|
57
|
+
* async, so that answer was sometimes a promise, and the copy went on to call
|
|
58
|
+
* `.map` on it. Whether a command will ask is a property of its declaration;
|
|
59
|
+
* nothing has to be resolved to know it.
|
|
60
|
+
*/
|
|
61
|
+
export declare function argumentOf(command: CommandDefinition, collected?: Record<string, unknown>): ArgSpec | undefined;
|
|
62
|
+
export declare function filterCommands(commands: CommandDefinition[], query: string): CommandDefinition[];
|
|
63
|
+
//# sourceMappingURL=command-palette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette.d.ts","sourceRoot":"","sources":["../../src/overlay/command-palette.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAa,MAAM,cAAc,CAAC;AAgB/F,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,qEA0VzB,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACtC,OAAO,GAAG,SAAS,CAKrB;AAqBD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAehG"}
|