termcast 1.3.50 → 1.3.52
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/environment.d.ts +1 -0
- package/dist/apis/environment.d.ts.map +1 -1
- package/dist/apis/environment.js +5 -0
- package/dist/apis/environment.js.map +1 -1
- package/dist/app.d.ts +33 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +1130 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +5 -2
- package/dist/compile.js.map +1 -1
- package/dist/components/actions.d.ts +4 -1
- package/dist/components/actions.d.ts.map +1 -1
- package/dist/components/actions.js +8 -5
- package/dist/components/actions.js.map +1 -1
- package/dist/components/detail.d.ts.map +1 -1
- package/dist/components/detail.js +21 -18
- package/dist/components/detail.js.map +1 -1
- package/dist/components/dropdown.d.ts.map +1 -1
- package/dist/components/dropdown.js +3 -2
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/footer.d.ts +6 -0
- package/dist/components/footer.d.ts.map +1 -1
- package/dist/components/footer.js +15 -6
- package/dist/components/footer.js.map +1 -1
- package/dist/components/form/checkbox.d.ts.map +1 -1
- package/dist/components/form/checkbox.js +1 -13
- package/dist/components/form/checkbox.js.map +1 -1
- package/dist/components/form/date-picker.js +2 -2
- package/dist/components/form/date-picker.js.map +1 -1
- package/dist/components/form/description.js +1 -1
- 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 +19 -3
- package/dist/components/form/dropdown.js.map +1 -1
- package/dist/components/form/file-picker.d.ts.map +1 -1
- package/dist/components/form/file-picker.js +22 -4
- package/dist/components/form/file-picker.js.map +1 -1
- package/dist/components/form/index.d.ts +3 -1
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +7 -5
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/form/password-field.js +3 -3
- package/dist/components/form/password-field.js.map +1 -1
- package/dist/components/form/text-area.d.ts.map +1 -1
- package/dist/components/form/text-area.js +29 -6
- package/dist/components/form/text-area.js.map +1 -1
- package/dist/components/form/text-field.js +3 -3
- package/dist/components/form/text-field.js.map +1 -1
- package/dist/components/graph.d.ts.map +1 -1
- package/dist/components/graph.js +21 -25
- package/dist/components/graph.js.map +1 -1
- package/dist/components/heatmap.d.ts +80 -0
- package/dist/components/heatmap.d.ts.map +1 -0
- package/dist/components/heatmap.js +424 -0
- package/dist/components/heatmap.js.map +1 -0
- package/dist/components/list.d.ts +2 -0
- package/dist/components/list.d.ts.map +1 -1
- package/dist/components/list.js +91 -58
- package/dist/components/list.js.map +1 -1
- package/dist/components/markdown.d.ts +7 -0
- package/dist/components/markdown.d.ts.map +1 -0
- package/dist/components/markdown.js +19 -0
- package/dist/components/markdown.js.map +1 -0
- package/dist/components/metadata.d.ts.map +1 -1
- package/dist/components/metadata.js +4 -1
- package/dist/components/metadata.js.map +1 -1
- package/dist/components/progress-bar.d.ts +37 -0
- package/dist/components/progress-bar.d.ts.map +1 -0
- package/dist/components/progress-bar.js +34 -0
- package/dist/components/progress-bar.js.map +1 -0
- package/dist/components/table.d.ts +3 -2
- package/dist/components/table.d.ts.map +1 -1
- package/dist/components/table.js +78 -63
- package/dist/components/table.js.map +1 -1
- package/dist/diagram-parser.d.ts +17 -3
- package/dist/diagram-parser.d.ts.map +1 -1
- package/dist/diagram-parser.js +17 -3
- package/dist/diagram-parser.js.map +1 -1
- package/dist/examples/list-slot.d.ts +2 -0
- package/dist/examples/list-slot.d.ts.map +1 -0
- package/dist/examples/list-slot.js +14 -0
- package/dist/examples/list-slot.js.map +1 -0
- package/dist/examples/list-with-dropdown.js +2 -4
- package/dist/examples/list-with-dropdown.js.map +1 -1
- package/dist/examples/simple-heatmap.d.ts +2 -0
- package/dist/examples/simple-heatmap.d.ts.map +1 -0
- package/dist/examples/simple-heatmap.js +37 -0
- package/dist/examples/simple-heatmap.js.map +1 -0
- package/dist/examples/simple-progress-bar.d.ts +2 -0
- package/dist/examples/simple-progress-bar.d.ts.map +1 -0
- package/dist/examples/simple-progress-bar.js +36 -0
- package/dist/examples/simple-progress-bar.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- 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 +5 -4
- package/dist/internal/date-picker-widget.js.map +1 -1
- package/dist/internal/navigation.d.ts.map +1 -1
- package/dist/internal/navigation.js +7 -2
- package/dist/internal/navigation.js.map +1 -1
- package/dist/internal/providers.d.ts.map +1 -1
- package/dist/internal/providers.js +42 -4
- package/dist/internal/providers.js.map +1 -1
- package/dist/logger.js +6 -1
- package/dist/logger.js.map +1 -1
- package/dist/state.d.ts +2 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +31 -2
- package/dist/state.js.map +1 -1
- package/dist/theme.d.ts +1 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +23 -1
- package/dist/theme.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +6 -1
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
- package/src/apis/environment.tsx +6 -0
- package/src/app.tsx +1492 -0
- package/src/assets/default-app-icon.png +0 -0
- package/src/cli.tsx +105 -0
- package/src/compile.tsx +5 -2
- package/src/components/actions.tsx +9 -6
- package/src/components/detail.tsx +33 -23
- package/src/components/dropdown.tsx +3 -2
- package/src/components/footer.tsx +40 -7
- package/src/components/form/checkbox.tsx +2 -17
- package/src/components/form/date-picker.tsx +2 -2
- package/src/components/form/description.tsx +1 -1
- package/src/components/form/dropdown.tsx +22 -3
- package/src/components/form/file-picker.tsx +33 -10
- package/src/components/form/index.tsx +11 -7
- package/src/components/form/password-field.tsx +3 -3
- package/src/components/form/text-area.tsx +31 -6
- package/src/components/form/text-field.tsx +3 -3
- package/src/components/graph.tsx +21 -24
- package/src/components/heatmap.tsx +602 -0
- package/src/components/list.tsx +147 -78
- package/src/components/markdown.tsx +30 -0
- package/src/components/metadata.tsx +9 -2
- package/src/components/progress-bar.tsx +112 -0
- package/src/components/table.tsx +88 -71
- package/src/diagram-parser.tsx +17 -3
- package/src/examples/bar-graph-weekly.vitest.tsx +4 -4
- package/src/examples/detail-metadata-showcase.vitest.tsx +12 -12
- package/src/examples/form-basic.vitest.tsx +117 -16
- package/src/examples/graph-bar-chart.vitest.tsx +7 -7
- package/src/examples/graph-row.vitest.tsx +45 -45
- package/src/examples/graph-styles.vitest.tsx +19 -19
- package/src/examples/internal/descendants-rerender.vitest.tsx +94 -46
- package/src/examples/internal/simple-scrollbox.vitest.tsx +38 -14
- package/src/examples/list-dropdown-default.vitest.tsx +78 -58
- package/src/examples/list-slot.tsx +38 -0
- package/src/examples/list-with-detail.vitest.tsx +8 -8
- package/src/examples/list-with-dropdown.tsx +2 -2
- package/src/examples/list-with-dropdown.vitest.tsx +16 -16
- package/src/examples/list-with-sections.vitest.tsx +45 -32
- package/src/examples/simple-detail-table.vitest.tsx +2 -2
- package/src/examples/simple-file-picker.vitest.tsx +1 -1
- package/src/examples/simple-grid.vitest.tsx +27 -53
- package/src/examples/simple-heatmap.tsx +63 -0
- package/src/examples/simple-heatmap.vitest.tsx +88 -0
- package/src/examples/simple-progress-bar.tsx +82 -0
- package/src/examples/simple-progress-bar.vitest.tsx +72 -0
- package/src/examples/table-edge-cases.vitest.tsx +1 -1
- package/src/index.tsx +19 -0
- package/src/internal/date-picker-widget.tsx +23 -12
- package/src/internal/navigation.tsx +7 -2
- package/src/internal/providers.tsx +48 -3
- package/src/logger.tsx +6 -1
- package/src/state.tsx +38 -2
- package/src/theme.tsx +26 -2
- package/src/utils.tsx +6 -1
package/src/state.tsx
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
1
2
|
import { create } from 'zustand'
|
|
2
3
|
import { type ReactNode } from 'react'
|
|
3
4
|
import type { TextareaRenderable } from '@opentui/core'
|
|
4
5
|
import type { RaycastPackageJson } from './package-json'
|
|
5
6
|
import type { KeyboardKeyEquivalent, KeyboardKeyModifier } from 'termcast/src/keyboard'
|
|
7
|
+
import { getResolvedTheme } from './themes'
|
|
8
|
+
import { logger } from './logger'
|
|
6
9
|
|
|
7
10
|
// Registered action shortcuts for global keyboard handling
|
|
8
11
|
// Stored by ActionPanel, consumed by List/Detail/Form keyboard handlers
|
|
@@ -73,6 +76,10 @@ interface AppState {
|
|
|
73
76
|
shouldAutoExecuteFirstAction: boolean
|
|
74
77
|
// First action title for footer display (set by offscreen ActionPanel)
|
|
75
78
|
firstActionTitle: string
|
|
79
|
+
// Selected List.Dropdown item title shown in List footer (^p label)
|
|
80
|
+
dropdownFooterLabel: string
|
|
81
|
+
// List.Dropdown tooltip shown in footer as ^p label (preferred over dropdownFooterLabel)
|
|
82
|
+
dropdownTooltip: string
|
|
76
83
|
// Flag to show actions dialog via portal
|
|
77
84
|
showActionsDialog: boolean
|
|
78
85
|
// Portal target node for rendering ActionPanel dialog in the overlay area.
|
|
@@ -107,12 +114,41 @@ export const useStore = create<AppState>(() => ({
|
|
|
107
114
|
// Actions state
|
|
108
115
|
shouldAutoExecuteFirstAction: false,
|
|
109
116
|
firstActionTitle: '',
|
|
117
|
+
dropdownFooterLabel: '',
|
|
118
|
+
dropdownTooltip: '',
|
|
110
119
|
showActionsDialog: false,
|
|
111
120
|
actionsPortalTarget: null,
|
|
112
|
-
// Theme state
|
|
113
|
-
currentThemeName: 'nerv',
|
|
121
|
+
// Theme state — TERMCAST_DEFAULT_THEME env var is set by the app launcher
|
|
122
|
+
currentThemeName: process.env.TERMCAST_DEFAULT_THEME || 'nerv',
|
|
114
123
|
// Active search input ref
|
|
115
124
|
activeSearchInputRef: null,
|
|
116
125
|
// Registered action shortcuts
|
|
117
126
|
registeredActionShortcuts: [],
|
|
118
127
|
}))
|
|
128
|
+
|
|
129
|
+
// Sync WezTerm's window background with the active termcast theme.
|
|
130
|
+
// When the theme changes, rewrite the background color in wezterm.lua.
|
|
131
|
+
// WezTerm auto-reloads the config on file change, updating the window edges/padding.
|
|
132
|
+
// The config path is passed from the launcher via TERMCAST_WEZTERM_CONFIG env var.
|
|
133
|
+
const weztermConfigPath = process.env.TERMCAST_WEZTERM_CONFIG
|
|
134
|
+
if (weztermConfigPath) {
|
|
135
|
+
useStore.subscribe((state, prevState) => {
|
|
136
|
+
if (state.currentThemeName === prevState.currentThemeName) {
|
|
137
|
+
return
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const theme = getResolvedTheme(state.currentThemeName)
|
|
141
|
+
const content = fs.readFileSync(weztermConfigPath, 'utf-8')
|
|
142
|
+
// Replace the background hex in: config.colors = { background = '#xxxxxx' }
|
|
143
|
+
const updated = content.replace(
|
|
144
|
+
/background\s*=\s*'#[0-9a-fA-F]{6}'/,
|
|
145
|
+
`background = '${theme.background}'`,
|
|
146
|
+
)
|
|
147
|
+
if (updated !== content) {
|
|
148
|
+
fs.writeFileSync(weztermConfigPath, updated)
|
|
149
|
+
}
|
|
150
|
+
} catch (e) {
|
|
151
|
+
logger.log('Failed to update wezterm config background:', e)
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
}
|
package/src/theme.tsx
CHANGED
|
@@ -28,7 +28,8 @@ export function loadPersistedTheme(): string {
|
|
|
28
28
|
} catch {
|
|
29
29
|
// Ignore errors on load
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
// TERMCAST_DEFAULT_THEME is set by the app launcher to override the default theme
|
|
32
|
+
return process.env.TERMCAST_DEFAULT_THEME || defaultThemeName
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
export function persistTheme(name: string): void {
|
|
@@ -58,6 +59,30 @@ export function getMarkdownSyntaxStyle(): SyntaxStyle {
|
|
|
58
59
|
return SyntaxStyle.fromStyles(getSyntaxTheme(themeName))
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
// Resolve a visible but subtle hover background for interactive rows.
|
|
63
|
+
// Some themes map background and backgroundPanel to the same value.
|
|
64
|
+
export function getInteractiveHoverBackground(theme: ResolvedTheme): string {
|
|
65
|
+
const normalize = (color: string): string => {
|
|
66
|
+
return color.toLowerCase()
|
|
67
|
+
}
|
|
68
|
+
const background = normalize(theme.background)
|
|
69
|
+
|
|
70
|
+
if (normalize(theme.backgroundElement) !== background) {
|
|
71
|
+
return theme.backgroundElement
|
|
72
|
+
}
|
|
73
|
+
if (normalize(theme.backgroundPanel) !== background) {
|
|
74
|
+
return theme.backgroundPanel
|
|
75
|
+
}
|
|
76
|
+
if (normalize(theme.borderSubtle) !== background) {
|
|
77
|
+
return theme.borderSubtle
|
|
78
|
+
}
|
|
79
|
+
if (normalize(theme.border) !== background) {
|
|
80
|
+
return theme.border
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return theme.primary
|
|
84
|
+
}
|
|
85
|
+
|
|
61
86
|
// Shared color palette for all chart components (Graph, BarChart, BarGraph).
|
|
62
87
|
// Order: accent, info, success, warning, error, secondary, primary (cycles with %).
|
|
63
88
|
export function getThemePalette(theme: ResolvedTheme): string[] {
|
|
@@ -80,4 +105,3 @@ export const markdownSyntaxStyle = new Proxy({} as SyntaxStyle, {
|
|
|
80
105
|
},
|
|
81
106
|
})
|
|
82
107
|
|
|
83
|
-
|
package/src/utils.tsx
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { logger } from './logger'
|
|
15
15
|
import { useStore } from './state'
|
|
16
16
|
import { initializeTheme } from './theme'
|
|
17
|
+
import { isAppMode } from './apis/environment'
|
|
17
18
|
|
|
18
19
|
export interface RenderWithProvidersOptions {
|
|
19
20
|
extensionName?: string
|
|
@@ -59,7 +60,11 @@ export async function renderWithProviders(
|
|
|
59
60
|
|
|
60
61
|
const renderer = await createCliRenderer({
|
|
61
62
|
onDestroy: () => {
|
|
62
|
-
process.
|
|
63
|
+
// In app mode, destroying the renderer should not kill the process.
|
|
64
|
+
// The app launcher manages the process lifecycle.
|
|
65
|
+
if (!isAppMode()) {
|
|
66
|
+
process.exit(0)
|
|
67
|
+
}
|
|
63
68
|
},
|
|
64
69
|
})
|
|
65
70
|
|