termcast 1.3.30 → 1.3.32
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/apis/cache.d.ts.map +1 -1
- package/dist/apis/cache.js +4 -39
- package/dist/apis/cache.js.map +1 -1
- package/dist/apis/hud.d.ts.map +1 -1
- package/dist/apis/hud.js +13 -31
- package/dist/apis/hud.js.map +1 -1
- package/dist/apis/localstorage.d.ts.map +1 -1
- package/dist/apis/localstorage.js +3 -27
- package/dist/apis/localstorage.js.map +1 -1
- package/dist/apis/toast.d.ts +16 -43
- package/dist/apis/toast.d.ts.map +1 -1
- package/dist/apis/toast.js +78 -177
- package/dist/apis/toast.js.map +1 -1
- package/dist/build.d.ts +3 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +52 -2
- package/dist/build.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +206 -25
- package/dist/cli.js.map +1 -1
- package/dist/colors.d.ts.map +1 -1
- package/dist/colors.js +1 -0
- package/dist/colors.js.map +1 -1
- package/dist/compile.d.ts +0 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +18 -23
- package/dist/compile.js.map +1 -1
- package/dist/components/actions.d.ts.map +1 -1
- package/dist/components/actions.js +30 -15
- package/dist/components/actions.js.map +1 -1
- package/dist/components/animation-tick.d.ts +12 -0
- package/dist/components/animation-tick.d.ts.map +1 -0
- package/dist/components/animation-tick.js +63 -0
- package/dist/components/animation-tick.js.map +1 -0
- package/dist/components/detail.d.ts.map +1 -1
- package/dist/components/detail.js +10 -13
- package/dist/components/detail.js.map +1 -1
- package/dist/components/dropdown.d.ts +1 -0
- package/dist/components/dropdown.d.ts.map +1 -1
- package/dist/components/dropdown.js +27 -26
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/extension-preferences.d.ts.map +1 -1
- package/dist/components/extension-preferences.js +15 -10
- package/dist/components/extension-preferences.js.map +1 -1
- package/dist/components/footer.d.ts +13 -0
- package/dist/components/footer.d.ts.map +1 -0
- package/dist/components/footer.js +106 -0
- package/dist/components/footer.js.map +1 -0
- package/dist/components/form/file-autocomplete.d.ts +19 -4
- package/dist/components/form/file-autocomplete.d.ts.map +1 -1
- package/dist/components/form/file-autocomplete.js +56 -55
- package/dist/components/form/file-autocomplete.js.map +1 -1
- package/dist/components/form/file-picker.d.ts.map +1 -1
- package/dist/components/form/file-picker.js +26 -15
- package/dist/components/form/file-picker.js.map +1 -1
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +17 -15
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/form/with-left-border.d.ts.map +1 -1
- package/dist/components/form/with-left-border.js +4 -12
- package/dist/components/form/with-left-border.js.map +1 -1
- package/dist/components/list.d.ts.map +1 -1
- package/dist/components/list.js +126 -86
- package/dist/components/list.js.map +1 -1
- package/dist/components/loading-bar.d.ts.map +1 -1
- package/dist/components/loading-bar.js +5 -22
- package/dist/components/loading-bar.js.map +1 -1
- package/dist/components/loading-text.d.ts.map +1 -1
- package/dist/components/loading-text.js +3 -22
- package/dist/components/loading-text.js.map +1 -1
- package/dist/components/theme-picker.d.ts +2 -0
- package/dist/components/theme-picker.d.ts.map +1 -0
- package/dist/components/theme-picker.js +37 -0
- package/dist/components/theme-picker.js.map +1 -0
- package/dist/descendants.d.ts +6 -0
- package/dist/descendants.d.ts.map +1 -1
- package/dist/descendants.js +74 -8
- package/dist/descendants.js.map +1 -1
- package/dist/examples/internal/descendants-rerender.d.ts +14 -0
- package/dist/examples/internal/descendants-rerender.d.ts.map +1 -0
- package/dist/examples/internal/descendants-rerender.js +145 -0
- package/dist/examples/internal/descendants-rerender.js.map +1 -0
- package/dist/examples/internal/simple-dialog.js +4 -1
- package/dist/examples/internal/simple-dialog.js.map +1 -1
- package/dist/examples/internal/simple-scrollbox.js +1 -1
- package/dist/examples/internal/simple-scrollbox.js.map +1 -1
- package/dist/examples/list-with-dropdown.js +1 -1
- package/dist/examples/list-with-dropdown.js.map +1 -1
- package/dist/examples/miscellaneous.js +1 -1
- package/dist/examples/miscellaneous.js.map +1 -1
- package/dist/examples/toast-action.d.ts +2 -0
- package/dist/examples/toast-action.d.ts.map +1 -0
- package/dist/examples/toast-action.js +76 -0
- package/dist/examples/toast-action.js.map +1 -0
- package/dist/examples/toast-variations.js +38 -36
- package/dist/examples/toast-variations.js.map +1 -1
- package/dist/extensions/dev.d.ts +1 -1
- package/dist/extensions/dev.d.ts.map +1 -1
- package/dist/extensions/dev.js +62 -30
- package/dist/extensions/dev.js.map +1 -1
- package/dist/extensions/home.d.ts.map +1 -1
- package/dist/extensions/home.js +4 -3
- package/dist/extensions/home.js.map +1 -1
- package/dist/extensions/react-refresh-init.d.ts +5 -0
- package/dist/extensions/react-refresh-init.d.ts.map +1 -0
- package/dist/extensions/react-refresh-init.js +52 -0
- package/dist/extensions/react-refresh-init.js.map +1 -0
- package/dist/internal/date-picker-widget.js +1 -1
- package/dist/internal/date-picker-widget.js.map +1 -1
- package/dist/internal/dialog.d.ts +8 -3
- package/dist/internal/dialog.d.ts.map +1 -1
- package/dist/internal/dialog.js +37 -53
- package/dist/internal/dialog.js.map +1 -1
- package/dist/internal/navigation.d.ts +1 -0
- package/dist/internal/navigation.d.ts.map +1 -1
- package/dist/internal/navigation.js +25 -1
- package/dist/internal/navigation.js.map +1 -1
- package/dist/internal/providers.d.ts.map +1 -1
- package/dist/internal/providers.js +9 -197
- package/dist/internal/providers.js.map +1 -1
- package/dist/internal/scrollbox.d.ts.map +1 -1
- package/dist/internal/scrollbox.js +1 -0
- package/dist/internal/scrollbox.js.map +1 -1
- package/dist/release.d.ts +1 -0
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +16 -9
- package/dist/release.js.map +1 -1
- package/dist/state.d.ts +27 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +6 -0
- package/dist/state.js.map +1 -1
- package/dist/theme.d.ts +6 -19
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +76 -45
- package/dist/theme.js.map +1 -1
- package/dist/themes/aura.json +69 -0
- package/dist/themes/ayu.json +80 -0
- package/dist/themes/catppuccin-frappe.json +233 -0
- package/dist/themes/catppuccin-macchiato.json +233 -0
- package/dist/themes/catppuccin.json +112 -0
- package/dist/themes/cobalt2.json +228 -0
- package/dist/themes/cursor.json +249 -0
- package/dist/themes/dracula.json +219 -0
- package/dist/themes/everforest.json +241 -0
- package/dist/themes/flexoki.json +237 -0
- package/dist/themes/github-light.json +56 -0
- package/dist/themes/github.json +241 -0
- package/dist/themes/gruvbox.json +95 -0
- package/dist/themes/kanagawa.json +77 -0
- package/dist/themes/lucent-orng.json +227 -0
- package/dist/themes/material.json +235 -0
- package/dist/themes/matrix.json +77 -0
- package/dist/themes/mercury.json +245 -0
- package/dist/themes/monokai.json +221 -0
- package/dist/themes/nightowl.json +221 -0
- package/dist/themes/nord.json +223 -0
- package/dist/themes/one-dark.json +84 -0
- package/dist/themes/opencode-light.json +62 -0
- package/dist/themes/opencode.json +245 -0
- package/dist/themes/orng.json +245 -0
- package/dist/themes/palenight.json +222 -0
- package/dist/themes/rosepine.json +234 -0
- package/dist/themes/solarized.json +223 -0
- package/dist/themes/synthwave84.json +226 -0
- package/dist/themes/termcast.json +226 -0
- package/dist/themes/tokyonight.json +243 -0
- package/dist/themes/vercel.json +255 -0
- package/dist/themes/vesper.json +218 -0
- package/dist/themes/zenburn.json +223 -0
- package/dist/themes.d.ts +57 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +181 -0
- package/dist/themes.js.map +1 -0
- package/dist/utils/run-command.d.ts +2 -1
- package/dist/utils/run-command.d.ts.map +1 -1
- package/dist/utils/run-command.js +20 -10
- package/dist/utils/run-command.js.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +90 -17
- package/dist/utils.js.map +1 -1
- package/dist/watcher.d.ts +3 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +16 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +16 -10
- package/src/apis/cache.tsx +5 -44
- package/src/apis/hud.tsx +17 -62
- package/src/apis/localstorage.tsx +3 -32
- package/src/apis/toast.tsx +91 -275
- package/src/build.test.tsx +10 -0
- package/src/build.tsx +61 -1
- package/src/cli.tsx +365 -103
- package/src/colors.tsx +1 -0
- package/src/compile.tsx +21 -29
- package/src/compile.vitest.tsx +300 -0
- package/src/components/actions.tsx +64 -45
- package/src/components/animation-tick.tsx +85 -0
- package/src/components/detail.tsx +31 -35
- package/src/components/dropdown.tsx +32 -21
- package/src/components/extension-preferences.tsx +14 -10
- package/src/components/footer.tsx +241 -0
- package/src/components/form/file-autocomplete.tsx +80 -60
- package/src/components/form/file-picker.tsx +37 -25
- package/src/components/form/index.tsx +45 -41
- package/src/components/form/with-left-border.tsx +4 -14
- package/src/components/list.tsx +181 -121
- package/src/components/loading-bar.tsx +5 -25
- package/src/components/loading-text.tsx +4 -23
- package/src/components/theme-picker.tsx +57 -0
- package/src/descendants.tsx +98 -9
- package/src/examples/actions-dialog-layout.vitest.tsx +112 -0
- package/src/examples/file-autocomplete.vitest.tsx +131 -122
- package/src/examples/form-basic.vitest.tsx +463 -644
- package/src/examples/form-dropdown.vitest.tsx +553 -571
- package/src/examples/form-scroll.vitest.tsx +112 -102
- package/src/examples/form-tagpicker.vitest.tsx +364 -338
- package/src/examples/internal/descendants-rerender.tsx +273 -0
- package/src/examples/internal/descendants-rerender.vitest.tsx +194 -0
- package/src/examples/internal/simple-dialog.tsx +4 -4
- package/src/examples/internal/simple-scrollbox.tsx +2 -2
- package/src/examples/internal/simple-scrollbox.vitest.tsx +43 -31
- package/src/examples/list-detail-metadata.vitest.tsx +34 -30
- package/src/examples/list-dropdown-default.vitest.tsx +84 -72
- package/src/examples/list-empty-view.vitest.tsx +93 -0
- package/src/examples/list-fetch-data.vitest.tsx +36 -30
- package/src/examples/list-scrollbox.vitest.tsx +59 -39
- package/src/examples/list-with-detail.vitest.tsx +339 -314
- package/src/examples/list-with-dropdown.tsx +1 -0
- package/src/examples/list-with-dropdown.vitest.tsx +176 -150
- package/src/examples/list-with-sections.vitest.tsx +289 -270
- package/src/examples/list-with-toast.vitest.tsx +44 -44
- package/src/examples/miscellaneous.tsx +10 -0
- package/src/examples/simple-file-picker.vitest.tsx +90 -86
- package/src/examples/simple-grid.vitest.tsx +275 -249
- package/src/examples/simple-navigation.vitest.tsx +192 -168
- package/src/examples/store.vitest.tsx +6 -4
- package/src/examples/swift-extension.vitest.tsx +31 -19
- package/src/examples/synonyms.vitest.tsx +93 -83
- package/src/examples/toast-action.tsx +160 -0
- package/src/examples/toast-action.vitest.tsx +404 -0
- package/src/examples/toast-variations.tsx +58 -57
- package/src/examples/toast-variations.vitest.tsx +186 -166
- package/src/extensions/dev.tsx +74 -33
- package/src/extensions/dev.vitest.tsx +162 -69
- package/src/extensions/home.tsx +5 -6
- package/src/extensions/react-refresh-init.tsx +59 -0
- package/src/internal/date-picker-widget.tsx +1 -1
- package/src/internal/dialog.tsx +59 -83
- package/src/internal/navigation.tsx +37 -4
- package/src/internal/providers.tsx +27 -315
- package/src/internal/scrollbox.tsx +1 -0
- package/src/release.tsx +16 -10
- package/src/state.tsx +36 -3
- package/src/theme.tsx +82 -51
- package/src/themes/aura.json +69 -0
- package/src/themes/ayu.json +80 -0
- package/src/themes/catppuccin-frappe.json +233 -0
- package/src/themes/catppuccin-macchiato.json +233 -0
- package/src/themes/catppuccin.json +112 -0
- package/src/themes/cobalt2.json +228 -0
- package/src/themes/cursor.json +249 -0
- package/src/themes/dracula.json +219 -0
- package/src/themes/everforest.json +241 -0
- package/src/themes/flexoki.json +237 -0
- package/src/themes/github-light.json +56 -0
- package/src/themes/github.json +241 -0
- package/src/themes/gruvbox.json +95 -0
- package/src/themes/kanagawa.json +77 -0
- package/src/themes/lucent-orng.json +227 -0
- package/src/themes/material.json +235 -0
- package/src/themes/matrix.json +77 -0
- package/src/themes/mercury.json +252 -0
- package/src/themes/monokai.json +221 -0
- package/src/themes/nightowl.json +221 -0
- package/src/themes/nord.json +223 -0
- package/src/themes/one-dark.json +84 -0
- package/src/themes/opencode-light.json +62 -0
- package/src/themes/opencode.json +245 -0
- package/src/themes/orng.json +245 -0
- package/src/themes/palenight.json +222 -0
- package/src/themes/rosepine.json +234 -0
- package/src/themes/solarized.json +223 -0
- package/src/themes/synthwave84.json +226 -0
- package/src/themes/termcast.json +227 -0
- package/src/themes/tokyonight.json +243 -0
- package/src/themes/vercel.json +255 -0
- package/src/themes/vesper.json +218 -0
- package/src/themes/zenburn.json +223 -0
- package/src/themes.ts +291 -0
- package/src/utils/run-command.tsx +23 -12
- package/src/utils.tsx +115 -18
- package/src/watcher.tsx +19 -0
package/dist/components/list.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@opentui/react/jsx-runtime";
|
|
2
2
|
import { TextAttributes, } from '@opentui/core';
|
|
3
|
-
import { useKeyboard } from '@opentui/react';
|
|
3
|
+
import { useKeyboard, flushSync } from '@opentui/react';
|
|
4
4
|
import React, { createContext, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
5
5
|
import { LoadingBar } from 'termcast/src/components/loading-bar';
|
|
6
|
+
import { Footer } from 'termcast/src/components/footer';
|
|
6
7
|
import { createDescendants } from 'termcast/src/descendants';
|
|
7
8
|
import { useStore } from 'termcast/src/state';
|
|
8
9
|
import { useDialog } from 'termcast/src/internal/dialog';
|
|
@@ -12,6 +13,7 @@ import { Offscreen } from 'termcast/src/internal/offscreen';
|
|
|
12
13
|
import { ScrollBox } from 'termcast/src/internal/scrollbox';
|
|
13
14
|
import { Color, resolveColor } from 'termcast/src/colors';
|
|
14
15
|
import { getIconEmoji } from 'termcast/src/components/icon';
|
|
16
|
+
import { ActionPanel } from 'termcast/src/components/actions';
|
|
15
17
|
import { Theme, markdownSyntaxStyle } from 'termcast/src/theme';
|
|
16
18
|
export { Color };
|
|
17
19
|
function formatRelativeDate(date) {
|
|
@@ -47,15 +49,10 @@ function formatRelativeDate(date) {
|
|
|
47
49
|
function ListFooter() {
|
|
48
50
|
const firstActionTitle = useStore((s) => s.firstActionTitle);
|
|
49
51
|
const hasToast = useStore((s) => s.toast !== null);
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
paddingRight: 1,
|
|
55
|
-
paddingTop: 1,
|
|
56
|
-
marginTop: 1,
|
|
57
|
-
flexDirection: 'row',
|
|
58
|
-
}, children: content }));
|
|
52
|
+
const listContext = useContext(ListContext);
|
|
53
|
+
const isShowingDetail = listContext?.isShowingDetail ?? false;
|
|
54
|
+
const content = hasToast ? null : (_jsxs("box", { style: { flexDirection: 'row', gap: 3 }, children: [firstActionTitle && (_jsxs("box", { style: { flexDirection: 'row', gap: 1 }, children: [_jsx("text", { flexShrink: 0, fg: Theme.text, attributes: TextAttributes.BOLD, children: "\u21B5" }), _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: firstActionTitle.toLowerCase() })] })), _jsxs("box", { style: { flexDirection: 'row', gap: 1 }, children: [_jsx("text", { flexShrink: 0, fg: Theme.text, attributes: TextAttributes.BOLD, children: "\u2191\u2193" }), _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "navigate" })] }), _jsxs("box", { style: { flexDirection: 'row', gap: 1 }, children: [_jsx("text", { flexShrink: 0, fg: Theme.text, attributes: TextAttributes.BOLD, children: "^k" }), _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "actions" })] })] }));
|
|
55
|
+
return _jsx(Footer, { hidePoweredBy: isShowingDetail, children: content });
|
|
59
56
|
}
|
|
60
57
|
const ListContext = createContext(undefined);
|
|
61
58
|
// Helper function to determine if an item should be visible based on search
|
|
@@ -74,7 +71,7 @@ function shouldItemBeVisible(searchQuery, props) {
|
|
|
74
71
|
.toLowerCase();
|
|
75
72
|
return searchableText.includes(needle);
|
|
76
73
|
}
|
|
77
|
-
const { DescendantsProvider: ListDescendantsProvider, useDescendants: useListDescendants, useDescendant: useListItemDescendant, } = createDescendants();
|
|
74
|
+
const { DescendantsProvider: ListDescendantsProvider, useDescendants: useListDescendants, useDescendant: useListItemDescendant, useDescendantsRerender: useListDescendantsRerender, useDescendantsMap: useListDescendantsMap, } = createDescendants();
|
|
78
75
|
const { DescendantsProvider: DropdownDescendantsProvider, useDescendants: useDropdownDescendants, useDescendant: useDropdownItemDescendant, } = createDescendants();
|
|
79
76
|
const DropdownContext = createContext(undefined);
|
|
80
77
|
function ListDropdownDialog(props) {
|
|
@@ -84,8 +81,10 @@ function ListDropdownDialog(props) {
|
|
|
84
81
|
const descendantsContext = useDropdownDescendants();
|
|
85
82
|
// Wrapper function that updates search text
|
|
86
83
|
const setSearchText = (value) => {
|
|
87
|
-
|
|
88
|
-
|
|
84
|
+
// Using flushSync to force descendants to update visibility before querying
|
|
85
|
+
flushSync(() => {
|
|
86
|
+
setSearchTextRaw(value);
|
|
87
|
+
});
|
|
89
88
|
const items = Object.values(descendantsContext.map.current)
|
|
90
89
|
.filter((item) => item.index !== -1 && item.props?.visible !== false)
|
|
91
90
|
.sort((a, b) => a.index - b.index);
|
|
@@ -144,13 +143,13 @@ function ListDropdownDialog(props) {
|
|
|
144
143
|
return (_jsx(DropdownDescendantsProvider, { value: descendantsContext, children: _jsxs("box", { children: [_jsxs("box", { style: { paddingLeft: 2, paddingRight: 2 }, children: [_jsxs("box", { style: { paddingLeft: 1, paddingRight: 1 }, children: [_jsxs("box", { style: {
|
|
145
144
|
flexDirection: 'row',
|
|
146
145
|
justifyContent: 'space-between',
|
|
147
|
-
}, children: [_jsx("text", {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
146
|
+
}, children: [_jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: props.tooltip }), _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "esc" })] }), _jsxs("box", { style: { paddingTop: 1, paddingBottom: 1, flexDirection: 'row' }, children: [_jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "> " }), _jsx("textarea", { ref: inputRef, height: 1, flexGrow: 1, wrapMode: 'none', keyBindings: [
|
|
147
|
+
{ name: 'return', action: 'submit' },
|
|
148
|
+
{ name: 'linefeed', action: 'submit' },
|
|
149
|
+
], onContentChange: () => {
|
|
150
|
+
const value = inputRef.current?.plainText || '';
|
|
151
|
+
setSearchText(value);
|
|
152
|
+
}, placeholder: props.placeholder || 'Search...', focused: inFocus, initialValue: searchText, focusedBackgroundColor: Theme.backgroundPanel, cursorColor: Theme.primary, focusedTextColor: Theme.textMuted })] })] }), _jsx("box", { style: { paddingBottom: 1 }, children: _jsx(DropdownContext.Provider, { value: {
|
|
154
153
|
currentSection: undefined,
|
|
155
154
|
selectedIndex,
|
|
156
155
|
setSelectedIndex,
|
|
@@ -160,18 +159,12 @@ function ListDropdownDialog(props) {
|
|
|
160
159
|
onChange: (value) => {
|
|
161
160
|
props.onChange?.(value);
|
|
162
161
|
},
|
|
163
|
-
}, children: props.children }) }), props.isLoading && (_jsx("box", { style: { paddingLeft: 1 }, children: _jsx("text", { fg: Theme.textMuted, children: "Loading..." }) }))] }), _jsx(DropdownFooter, {})] }) }));
|
|
162
|
+
}, children: props.children }) }), props.isLoading && (_jsx("box", { style: { paddingLeft: 1 }, children: _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "Loading..." }) }))] }), _jsx(DropdownFooter, {})] }) }));
|
|
164
163
|
}
|
|
165
164
|
function DropdownFooter() {
|
|
166
165
|
const hasToast = useStore((s) => s.toast !== null);
|
|
167
|
-
const content = hasToast ? null : (_jsxs(
|
|
168
|
-
return (_jsx(
|
|
169
|
-
paddingRight: 2,
|
|
170
|
-
paddingLeft: 3,
|
|
171
|
-
paddingBottom: 1,
|
|
172
|
-
paddingTop: 1,
|
|
173
|
-
flexDirection: 'row',
|
|
174
|
-
}, children: content }));
|
|
166
|
+
const content = hasToast ? null : (_jsxs("box", { style: { flexDirection: 'row', gap: 3 }, children: [_jsxs("box", { style: { flexDirection: 'row', gap: 1 }, children: [_jsx("text", { flexShrink: 0, fg: Theme.text, attributes: TextAttributes.BOLD, children: "\u21B5" }), _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "select" })] }), _jsxs("box", { style: { flexDirection: 'row', gap: 1 }, children: [_jsx("text", { flexShrink: 0, fg: Theme.text, attributes: TextAttributes.BOLD, children: "\u2191\u2193" }), _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "navigate" })] })] }));
|
|
167
|
+
return (_jsx(Footer, { paddingLeft: 3, paddingRight: 2, paddingBottom: 1, marginTop: 0, children: content }));
|
|
175
168
|
}
|
|
176
169
|
// Render a single list item row
|
|
177
170
|
function ListItemRow(props) {
|
|
@@ -186,7 +179,7 @@ function ListItemRow(props) {
|
|
|
186
179
|
: accessory.text?.value;
|
|
187
180
|
const textColor = typeof accessory.text === 'object' ? accessory.text?.color : undefined;
|
|
188
181
|
if (textValue) {
|
|
189
|
-
accessoryElements.push(_jsx("text", { fg: active ? Theme.background : resolveColor(textColor) || Theme.info, wrapMode: "none", children: textValue }, `text-${textValue}`));
|
|
182
|
+
accessoryElements.push(_jsx("text", { flexShrink: 0, fg: active ? Theme.background : resolveColor(textColor) || Theme.info, wrapMode: "none", children: textValue }, `text-${textValue}`));
|
|
190
183
|
}
|
|
191
184
|
}
|
|
192
185
|
if ('tag' in accessory && accessory.tag) {
|
|
@@ -195,7 +188,7 @@ function ListItemRow(props) {
|
|
|
195
188
|
: accessory.tag?.value;
|
|
196
189
|
const tagColor = typeof accessory.tag === 'object' ? accessory.tag?.color : undefined;
|
|
197
190
|
if (tagValue) {
|
|
198
|
-
accessoryElements.push(_jsxs("text", { fg: active ? Theme.background : resolveColor(tagColor) || Theme.warning, wrapMode: "none", children: ["[", tagValue, "]"] }, `tag-${tagValue}`));
|
|
191
|
+
accessoryElements.push(_jsxs("text", { flexShrink: 0, fg: active ? Theme.background : resolveColor(tagColor) || Theme.warning, wrapMode: "none", children: ["[", tagValue, "]"] }, `tag-${tagValue}`));
|
|
199
192
|
}
|
|
200
193
|
}
|
|
201
194
|
if ('date' in accessory && accessory.date) {
|
|
@@ -207,7 +200,7 @@ function ListItemRow(props) {
|
|
|
207
200
|
: undefined;
|
|
208
201
|
if (dateValue) {
|
|
209
202
|
const formatted = formatRelativeDate(dateValue);
|
|
210
|
-
accessoryElements.push(_jsx("text", { fg: active ? Theme.background : resolveColor(dateColor) || Theme.success, wrapMode: "none", children: formatted }, `date-${dateValue.getTime()}`));
|
|
203
|
+
accessoryElements.push(_jsx("text", { flexShrink: 0, fg: active ? Theme.background : resolveColor(dateColor) || Theme.success, wrapMode: "none", children: formatted }, `date-${dateValue.getTime()}`));
|
|
211
204
|
}
|
|
212
205
|
}
|
|
213
206
|
});
|
|
@@ -227,7 +220,7 @@ function ListItemRow(props) {
|
|
|
227
220
|
setIsHovered(true);
|
|
228
221
|
}, onMouseOut: () => {
|
|
229
222
|
setIsHovered(false);
|
|
230
|
-
}, onMouseDown: props.onMouseDown, children: [_jsxs("box", { style: { flexDirection: 'row', flexGrow: 1, flexShrink: 1, overflow: 'hidden', gap: 1 }, children: [_jsxs("box", { style: { flexDirection: 'row', flexShrink: 0 }, children: [_jsx("text", { fg: active ? Theme.background : Theme.text, attributes: active ? TextAttributes.BOLD : undefined, selectable: false, wrapMode: "none", children: active ? '›' : ' ' }), icon && _jsxs("text", { fg: active ? Theme.background : iconColor || Theme.text, selectable: false, wrapMode: "none", children: [getIconEmoji(icon), " "] }), _jsx("text", { fg: active ? Theme.background : Theme.text, attributes: active ? TextAttributes.BOLD : undefined, selectable: false, wrapMode: "none", children: title })] }), subtitle && (_jsx("text", { fg: active ? Theme.background : Theme.textMuted, selectable: false, wrapMode: "none", children: subtitle }))] }), accessoryElements.length > 0 && (_jsx("box", { style: { flexDirection: 'row', flexShrink: 0 }, children: accessoryElements.map((elem, i) => (_jsxs("box", { style: { flexDirection: 'row' }, children: [i > 0 && _jsx("text", { children: " " }), elem] }, i))) }))] }));
|
|
223
|
+
}, onMouseDown: props.onMouseDown, children: [_jsxs("box", { style: { flexDirection: 'row', flexGrow: 1, flexShrink: 1, overflow: 'hidden', gap: 1 }, children: [_jsxs("box", { style: { flexDirection: 'row', flexShrink: 0 }, children: [_jsx("text", { flexShrink: 0, fg: active ? Theme.background : Theme.text, attributes: active ? TextAttributes.BOLD : undefined, selectable: false, wrapMode: "none", children: active ? '›' : ' ' }), icon && _jsxs("text", { flexShrink: 0, fg: active ? Theme.background : iconColor || Theme.text, selectable: false, wrapMode: "none", children: [getIconEmoji(icon), " "] }), _jsx("text", { flexShrink: 0, fg: active ? Theme.background : Theme.text, attributes: active ? TextAttributes.BOLD : undefined, selectable: false, wrapMode: "none", children: title })] }), subtitle && (_jsx("text", { flexShrink: 0, fg: active ? Theme.background : Theme.textMuted, selectable: false, wrapMode: "none", children: subtitle }))] }), accessoryElements.length > 0 && (_jsx("box", { style: { flexDirection: 'row', flexShrink: 0 }, children: accessoryElements.map((elem, i) => (_jsxs("box", { style: { flexDirection: 'row' }, children: [i > 0 && _jsx("text", { flexShrink: 0, children: " " }), elem] }, i))) }))] }));
|
|
231
224
|
}
|
|
232
225
|
export const List = (props) => {
|
|
233
226
|
const { children, onSelectionChange, filtering, searchText: controlledSearchText, onSearchTextChange, searchBarPlaceholder = 'Search...', isLoading, navigationTitle, isShowingDetail, selectedItemId, searchBarAccessory, ...otherProps } = props;
|
|
@@ -284,9 +277,10 @@ export const List = (props) => {
|
|
|
284
277
|
};
|
|
285
278
|
// Wrapper function that updates search text
|
|
286
279
|
const setInternalSearchText = (value) => {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
280
|
+
// Using flushSync to force descendants to update visibility before querying
|
|
281
|
+
flushSync(() => {
|
|
282
|
+
setInternalSearchTextRaw(value);
|
|
283
|
+
});
|
|
290
284
|
const items = Object.values(descendantsContext.map.current)
|
|
291
285
|
.filter((item) => item.index !== -1 && item.props?.visible !== false)
|
|
292
286
|
.sort((a, b) => a.index - b.index);
|
|
@@ -402,11 +396,15 @@ export const List = (props) => {
|
|
|
402
396
|
if (evt.name === 'k' && evt.ctrl) {
|
|
403
397
|
// Show current item's actions if available
|
|
404
398
|
if (currentItem?.props?.actions) {
|
|
405
|
-
dialog.
|
|
399
|
+
dialog.pushActions(currentItem.props.actions);
|
|
406
400
|
}
|
|
407
401
|
// Otherwise show List's own actions
|
|
408
402
|
else if (props.actions) {
|
|
409
|
-
dialog.
|
|
403
|
+
dialog.pushActions(props.actions);
|
|
404
|
+
}
|
|
405
|
+
// Otherwise show empty ActionPanel (still has Settings section with Configure Extension, etc.)
|
|
406
|
+
else {
|
|
407
|
+
dialog.pushActions(_jsx(ActionPanel, {}));
|
|
410
408
|
}
|
|
411
409
|
return;
|
|
412
410
|
}
|
|
@@ -420,7 +418,7 @@ export const List = (props) => {
|
|
|
420
418
|
return;
|
|
421
419
|
if (currentItem.props.actions) {
|
|
422
420
|
useStore.setState({ shouldAutoExecuteFirstAction: true });
|
|
423
|
-
dialog.
|
|
421
|
+
dialog.pushActions(currentItem.props.actions);
|
|
424
422
|
}
|
|
425
423
|
}
|
|
426
424
|
});
|
|
@@ -449,17 +447,17 @@ export const List = (props) => {
|
|
|
449
447
|
flexDirection: 'row',
|
|
450
448
|
justifyContent: 'space-between',
|
|
451
449
|
alignItems: 'center',
|
|
452
|
-
}, children: [
|
|
450
|
+
}, children: [_jsxs("box", { style: {
|
|
453
451
|
flexGrow: 1,
|
|
454
|
-
flexDirection: '
|
|
452
|
+
flexDirection: 'row',
|
|
455
453
|
flexShrink: 1,
|
|
456
|
-
}, children: _jsx("textarea", { ref: inputRef, height: 1, wrapMode: 'none', keyBindings: [
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
454
|
+
}, children: [_jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "> " }), _jsx("textarea", { ref: inputRef, height: 1, flexGrow: 1, wrapMode: 'none', keyBindings: [
|
|
455
|
+
{ name: 'return', action: 'submit' },
|
|
456
|
+
{ name: 'linefeed', action: 'submit' },
|
|
457
|
+
], placeholder: searchBarPlaceholder, focused: inFocus && !isDropdownOpen, initialValue: searchText, onContentChange: () => {
|
|
458
|
+
const value = inputRef.current?.plainText || '';
|
|
459
|
+
handleSearchChange(value);
|
|
460
|
+
}, focusedBackgroundColor: Theme.backgroundPanel, cursorColor: Theme.primary, focusedTextColor: Theme.text })] }), searchBarAccessory] }) }), _jsxs("box", { style: { flexDirection: 'row', flexGrow: 1, flexShrink: 1 }, children: [_jsxs("box", { style: { width: isShowingDetail ? '50%' : '100%', flexGrow: 1, flexShrink: 1, flexDirection: 'column' }, children: [_jsx(ScrollBox, { ref: scrollBoxRef, focused: false, flexGrow: 1, flexShrink: 1, style: {
|
|
463
461
|
rootOptions: {
|
|
464
462
|
backgroundColor: undefined,
|
|
465
463
|
},
|
|
@@ -473,13 +471,42 @@ export const List = (props) => {
|
|
|
473
471
|
paddingRight: 1,
|
|
474
472
|
}, border: ['left'], borderStyle: 'single', borderColor: Theme.border, children: currentDetail }))] })] }) }) }));
|
|
475
473
|
};
|
|
474
|
+
function DefaultEmptyView() {
|
|
475
|
+
// Subscribe to re-render when items are added/removed
|
|
476
|
+
void useListDescendantsRerender();
|
|
477
|
+
// Get live map ref for reading in useLayoutEffect
|
|
478
|
+
const map = useListDescendantsMap();
|
|
479
|
+
const [hasVisibleItems, setHasVisibleItems] = useState(true);
|
|
480
|
+
// We must check visibility in useLayoutEffect because:
|
|
481
|
+
// 1. map.current is cleared by reset() during render, so it's empty if read during render
|
|
482
|
+
// 2. committedMap is stale - it's a snapshot from the previous render cycle and doesn't
|
|
483
|
+
// reflect prop changes like 'visible' (only tracks which items exist, not their props)
|
|
484
|
+
// 3. Items register in their own useLayoutEffect, so map.current is only populated after
|
|
485
|
+
// all items' layout effects have run
|
|
486
|
+
useLayoutEffect(() => {
|
|
487
|
+
const items = Object.values(map.current)
|
|
488
|
+
.filter((item) => item.index !== -1 && item.props?.visible !== false);
|
|
489
|
+
setHasVisibleItems(items.length > 0);
|
|
490
|
+
});
|
|
491
|
+
if (hasVisibleItems)
|
|
492
|
+
return null;
|
|
493
|
+
return (_jsx("box", { style: {
|
|
494
|
+
flexDirection: 'column',
|
|
495
|
+
alignItems: 'center',
|
|
496
|
+
justifyContent: 'center',
|
|
497
|
+
paddingTop: 2,
|
|
498
|
+
paddingBottom: 2,
|
|
499
|
+
paddingLeft: 2,
|
|
500
|
+
paddingRight: 2,
|
|
501
|
+
}, children: _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "No items found" }) }));
|
|
502
|
+
}
|
|
476
503
|
// Component to render list items and sections
|
|
477
504
|
function ListItemsRenderer(props) {
|
|
478
505
|
const { children } = props;
|
|
479
506
|
const listContext = useContext(ListContext);
|
|
480
507
|
const searchText = listContext?.searchText || '';
|
|
481
508
|
// Pass search text down via context
|
|
482
|
-
return (
|
|
509
|
+
return (_jsxs(ListSectionContext.Provider, { value: { searchText }, children: [children, _jsx(DefaultEmptyView, {})] }));
|
|
483
510
|
}
|
|
484
511
|
const ListSectionContext = createContext({});
|
|
485
512
|
const ListItem = (props) => {
|
|
@@ -531,8 +558,8 @@ const ListItem = (props) => {
|
|
|
531
558
|
const handleMouseDown = () => {
|
|
532
559
|
if (listContext && index !== -1) {
|
|
533
560
|
// If clicking on already selected item, show actions (like pressing Enter)
|
|
534
|
-
if (isActive
|
|
535
|
-
dialog.
|
|
561
|
+
if (isActive) {
|
|
562
|
+
dialog.pushActions(props.actions || _jsx(ActionPanel, {}));
|
|
536
563
|
}
|
|
537
564
|
else if (listContext.setSelectedIndex) {
|
|
538
565
|
// Otherwise just select the item
|
|
@@ -570,7 +597,9 @@ const ListItem = (props) => {
|
|
|
570
597
|
};
|
|
571
598
|
const ListItemDetail = (props) => {
|
|
572
599
|
const { isLoading, markdown, metadata } = props;
|
|
573
|
-
return (_jsxs("box", { style: { flexDirection: 'column', flexGrow: 1 }, children: [isLoading && (_jsx("box", { style: { paddingBottom: 1 }, children: _jsx("text", { fg: Theme.textMuted, children: "Loading..." }) })), _jsx(ScrollBox, { focused: false,
|
|
600
|
+
return (_jsxs("box", { style: { flexDirection: 'column', flexGrow: 1 }, children: [isLoading && (_jsx("box", { style: { paddingBottom: 1 }, children: _jsx("text", { flexShrink: 0, fg: Theme.textMuted, children: "Loading..." }) })), _jsx(ScrollBox, { focused: false,
|
|
601
|
+
// flexGrow={1}
|
|
602
|
+
flexShrink: 1, style: {
|
|
574
603
|
rootOptions: {
|
|
575
604
|
backgroundColor: undefined,
|
|
576
605
|
},
|
|
@@ -583,19 +612,19 @@ const ListItemDetailMetadata = (props) => {
|
|
|
583
612
|
return (_jsx("box", { style: { flexDirection: 'column' }, children: props.children }));
|
|
584
613
|
};
|
|
585
614
|
const ListItemDetailMetadataLabel = (props) => {
|
|
586
|
-
return (_jsxs("box", { style: { flexDirection: 'column', paddingBottom: 0.5 }, children: [_jsxs("text", { fg: Theme.textMuted, children: [props.title, ":"] }), props.text && _jsx("text", { fg: Theme.text, children: props.text })] }));
|
|
615
|
+
return (_jsxs("box", { style: { flexDirection: 'column', paddingBottom: 0.5 }, children: [_jsxs("text", { flexShrink: 0, fg: Theme.textMuted, children: [props.title, ":"] }), props.text && _jsx("text", { flexShrink: 0, fg: Theme.text, children: props.text })] }));
|
|
587
616
|
};
|
|
588
617
|
const ListItemDetailMetadataSeparator = () => {
|
|
589
|
-
return (_jsx("box", { style: { paddingBottom: 0.5 }, children: _jsx("text", { fg: Theme.border, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }) }));
|
|
618
|
+
return (_jsx("box", { style: { paddingBottom: 0.5 }, children: _jsx("text", { flexShrink: 0, fg: Theme.border, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }) }));
|
|
590
619
|
};
|
|
591
620
|
const ListItemDetailMetadataLink = (props) => {
|
|
592
|
-
return (_jsxs("box", { style: { flexDirection: 'column', paddingBottom: 0.5 }, children: [_jsxs("text", { fg: Theme.textMuted, children: [props.title, ":"] }), _jsx("text", { fg: Theme.
|
|
621
|
+
return (_jsxs("box", { style: { flexDirection: 'column', paddingBottom: 0.5 }, children: [_jsxs("text", { flexShrink: 0, fg: Theme.textMuted, children: [props.title, ":"] }), _jsx("text", { flexShrink: 0, fg: Theme.markdownLink, children: props.text })] }));
|
|
593
622
|
};
|
|
594
623
|
const ListItemDetailMetadataTagList = (props) => {
|
|
595
|
-
return (_jsxs("box", { style: { flexDirection: 'column', paddingBottom: 0.5 }, children: [_jsxs("text", { fg: Theme.textMuted, children: [props.title, ":"] }), _jsx("box", { style: { flexDirection: 'row', paddingLeft: 1 }, children: props.children })] }));
|
|
624
|
+
return (_jsxs("box", { style: { flexDirection: 'column', paddingBottom: 0.5 }, children: [_jsxs("text", { flexShrink: 0, fg: Theme.textMuted, children: [props.title, ":"] }), _jsx("box", { style: { flexDirection: 'row', paddingLeft: 1 }, children: props.children })] }));
|
|
596
625
|
};
|
|
597
626
|
const ListItemDetailMetadataTagListItem = (props) => {
|
|
598
|
-
return (_jsx("box", { style: { paddingRight: 1 }, children: _jsxs("text", { fg: resolveColor(props.color) || Theme.accent, children: ["[", props.text, "]"] }) }));
|
|
627
|
+
return (_jsx("box", { style: { paddingRight: 1 }, children: _jsxs("text", { flexShrink: 0, fg: resolveColor(props.color) || Theme.accent, children: ["[", props.text, "]"] }) }));
|
|
599
628
|
};
|
|
600
629
|
ListItemDetail.Metadata = ListItemDetailMetadata;
|
|
601
630
|
ListItemDetailMetadata.Label = ListItemDetailMetadataLabel;
|
|
@@ -604,6 +633,14 @@ ListItemDetailMetadata.Link = ListItemDetailMetadataLink;
|
|
|
604
633
|
ListItemDetailMetadata.TagList = ListItemDetailMetadataTagList;
|
|
605
634
|
ListItemDetailMetadataTagList.Item = ListItemDetailMetadataTagListItem;
|
|
606
635
|
ListItem.Detail = ListItemDetail;
|
|
636
|
+
/**
|
|
637
|
+
* A dropdown menu shown in the right-hand-side of the search bar.
|
|
638
|
+
* Open it with Ctrl+P or by clicking on it.
|
|
639
|
+
*
|
|
640
|
+
* Note: There is no built-in "All" or reset option. If you want users to be
|
|
641
|
+
* able to reset the filter, add a `List.Dropdown.Item` with title="All" and
|
|
642
|
+
* value="" (or your preferred reset value) at the top of your dropdown items.
|
|
643
|
+
*/
|
|
607
644
|
const ListDropdown = (props) => {
|
|
608
645
|
const listContext = useContext(ListContext);
|
|
609
646
|
const [isHovered, setIsHovered] = useState(false);
|
|
@@ -657,27 +694,30 @@ const ListDropdown = (props) => {
|
|
|
657
694
|
useEffect(() => {
|
|
658
695
|
if (isDropdownOpen && !dialog.stack.length) {
|
|
659
696
|
// Pass the children to the dialog to render them there
|
|
660
|
-
dialog.push(
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
const
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
697
|
+
dialog.push({
|
|
698
|
+
element: (_jsx(ListDropdownDialog, { ...props, value: dropdownState.value, onChange: (newValue) => {
|
|
699
|
+
// Find the title for this value
|
|
700
|
+
let title = newValue;
|
|
701
|
+
for (const item of Object.values(descendantsContext.map.current)) {
|
|
702
|
+
const itemProps = item.props;
|
|
703
|
+
if (itemProps.value === newValue) {
|
|
704
|
+
title = itemProps.title;
|
|
705
|
+
break;
|
|
706
|
+
}
|
|
668
707
|
}
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
708
|
+
setDropdownState({ value: newValue, title });
|
|
709
|
+
setIsDropdownOpen(false);
|
|
710
|
+
dialog.clear();
|
|
711
|
+
if (props.onChange) {
|
|
712
|
+
props.onChange(newValue);
|
|
713
|
+
}
|
|
714
|
+
// TODO: Handle storeValue to persist the value
|
|
715
|
+
}, onCancel: () => {
|
|
716
|
+
setIsDropdownOpen(false);
|
|
717
|
+
dialog.clear();
|
|
718
|
+
}, children: props.children })),
|
|
719
|
+
position: 'center',
|
|
720
|
+
});
|
|
681
721
|
}
|
|
682
722
|
}, [isDropdownOpen, props.children]);
|
|
683
723
|
// Display the title from our state
|
|
@@ -694,7 +734,7 @@ const ListDropdown = (props) => {
|
|
|
694
734
|
if (!isDropdownOpen) {
|
|
695
735
|
listContext.openDropdown();
|
|
696
736
|
}
|
|
697
|
-
}, children: [_jsx("text", { fg: isHovered ? Theme.text : Theme.textMuted, selectable: false, children: displayValue }), _jsxs("text", { fg: isHovered ? Theme.text : Theme.textMuted, selectable: false, children: [' ', "\u25BE"] })] }, dropdownState.value)] }) }));
|
|
737
|
+
}, children: [_jsx("text", { flexShrink: 0, fg: isHovered ? Theme.text : Theme.textMuted, selectable: false, children: displayValue }), _jsxs("text", { flexShrink: 0, fg: isHovered ? Theme.text : Theme.textMuted, selectable: false, children: [' ', "\u25BE"] })] }, dropdownState.value)] }) }));
|
|
698
738
|
};
|
|
699
739
|
ListDropdown.Item = (props) => {
|
|
700
740
|
const dropdownContext = useContext(DropdownContext);
|
|
@@ -748,7 +788,7 @@ ListDropdown.Item = (props) => {
|
|
|
748
788
|
paddingLeft: isActive ? 0 : 1,
|
|
749
789
|
paddingRight: 1,
|
|
750
790
|
justifyContent: 'space-between',
|
|
751
|
-
}, border: false, onMouseMove: handleMouseMove, onMouseOut: () => setIsHovered(false), onMouseDown: handleMouseDown, children: _jsxs("box", { style: { flexDirection: 'row' }, children: [isActive && (_jsxs("text", { fg: Theme.background, selectable: false, children: ["\u203A", ''] })), _jsx("text", { fg: isActive
|
|
791
|
+
}, border: false, onMouseMove: handleMouseMove, onMouseOut: () => setIsHovered(false), onMouseDown: handleMouseDown, children: _jsxs("box", { style: { flexDirection: 'row' }, children: [isActive && (_jsxs("text", { flexShrink: 0, fg: Theme.background, selectable: false, children: ["\u203A", ''] })), _jsx("text", { flexShrink: 0, fg: isActive
|
|
752
792
|
? Theme.background
|
|
753
793
|
: isCurrent
|
|
754
794
|
? Theme.primary
|
|
@@ -771,7 +811,7 @@ ListDropdown.Section = (props) => {
|
|
|
771
811
|
const showTitle = parentContext.selectedIndex !== undefined &&
|
|
772
812
|
props.title &&
|
|
773
813
|
!parentContext.searchText?.trim();
|
|
774
|
-
return (_jsxs(_Fragment, { children: [showTitle && (_jsx("box", { style: { paddingTop: 1, paddingLeft: 1 }, children: _jsx("text", { fg: Theme.accent, attributes: TextAttributes.BOLD, children: props.title }) })), _jsx(DropdownContext.Provider, { value: sectionContextValue, children: props.children })] }));
|
|
814
|
+
return (_jsxs(_Fragment, { children: [showTitle && (_jsx("box", { style: { paddingTop: 1, paddingLeft: 1 }, children: _jsx("text", { flexShrink: 0, fg: Theme.accent, attributes: TextAttributes.BOLD, children: props.title }) })), _jsx(DropdownContext.Provider, { value: sectionContextValue, children: props.children })] }));
|
|
775
815
|
};
|
|
776
816
|
List.Item = ListItem;
|
|
777
817
|
const ListSection = (props) => {
|
|
@@ -795,7 +835,7 @@ const ListSection = (props) => {
|
|
|
795
835
|
}
|
|
796
836
|
return (_jsxs("box", { style: { marginBottom: 1 }, children: [props.title && (_jsx("box", { border: false, style: {
|
|
797
837
|
paddingLeft: 1,
|
|
798
|
-
}, children: _jsx("text", { fg: Theme.accent, attributes: TextAttributes.BOLD, children: props.title }) })), children] }));
|
|
838
|
+
}, children: _jsx("text", { flexShrink: 0, fg: Theme.accent, attributes: TextAttributes.BOLD, children: props.title }) })), children] }));
|
|
799
839
|
};
|
|
800
840
|
List.Section = ListSection;
|
|
801
841
|
List.Dropdown = ListDropdown;
|
|
@@ -806,15 +846,15 @@ List.EmptyView = (props) => {
|
|
|
806
846
|
useKeyboard((evt) => {
|
|
807
847
|
if (!inFocus)
|
|
808
848
|
return;
|
|
809
|
-
// Handle Ctrl+K to show actions
|
|
810
|
-
if (evt.name === 'k' && evt.ctrl
|
|
811
|
-
dialog.
|
|
849
|
+
// Handle Ctrl+K to show actions (always show panel, even without actions)
|
|
850
|
+
if (evt.name === 'k' && evt.ctrl) {
|
|
851
|
+
dialog.pushActions(props.actions || _jsx(ActionPanel, {}));
|
|
812
852
|
return;
|
|
813
853
|
}
|
|
814
854
|
// Handle Enter to execute first action
|
|
815
855
|
if (evt.name === 'return' && props.actions) {
|
|
816
856
|
useStore.setState({ shouldAutoExecuteFirstAction: true });
|
|
817
|
-
dialog.
|
|
857
|
+
dialog.pushActions(props.actions);
|
|
818
858
|
}
|
|
819
859
|
});
|
|
820
860
|
// Get icon string from ImageLike
|
|
@@ -842,7 +882,7 @@ List.EmptyView = (props) => {
|
|
|
842
882
|
paddingLeft: 2,
|
|
843
883
|
paddingRight: 2,
|
|
844
884
|
gap: 1,
|
|
845
|
-
}, children: [iconEmoji && (_jsx("text", { fg: Theme.textMuted, style: { marginBottom: 1 }, children: iconEmoji })), props.title && (_jsx("text", { fg: Theme.text, attributes: TextAttributes.BOLD, children: props.title?.replace(/\bRaycast\b/g, 'Termcast').replace(/\braycast\b/g, 'termcast') || '' })), props.description && (_jsx("text", { fg: Theme.textMuted, wrapMode: 'word', children: props.description?.replace(/\bRaycast\b/g, 'Termcast').replace(/\braycast\b/g, 'termcast') || '' }))] }));
|
|
885
|
+
}, children: [iconEmoji && (_jsx("text", { flexShrink: 0, fg: Theme.textMuted, style: { marginBottom: 1 }, children: iconEmoji })), props.title && (_jsx("text", { flexShrink: 0, fg: Theme.text, attributes: TextAttributes.BOLD, children: props.title?.replace(/\bRaycast\b/g, 'Termcast').replace(/\braycast\b/g, 'termcast') || '' })), props.description && (_jsx("text", { flexShrink: 0, fg: Theme.textMuted, wrapMode: 'word', children: props.description?.replace(/\bRaycast\b/g, 'Termcast').replace(/\braycast\b/g, 'termcast') || '' }))] }));
|
|
846
886
|
};
|
|
847
887
|
export default List;
|
|
848
888
|
// Grid uses List internally with a different visual representation
|