termcast 1.3.9 → 1.3.16
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/dist/action-utils.js +1 -1
- package/dist/action-utils.js.map +1 -1
- package/dist/apis/ai.js +1 -1
- package/dist/apis/ai.js.map +1 -1
- package/dist/apis/clipboard.js +2 -2
- package/dist/apis/clipboard.js.map +1 -1
- package/dist/apis/hud.d.ts +2 -2
- package/dist/apis/hud.d.ts.map +1 -1
- package/dist/apis/hud.js +5 -5
- package/dist/apis/hud.js.map +1 -1
- package/dist/apis/oauth.d.ts +1 -1
- package/dist/apis/oauth.d.ts.map +1 -1
- package/dist/apis/oauth.js +8 -8
- package/dist/apis/oauth.js.map +1 -1
- package/dist/apis/preferences.js +4 -4
- package/dist/apis/preferences.js.map +1 -1
- package/dist/apis/toast.d.ts +1 -5
- package/dist/apis/toast.d.ts.map +1 -1
- package/dist/apis/toast.js +26 -20
- package/dist/apis/toast.js.map +1 -1
- package/dist/build.d.ts +2 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +9 -8
- package/dist/build.js.map +1 -1
- package/dist/cli.js +44 -2
- package/dist/cli.js.map +1 -1
- package/dist/colors.d.ts +8 -1
- package/dist/colors.d.ts.map +1 -1
- package/dist/colors.js +12 -0
- package/dist/colors.js.map +1 -1
- package/dist/compile.d.ts +30 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +156 -0
- package/dist/compile.js.map +1 -0
- package/dist/components/actions.d.ts +2 -1
- package/dist/components/actions.d.ts.map +1 -1
- package/dist/components/actions.js +11 -8
- package/dist/components/actions.js.map +1 -1
- package/dist/components/alert.js +4 -4
- package/dist/components/alert.js.map +1 -1
- package/dist/components/command-arguments.d.ts +9 -0
- package/dist/components/command-arguments.d.ts.map +1 -0
- package/dist/components/command-arguments.js +21 -0
- package/dist/components/command-arguments.js.map +1 -0
- package/dist/components/detail.d.ts +3 -3
- package/dist/components/detail.d.ts.map +1 -1
- package/dist/components/detail.js +20 -42
- package/dist/components/detail.js.map +1 -1
- package/dist/components/dropdown.d.ts +2 -1
- package/dist/components/dropdown.d.ts.map +1 -1
- package/dist/components/dropdown.js +81 -25
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/extension-preferences.d.ts.map +1 -1
- package/dist/components/extension-preferences.js +23 -33
- package/dist/components/extension-preferences.js.map +1 -1
- package/dist/components/form/checkbox.d.ts.map +1 -1
- package/dist/components/form/checkbox.js +11 -4
- package/dist/components/form/checkbox.js.map +1 -1
- package/dist/components/form/date-picker.d.ts.map +1 -1
- package/dist/components/form/date-picker.js +18 -31
- package/dist/components/form/date-picker.js.map +1 -1
- package/dist/components/form/description.d.ts +2 -0
- package/dist/components/form/description.d.ts.map +1 -1
- package/dist/components/form/description.js +21 -3
- package/dist/components/form/description.js.map +1 -1
- package/dist/components/form/dropdown.d.ts.map +1 -1
- package/dist/components/form/dropdown.js +17 -32
- package/dist/components/form/dropdown.js.map +1 -1
- package/dist/components/form/file-autocomplete.d.ts +7 -4
- package/dist/components/form/file-autocomplete.d.ts.map +1 -1
- package/dist/components/form/file-autocomplete.js +56 -48
- package/dist/components/form/file-autocomplete.js.map +1 -1
- package/dist/components/form/file-picker.d.ts +5 -0
- package/dist/components/form/file-picker.d.ts.map +1 -1
- package/dist/components/form/file-picker.js +48 -51
- package/dist/components/form/file-picker.js.map +1 -1
- package/dist/components/form/form-end.js +1 -1
- package/dist/components/form/form-end.js.map +1 -1
- package/dist/components/form/form-ref.d.ts +43 -0
- package/dist/components/form/form-ref.d.ts.map +1 -0
- package/dist/components/form/form-ref.js +53 -0
- package/dist/components/form/form-ref.js.map +1 -0
- package/dist/components/form/index.d.ts +16 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +90 -27
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/form/password-field.d.ts.map +1 -1
- package/dist/components/form/password-field.js +33 -17
- package/dist/components/form/password-field.js.map +1 -1
- package/dist/components/form/separator.js +1 -1
- package/dist/components/form/separator.js.map +1 -1
- package/dist/components/form/tagpicker.d.ts +1 -1
- package/dist/components/form/tagpicker.d.ts.map +1 -1
- package/dist/components/form/text-area.d.ts.map +1 -1
- package/dist/components/form/text-area.js +33 -16
- package/dist/components/form/text-area.js.map +1 -1
- package/dist/components/form/text-field.d.ts.map +1 -1
- package/dist/components/form/text-field.js +38 -18
- package/dist/components/form/text-field.js.map +1 -1
- package/dist/components/form/use-form-navigation.d.ts +4 -0
- package/dist/components/form/use-form-navigation.d.ts.map +1 -1
- package/dist/components/form/use-form-navigation.js +35 -18
- package/dist/components/form/use-form-navigation.js.map +1 -1
- package/dist/components/form/with-left-border.d.ts.map +1 -1
- package/dist/components/form/with-left-border.js +3 -3
- package/dist/components/form/with-left-border.js.map +1 -1
- package/dist/components/icon.d.ts +3 -1
- package/dist/components/icon.d.ts.map +1 -1
- package/dist/components/icon.js +494 -469
- package/dist/components/icon.js.map +1 -1
- package/dist/components/image.js +1 -1
- package/dist/components/image.js.map +1 -1
- package/dist/components/list.d.ts +12 -8
- package/dist/components/list.d.ts.map +1 -1
- package/dist/components/list.js +172 -40
- package/dist/components/list.js.map +1 -1
- package/dist/components/loading-bar.js +2 -2
- package/dist/components/loading-bar.js.map +1 -1
- package/dist/components/menubar-extra.d.ts +1 -1
- package/dist/components/menubar-extra.d.ts.map +1 -1
- package/dist/components/menubar-extra.js +2 -2
- package/dist/components/menubar-extra.js.map +1 -1
- package/dist/descendants.d.ts.map +1 -1
- package/dist/descendants.js +8 -5
- package/dist/descendants.js.map +1 -1
- package/dist/e2e-node.d.ts +2 -0
- package/dist/e2e-node.d.ts.map +1 -1
- package/dist/e2e-node.js +14 -0
- package/dist/e2e-node.js.map +1 -1
- package/dist/examples/action-show-in-finder.js +3 -3
- package/dist/examples/action-show-in-finder.js.map +1 -1
- package/dist/examples/environment-test.js +4 -4
- package/dist/examples/environment-test.js.map +1 -1
- package/dist/examples/error-boundary.js +5 -5
- package/dist/examples/error-boundary.js.map +1 -1
- package/dist/examples/form-basic.d.ts.map +1 -1
- package/dist/examples/form-basic.js +6 -6
- package/dist/examples/form-basic.js.map +1 -1
- package/dist/examples/form-dropdown.js +3 -3
- package/dist/examples/form-dropdown.js.map +1 -1
- package/dist/examples/form-scroll.d.ts +2 -0
- package/dist/examples/form-scroll.d.ts.map +1 -0
- package/dist/examples/form-scroll.js +8 -0
- package/dist/examples/form-scroll.js.map +1 -0
- package/dist/examples/form-tagpicker.js +3 -3
- package/dist/examples/form-tagpicker.js.map +1 -1
- package/dist/examples/internal/descendants-filtering.js +10 -5
- package/dist/examples/internal/descendants-filtering.js.map +1 -1
- package/dist/examples/internal/descendants.js +13 -6
- package/dist/examples/internal/descendants.js.map +1 -1
- package/dist/examples/internal/rhf-custom-ref.d.ts +2 -0
- package/dist/examples/internal/rhf-custom-ref.d.ts.map +1 -0
- package/dist/examples/internal/rhf-custom-ref.js +67 -0
- package/dist/examples/internal/rhf-custom-ref.js.map +1 -0
- package/dist/examples/internal/scrollbox-demo.js +4 -8
- package/dist/examples/internal/scrollbox-demo.js.map +1 -1
- package/dist/examples/internal/scrollbox-with-descendants.d.ts +2 -0
- package/dist/examples/internal/scrollbox-with-descendants.d.ts.map +1 -0
- package/dist/examples/internal/scrollbox-with-descendants.js +63 -0
- package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -0
- package/dist/examples/internal/simple-dialog.js +7 -7
- package/dist/examples/internal/simple-dialog.js.map +1 -1
- package/dist/examples/internal/simple-scrollbox.d.ts +2 -0
- package/dist/examples/internal/simple-scrollbox.d.ts.map +1 -0
- package/dist/examples/internal/simple-scrollbox.js +25 -0
- package/dist/examples/internal/simple-scrollbox.js.map +1 -0
- package/dist/examples/internal/text-stacking.js +4 -2
- package/dist/examples/internal/text-stacking.js.map +1 -1
- package/dist/examples/list-dropdown-default.js +3 -3
- package/dist/examples/list-dropdown-default.js.map +1 -1
- package/dist/examples/list-fetch-data.js +3 -3
- package/dist/examples/list-fetch-data.js.map +1 -1
- package/dist/examples/list-scrollbox.d.ts +2 -0
- package/dist/examples/list-scrollbox.d.ts.map +1 -0
- package/dist/examples/list-scrollbox.js +29 -0
- package/dist/examples/list-scrollbox.js.map +1 -0
- package/dist/examples/list-with-detail.js +2 -2
- package/dist/examples/list-with-detail.js.map +1 -1
- package/dist/examples/list-with-dropdown.js +2 -2
- package/dist/examples/list-with-dropdown.js.map +1 -1
- package/dist/examples/list-with-sections.js +6 -6
- package/dist/examples/list-with-sections.js.map +1 -1
- package/dist/examples/miscellaneous.js +14 -14
- package/dist/examples/miscellaneous.js.map +1 -1
- package/dist/examples/nested-navigation.js +9 -7
- package/dist/examples/nested-navigation.js.map +1 -1
- package/dist/examples/preferences-test.js +4 -4
- package/dist/examples/preferences-test.js.map +1 -1
- package/dist/examples/simple-dropdown.js +4 -4
- package/dist/examples/simple-dropdown.js.map +1 -1
- package/dist/examples/simple-file-picker.js +3 -3
- package/dist/examples/simple-file-picker.js.map +1 -1
- package/dist/examples/simple-grid.js +2 -2
- package/dist/examples/simple-grid.js.map +1 -1
- package/dist/examples/simple-hud.js +4 -4
- package/dist/examples/simple-hud.js.map +1 -1
- package/dist/examples/simple-list-search.js +21 -5
- package/dist/examples/simple-list-search.js.map +1 -1
- package/dist/examples/simple-list.js +4 -4
- package/dist/examples/simple-list.js.map +1 -1
- package/dist/examples/simple-navigation.js +9 -7
- package/dist/examples/simple-navigation.js.map +1 -1
- package/dist/examples/store.js +1 -1
- package/dist/examples/store.js.map +1 -1
- package/dist/examples/submodule-diff.d.ts +2 -0
- package/dist/examples/submodule-diff.d.ts.map +1 -0
- package/dist/examples/submodule-diff.js +99 -0
- package/dist/examples/submodule-diff.js.map +1 -0
- package/dist/examples/tanstack-demo.js +3 -3
- package/dist/examples/tanstack-demo.js.map +1 -1
- package/dist/examples/use-promise-demo.js +3 -3
- package/dist/examples/use-promise-demo.js.map +1 -1
- package/dist/extensions/dev.d.ts +8 -0
- package/dist/extensions/dev.d.ts.map +1 -1
- package/dist/extensions/dev.js +60 -35
- package/dist/extensions/dev.js.map +1 -1
- package/dist/extensions/home.d.ts.map +1 -1
- package/dist/extensions/home.js +22 -97
- package/dist/extensions/home.js.map +1 -1
- package/dist/extensions/store.js +2 -2
- package/dist/extensions/store.js.map +1 -1
- package/dist/globals.js +1 -1
- package/dist/globals.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-action-panel.js +1 -1
- package/dist/hooks/use-action-panel.js.map +1 -1
- package/dist/hooks/use-unstable-ai.js +1 -1
- package/dist/hooks/use-unstable-ai.js.map +1 -1
- package/dist/index.d.ts +57 -55
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -38
- package/dist/index.js.map +1 -1
- package/dist/internal/date-picker-widget.d.ts.map +1 -1
- package/dist/internal/date-picker-widget.js +56 -48
- package/dist/internal/date-picker-widget.js.map +1 -1
- package/dist/internal/dialog.d.ts +3 -3
- package/dist/internal/dialog.d.ts.map +1 -1
- package/dist/internal/dialog.js +10 -10
- package/dist/internal/dialog.js.map +1 -1
- package/dist/internal/error-handler.js +2 -2
- package/dist/internal/error-handler.js.map +1 -1
- package/dist/internal/focus-context.d.ts +1 -1
- package/dist/internal/focus-context.d.ts.map +1 -1
- package/dist/internal/navigation.d.ts +1 -1
- package/dist/internal/navigation.d.ts.map +1 -1
- package/dist/internal/navigation.js +2 -2
- package/dist/internal/navigation.js.map +1 -1
- package/dist/internal/providers.d.ts +2 -2
- package/dist/internal/providers.d.ts.map +1 -1
- package/dist/internal/providers.js +9 -9
- package/dist/internal/providers.js.map +1 -1
- package/dist/internal/scrollbox.d.ts +12 -0
- package/dist/internal/scrollbox.d.ts.map +1 -0
- package/dist/internal/scrollbox.js +34 -0
- package/dist/internal/scrollbox.js.map +1 -0
- package/dist/preload.js +1 -1
- package/dist/preload.js.map +1 -1
- package/dist/release.d.ts +11 -0
- package/dist/release.d.ts.map +1 -0
- package/dist/release.js +113 -0
- package/dist/release.js.map +1 -0
- package/dist/state.d.ts +1 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +1 -0
- package/dist/state.js.map +1 -1
- package/dist/theme.d.ts +11 -8
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +31 -8
- package/dist/theme.js.map +1 -1
- package/dist/utils/run-command.d.ts +22 -0
- package/dist/utils/run-command.d.ts.map +1 -0
- package/dist/utils/run-command.js +127 -0
- package/dist/utils/run-command.js.map +1 -0
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +6 -4
- package/dist/utils.js.map +1 -1
- package/package.json +13 -8
- package/src/apis/toast.tsx +38 -17
- package/src/build.tsx +5 -3
- package/src/cli.tsx +46 -0
- package/src/colors.tsx +22 -1
- package/src/compile.tsx +219 -0
- package/src/components/actions.tsx +7 -1
- package/src/components/command-arguments.tsx +81 -0
- package/src/components/detail.tsx +26 -58
- package/src/components/dropdown.tsx +108 -23
- package/src/components/extension-preferences.tsx +55 -35
- package/src/components/form/checkbox.tsx +13 -5
- package/src/components/form/date-picker.tsx +24 -29
- package/src/components/form/description.tsx +35 -7
- package/src/components/form/dropdown.tsx +16 -30
- package/src/components/form/file-autocomplete.tsx +87 -77
- package/src/components/form/file-picker.tsx +69 -57
- package/src/components/form/form-ref.tsx +68 -0
- package/src/components/form/index.tsx +152 -41
- package/src/components/form/password-field.tsx +35 -22
- package/src/components/form/text-area.tsx +78 -58
- package/src/components/form/text-field.tsx +82 -61
- package/src/components/form/use-form-navigation.tsx +43 -23
- package/src/components/form/with-left-border.tsx +2 -1
- package/src/components/icon.tsx +497 -469
- package/src/components/list.tsx +279 -112
- package/src/components/loading-bar.tsx +1 -1
- package/src/descendants.tsx +15 -5
- package/src/e2e-node.tsx +16 -0
- package/src/examples/action-show-in-finder.tsx +1 -1
- package/src/examples/environment-test.tsx +1 -1
- package/src/examples/error-boundary.tsx +1 -1
- package/src/examples/file-autocomplete.vitest.tsx +245 -0
- package/src/examples/form-basic.tsx +12 -12
- package/src/examples/form-basic.vitest.tsx +297 -671
- package/src/examples/form-dropdown.tsx +1 -1
- package/src/examples/form-dropdown.vitest.tsx +353 -221
- package/src/examples/form-scroll.tsx +56 -0
- package/src/examples/form-scroll.vitest.tsx +228 -0
- package/src/examples/form-tagpicker.tsx +1 -1
- package/src/examples/form-tagpicker.vitest.tsx +438 -193
- package/src/examples/internal/descendants-filtering.tsx +13 -5
- package/src/examples/internal/descendants.tsx +17 -5
- package/src/examples/internal/rhf-custom-ref.tsx +152 -0
- package/src/examples/internal/scrollbox-demo.tsx +15 -7
- package/src/examples/internal/scrollbox-with-descendants.tsx +94 -0
- package/src/examples/internal/simple-dialog.tsx +1 -1
- package/src/examples/internal/simple-scrollbox.tsx +58 -0
- package/src/examples/internal/simple-scrollbox.vitest.tsx +104 -0
- package/src/examples/internal/text-stacking.tsx +4 -2
- package/src/examples/list-dropdown-default.tsx +1 -1
- package/src/examples/list-dropdown-default.vitest.tsx +136 -71
- package/src/examples/list-fetch-data.tsx +1 -1
- package/src/examples/list-fetch-data.vitest.tsx +42 -33
- package/src/examples/list-scrollbox.tsx +46 -0
- package/src/examples/list-scrollbox.vitest.tsx +103 -0
- package/src/examples/list-with-detail.tsx +1 -1
- package/src/examples/list-with-detail.vitest.tsx +290 -294
- package/src/examples/list-with-dropdown.tsx +1 -1
- package/src/examples/list-with-dropdown.vitest.tsx +190 -150
- package/src/examples/list-with-sections.tsx +12 -1
- package/src/examples/list-with-sections.vitest.tsx +390 -218
- package/src/examples/miscellaneous.tsx +1 -1
- package/src/examples/nested-navigation.tsx +7 -5
- package/src/examples/preferences-test.tsx +1 -1
- package/src/examples/simple-dropdown.tsx +1 -1
- package/src/examples/simple-file-picker.tsx +1 -1
- package/src/examples/simple-file-picker.vitest.tsx +533 -127
- package/src/examples/simple-grid.tsx +1 -1
- package/src/examples/simple-grid.vitest.tsx +258 -234
- package/src/examples/simple-hud.tsx +1 -1
- package/src/examples/simple-list-search.tsx +42 -1
- package/src/examples/simple-list.tsx +1 -1
- package/src/examples/simple-navigation.tsx +7 -5
- package/src/examples/simple-navigation.vitest.tsx +434 -238
- package/src/examples/store.tsx +1 -1
- package/src/examples/store.vitest.tsx +31 -14
- package/src/examples/submodule-diff.tsx +153 -0
- package/src/examples/tanstack-demo.tsx +1 -1
- package/src/examples/use-promise-demo.tsx +1 -1
- package/src/extensions/dev.tsx +76 -38
- package/src/extensions/dev.vitest.tsx +220 -0
- package/src/extensions/home.tsx +20 -121
- package/src/globals.ts +1 -1
- package/src/index.tsx +12 -25
- package/src/internal/date-picker-widget.tsx +56 -46
- package/src/internal/dialog.tsx +6 -6
- package/src/internal/providers.tsx +1 -1
- package/src/internal/scrollbox.tsx +63 -0
- package/src/release.tsx +159 -0
- package/src/state.tsx +2 -0
- package/src/store-api/search.test.tsx +4 -13
- package/src/theme.tsx +33 -8
- package/src/utils/run-command.tsx +204 -0
- package/src/utils.tsx +6 -4
- package/dist/ai.d.ts +0 -104
- package/dist/ai.d.ts.map +0 -1
- package/dist/ai.js +0 -135
- package/dist/ai.js.map +0 -1
- package/dist/apis/cache.test.d.ts +0 -2
- package/dist/apis/cache.test.d.ts.map +0 -1
- package/dist/apis/cache.test.js +0 -246
- package/dist/apis/cache.test.js.map +0 -1
- package/dist/apis/localstorage.test.d.ts +0 -2
- package/dist/apis/localstorage.test.d.ts.map +0 -1
- package/dist/apis/localstorage.test.js +0 -131
- package/dist/apis/localstorage.test.js.map +0 -1
- package/dist/apis/toast.test.d.ts +0 -2
- package/dist/apis/toast.test.d.ts.map +0 -1
- package/dist/apis/toast.test.js +0 -67
- package/dist/apis/toast.test.js.map +0 -1
- package/dist/build.test.d.ts +0 -2
- package/dist/build.test.d.ts.map +0 -1
- package/dist/build.test.js +0 -73
- package/dist/build.test.js.map +0 -1
- package/dist/cache.d.ts +0 -32
- package/dist/cache.d.ts.map +0 -1
- package/dist/cache.js +0 -205
- package/dist/cache.js.map +0 -1
- package/dist/cache.test.d.ts +0 -2
- package/dist/cache.test.d.ts.map +0 -1
- package/dist/cache.test.js +0 -246
- package/dist/cache.test.js.map +0 -1
- package/dist/clipboard.d.ts +0 -36
- package/dist/clipboard.d.ts.map +0 -1
- package/dist/clipboard.js +0 -154
- package/dist/clipboard.js.map +0 -1
- package/dist/components/form/form-type-only.d.ts +0 -174
- package/dist/components/form/form-type-only.d.ts.map +0 -1
- package/dist/components/form/form-type-only.js +0 -2
- package/dist/components/form/form-type-only.js.map +0 -1
- package/dist/components/form/use-form-handling.d.ts +0 -4
- package/dist/components/form/use-form-handling.d.ts.map +0 -1
- package/dist/components/form/use-form-handling.js +0 -37
- package/dist/components/form/use-form-handling.js.map +0 -1
- package/dist/dev-ui.d.ts +0 -7
- package/dist/dev-ui.d.ts.map +0 -1
- package/dist/dev-ui.js +0 -118
- package/dist/dev-ui.js.map +0 -1
- package/dist/environment.d.ts +0 -63
- package/dist/environment.d.ts.map +0 -1
- package/dist/environment.js +0 -189
- package/dist/environment.js.map +0 -1
- package/dist/examples/datepicker.d.ts +0 -2
- package/dist/examples/datepicker.d.ts.map +0 -1
- package/dist/examples/datepicker.js +0 -344
- package/dist/examples/datepicker.js.map +0 -1
- package/dist/examples/form-basic-arrow-keys.vitest.d.ts +0 -2
- package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +0 -1
- package/dist/examples/form-basic-arrow-keys.vitest.js +0 -46
- package/dist/examples/form-basic-arrow-keys.vitest.js.map +0 -1
- package/dist/examples/form-basic.vitest.d.ts +0 -2
- package/dist/examples/form-basic.vitest.d.ts.map +0 -1
- package/dist/examples/form-basic.vitest.js +0 -995
- package/dist/examples/form-basic.vitest.js.map +0 -1
- package/dist/examples/form-dropdown-with-sections.d.ts +0 -2
- package/dist/examples/form-dropdown-with-sections.d.ts.map +0 -1
- package/dist/examples/form-dropdown-with-sections.js +0 -13
- package/dist/examples/form-dropdown-with-sections.js.map +0 -1
- package/dist/examples/form-dropdown-with-sections.vitest.d.ts +0 -2
- package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +0 -1
- package/dist/examples/form-dropdown-with-sections.vitest.js +0 -75
- package/dist/examples/form-dropdown-with-sections.vitest.js.map +0 -1
- package/dist/examples/form-dropdown.vitest.d.ts +0 -2
- package/dist/examples/form-dropdown.vitest.d.ts.map +0 -1
- package/dist/examples/form-dropdown.vitest.js +0 -722
- package/dist/examples/form-dropdown.vitest.js.map +0 -1
- package/dist/examples/form-multiselect-dropdown.d.ts +0 -2
- package/dist/examples/form-multiselect-dropdown.d.ts.map +0 -1
- package/dist/examples/form-multiselect-dropdown.js +0 -13
- package/dist/examples/form-multiselect-dropdown.js.map +0 -1
- package/dist/examples/form-tagpicker.vitest.d.ts +0 -2
- package/dist/examples/form-tagpicker.vitest.d.ts.map +0 -1
- package/dist/examples/form-tagpicker.vitest.js +0 -491
- package/dist/examples/form-tagpicker.vitest.js.map +0 -1
- package/dist/examples/internal/nested-boxes.d.ts +0 -2
- package/dist/examples/internal/nested-boxes.d.ts.map +0 -1
- package/dist/examples/internal/nested-boxes.js +0 -7
- package/dist/examples/internal/nested-boxes.js.map +0 -1
- package/dist/examples/internal/unicode-square-repro.d.ts +0 -2
- package/dist/examples/internal/unicode-square-repro.d.ts.map +0 -1
- package/dist/examples/internal/unicode-square-repro.js +0 -7
- package/dist/examples/internal/unicode-square-repro.js.map +0 -1
- package/dist/examples/list-dropdown-default.vitest.d.ts +0 -2
- package/dist/examples/list-dropdown-default.vitest.d.ts.map +0 -1
- package/dist/examples/list-dropdown-default.vitest.js +0 -164
- package/dist/examples/list-dropdown-default.vitest.js.map +0 -1
- package/dist/examples/list-fetch-data.vitest.d.ts +0 -2
- package/dist/examples/list-fetch-data.vitest.d.ts.map +0 -1
- package/dist/examples/list-fetch-data.vitest.js +0 -103
- package/dist/examples/list-fetch-data.vitest.js.map +0 -1
- package/dist/examples/list-filter-navigation.d.ts +0 -2
- package/dist/examples/list-filter-navigation.d.ts.map +0 -1
- package/dist/examples/list-filter-navigation.js +0 -8
- package/dist/examples/list-filter-navigation.js.map +0 -1
- package/dist/examples/list-with-detail.vitest.d.ts +0 -2
- package/dist/examples/list-with-detail.vitest.d.ts.map +0 -1
- package/dist/examples/list-with-detail.vitest.js +0 -438
- package/dist/examples/list-with-detail.vitest.js.map +0 -1
- package/dist/examples/list-with-dropdown.vitest.d.ts +0 -2
- package/dist/examples/list-with-dropdown.vitest.d.ts.map +0 -1
- package/dist/examples/list-with-dropdown.vitest.js +0 -297
- package/dist/examples/list-with-dropdown.vitest.js.map +0 -1
- package/dist/examples/list-with-sections.vitest.d.ts +0 -2
- package/dist/examples/list-with-sections.vitest.d.ts.map +0 -1
- package/dist/examples/list-with-sections.vitest.js +0 -441
- package/dist/examples/list-with-sections.vitest.js.map +0 -1
- package/dist/examples/simple-file-picker.vitest.d.ts +0 -2
- package/dist/examples/simple-file-picker.vitest.d.ts.map +0 -1
- package/dist/examples/simple-file-picker.vitest.js +0 -277
- package/dist/examples/simple-file-picker.vitest.js.map +0 -1
- package/dist/examples/simple-grid.vitest.d.ts +0 -2
- package/dist/examples/simple-grid.vitest.d.ts.map +0 -1
- package/dist/examples/simple-grid.vitest.js +0 -498
- package/dist/examples/simple-grid.vitest.js.map +0 -1
- package/dist/examples/simple-navigation.vitest.d.ts +0 -2
- package/dist/examples/simple-navigation.vitest.d.ts.map +0 -1
- package/dist/examples/simple-navigation.vitest.js +0 -522
- package/dist/examples/simple-navigation.vitest.js.map +0 -1
- package/dist/examples/store.vitest.d.ts +0 -2
- package/dist/examples/store.vitest.d.ts.map +0 -1
- package/dist/examples/store.vitest.js +0 -52
- package/dist/examples/store.vitest.js.map +0 -1
- package/dist/home-command.d.ts +0 -8
- package/dist/home-command.d.ts.map +0 -1
- package/dist/home-command.js +0 -181
- package/dist/home-command.js.map +0 -1
- package/dist/hooks/hooks.test.d.ts +0 -2
- package/dist/hooks/hooks.test.d.ts.map +0 -1
- package/dist/hooks/hooks.test.js +0 -37
- package/dist/hooks/hooks.test.js.map +0 -1
- package/dist/hover-repro.d.ts +0 -2
- package/dist/hover-repro.d.ts.map +0 -1
- package/dist/hover-repro.js +0 -20
- package/dist/hover-repro.js.map +0 -1
- package/dist/localstorage.d.ts +0 -13
- package/dist/localstorage.d.ts.map +0 -1
- package/dist/localstorage.js +0 -190
- package/dist/localstorage.js.map +0 -1
- package/dist/localstorage.test.d.ts +0 -2
- package/dist/localstorage.test.d.ts.map +0 -1
- package/dist/localstorage.test.js +0 -131
- package/dist/localstorage.test.js.map +0 -1
- package/dist/oauth.d.ts +0 -142
- package/dist/oauth.d.ts.map +0 -1
- package/dist/oauth.js +0 -551
- package/dist/oauth.js.map +0 -1
- package/dist/preferences.d.ts +0 -23
- package/dist/preferences.d.ts.map +0 -1
- package/dist/preferences.js +0 -105
- package/dist/preferences.js.map +0 -1
- package/dist/store-api/download.test.d.ts +0 -2
- package/dist/store-api/download.test.d.ts.map +0 -1
- package/dist/store-api/download.test.js +0 -36
- package/dist/store-api/download.test.js.map +0 -1
- package/dist/store-api/extension.test.d.ts +0 -2
- package/dist/store-api/extension.test.d.ts.map +0 -1
- package/dist/store-api/extension.test.js +0 -22
- package/dist/store-api/extension.test.js.map +0 -1
- package/dist/store-api/search.test.d.ts +0 -2
- package/dist/store-api/search.test.d.ts.map +0 -1
- package/dist/store-api/search.test.js +0 -45
- package/dist/store-api/search.test.js.map +0 -1
- package/dist/store.d.ts +0 -21
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -84
- package/dist/store.js.map +0 -1
- package/dist/toast.d.ts +0 -44
- package/dist/toast.d.ts.map +0 -1
- package/dist/toast.js +0 -221
- package/dist/toast.js.map +0 -1
- package/dist/utils.test.d.ts +0 -2
- package/dist/utils.test.d.ts.map +0 -1
- package/dist/utils.test.js +0 -152
- package/dist/utils.test.js.map +0 -1
- package/dist/window.d.ts +0 -12
- package/dist/window.d.ts.map +0 -1
- package/dist/window.js +0 -48
- package/dist/window.js.map +0 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import {
|
|
1
|
+
import React, { useRef } from 'react'
|
|
2
|
+
import { BoxRenderable } from '@opentui/core'
|
|
3
3
|
import { useKeyboard } from '@opentui/react'
|
|
4
4
|
import { useFormContext, Controller } from 'react-hook-form'
|
|
5
|
-
import { useFocusContext } from './index'
|
|
5
|
+
import { useFocusContext, useFormFieldDescendant } from './index'
|
|
6
6
|
import { FormItemProps, FormItemRef } from './types'
|
|
7
|
-
import { logger } from 'termcast/src/logger'
|
|
8
7
|
import { Theme } from 'termcast/src/theme'
|
|
9
8
|
import { WithLeftBorder } from './with-left-border'
|
|
10
9
|
import { DatePickerWidget } from 'termcast/src/internal/date-picker-widget'
|
|
11
10
|
import { useIsInFocus } from 'termcast/src/internal/focus-context'
|
|
11
|
+
import { useFormNavigationHelpers } from './use-form-navigation'
|
|
12
12
|
|
|
13
13
|
export enum DatePickerType {
|
|
14
14
|
Date = 'date',
|
|
@@ -29,32 +29,20 @@ interface DatePickerComponentType {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const DatePickerComponent = (props: DatePickerProps): any => {
|
|
32
|
-
const { control
|
|
32
|
+
const { control } = useFormContext()
|
|
33
33
|
const { focusedField, setFocusedField } = useFocusContext()
|
|
34
34
|
const isFocused = focusedField === props.id
|
|
35
35
|
const isInFocus = useIsInFocus()
|
|
36
36
|
|
|
37
|
-
const
|
|
38
|
-
// Find previous field and focus it
|
|
39
|
-
const fieldNames = Object.keys(getValues())
|
|
40
|
-
const currentIndex = fieldNames.indexOf(props.id)
|
|
41
|
-
if (currentIndex > 0) {
|
|
42
|
-
setFocusedField(fieldNames[currentIndex - 1])
|
|
43
|
-
} else {
|
|
44
|
-
setFocusedField(fieldNames[fieldNames.length - 1])
|
|
45
|
-
}
|
|
46
|
-
}
|
|
37
|
+
const elementRef = useRef<BoxRenderable>(null)
|
|
47
38
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
setFocusedField(fieldNames[0])
|
|
56
|
-
}
|
|
57
|
-
}
|
|
39
|
+
// Register as form field descendant for scroll support
|
|
40
|
+
useFormFieldDescendant({
|
|
41
|
+
id: props.id,
|
|
42
|
+
elementRef: elementRef.current,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const { navigateToPrevious, navigateToNext } = useFormNavigationHelpers(props.id)
|
|
58
46
|
|
|
59
47
|
// Handle tab navigation only
|
|
60
48
|
useKeyboard((evt) => {
|
|
@@ -62,9 +50,9 @@ const DatePickerComponent = (props: DatePickerProps): any => {
|
|
|
62
50
|
|
|
63
51
|
if (evt.name === 'tab') {
|
|
64
52
|
if (evt.shift) {
|
|
65
|
-
|
|
53
|
+
navigateToPrevious()
|
|
66
54
|
} else {
|
|
67
|
-
|
|
55
|
+
navigateToNext()
|
|
68
56
|
}
|
|
69
57
|
}
|
|
70
58
|
})
|
|
@@ -76,10 +64,10 @@ const DatePickerComponent = (props: DatePickerProps): any => {
|
|
|
76
64
|
defaultValue={props.defaultValue || props.value || null}
|
|
77
65
|
render={({ field, fieldState, formState }) => {
|
|
78
66
|
return (
|
|
79
|
-
<box flexDirection='column'>
|
|
67
|
+
<box ref={elementRef} flexDirection='column'>
|
|
80
68
|
<WithLeftBorder withDiamond isFocused={isFocused}>
|
|
81
69
|
<text
|
|
82
|
-
fg={Theme.text}
|
|
70
|
+
fg={isFocused ? Theme.primary : Theme.text}
|
|
83
71
|
onMouseDown={() => {
|
|
84
72
|
setFocusedField(props.id)
|
|
85
73
|
}}
|
|
@@ -100,6 +88,13 @@ const DatePickerComponent = (props: DatePickerProps): any => {
|
|
|
100
88
|
focused={isFocused}
|
|
101
89
|
/>
|
|
102
90
|
</WithLeftBorder>
|
|
91
|
+
{field.value && (
|
|
92
|
+
<WithLeftBorder isFocused={isFocused}>
|
|
93
|
+
<text fg={Theme.accent}>
|
|
94
|
+
Selected: {field.value.toISOString().split('T')[0]}
|
|
95
|
+
</text>
|
|
96
|
+
</WithLeftBorder>
|
|
97
|
+
)}
|
|
103
98
|
{(fieldState.error || props.error) && (
|
|
104
99
|
<WithLeftBorder isFocused={isFocused}>
|
|
105
100
|
<text fg={Theme.error}>
|
|
@@ -1,30 +1,58 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { TextAttributes } from '@opentui/core'
|
|
1
|
+
import React, { useRef, useId } from 'react'
|
|
2
|
+
import { BoxRenderable, TextAttributes } from '@opentui/core'
|
|
3
3
|
import { Theme } from 'termcast/src/theme'
|
|
4
4
|
import { WithLeftBorder } from './with-left-border'
|
|
5
|
+
import { useFocusContext, useFormFieldDescendant } from './index'
|
|
6
|
+
import { useFormNavigation } from './use-form-navigation'
|
|
5
7
|
|
|
6
8
|
export interface DescriptionProps {
|
|
9
|
+
id?: string
|
|
7
10
|
title?: string
|
|
8
11
|
text: string
|
|
9
12
|
isFormTitle?: boolean
|
|
10
13
|
}
|
|
11
14
|
|
|
15
|
+
export const FORM_MAX_WIDTH = 70
|
|
16
|
+
|
|
12
17
|
export const Description = (props: DescriptionProps): any => {
|
|
18
|
+
const elementRef = useRef<BoxRenderable>(null)
|
|
19
|
+
const autoId = useId()
|
|
20
|
+
const id = props.id || autoId
|
|
21
|
+
|
|
22
|
+
const focusContext = useFocusContext()
|
|
23
|
+
const isFocused = focusContext.focusedField === id
|
|
24
|
+
|
|
25
|
+
// Register as form field descendant for scroll and navigation support
|
|
26
|
+
useFormFieldDescendant({
|
|
27
|
+
id,
|
|
28
|
+
elementRef: elementRef.current,
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Use form navigation for tab/arrow key support
|
|
32
|
+
useFormNavigation(id)
|
|
33
|
+
|
|
13
34
|
return (
|
|
14
|
-
|
|
35
|
+
<box
|
|
36
|
+
ref={elementRef}
|
|
37
|
+
flexDirection='column'
|
|
38
|
+
maxWidth={FORM_MAX_WIDTH}
|
|
39
|
+
onMouseDown={() => {
|
|
40
|
+
focusContext.setFocusedField(id)
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
15
43
|
{props.title && (
|
|
16
44
|
<WithLeftBorder
|
|
17
|
-
customCharacter={{ focused: '
|
|
18
|
-
isFocused={
|
|
45
|
+
customCharacter={{ focused: '■', unfocused: '▪︎' }}
|
|
46
|
+
isFocused={isFocused}
|
|
19
47
|
>
|
|
20
48
|
<text fg={Theme.text} attributes={TextAttributes.BOLD}>
|
|
21
49
|
{props.title}
|
|
22
50
|
</text>
|
|
23
51
|
</WithLeftBorder>
|
|
24
52
|
)}
|
|
25
|
-
<WithLeftBorder isFocused={
|
|
53
|
+
<WithLeftBorder isFocused={isFocused}>
|
|
26
54
|
<text fg={Theme.textMuted}>{props.text}</text>
|
|
27
55
|
</WithLeftBorder>
|
|
28
|
-
|
|
56
|
+
</box>
|
|
29
57
|
)
|
|
30
58
|
}
|
|
@@ -5,10 +5,8 @@ import React, {
|
|
|
5
5
|
useMemo,
|
|
6
6
|
useRef,
|
|
7
7
|
useLayoutEffect,
|
|
8
|
-
useEffect,
|
|
9
|
-
Children,
|
|
10
8
|
} from 'react'
|
|
11
|
-
import {
|
|
9
|
+
import { BoxRenderable } from '@opentui/core'
|
|
12
10
|
import { useKeyboard } from '@opentui/react'
|
|
13
11
|
import {
|
|
14
12
|
useFormContext,
|
|
@@ -16,7 +14,7 @@ import {
|
|
|
16
14
|
ControllerRenderProps,
|
|
17
15
|
ControllerFieldState,
|
|
18
16
|
} from 'react-hook-form'
|
|
19
|
-
import { useFocusContext } from './index'
|
|
17
|
+
import { useFocusContext, useFormFieldDescendant } from './index'
|
|
20
18
|
import { FormItemProps, FormItemRef } from './types'
|
|
21
19
|
import { logger } from 'termcast/src/logger'
|
|
22
20
|
import { Theme } from 'termcast/src/theme'
|
|
@@ -26,6 +24,7 @@ import {
|
|
|
26
24
|
} from 'termcast/src/descendants'
|
|
27
25
|
import { WithLeftBorder } from './with-left-border'
|
|
28
26
|
import { useIsInFocus } from 'termcast/src/internal/focus-context'
|
|
27
|
+
import { useFormNavigationHelpers } from './use-form-navigation'
|
|
29
28
|
|
|
30
29
|
export interface DropdownProps extends FormItemProps<string | string[]> {
|
|
31
30
|
placeholder?: string
|
|
@@ -233,36 +232,23 @@ const DropdownContent = ({
|
|
|
233
232
|
}: DropdownContentProps) => {
|
|
234
233
|
const descendantsContext = useFormDropdownDescendants()
|
|
235
234
|
const isInFocus = useIsInFocus()
|
|
236
|
-
const { getValues } = useFormContext()
|
|
237
235
|
const { focusedField, setFocusedField } = useFocusContext()
|
|
238
236
|
const isFocused = focusedField === props.id
|
|
239
237
|
const [focusedIndex, setFocusedIndex] = useState(0)
|
|
240
238
|
const [offset, setOffset] = useState(0)
|
|
241
239
|
|
|
240
|
+
const elementRef = useRef<BoxRenderable>(null)
|
|
241
|
+
|
|
242
|
+
// Register as form field descendant for scroll support
|
|
243
|
+
useFormFieldDescendant({
|
|
244
|
+
id: props.id,
|
|
245
|
+
elementRef: elementRef.current,
|
|
246
|
+
})
|
|
247
|
+
|
|
242
248
|
const [selectedTitles, setSelectedTitles] = useState<string[]>([])
|
|
243
249
|
const [itemsCount, setItemsCount] = useState(0)
|
|
244
250
|
|
|
245
|
-
const
|
|
246
|
-
// Find previous field and focus it
|
|
247
|
-
const fieldNames = Object.keys(getValues())
|
|
248
|
-
const currentIndex = fieldNames.indexOf(props.id)
|
|
249
|
-
if (currentIndex > 0) {
|
|
250
|
-
setFocusedField(fieldNames[currentIndex - 1])
|
|
251
|
-
} else {
|
|
252
|
-
setFocusedField(fieldNames[fieldNames.length - 1])
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const handleNavigateDown = () => {
|
|
257
|
-
// Find next field and focus it
|
|
258
|
-
const fieldNames = Object.keys(getValues())
|
|
259
|
-
const currentIndex = fieldNames.indexOf(props.id)
|
|
260
|
-
if (currentIndex < fieldNames.length - 1) {
|
|
261
|
-
setFocusedField(fieldNames[currentIndex + 1])
|
|
262
|
-
} else {
|
|
263
|
-
setFocusedField(fieldNames[0])
|
|
264
|
-
}
|
|
265
|
-
}
|
|
251
|
+
const { navigateToPrevious, navigateToNext } = useFormNavigationHelpers(props.id)
|
|
266
252
|
|
|
267
253
|
// Helper to get value for a descendantId
|
|
268
254
|
const getValueForDescendantId = (
|
|
@@ -367,9 +353,9 @@ const DropdownContent = ({
|
|
|
367
353
|
// Handle tab navigation
|
|
368
354
|
if (evt.name === 'tab') {
|
|
369
355
|
if (evt.shift) {
|
|
370
|
-
|
|
356
|
+
navigateToPrevious()
|
|
371
357
|
} else {
|
|
372
|
-
|
|
358
|
+
navigateToNext()
|
|
373
359
|
}
|
|
374
360
|
}
|
|
375
361
|
})
|
|
@@ -430,10 +416,10 @@ const DropdownContent = ({
|
|
|
430
416
|
return (
|
|
431
417
|
<FormDropdownDescendantsProvider value={descendantsContext}>
|
|
432
418
|
<FormDropdownContext.Provider value={contextValue}>
|
|
433
|
-
<box flexDirection='column'>
|
|
419
|
+
<box ref={elementRef} flexDirection='column'>
|
|
434
420
|
<WithLeftBorder withDiamond isFocused={isFocused}>
|
|
435
421
|
<text
|
|
436
|
-
fg={Theme.text}
|
|
422
|
+
fg={isFocused ? Theme.primary : Theme.text}
|
|
437
423
|
onMouseDown={() => {
|
|
438
424
|
setFocusedField(props.id)
|
|
439
425
|
}}
|
|
@@ -1,59 +1,63 @@
|
|
|
1
|
-
import React, { useState
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import { useQuery } from '@tanstack/react-query'
|
|
2
3
|
import { Theme } from 'termcast/src/theme'
|
|
3
|
-
import {
|
|
4
|
+
import { TextareaRenderable, RGBA } from '@opentui/core'
|
|
5
|
+
import { searchFiles, parsePath } from '../../utils/file-system'
|
|
4
6
|
import { useKeyboard } from '@opentui/react'
|
|
5
7
|
import { useIsInFocus } from 'termcast/src/internal/focus-context'
|
|
6
8
|
|
|
9
|
+
const backgroundPanel = RGBA.fromHex(Theme.backgroundPanel)
|
|
10
|
+
const primary = RGBA.fromHex(Theme.primary)
|
|
11
|
+
const border = RGBA.fromHex(Theme.border)
|
|
12
|
+
|
|
7
13
|
export interface FileAutocompleteProps {
|
|
8
|
-
value: string
|
|
9
|
-
onChange: (value: string) => void
|
|
10
14
|
onSelect: (path: string) => void
|
|
11
15
|
visible: boolean
|
|
12
16
|
onVisibilityChange: (visible: boolean) => void
|
|
13
|
-
inputRef: React.RefObject<
|
|
17
|
+
inputRef: React.RefObject<TextareaRenderable | null>
|
|
14
18
|
anchorRef: React.RefObject<any>
|
|
19
|
+
searchTrigger: number
|
|
20
|
+
canChooseFiles?: boolean
|
|
21
|
+
canChooseDirectories?: boolean
|
|
22
|
+
initialDirectory?: string
|
|
15
23
|
}
|
|
16
24
|
|
|
17
25
|
export const FileAutocomplete = ({
|
|
18
|
-
value,
|
|
19
|
-
onChange,
|
|
20
26
|
onSelect,
|
|
21
27
|
visible,
|
|
22
28
|
onVisibilityChange,
|
|
23
29
|
inputRef,
|
|
24
30
|
anchorRef,
|
|
31
|
+
searchTrigger,
|
|
32
|
+
canChooseFiles = true,
|
|
33
|
+
canChooseDirectories = false,
|
|
34
|
+
initialDirectory,
|
|
25
35
|
}: FileAutocompleteProps): any => {
|
|
26
36
|
const [selectedIndex, setSelectedIndex] = useState(0)
|
|
27
|
-
const [items, setItems] = useState<FileSystemItem[]>([])
|
|
28
|
-
const [loading, setLoading] = useState(false)
|
|
29
37
|
const isInFocus = useIsInFocus()
|
|
30
38
|
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// Search for files when value changes or visibility changes
|
|
37
|
-
useEffect(() => {
|
|
38
|
-
if (!visible) return
|
|
39
|
+
const inputValue = inputRef.current?.plainText || ''
|
|
40
|
+
const defaultBasePath = initialDirectory || '.'
|
|
41
|
+
const { basePath, prefix } = inputValue
|
|
42
|
+
? parsePath(inputValue)
|
|
43
|
+
: { basePath: defaultBasePath, prefix: '' }
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
const { data: items = [], isLoading: loading } = useQuery({
|
|
46
|
+
queryKey: ['file-autocomplete', basePath, prefix, searchTrigger, canChooseFiles, canChooseDirectories],
|
|
47
|
+
queryFn: async () => {
|
|
48
|
+
const results = await searchFiles(basePath, prefix)
|
|
49
|
+
const filtered = results.filter((item) => {
|
|
50
|
+
if (item.isDirectory) return true
|
|
51
|
+
return canChooseFiles
|
|
52
|
+
})
|
|
53
|
+
setSelectedIndex(0)
|
|
54
|
+
return filtered
|
|
55
|
+
},
|
|
56
|
+
enabled: visible,
|
|
57
|
+
})
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
}, [value, visible, basePath, prefix])
|
|
59
|
+
const directoryOnlyMode = canChooseDirectories && !canChooseFiles
|
|
55
60
|
|
|
56
|
-
// Handle keyboard navigation
|
|
57
61
|
useKeyboard((evt) => {
|
|
58
62
|
if (!visible || !isInFocus) return
|
|
59
63
|
|
|
@@ -65,77 +69,83 @@ export const FileAutocomplete = ({
|
|
|
65
69
|
onVisibilityChange(false)
|
|
66
70
|
} else if (evt.name === 'return') {
|
|
67
71
|
if (items[selectedIndex]) {
|
|
72
|
+
const value = inputRef.current?.plainText || ''
|
|
68
73
|
const selectedItem = items[selectedIndex]
|
|
69
74
|
const newValue =
|
|
70
75
|
value.substring(0, value.lastIndexOf('/') + 1) + selectedItem.name
|
|
71
76
|
|
|
72
77
|
if (selectedItem.isDirectory) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
78
|
+
const fullPath = newValue + '/'
|
|
79
|
+
inputRef.current?.setText(fullPath)
|
|
80
|
+
inputRef.current!.cursorOffset = fullPath.length
|
|
76
81
|
} else {
|
|
77
82
|
onSelect(newValue)
|
|
78
83
|
onVisibilityChange(false)
|
|
79
84
|
}
|
|
80
85
|
}
|
|
86
|
+
} else if (evt.name === 'right') {
|
|
87
|
+
if (items[selectedIndex]) {
|
|
88
|
+
const value = inputRef.current?.plainText || ''
|
|
89
|
+
const selectedItem = items[selectedIndex]
|
|
90
|
+
const newValue =
|
|
91
|
+
value.substring(0, value.lastIndexOf('/') + 1) + selectedItem.name
|
|
92
|
+
onSelect(newValue)
|
|
93
|
+
onVisibilityChange(false)
|
|
94
|
+
}
|
|
81
95
|
}
|
|
82
96
|
})
|
|
83
97
|
|
|
84
98
|
if (!visible || items.length === 0) return null
|
|
85
99
|
|
|
86
|
-
// Calculate position based on anchor element
|
|
87
100
|
const anchorElement = anchorRef.current
|
|
88
101
|
if (!anchorElement) return null
|
|
89
102
|
|
|
103
|
+
const maxVisible = 8
|
|
104
|
+
const visibleItems = items.slice(0, maxVisible)
|
|
105
|
+
const displayHeight = visibleItems.length + 1
|
|
106
|
+
|
|
107
|
+
const contentWidth = anchorElement.width - 2
|
|
108
|
+
|
|
109
|
+
const hintText = directoryOnlyMode
|
|
110
|
+
? '↑↓ navigate ⏎ open folder → select folder esc close'
|
|
111
|
+
: '↑↓ navigate ⏎ open/select → select esc close'
|
|
112
|
+
|
|
90
113
|
return (
|
|
91
114
|
<box
|
|
92
115
|
position='absolute'
|
|
93
|
-
top={anchorElement.y
|
|
116
|
+
top={anchorElement.y - displayHeight - 2}
|
|
94
117
|
left={anchorElement.x}
|
|
95
118
|
width={anchorElement.width}
|
|
119
|
+
height={displayHeight + 2}
|
|
96
120
|
zIndex={1000}
|
|
97
121
|
borderStyle='single'
|
|
98
|
-
borderColor={
|
|
99
|
-
backgroundColor={
|
|
100
|
-
|
|
122
|
+
borderColor={border}
|
|
123
|
+
backgroundColor={backgroundPanel}
|
|
124
|
+
shouldFill
|
|
101
125
|
>
|
|
102
|
-
{
|
|
103
|
-
|
|
104
|
-
Loading
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
onVisibilityChange(false)
|
|
126
|
-
}
|
|
127
|
-
}}
|
|
128
|
-
>
|
|
129
|
-
<text
|
|
130
|
-
fg={index === selectedIndex ? Theme.background : Theme.text}
|
|
131
|
-
>
|
|
132
|
-
{item.isDirectory ? '📁 ' : '📄 '}
|
|
133
|
-
{item.name}
|
|
134
|
-
</text>
|
|
135
|
-
</box>
|
|
136
|
-
))}
|
|
137
|
-
</box>
|
|
138
|
-
)}
|
|
126
|
+
<box flexDirection='column' backgroundColor={backgroundPanel} shouldFill>
|
|
127
|
+
{loading ? (
|
|
128
|
+
<text fg={Theme.textMuted}> Loading...</text>
|
|
129
|
+
) : (
|
|
130
|
+
<>
|
|
131
|
+
{visibleItems.map((item, index) => {
|
|
132
|
+
const icon = item.isDirectory ? '📁 ' : '📄 '
|
|
133
|
+
const text = ' ' + icon + item.name
|
|
134
|
+
const padded = text.padEnd(contentWidth, ' ')
|
|
135
|
+
return (
|
|
136
|
+
<text
|
|
137
|
+
key={item.path}
|
|
138
|
+
fg={index === selectedIndex ? Theme.background : Theme.text}
|
|
139
|
+
bg={index === selectedIndex ? Theme.primary : Theme.backgroundPanel}
|
|
140
|
+
>
|
|
141
|
+
{padded}
|
|
142
|
+
</text>
|
|
143
|
+
)
|
|
144
|
+
})}
|
|
145
|
+
<text fg={Theme.textMuted}> {hintText}</text>
|
|
146
|
+
</>
|
|
147
|
+
)}
|
|
148
|
+
</box>
|
|
139
149
|
</box>
|
|
140
150
|
)
|
|
141
151
|
}
|