@flyingrobots/bijou-tui 7.1.0 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -4
- package/dist/accordion.d.ts +3 -108
- package/dist/accordion.d.ts.map +1 -1
- package/dist/accordion.js +2 -161
- package/dist/accordion.js.map +1 -1
- package/dist/accordion.part01.d.ts +25 -0
- package/dist/accordion.part01.d.ts.map +1 -0
- package/dist/accordion.part01.js +61 -0
- package/dist/accordion.part01.js.map +1 -0
- package/dist/accordion.part02.d.ts +8 -0
- package/dist/accordion.part02.d.ts.map +1 -0
- package/dist/accordion.part02.js +15 -0
- package/dist/accordion.part02.js.map +1 -0
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +5 -6
- package/dist/animate.js.map +1 -1
- package/dist/app-frame-actions.d.ts +1 -18
- package/dist/app-frame-actions.d.ts.map +1 -1
- package/dist/app-frame-actions.js +44 -42
- package/dist/app-frame-actions.js.map +1 -1
- package/dist/app-frame-i18n.d.ts.map +1 -1
- package/dist/app-frame-i18n.js +19 -2
- package/dist/app-frame-i18n.js.map +1 -1
- package/dist/app-frame-overlays.d.ts +1 -8
- package/dist/app-frame-overlays.d.ts.map +1 -1
- package/dist/app-frame-overlays.js +54 -24
- package/dist/app-frame-overlays.js.map +1 -1
- package/dist/app-frame-palette.d.ts +1 -11
- package/dist/app-frame-palette.d.ts.map +1 -1
- package/dist/app-frame-palette.js +19 -18
- package/dist/app-frame-palette.js.map +1 -1
- package/dist/app-frame-render.d.ts +0 -7
- package/dist/app-frame-render.d.ts.map +1 -1
- package/dist/app-frame-render.js +17 -26
- package/dist/app-frame-render.js.map +1 -1
- package/dist/app-frame-types.d.ts +8 -4
- package/dist/app-frame-types.d.ts.map +1 -1
- package/dist/app-frame-types.js +5 -5
- package/dist/app-frame-types.js.map +1 -1
- package/dist/app-frame-utils.d.ts +2 -1
- package/dist/app-frame-utils.d.ts.map +1 -1
- package/dist/app-frame-utils.js +8 -1
- package/dist/app-frame-utils.js.map +1 -1
- package/dist/app-frame.d.ts +14 -3
- package/dist/app-frame.d.ts.map +1 -1
- package/dist/app-frame.js +295 -231
- package/dist/app-frame.js.map +1 -1
- package/dist/app-frame.test-support.part01.d.ts +149 -0
- package/dist/app-frame.test-support.part01.d.ts.map +1 -0
- package/dist/app-frame.test-support.part01.js +106 -0
- package/dist/app-frame.test-support.part01.js.map +1 -0
- package/dist/app-frame.test-support.part02.d.ts +15 -0
- package/dist/app-frame.test-support.part02.d.ts.map +1 -0
- package/dist/app-frame.test-support.part02.js +89 -0
- package/dist/app-frame.test-support.part02.js.map +1 -0
- package/dist/browsable-list.d.ts +5 -5
- package/dist/browsable-list.d.ts.map +1 -1
- package/dist/browsable-list.js.map +1 -1
- package/dist/canvas.d.ts +2 -34
- package/dist/canvas.d.ts.map +1 -1
- package/dist/canvas.js +43 -47
- package/dist/canvas.js.map +1 -1
- package/dist/cell-glyph-fit.js +1 -1
- package/dist/cell-glyph-fit.js.map +1 -1
- package/dist/collection-surface-types.d.ts +12 -0
- package/dist/collection-surface-types.d.ts.map +1 -0
- package/dist/collection-surface-types.js +2 -0
- package/dist/collection-surface-types.js.map +1 -0
- package/dist/collection-surface.d.ts +2 -7
- package/dist/collection-surface.d.ts.map +1 -1
- package/dist/collection-surface.js +8 -18
- package/dist/collection-surface.js.map +1 -1
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +2 -1
- package/dist/command-palette.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +1 -1
- package/dist/commands.js.map +1 -1
- package/dist/css/install.js.map +1 -1
- package/dist/css/parser.js +9 -3
- package/dist/css/parser.js.map +1 -1
- package/dist/css/resolver-types.d.ts +13 -0
- package/dist/css/resolver-types.d.ts.map +1 -0
- package/dist/css/resolver-types.js +2 -0
- package/dist/css/resolver-types.js.map +1 -0
- package/dist/css/resolver.d.ts +2 -12
- package/dist/css/resolver.d.ts.map +1 -1
- package/dist/css/resolver.js +13 -20
- package/dist/css/resolver.js.map +1 -1
- package/dist/css/text-style.d.ts +4 -8
- package/dist/css/text-style.d.ts.map +1 -1
- package/dist/css/text-style.js +13 -18
- package/dist/css/text-style.js.map +1 -1
- package/dist/dag-pane.d.ts +4 -224
- package/dist/dag-pane.d.ts.map +1 -1
- package/dist/dag-pane.js +3 -516
- package/dist/dag-pane.js.map +1 -1
- package/dist/dag-pane.part01.d.ts +58 -0
- package/dist/dag-pane.part01.d.ts.map +1 -0
- package/dist/dag-pane.part01.js +2 -0
- package/dist/dag-pane.part01.js.map +1 -0
- package/dist/dag-pane.part02.d.ts +4 -0
- package/dist/dag-pane.part02.d.ts.map +1 -0
- package/dist/dag-pane.part02.js +56 -0
- package/dist/dag-pane.part02.js.map +1 -0
- package/dist/dag-pane.part03.d.ts +6 -0
- package/dist/dag-pane.part03.d.ts.map +1 -0
- package/dist/dag-pane.part03.js +76 -0
- package/dist/dag-pane.part03.js.map +1 -0
- package/dist/dag-pane.part04.d.ts +7 -0
- package/dist/dag-pane.part04.d.ts.map +1 -0
- package/dist/dag-pane.part04.js +66 -0
- package/dist/dag-pane.part04.js.map +1 -0
- package/dist/dag-pane.part05.d.ts +7 -0
- package/dist/dag-pane.part05.d.ts.map +1 -0
- package/dist/dag-pane.part05.js +78 -0
- package/dist/dag-pane.part05.js.map +1 -0
- package/dist/dag-pane.part06.d.ts +14 -0
- package/dist/dag-pane.part06.d.ts.map +1 -0
- package/dist/dag-pane.part06.js +65 -0
- package/dist/dag-pane.part06.js.map +1 -0
- package/dist/dag-pane.part07.d.ts +18 -0
- package/dist/dag-pane.part07.d.ts.map +1 -0
- package/dist/dag-pane.part07.js +22 -0
- package/dist/dag-pane.part07.js.map +1 -0
- package/dist/driver.d.ts +35 -21
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +69 -39
- package/dist/driver.js.map +1 -1
- package/dist/eventbus.d.ts.map +1 -1
- package/dist/eventbus.js +13 -23
- package/dist/eventbus.js.map +1 -1
- package/dist/file-picker.d.ts +4 -164
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +3 -292
- package/dist/file-picker.js.map +1 -1
- package/dist/file-picker.part01.d.ts +54 -0
- package/dist/file-picker.part01.d.ts.map +1 -0
- package/dist/file-picker.part01.js +47 -0
- package/dist/file-picker.part01.js.map +1 -0
- package/dist/file-picker.part02.d.ts +9 -0
- package/dist/file-picker.part02.d.ts.map +1 -0
- package/dist/file-picker.part02.js +77 -0
- package/dist/file-picker.part02.js.map +1 -0
- package/dist/file-picker.part03.d.ts +12 -0
- package/dist/file-picker.part03.d.ts.map +1 -0
- package/dist/file-picker.part03.js +35 -0
- package/dist/file-picker.part03.js.map +1 -0
- package/dist/flex.d.ts +0 -61
- package/dist/flex.d.ts.map +1 -1
- package/dist/flex.js +11 -161
- package/dist/flex.js.map +1 -1
- package/dist/focus-area.d.ts +6 -210
- package/dist/focus-area.d.ts.map +1 -1
- package/dist/focus-area.js +5 -425
- package/dist/focus-area.js.map +1 -1
- package/dist/focus-area.part01.d.ts +57 -0
- package/dist/focus-area.part01.d.ts.map +1 -0
- package/dist/focus-area.part01.js +23 -0
- package/dist/focus-area.part01.js.map +1 -0
- package/dist/focus-area.part02.d.ts +13 -0
- package/dist/focus-area.part02.d.ts.map +1 -0
- package/dist/focus-area.part02.js +65 -0
- package/dist/focus-area.part02.js.map +1 -0
- package/dist/focus-area.part03.d.ts +5 -0
- package/dist/focus-area.part03.d.ts.map +1 -0
- package/dist/focus-area.part03.js +42 -0
- package/dist/focus-area.part03.js.map +1 -0
- package/dist/focus-area.part04.d.ts +5 -0
- package/dist/focus-area.part04.d.ts.map +1 -0
- package/dist/focus-area.part04.js +49 -0
- package/dist/focus-area.part04.js.map +1 -0
- package/dist/focus-area.part05.d.ts +10 -0
- package/dist/focus-area.part05.d.ts.map +1 -0
- package/dist/focus-area.part05.js +66 -0
- package/dist/focus-area.part05.js.map +1 -0
- package/dist/focus-area.part06.d.ts +17 -0
- package/dist/focus-area.part06.d.ts.map +1 -0
- package/dist/focus-area.part06.js +48 -0
- package/dist/focus-area.part06.js.map +1 -0
- package/dist/focus-map.d.ts.map +1 -1
- package/dist/focus-map.js +8 -10
- package/dist/focus-map.js.map +1 -1
- package/dist/index.d.ts +8 -80
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -107
- package/dist/index.js.map +1 -1
- package/dist/index.part01.d.ts +15 -0
- package/dist/index.part01.d.ts.map +1 -0
- package/dist/index.part01.js +11 -0
- package/dist/index.part01.js.map +1 -0
- package/dist/index.part02.d.ts +26 -0
- package/dist/index.part02.d.ts.map +1 -0
- package/dist/index.part02.js +24 -0
- package/dist/index.part02.js.map +1 -0
- package/dist/index.part03.d.ts +17 -0
- package/dist/index.part03.d.ts.map +1 -0
- package/dist/index.part03.js +11 -0
- package/dist/index.part03.js.map +1 -0
- package/dist/index.part04.d.ts +6 -0
- package/dist/index.part04.d.ts.map +1 -0
- package/dist/index.part04.js +11 -0
- package/dist/index.part04.js.map +1 -0
- package/dist/index.part05.d.ts +10 -0
- package/dist/index.part05.d.ts.map +1 -0
- package/dist/index.part05.js +26 -0
- package/dist/index.part05.js.map +1 -0
- package/dist/index.part06.d.ts +9 -0
- package/dist/index.part06.d.ts.map +1 -0
- package/dist/index.part06.js +16 -0
- package/dist/index.part06.js.map +1 -0
- package/dist/index.part07.d.ts +8 -0
- package/dist/index.part07.d.ts.map +1 -0
- package/dist/index.part07.js +15 -0
- package/dist/index.part07.js.map +1 -0
- package/dist/index.part08.d.ts +5 -0
- package/dist/index.part08.d.ts.map +1 -0
- package/dist/index.part08.js +9 -0
- package/dist/index.part08.js.map +1 -0
- package/dist/input-map.d.ts.map +1 -1
- package/dist/input-map.js +1 -2
- package/dist/input-map.js.map +1 -1
- package/dist/input-parser.d.ts +3 -0
- package/dist/input-parser.d.ts.map +1 -0
- package/dist/input-parser.js +95 -0
- package/dist/input-parser.js.map +1 -0
- package/dist/input-routing-inspector.js +3 -3
- package/dist/input-routing-inspector.js.map +1 -1
- package/dist/inputstack.d.ts.map +1 -1
- package/dist/inputstack.js +2 -0
- package/dist/inputstack.js.map +1 -1
- package/dist/keybindings.d.ts.map +1 -1
- package/dist/keybindings.js +5 -2
- package/dist/keybindings.js.map +1 -1
- package/dist/keys.d.ts +0 -36
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +11 -66
- package/dist/keys.js.map +1 -1
- package/dist/layout-inspector.d.ts +2 -30
- package/dist/layout-inspector.d.ts.map +1 -1
- package/dist/layout-inspector.js +1 -132
- package/dist/layout-inspector.js.map +1 -1
- package/dist/layout-inspector.part01.d.ts +52 -0
- package/dist/layout-inspector.part01.d.ts.map +1 -0
- package/dist/layout-inspector.part01.js +48 -0
- package/dist/layout-inspector.part01.js.map +1 -0
- package/dist/layout-inspector.part02.d.ts +11 -0
- package/dist/layout-inspector.part02.d.ts.map +1 -0
- package/dist/layout-inspector.part02.js +80 -0
- package/dist/layout-inspector.part02.js.map +1 -0
- package/dist/layout-inspector.part03.d.ts +5 -0
- package/dist/layout-inspector.part03.d.ts.map +1 -0
- package/dist/layout-inspector.part03.js +11 -0
- package/dist/layout-inspector.part03.js.map +1 -0
- package/dist/layout-preset.js +4 -4
- package/dist/layout-preset.js.map +1 -1
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +5 -3
- package/dist/layout.js.map +1 -1
- package/dist/motion/motion.js +8 -4
- package/dist/motion/motion.js.map +1 -1
- package/dist/motion/reconciler.d.ts.map +1 -1
- package/dist/motion/reconciler.js +9 -7
- package/dist/motion/reconciler.js.map +1 -1
- package/dist/mouse-mode.d.ts +5 -0
- package/dist/mouse-mode.d.ts.map +1 -0
- package/dist/mouse-mode.js +17 -0
- package/dist/mouse-mode.js.map +1 -0
- package/dist/navigable-table.d.ts +3 -136
- package/dist/navigable-table.d.ts.map +1 -1
- package/dist/navigable-table.js +2 -234
- package/dist/navigable-table.js.map +1 -1
- package/dist/navigable-table.part01.d.ts +42 -0
- package/dist/navigable-table.part01.d.ts.map +1 -0
- package/dist/navigable-table.part01.js +42 -0
- package/dist/navigable-table.part01.js.map +1 -0
- package/dist/navigable-table.part02.d.ts +16 -0
- package/dist/navigable-table.part02.d.ts.map +1 -0
- package/dist/navigable-table.part02.js +83 -0
- package/dist/navigable-table.part02.js.map +1 -0
- package/dist/notification-card.d.ts +11 -0
- package/dist/notification-card.d.ts.map +1 -0
- package/dist/notification-card.js +157 -0
- package/dist/notification-card.js.map +1 -0
- package/dist/notification-stack.d.ts +6 -0
- package/dist/notification-stack.d.ts.map +1 -0
- package/dist/notification-stack.js +257 -0
- package/dist/notification-stack.js.map +1 -0
- package/dist/notification.d.ts +14 -112
- package/dist/notification.d.ts.map +1 -1
- package/dist/notification.js +12 -1087
- package/dist/notification.js.map +1 -1
- package/dist/notification.part01.d.ts +77 -0
- package/dist/notification.part01.d.ts.map +1 -0
- package/dist/notification.part01.js +19 -0
- package/dist/notification.part01.js.map +1 -0
- package/dist/notification.part02.d.ts +42 -0
- package/dist/notification.part02.d.ts.map +1 -0
- package/dist/notification.part02.js +44 -0
- package/dist/notification.part02.js.map +1 -0
- package/dist/notification.part03.d.ts +6 -0
- package/dist/notification.part03.d.ts.map +1 -0
- package/dist/notification.part03.js +81 -0
- package/dist/notification.part03.js.map +1 -0
- package/dist/notification.part04.d.ts +4 -0
- package/dist/notification.part04.d.ts.map +1 -0
- package/dist/notification.part04.js +32 -0
- package/dist/notification.part04.js.map +1 -0
- package/dist/notification.part05.d.ts +6 -0
- package/dist/notification.part05.d.ts.map +1 -0
- package/dist/notification.part05.js +95 -0
- package/dist/notification.part05.js.map +1 -0
- package/dist/notification.part06.d.ts +9 -0
- package/dist/notification.part06.d.ts.map +1 -0
- package/dist/notification.part06.js +65 -0
- package/dist/notification.part06.js.map +1 -0
- package/dist/notification.part07.d.ts +10 -0
- package/dist/notification.part07.d.ts.map +1 -0
- package/dist/notification.part07.js +70 -0
- package/dist/notification.part07.js.map +1 -0
- package/dist/notification.part08.d.ts +5 -0
- package/dist/notification.part08.d.ts.map +1 -0
- package/dist/notification.part08.js +79 -0
- package/dist/notification.part08.js.map +1 -0
- package/dist/notification.part09.d.ts +14 -0
- package/dist/notification.part09.d.ts.map +1 -0
- package/dist/notification.part09.js +96 -0
- package/dist/notification.part09.js.map +1 -0
- package/dist/notification.part10.d.ts +13 -0
- package/dist/notification.part10.d.ts.map +1 -0
- package/dist/notification.part10.js +94 -0
- package/dist/notification.part10.js.map +1 -0
- package/dist/notification.part11.d.ts +6 -0
- package/dist/notification.part11.d.ts.map +1 -0
- package/dist/notification.part11.js +42 -0
- package/dist/notification.part11.js.map +1 -0
- package/dist/overlay.d.ts +8 -232
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +5 -629
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.part01.d.ts +71 -0
- package/dist/overlay.part01.d.ts.map +1 -0
- package/dist/overlay.part01.js +34 -0
- package/dist/overlay.part01.js.map +1 -0
- package/dist/overlay.part02.d.ts +8 -0
- package/dist/overlay.part02.d.ts.map +1 -0
- package/dist/overlay.part02.js +81 -0
- package/dist/overlay.part02.js.map +1 -0
- package/dist/overlay.part03.d.ts +27 -0
- package/dist/overlay.part03.d.ts.map +1 -0
- package/dist/overlay.part03.js +83 -0
- package/dist/overlay.part03.js.map +1 -0
- package/dist/overlay.part04.d.ts +8 -0
- package/dist/overlay.part04.d.ts.map +1 -0
- package/dist/overlay.part04.js +103 -0
- package/dist/overlay.part04.js.map +1 -0
- package/dist/overlay.part05.d.ts +8 -0
- package/dist/overlay.part05.d.ts.map +1 -0
- package/dist/overlay.part05.js +66 -0
- package/dist/overlay.part05.js.map +1 -0
- package/dist/overlay.part06.d.ts +46 -0
- package/dist/overlay.part06.d.ts.map +1 -0
- package/dist/overlay.part06.js +35 -0
- package/dist/overlay.part06.js.map +1 -0
- package/dist/overlay.part07.d.ts +4 -0
- package/dist/overlay.part07.d.ts.map +1 -0
- package/dist/overlay.part07.js +64 -0
- package/dist/overlay.part07.js.map +1 -0
- package/dist/overlay.part08.d.ts +34 -0
- package/dist/overlay.part08.d.ts.map +1 -0
- package/dist/overlay.part08.js +54 -0
- package/dist/overlay.part08.js.map +1 -0
- package/dist/overlay.part09.d.ts +6 -0
- package/dist/overlay.part09.d.ts.map +1 -0
- package/dist/overlay.part09.js +42 -0
- package/dist/overlay.part09.js.map +1 -0
- package/dist/pager.d.ts.map +1 -1
- package/dist/pager.js +2 -4
- package/dist/pager.js.map +1 -1
- package/dist/panel-dock.d.ts.map +1 -1
- package/dist/panel-dock.js +9 -11
- package/dist/panel-dock.js.map +1 -1
- package/dist/panels.d.ts.map +1 -1
- package/dist/panels.js +2 -0
- package/dist/panels.js.map +1 -1
- package/dist/pipeline/middleware/css.d.ts +3 -5
- package/dist/pipeline/middleware/css.d.ts.map +1 -1
- package/dist/pipeline/middleware/css.js +12 -6
- package/dist/pipeline/middleware/css.js.map +1 -1
- package/dist/pipeline/middleware/grayscale.js +15 -10
- package/dist/pipeline/middleware/grayscale.js.map +1 -1
- package/dist/pipeline/middleware/motion.js +9 -1
- package/dist/pipeline/middleware/motion.js.map +1 -1
- package/dist/pipeline/middleware/paint.js +9 -1
- package/dist/pipeline/middleware/paint.js.map +1 -1
- package/dist/pipeline/middleware/surface-shaders.js +13 -11
- package/dist/pipeline/middleware/surface-shaders.js.map +1 -1
- package/dist/pipeline/pipeline.d.ts +7 -52
- package/dist/pipeline/pipeline.d.ts.map +1 -1
- package/dist/pipeline/pipeline.js +37 -27
- package/dist/pipeline/pipeline.js.map +1 -1
- package/dist/raster-glyph.d.ts +2 -44
- package/dist/raster-glyph.d.ts.map +1 -1
- package/dist/raster-glyph.js +1 -404
- package/dist/raster-glyph.js.map +1 -1
- package/dist/raster-glyph.part01.d.ts +75 -0
- package/dist/raster-glyph.part01.d.ts.map +1 -0
- package/dist/raster-glyph.part01.js +25 -0
- package/dist/raster-glyph.part01.js.map +1 -0
- package/dist/raster-glyph.part02.d.ts +12 -0
- package/dist/raster-glyph.part02.d.ts.map +1 -0
- package/dist/raster-glyph.part02.js +81 -0
- package/dist/raster-glyph.part02.js.map +1 -0
- package/dist/raster-glyph.part03.d.ts +6 -0
- package/dist/raster-glyph.part03.d.ts.map +1 -0
- package/dist/raster-glyph.part03.js +60 -0
- package/dist/raster-glyph.part03.js.map +1 -0
- package/dist/raster-glyph.part04.d.ts +7 -0
- package/dist/raster-glyph.part04.d.ts.map +1 -0
- package/dist/raster-glyph.part04.js +59 -0
- package/dist/raster-glyph.part04.js.map +1 -0
- package/dist/raster-glyph.part05.d.ts +6 -0
- package/dist/raster-glyph.part05.d.ts.map +1 -0
- package/dist/raster-glyph.part05.js +71 -0
- package/dist/raster-glyph.part05.js.map +1 -0
- package/dist/raster-glyph.part06.d.ts +18 -0
- package/dist/raster-glyph.part06.d.ts.map +1 -0
- package/dist/raster-glyph.part06.js +78 -0
- package/dist/raster-glyph.part06.js.map +1 -0
- package/dist/raster-glyph.part07.d.ts +11 -0
- package/dist/raster-glyph.part07.d.ts.map +1 -0
- package/dist/raster-glyph.part07.js +55 -0
- package/dist/raster-glyph.part07.js.map +1 -0
- package/dist/raytrace.d.ts +3 -58
- package/dist/raytrace.d.ts.map +1 -1
- package/dist/raytrace.js +2 -120
- package/dist/raytrace.js.map +1 -1
- package/dist/raytrace.part01.d.ts +47 -0
- package/dist/raytrace.part01.d.ts.map +1 -0
- package/dist/raytrace.part01.js +45 -0
- package/dist/raytrace.part01.js.map +1 -0
- package/dist/raytrace.part02.d.ts +12 -0
- package/dist/raytrace.part02.d.ts.map +1 -0
- package/dist/raytrace.part02.js +73 -0
- package/dist/raytrace.part02.js.map +1 -0
- package/dist/runtime-binding.d.ts +2 -3
- package/dist/runtime-binding.d.ts.map +1 -1
- package/dist/runtime-binding.js +49 -38
- package/dist/runtime-binding.js.map +1 -1
- package/dist/runtime-engine.d.ts +2 -2
- package/dist/runtime-engine.d.ts.map +1 -1
- package/dist/runtime-engine.js +15 -4
- package/dist/runtime-engine.js.map +1 -1
- package/dist/runtime.d.ts +2 -18
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +33 -59
- package/dist/runtime.js.map +1 -1
- package/dist/screen.js +1 -1
- package/dist/screen.js.map +1 -1
- package/dist/shell-quit.d.ts.map +1 -1
- package/dist/shell-quit.js +48 -5
- package/dist/shell-quit.js.map +1 -1
- package/dist/split-pane.d.ts +3 -104
- package/dist/split-pane.d.ts.map +1 -1
- package/dist/split-pane.js +2 -190
- package/dist/split-pane.js.map +1 -1
- package/dist/split-pane.part01.d.ts +60 -0
- package/dist/split-pane.part01.d.ts.map +1 -0
- package/dist/split-pane.part01.js +45 -0
- package/dist/split-pane.part01.js.map +1 -0
- package/dist/split-pane.part02.d.ts +8 -0
- package/dist/split-pane.part02.d.ts.map +1 -0
- package/dist/split-pane.part02.js +73 -0
- package/dist/split-pane.part02.js.map +1 -0
- package/dist/split-pane.part03.d.ts +4 -0
- package/dist/split-pane.part03.d.ts.map +1 -0
- package/dist/split-pane.part03.js +40 -0
- package/dist/split-pane.part03.js.map +1 -0
- package/dist/spring.d.ts +4 -187
- package/dist/spring.d.ts.map +1 -1
- package/dist/spring.js +2 -142
- package/dist/spring.js.map +1 -1
- package/dist/spring.part01.d.ts +90 -0
- package/dist/spring.part01.d.ts.map +1 -0
- package/dist/spring.part01.js +58 -0
- package/dist/spring.part01.js.map +1 -0
- package/dist/spring.part02.d.ts +25 -0
- package/dist/spring.part02.d.ts.map +1 -0
- package/dist/spring.part02.js +21 -0
- package/dist/spring.part02.js.map +1 -0
- package/dist/status-bar.js +1 -1
- package/dist/status-bar.js.map +1 -1
- package/dist/subapp/mount.d.ts +6 -6
- package/dist/subapp/mount.d.ts.map +1 -1
- package/dist/subapp/mount.js +19 -14
- package/dist/subapp/mount.js.map +1 -1
- package/dist/surface-budget-types.d.ts +26 -0
- package/dist/surface-budget-types.d.ts.map +1 -0
- package/dist/surface-budget-types.js +2 -0
- package/dist/surface-budget-types.js.map +1 -0
- package/dist/surface-budget.d.ts +2 -25
- package/dist/surface-budget.d.ts.map +1 -1
- package/dist/surface-budget.js.map +1 -1
- package/dist/surface-diff.js +26 -28
- package/dist/surface-diff.js.map +1 -1
- package/dist/surface-layout.d.ts.map +1 -1
- package/dist/surface-layout.js +1 -2
- package/dist/surface-layout.js.map +1 -1
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +17 -15
- package/dist/timeline.js.map +1 -1
- package/dist/transition-shaders.d.ts +5 -142
- package/dist/transition-shaders.d.ts.map +1 -1
- package/dist/transition-shaders.js +4 -391
- package/dist/transition-shaders.js.map +1 -1
- package/dist/transition-shaders.part01.d.ts +41 -0
- package/dist/transition-shaders.part01.d.ts.map +1 -0
- package/dist/transition-shaders.part01.js +38 -0
- package/dist/transition-shaders.part01.js.map +1 -0
- package/dist/transition-shaders.part02.d.ts +12 -0
- package/dist/transition-shaders.part02.d.ts.map +1 -0
- package/dist/transition-shaders.part02.js +88 -0
- package/dist/transition-shaders.part02.js.map +1 -0
- package/dist/transition-shaders.part03.d.ts +6 -0
- package/dist/transition-shaders.part03.d.ts.map +1 -0
- package/dist/transition-shaders.part03.js +82 -0
- package/dist/transition-shaders.part03.js.map +1 -0
- package/dist/transition-shaders.part04.d.ts +16 -0
- package/dist/transition-shaders.part04.d.ts.map +1 -0
- package/dist/transition-shaders.part04.js +98 -0
- package/dist/transition-shaders.part04.js.map +1 -0
- package/dist/types.d.ts +10 -42
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -36
- package/dist/types.js.map +1 -1
- package/dist/view-output.d.ts +1 -1
- package/dist/view-output.d.ts.map +1 -1
- package/dist/view-output.js +3 -2
- package/dist/view-output.js.map +1 -1
- package/dist/viewport.d.ts +7 -213
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +6 -470
- package/dist/viewport.js.map +1 -1
- package/dist/viewport.part01.d.ts +51 -0
- package/dist/viewport.part01.d.ts.map +1 -0
- package/dist/viewport.part01.js +10 -0
- package/dist/viewport.part01.js.map +1 -0
- package/dist/viewport.part02.d.ts +2 -0
- package/dist/viewport.part02.d.ts.map +1 -0
- package/dist/viewport.part02.js +69 -0
- package/dist/viewport.part02.js.map +1 -0
- package/dist/viewport.part03.d.ts +10 -0
- package/dist/viewport.part03.d.ts.map +1 -0
- package/dist/viewport.part03.js +78 -0
- package/dist/viewport.part03.js.map +1 -0
- package/dist/viewport.part04.d.ts +4 -0
- package/dist/viewport.part04.d.ts.map +1 -0
- package/dist/viewport.part04.js +50 -0
- package/dist/viewport.part04.js.map +1 -0
- package/dist/viewport.part05.d.ts +5 -0
- package/dist/viewport.part05.d.ts.map +1 -0
- package/dist/viewport.part05.js +59 -0
- package/dist/viewport.part05.js.map +1 -0
- package/dist/viewport.part06.d.ts +14 -0
- package/dist/viewport.part06.d.ts.map +1 -0
- package/dist/viewport.part06.js +58 -0
- package/dist/viewport.part06.js.map +1 -0
- package/package.json +3 -3
package/dist/file-picker.js
CHANGED
|
@@ -1,293 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Uses `IOPort.readDir()` to list directory contents and `IOPort.joinPath()`
|
|
5
|
-
* to navigate between directories. Follows the same state + pure transformers
|
|
6
|
-
* + sync render + convenience keymap pattern as pager and accordion.
|
|
7
|
-
*
|
|
8
|
-
* ```ts
|
|
9
|
-
* // In TEA init:
|
|
10
|
-
* const fpState = createFilePickerState({ cwd: '/project', io });
|
|
11
|
-
*
|
|
12
|
-
* // In TEA view:
|
|
13
|
-
* const output = filePicker(model.fpState);
|
|
14
|
-
*
|
|
15
|
-
* // In TEA update:
|
|
16
|
-
* case 'focus-next':
|
|
17
|
-
* return [{ ...model, fpState: fpFocusNext(model.fpState) }, []];
|
|
18
|
-
* case 'enter':
|
|
19
|
-
* return [{ ...model, fpState: fpEnter(model.fpState, io) }, []];
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
import { createSurface, parseAnsiToSurface, sanitizePositiveInt } from '@flyingrobots/bijou';
|
|
23
|
-
import { createKeyMap } from './keybindings.js';
|
|
24
|
-
import { vstackSurface } from './surface-layout.js';
|
|
25
|
-
import { viewportSurface, visibleLength } from './viewport.js';
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
// Helpers
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
/**
|
|
30
|
-
* Safely read and parse directory entries. Returns `[]` if the directory
|
|
31
|
-
* is unreadable (permissions, missing, etc.) instead of throwing.
|
|
32
|
-
*
|
|
33
|
-
* @param io - IO port for filesystem access.
|
|
34
|
-
* @param cwd - Directory path to read.
|
|
35
|
-
* @param filter - Optional file extension filter.
|
|
36
|
-
* @returns Sorted array of file entries, or empty array on error.
|
|
37
|
-
*/
|
|
38
|
-
function safeReadEntries(io, cwd, filter) {
|
|
39
|
-
try {
|
|
40
|
-
return parseEntries(io.readDir(cwd), filter);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return [];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Parse raw directory listing into sorted `FileEntry[]`.
|
|
48
|
-
*
|
|
49
|
-
* @param names - Names returned by `IOPort.readDir()` (dirs have trailing `/`).
|
|
50
|
-
* @param filter - Optional extension suffix (e.g. `".ts"`) — only files whose
|
|
51
|
-
* name ends with this suffix are included. Directories are
|
|
52
|
-
* always included regardless of the filter.
|
|
53
|
-
* @returns Sorted array of file entries (directories first, then files).
|
|
54
|
-
*/
|
|
55
|
-
function parseEntries(names, filter) {
|
|
56
|
-
const dirs = [];
|
|
57
|
-
const files = [];
|
|
58
|
-
for (const name of names) {
|
|
59
|
-
if (name.endsWith('/')) {
|
|
60
|
-
dirs.push({ name: name.slice(0, -1), isDirectory: true });
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
if (filter && !name.endsWith(filter))
|
|
64
|
-
continue;
|
|
65
|
-
files.push({ name, isDirectory: false });
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// Sort dirs first, then files, both alphabetically
|
|
69
|
-
dirs.sort((a, b) => a.name.localeCompare(b.name));
|
|
70
|
-
files.sort((a, b) => a.name.localeCompare(b.name));
|
|
71
|
-
return [...dirs, ...files];
|
|
72
|
-
}
|
|
73
|
-
// ---------------------------------------------------------------------------
|
|
74
|
-
// State creation
|
|
75
|
-
// ---------------------------------------------------------------------------
|
|
76
|
-
/**
|
|
77
|
-
* Create initial file picker state for the given directory.
|
|
78
|
-
*
|
|
79
|
-
* Reads directory contents via `io.readDir()` and parses entries into
|
|
80
|
-
* directories (trailing `/`) and files. Directories are sorted first,
|
|
81
|
-
* then files, both alphabetically.
|
|
82
|
-
*
|
|
83
|
-
* @param options - Starting directory, IO port, height, and optional filter.
|
|
84
|
-
* @returns Fresh file picker state with focus on the first entry.
|
|
85
|
-
*/
|
|
86
|
-
export function createFilePickerState(options) {
|
|
87
|
-
const height = sanitizePositiveInt(options.height, 10);
|
|
88
|
-
const entries = safeReadEntries(options.io, options.cwd, options.filter);
|
|
89
|
-
return {
|
|
90
|
-
cwd: options.cwd,
|
|
91
|
-
entries,
|
|
92
|
-
focusIndex: 0,
|
|
93
|
-
scrollY: 0,
|
|
94
|
-
height,
|
|
95
|
-
filter: options.filter,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
// State transformers
|
|
100
|
-
// ---------------------------------------------------------------------------
|
|
101
|
-
/**
|
|
102
|
-
* Move focus to the next entry (wraps around).
|
|
103
|
-
*
|
|
104
|
-
* @param state - Current file picker state.
|
|
105
|
-
* @returns Updated state with focus on the next entry.
|
|
106
|
-
*/
|
|
107
|
-
export function fpFocusNext(state) {
|
|
108
|
-
if (state.entries.length === 0)
|
|
109
|
-
return state;
|
|
110
|
-
const focusIndex = (state.focusIndex + 1) % state.entries.length;
|
|
111
|
-
return { ...state, focusIndex, scrollY: adjustScroll(focusIndex, state.scrollY, state.height, state.entries.length) };
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Move focus to the previous entry (wraps around).
|
|
115
|
-
*
|
|
116
|
-
* @param state - Current file picker state.
|
|
117
|
-
* @returns Updated state with focus on the previous entry.
|
|
118
|
-
*/
|
|
119
|
-
export function fpFocusPrev(state) {
|
|
120
|
-
if (state.entries.length === 0)
|
|
121
|
-
return state;
|
|
122
|
-
const focusIndex = (state.focusIndex - 1 + state.entries.length) % state.entries.length;
|
|
123
|
-
return { ...state, focusIndex, scrollY: adjustScroll(focusIndex, state.scrollY, state.height, state.entries.length) };
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Enter the focused directory, refreshing the entry list. No-op on files.
|
|
127
|
-
*
|
|
128
|
-
* @param state - Current file picker state.
|
|
129
|
-
* @param io - IO port for filesystem access.
|
|
130
|
-
* @returns Updated state browsing the focused directory, or unchanged if focused on a file.
|
|
131
|
-
*/
|
|
132
|
-
export function fpEnter(state, io) {
|
|
133
|
-
if (state.entries.length === 0)
|
|
134
|
-
return state;
|
|
135
|
-
const entry = state.entries[state.focusIndex];
|
|
136
|
-
if (!entry || !entry.isDirectory)
|
|
137
|
-
return state;
|
|
138
|
-
const newCwd = io.joinPath(state.cwd, entry.name);
|
|
139
|
-
const entries = safeReadEntries(io, newCwd, state.filter);
|
|
140
|
-
return {
|
|
141
|
-
...state,
|
|
142
|
-
cwd: newCwd,
|
|
143
|
-
entries,
|
|
144
|
-
focusIndex: 0,
|
|
145
|
-
scrollY: 0,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Navigate to the parent directory. No-op at filesystem root.
|
|
150
|
-
*
|
|
151
|
-
* @param state - Current file picker state.
|
|
152
|
-
* @param io - IO port for filesystem access.
|
|
153
|
-
* @returns Updated state browsing the parent directory, or unchanged at root.
|
|
154
|
-
*/
|
|
155
|
-
export function fpBack(state, io) {
|
|
156
|
-
const newCwd = io.joinPath(state.cwd, '..');
|
|
157
|
-
if (newCwd === state.cwd)
|
|
158
|
-
return state;
|
|
159
|
-
const entries = safeReadEntries(io, newCwd, state.filter);
|
|
160
|
-
return {
|
|
161
|
-
...state,
|
|
162
|
-
cwd: newCwd,
|
|
163
|
-
entries,
|
|
164
|
-
focusIndex: 0,
|
|
165
|
-
scrollY: 0,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
// Scroll helper
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
|
-
/**
|
|
172
|
-
* Clamp scroll position so the focused entry stays within the visible window.
|
|
173
|
-
*
|
|
174
|
-
* @param focusIndex - Index of the focused entry.
|
|
175
|
-
* @param scrollY - Current scroll offset.
|
|
176
|
-
* @param height - Viewport height in entries.
|
|
177
|
-
* @param totalItems - Total number of entries.
|
|
178
|
-
* @returns Adjusted scroll offset.
|
|
179
|
-
*/
|
|
180
|
-
function adjustScroll(focusIndex, scrollY, height, totalItems) {
|
|
181
|
-
let newScrollY = scrollY;
|
|
182
|
-
if (focusIndex < newScrollY) {
|
|
183
|
-
newScrollY = focusIndex;
|
|
184
|
-
}
|
|
185
|
-
else if (focusIndex >= newScrollY + height) {
|
|
186
|
-
newScrollY = focusIndex - height + 1;
|
|
187
|
-
}
|
|
188
|
-
const maxScroll = Math.max(0, totalItems - height);
|
|
189
|
-
return Math.min(newScrollY, maxScroll);
|
|
190
|
-
}
|
|
191
|
-
function renderFilePickerEntryLines(state, options) {
|
|
192
|
-
const indicator = options?.focusIndicator ?? '\u25b8';
|
|
193
|
-
const selectedIndicator = options?.selectedIndicator ?? '*';
|
|
194
|
-
const hasSelection = options?.selectedIndex !== undefined
|
|
195
|
-
&& options.selectedIndex >= 0
|
|
196
|
-
&& options.selectedIndex < state.entries.length;
|
|
197
|
-
const dirIcon = options?.dirIndicator ?? 'd';
|
|
198
|
-
const fileIcon = options?.fileIndicator ?? '-';
|
|
199
|
-
const pad = ' '.repeat(indicator.length);
|
|
200
|
-
const selectedPad = ' '.repeat(selectedIndicator.length);
|
|
201
|
-
if (state.entries.length === 0)
|
|
202
|
-
return [' (empty)'];
|
|
203
|
-
return state.entries.map((entry, index) => {
|
|
204
|
-
const prefix = index === state.focusIndex ? indicator : pad;
|
|
205
|
-
const selected = hasSelection && index === options?.selectedIndex ? selectedIndicator : selectedPad;
|
|
206
|
-
const icon = entry.isDirectory ? dirIcon : fileIcon;
|
|
207
|
-
const suffix = entry.isDirectory ? '/' : '';
|
|
208
|
-
return hasSelection
|
|
209
|
-
? `${prefix} ${selected} ${icon} ${entry.name}${suffix}`
|
|
210
|
-
: `${prefix} ${icon} ${entry.name}${suffix}`;
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
// ---------------------------------------------------------------------------
|
|
214
|
-
// Render
|
|
215
|
-
// ---------------------------------------------------------------------------
|
|
216
|
-
/**
|
|
217
|
-
* Render the file picker — cwd header followed by the visible entry list.
|
|
218
|
-
*
|
|
219
|
-
* Each entry is prefixed with a focus indicator and a type indicator
|
|
220
|
-
* (directory or file). Directories are suffixed with `/`.
|
|
221
|
-
*
|
|
222
|
-
* @param state - Current file picker state.
|
|
223
|
-
* @param options - Rendering options (focus, dir, and file indicators).
|
|
224
|
-
* @returns Rendered file picker string with cwd header and entry list.
|
|
225
|
-
*/
|
|
226
|
-
export function filePicker(state, options) {
|
|
227
|
-
const entryLines = renderFilePickerEntryLines(state, options);
|
|
228
|
-
return [
|
|
229
|
-
state.cwd,
|
|
230
|
-
...entryLines.slice(state.scrollY, state.scrollY + state.height),
|
|
231
|
-
].join('\n');
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Render the file picker into a viewport-backed `Surface`.
|
|
235
|
-
*
|
|
236
|
-
* The cwd header remains fixed while the entry list uses the shared
|
|
237
|
-
* `viewportSurface()` masking primitive for scrolling.
|
|
238
|
-
*
|
|
239
|
-
* @param state - Current file picker state.
|
|
240
|
-
* @param options - Rendering options plus optional fixed width.
|
|
241
|
-
* @returns Surface containing the cwd header and scrollable entry list.
|
|
242
|
-
*/
|
|
243
|
-
export function filePickerSurface(state, options) {
|
|
244
|
-
const entryLines = renderFilePickerEntryLines(state, options);
|
|
245
|
-
const width = Math.max(1, options?.width ?? 0, visibleLength(state.cwd), ...entryLines.map((line) => visibleLength(line)));
|
|
246
|
-
const headerSurface = parseAnsiToSurface(state.cwd, width, 1);
|
|
247
|
-
const listSurface = entryLines.length === 0
|
|
248
|
-
? createSurface(width, Math.max(1, state.height))
|
|
249
|
-
: viewportSurface({
|
|
250
|
-
width,
|
|
251
|
-
height: Math.max(1, state.height),
|
|
252
|
-
content: entryLines.join('\n'),
|
|
253
|
-
scrollY: state.scrollY,
|
|
254
|
-
showScrollbar: options?.showScrollbar ?? false,
|
|
255
|
-
});
|
|
256
|
-
return vstackSurface(headerSurface, listSurface);
|
|
257
|
-
}
|
|
258
|
-
// ---------------------------------------------------------------------------
|
|
259
|
-
// Convenience keymap
|
|
260
|
-
// ---------------------------------------------------------------------------
|
|
261
|
-
/**
|
|
262
|
-
* Create a preconfigured KeyMap for file picker navigation.
|
|
263
|
-
*
|
|
264
|
-
* The caller provides their own message types for each action:
|
|
265
|
-
* ```ts
|
|
266
|
-
* const keys = filePickerKeyMap({
|
|
267
|
-
* focusNext: { type: 'next' },
|
|
268
|
-
* focusPrev: { type: 'prev' },
|
|
269
|
-
* enter: { type: 'enter' },
|
|
270
|
-
* back: { type: 'back' },
|
|
271
|
-
* quit: { type: 'quit' },
|
|
272
|
-
* });
|
|
273
|
-
* ```
|
|
274
|
-
*
|
|
275
|
-
* @template Msg - Application message type dispatched by key bindings.
|
|
276
|
-
* @param actions - Map of navigation and action messages.
|
|
277
|
-
* @returns Preconfigured key map with vim-style file picker bindings.
|
|
278
|
-
*/
|
|
279
|
-
export function filePickerKeyMap(actions) {
|
|
280
|
-
return createKeyMap()
|
|
281
|
-
.group('Navigation', (g) => g
|
|
282
|
-
.bind('j', 'Next entry', actions.focusNext)
|
|
283
|
-
.bind('down', 'Next entry', actions.focusNext)
|
|
284
|
-
.bind('k', 'Previous entry', actions.focusPrev)
|
|
285
|
-
.bind('up', 'Previous entry', actions.focusPrev))
|
|
286
|
-
.group('Actions', (g) => g
|
|
287
|
-
.bind('enter', 'Enter directory / select file', actions.enter)
|
|
288
|
-
.bind('backspace', 'Parent directory', actions.back)
|
|
289
|
-
.bind('left', 'Parent directory', actions.back))
|
|
290
|
-
.bind('q', 'Quit', actions.quit)
|
|
291
|
-
.bind('ctrl+c', 'Quit', actions.quit);
|
|
292
|
-
}
|
|
1
|
+
export { createFilePickerState, fpFocusNext } from './file-picker.part01.js';
|
|
2
|
+
export { filePicker, fpBack, fpEnter, fpFocusPrev } from './file-picker.part02.js';
|
|
3
|
+
export { filePickerKeyMap, filePickerSurface } from './file-picker.part03.js';
|
|
293
4
|
//# sourceMappingURL=file-picker.js.map
|
package/dist/file-picker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { IOPort } from '@flyingrobots/bijou';
|
|
2
|
+
export interface FileEntry {
|
|
3
|
+
/** Name of the file or directory (without trailing `/`). */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Whether this entry is a directory. */
|
|
6
|
+
isDirectory: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface FilePickerState {
|
|
9
|
+
/** Current working directory being browsed. */
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
/** Sorted entries in the current directory. */
|
|
12
|
+
readonly entries: readonly FileEntry[];
|
|
13
|
+
/** Index of the currently focused entry. */
|
|
14
|
+
readonly focusIndex: number;
|
|
15
|
+
/** Vertical scroll offset (first visible entry index). */
|
|
16
|
+
readonly scrollY: number;
|
|
17
|
+
/** Maximum number of visible entries. */
|
|
18
|
+
readonly height: number;
|
|
19
|
+
/** Optional file extension filter (e.g. `".ts"`). */
|
|
20
|
+
readonly filter?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FilePickerOptions {
|
|
23
|
+
/** Starting directory path. */
|
|
24
|
+
readonly cwd: string;
|
|
25
|
+
/** IO port used for directory listing and path joining. */
|
|
26
|
+
readonly io: IOPort;
|
|
27
|
+
/** Maximum number of visible entries (default: 10). */
|
|
28
|
+
readonly height?: number;
|
|
29
|
+
/** Optional file extension filter (e.g. `".ts"`). */
|
|
30
|
+
readonly filter?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface FilePickerRenderOptions {
|
|
33
|
+
/** Character(s) shown next to the focused entry (default: `"\u25b8"`). */
|
|
34
|
+
readonly focusIndicator?: string;
|
|
35
|
+
/** Index of the entry that is selected by the hosting application. */
|
|
36
|
+
readonly selectedIndex?: number;
|
|
37
|
+
/** Character(s) shown next to the selected entry when `selectedIndex` is set (default: `"*"`). */
|
|
38
|
+
readonly selectedIndicator?: string;
|
|
39
|
+
/** Character(s) shown before directory names (default: `"d"`). */
|
|
40
|
+
readonly dirIndicator?: string;
|
|
41
|
+
/** Character(s) shown before file names (default: `"-"`). */
|
|
42
|
+
readonly fileIndicator?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface FilePickerSurfaceOptions extends FilePickerRenderOptions {
|
|
45
|
+
/** Fixed viewport width. Defaults to the widest rendered row or cwd header. */
|
|
46
|
+
readonly width?: number;
|
|
47
|
+
/** Show a scrollbar track on the right edge. Default: false. */
|
|
48
|
+
readonly showScrollbar?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare function safeReadEntries(io: IOPort, cwd: string, filter?: string): FileEntry[];
|
|
51
|
+
export declare function parseEntries(names: string[], filter?: string): FileEntry[];
|
|
52
|
+
export declare function createFilePickerState(options: FilePickerOptions): FilePickerState;
|
|
53
|
+
export declare function fpFocusNext(state: FilePickerState): FilePickerState;
|
|
54
|
+
//# sourceMappingURL=file-picker.part01.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.part01.d.ts","sourceRoot":"","sources":["../src/file-picker.part01.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kGAAkG;IAClG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,6DAA6D;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AACD,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AACD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAMrF;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAkB1E;AACD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,CAYjF;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CAInE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { sanitizePositiveInt } from '@flyingrobots/bijou';
|
|
2
|
+
import { adjustScroll } from './file-picker.part02.js';
|
|
3
|
+
export function safeReadEntries(io, cwd, filter) {
|
|
4
|
+
try {
|
|
5
|
+
return parseEntries(io.readDir(cwd), filter);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function parseEntries(names, filter) {
|
|
12
|
+
const dirs = [];
|
|
13
|
+
const files = [];
|
|
14
|
+
for (const name of names) {
|
|
15
|
+
if (name.endsWith('/')) {
|
|
16
|
+
dirs.push({ name: name.slice(0, -1), isDirectory: true });
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (filter && !name.endsWith(filter))
|
|
20
|
+
continue;
|
|
21
|
+
files.push({ name, isDirectory: false });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Sort dirs first, then files, both alphabetically
|
|
25
|
+
dirs.sort((a, b) => a.name.localeCompare(b.name));
|
|
26
|
+
files.sort((a, b) => a.name.localeCompare(b.name));
|
|
27
|
+
return [...dirs, ...files];
|
|
28
|
+
}
|
|
29
|
+
export function createFilePickerState(options) {
|
|
30
|
+
const height = sanitizePositiveInt(options.height, 10);
|
|
31
|
+
const entries = safeReadEntries(options.io, options.cwd, options.filter);
|
|
32
|
+
return {
|
|
33
|
+
cwd: options.cwd,
|
|
34
|
+
entries,
|
|
35
|
+
focusIndex: 0,
|
|
36
|
+
scrollY: 0,
|
|
37
|
+
height,
|
|
38
|
+
filter: options.filter,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function fpFocusNext(state) {
|
|
42
|
+
if (state.entries.length === 0)
|
|
43
|
+
return state;
|
|
44
|
+
const focusIndex = (state.focusIndex + 1) % state.entries.length;
|
|
45
|
+
return { ...state, focusIndex, scrollY: adjustScroll(focusIndex, state.scrollY, state.height, state.entries.length) };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=file-picker.part01.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.part01.js","sourceRoot":"","sources":["../src/file-picker.part01.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAiDvD,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,GAAW,EAAE,MAAe;IACtE,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,KAAe,EAAE,MAAe;IAC3D,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;AAC7B,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzE,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO;QACP,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,KAAsB;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACjE,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACxH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IOPort } from '@flyingrobots/bijou';
|
|
2
|
+
import type { FilePickerRenderOptions, FilePickerState } from './file-picker.part01.js';
|
|
3
|
+
export declare function fpFocusPrev(state: FilePickerState): FilePickerState;
|
|
4
|
+
export declare function fpEnter(state: FilePickerState, io: IOPort): FilePickerState;
|
|
5
|
+
export declare function fpBack(state: FilePickerState, io: IOPort): FilePickerState;
|
|
6
|
+
export declare function adjustScroll(focusIndex: number, scrollY: number, height: number, totalItems: number): number;
|
|
7
|
+
export declare function renderFilePickerEntryLines(state: FilePickerState, options?: FilePickerRenderOptions): string[];
|
|
8
|
+
export declare function filePicker(state: FilePickerState, options?: FilePickerRenderOptions): string;
|
|
9
|
+
//# sourceMappingURL=file-picker.part02.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.part02.d.ts","sourceRoot":"","sources":["../src/file-picker.part02.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxF,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CAInE;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAe3E;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAa1E;AACD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAS5G;AACD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,EAAE,CAsBV;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM,CAM5F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { safeReadEntries } from './file-picker.part01.js';
|
|
2
|
+
export function fpFocusPrev(state) {
|
|
3
|
+
if (state.entries.length === 0)
|
|
4
|
+
return state;
|
|
5
|
+
const focusIndex = (state.focusIndex - 1 + state.entries.length) % state.entries.length;
|
|
6
|
+
return { ...state, focusIndex, scrollY: adjustScroll(focusIndex, state.scrollY, state.height, state.entries.length) };
|
|
7
|
+
}
|
|
8
|
+
export function fpEnter(state, io) {
|
|
9
|
+
if (state.entries.length === 0)
|
|
10
|
+
return state;
|
|
11
|
+
const entry = state.entries[state.focusIndex];
|
|
12
|
+
if (!entry?.isDirectory)
|
|
13
|
+
return state;
|
|
14
|
+
const newCwd = io.joinPath(state.cwd, entry.name);
|
|
15
|
+
const entries = safeReadEntries(io, newCwd, state.filter);
|
|
16
|
+
return {
|
|
17
|
+
...state,
|
|
18
|
+
cwd: newCwd,
|
|
19
|
+
entries,
|
|
20
|
+
focusIndex: 0,
|
|
21
|
+
scrollY: 0,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function fpBack(state, io) {
|
|
25
|
+
const newCwd = io.joinPath(state.cwd, '..');
|
|
26
|
+
if (newCwd === state.cwd)
|
|
27
|
+
return state;
|
|
28
|
+
const entries = safeReadEntries(io, newCwd, state.filter);
|
|
29
|
+
return {
|
|
30
|
+
...state,
|
|
31
|
+
cwd: newCwd,
|
|
32
|
+
entries,
|
|
33
|
+
focusIndex: 0,
|
|
34
|
+
scrollY: 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function adjustScroll(focusIndex, scrollY, height, totalItems) {
|
|
38
|
+
let newScrollY = scrollY;
|
|
39
|
+
if (focusIndex < newScrollY) {
|
|
40
|
+
newScrollY = focusIndex;
|
|
41
|
+
}
|
|
42
|
+
else if (focusIndex >= newScrollY + height) {
|
|
43
|
+
newScrollY = focusIndex - height + 1;
|
|
44
|
+
}
|
|
45
|
+
const maxScroll = Math.max(0, totalItems - height);
|
|
46
|
+
return Math.min(newScrollY, maxScroll);
|
|
47
|
+
}
|
|
48
|
+
export function renderFilePickerEntryLines(state, options) {
|
|
49
|
+
const indicator = options?.focusIndicator ?? '\u25b8';
|
|
50
|
+
const selectedIndicator = options?.selectedIndicator ?? '*';
|
|
51
|
+
const hasSelection = options?.selectedIndex !== undefined
|
|
52
|
+
&& options.selectedIndex >= 0
|
|
53
|
+
&& options.selectedIndex < state.entries.length;
|
|
54
|
+
const dirIcon = options?.dirIndicator ?? 'd';
|
|
55
|
+
const fileIcon = options?.fileIndicator ?? '-';
|
|
56
|
+
const pad = ' '.repeat(indicator.length);
|
|
57
|
+
const selectedPad = ' '.repeat(selectedIndicator.length);
|
|
58
|
+
if (state.entries.length === 0)
|
|
59
|
+
return [' (empty)'];
|
|
60
|
+
return state.entries.map((entry, index) => {
|
|
61
|
+
const prefix = index === state.focusIndex ? indicator : pad;
|
|
62
|
+
const selected = hasSelection && index === options.selectedIndex ? selectedIndicator : selectedPad;
|
|
63
|
+
const icon = entry.isDirectory ? dirIcon : fileIcon;
|
|
64
|
+
const suffix = entry.isDirectory ? '/' : '';
|
|
65
|
+
return hasSelection
|
|
66
|
+
? `${prefix} ${selected} ${icon} ${entry.name}${suffix}`
|
|
67
|
+
: `${prefix} ${icon} ${entry.name}${suffix}`;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
export function filePicker(state, options) {
|
|
71
|
+
const entryLines = renderFilePickerEntryLines(state, options);
|
|
72
|
+
return [
|
|
73
|
+
state.cwd,
|
|
74
|
+
...entryLines.slice(state.scrollY, state.scrollY + state.height),
|
|
75
|
+
].join('\n');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=file-picker.part02.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.part02.js","sourceRoot":"","sources":["../src/file-picker.part02.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Surface } from '@flyingrobots/bijou';
|
|
2
|
+
import type { KeyMap } from './keybindings.js';
|
|
3
|
+
import type { FilePickerState, FilePickerSurfaceOptions } from './file-picker.part01.js';
|
|
4
|
+
export declare function filePickerSurface(state: FilePickerState, options?: FilePickerSurfaceOptions): Surface;
|
|
5
|
+
export declare function filePickerKeyMap<Msg>(actions: {
|
|
6
|
+
focusNext: Msg;
|
|
7
|
+
focusPrev: Msg;
|
|
8
|
+
enter: Msg;
|
|
9
|
+
back: Msg;
|
|
10
|
+
quit: Msg;
|
|
11
|
+
}): KeyMap<Msg>;
|
|
12
|
+
//# sourceMappingURL=file-picker.part03.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.part03.d.ts","sourceRoot":"","sources":["../src/file-picker.part03.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM/C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAGzF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAqBT;AACD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE;IAC7C,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,GAAG,CAAC;IACX,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;CACX,GAAG,MAAM,CAAC,GAAG,CAAC,CAed"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createSurface, parseAnsiToSurface } from '@flyingrobots/bijou';
|
|
2
|
+
import { createKeyMap } from './keybindings.js';
|
|
3
|
+
import { vstackSurface } from './surface-layout.js';
|
|
4
|
+
import { viewportSurface, visibleLength } from './viewport.js';
|
|
5
|
+
import { renderFilePickerEntryLines } from './file-picker.part02.js';
|
|
6
|
+
export function filePickerSurface(state, options) {
|
|
7
|
+
const entryLines = renderFilePickerEntryLines(state, options);
|
|
8
|
+
const width = Math.max(1, options?.width ?? 0, visibleLength(state.cwd), ...entryLines.map((line) => visibleLength(line)));
|
|
9
|
+
const headerSurface = parseAnsiToSurface(state.cwd, width, 1);
|
|
10
|
+
const listSurface = entryLines.length === 0
|
|
11
|
+
? createSurface(width, Math.max(1, state.height))
|
|
12
|
+
: viewportSurface({
|
|
13
|
+
width,
|
|
14
|
+
height: Math.max(1, state.height),
|
|
15
|
+
content: entryLines.join('\n'),
|
|
16
|
+
scrollY: state.scrollY,
|
|
17
|
+
showScrollbar: options?.showScrollbar ?? false,
|
|
18
|
+
});
|
|
19
|
+
return vstackSurface(headerSurface, listSurface);
|
|
20
|
+
}
|
|
21
|
+
export function filePickerKeyMap(actions) {
|
|
22
|
+
return createKeyMap()
|
|
23
|
+
.group('Navigation', (g) => g
|
|
24
|
+
.bind('j', 'Next entry', actions.focusNext)
|
|
25
|
+
.bind('down', 'Next entry', actions.focusNext)
|
|
26
|
+
.bind('k', 'Previous entry', actions.focusPrev)
|
|
27
|
+
.bind('up', 'Previous entry', actions.focusPrev))
|
|
28
|
+
.group('Actions', (g) => g
|
|
29
|
+
.bind('enter', 'Enter directory / select file', actions.enter)
|
|
30
|
+
.bind('backspace', 'Parent directory', actions.back)
|
|
31
|
+
.bind('left', 'Parent directory', actions.back))
|
|
32
|
+
.bind('q', 'Quit', actions.quit)
|
|
33
|
+
.bind('ctrl+c', 'Quit', actions.quit);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=file-picker.part03.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.part03.js","sourceRoot":"","sources":["../src/file-picker.part03.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,MAAM,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,OAAkC;IAElC,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,OAAO,EAAE,KAAK,IAAI,CAAC,EACnB,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EACxB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CACjD,CAAC;IAEF,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC;QACzC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,eAAe,CAAC;YAChB,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;YACjC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,KAAK;SAC/C,CAAC,CAAC;IAEL,OAAO,aAAa,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAM,OAMrC;IACC,OAAO,YAAY,EAAO;SACvB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC1B,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC;SAC1C,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC;SAC7C,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,SAAS,CAAC;SAC9C,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,SAAS,CAAC,CACjD;SACA,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACvB,IAAI,CAAC,OAAO,EAAE,+BAA+B,EAAE,OAAO,CAAC,KAAK,CAAC;SAC7D,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;SACnD,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAChD;SACA,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;SAC/B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
|