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.
Files changed (178) hide show
  1. package/dist/apis/environment.d.ts +1 -0
  2. package/dist/apis/environment.d.ts.map +1 -1
  3. package/dist/apis/environment.js +5 -0
  4. package/dist/apis/environment.js.map +1 -1
  5. package/dist/app.d.ts +33 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +1130 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/cli.js +80 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/compile.d.ts.map +1 -1
  12. package/dist/compile.js +5 -2
  13. package/dist/compile.js.map +1 -1
  14. package/dist/components/actions.d.ts +4 -1
  15. package/dist/components/actions.d.ts.map +1 -1
  16. package/dist/components/actions.js +8 -5
  17. package/dist/components/actions.js.map +1 -1
  18. package/dist/components/detail.d.ts.map +1 -1
  19. package/dist/components/detail.js +21 -18
  20. package/dist/components/detail.js.map +1 -1
  21. package/dist/components/dropdown.d.ts.map +1 -1
  22. package/dist/components/dropdown.js +3 -2
  23. package/dist/components/dropdown.js.map +1 -1
  24. package/dist/components/footer.d.ts +6 -0
  25. package/dist/components/footer.d.ts.map +1 -1
  26. package/dist/components/footer.js +15 -6
  27. package/dist/components/footer.js.map +1 -1
  28. package/dist/components/form/checkbox.d.ts.map +1 -1
  29. package/dist/components/form/checkbox.js +1 -13
  30. package/dist/components/form/checkbox.js.map +1 -1
  31. package/dist/components/form/date-picker.js +2 -2
  32. package/dist/components/form/date-picker.js.map +1 -1
  33. package/dist/components/form/description.js +1 -1
  34. package/dist/components/form/description.js.map +1 -1
  35. package/dist/components/form/dropdown.d.ts.map +1 -1
  36. package/dist/components/form/dropdown.js +19 -3
  37. package/dist/components/form/dropdown.js.map +1 -1
  38. package/dist/components/form/file-picker.d.ts.map +1 -1
  39. package/dist/components/form/file-picker.js +22 -4
  40. package/dist/components/form/file-picker.js.map +1 -1
  41. package/dist/components/form/index.d.ts +3 -1
  42. package/dist/components/form/index.d.ts.map +1 -1
  43. package/dist/components/form/index.js +7 -5
  44. package/dist/components/form/index.js.map +1 -1
  45. package/dist/components/form/password-field.js +3 -3
  46. package/dist/components/form/password-field.js.map +1 -1
  47. package/dist/components/form/text-area.d.ts.map +1 -1
  48. package/dist/components/form/text-area.js +29 -6
  49. package/dist/components/form/text-area.js.map +1 -1
  50. package/dist/components/form/text-field.js +3 -3
  51. package/dist/components/form/text-field.js.map +1 -1
  52. package/dist/components/graph.d.ts.map +1 -1
  53. package/dist/components/graph.js +21 -25
  54. package/dist/components/graph.js.map +1 -1
  55. package/dist/components/heatmap.d.ts +80 -0
  56. package/dist/components/heatmap.d.ts.map +1 -0
  57. package/dist/components/heatmap.js +424 -0
  58. package/dist/components/heatmap.js.map +1 -0
  59. package/dist/components/list.d.ts +2 -0
  60. package/dist/components/list.d.ts.map +1 -1
  61. package/dist/components/list.js +91 -58
  62. package/dist/components/list.js.map +1 -1
  63. package/dist/components/markdown.d.ts +7 -0
  64. package/dist/components/markdown.d.ts.map +1 -0
  65. package/dist/components/markdown.js +19 -0
  66. package/dist/components/markdown.js.map +1 -0
  67. package/dist/components/metadata.d.ts.map +1 -1
  68. package/dist/components/metadata.js +4 -1
  69. package/dist/components/metadata.js.map +1 -1
  70. package/dist/components/progress-bar.d.ts +37 -0
  71. package/dist/components/progress-bar.d.ts.map +1 -0
  72. package/dist/components/progress-bar.js +34 -0
  73. package/dist/components/progress-bar.js.map +1 -0
  74. package/dist/components/table.d.ts +3 -2
  75. package/dist/components/table.d.ts.map +1 -1
  76. package/dist/components/table.js +78 -63
  77. package/dist/components/table.js.map +1 -1
  78. package/dist/diagram-parser.d.ts +17 -3
  79. package/dist/diagram-parser.d.ts.map +1 -1
  80. package/dist/diagram-parser.js +17 -3
  81. package/dist/diagram-parser.js.map +1 -1
  82. package/dist/examples/list-slot.d.ts +2 -0
  83. package/dist/examples/list-slot.d.ts.map +1 -0
  84. package/dist/examples/list-slot.js +14 -0
  85. package/dist/examples/list-slot.js.map +1 -0
  86. package/dist/examples/list-with-dropdown.js +2 -4
  87. package/dist/examples/list-with-dropdown.js.map +1 -1
  88. package/dist/examples/simple-heatmap.d.ts +2 -0
  89. package/dist/examples/simple-heatmap.d.ts.map +1 -0
  90. package/dist/examples/simple-heatmap.js +37 -0
  91. package/dist/examples/simple-heatmap.js.map +1 -0
  92. package/dist/examples/simple-progress-bar.d.ts +2 -0
  93. package/dist/examples/simple-progress-bar.d.ts.map +1 -0
  94. package/dist/examples/simple-progress-bar.js +36 -0
  95. package/dist/examples/simple-progress-bar.js.map +1 -0
  96. package/dist/index.d.ts +6 -0
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +6 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/internal/date-picker-widget.d.ts.map +1 -1
  101. package/dist/internal/date-picker-widget.js +5 -4
  102. package/dist/internal/date-picker-widget.js.map +1 -1
  103. package/dist/internal/navigation.d.ts.map +1 -1
  104. package/dist/internal/navigation.js +7 -2
  105. package/dist/internal/navigation.js.map +1 -1
  106. package/dist/internal/providers.d.ts.map +1 -1
  107. package/dist/internal/providers.js +42 -4
  108. package/dist/internal/providers.js.map +1 -1
  109. package/dist/logger.js +6 -1
  110. package/dist/logger.js.map +1 -1
  111. package/dist/state.d.ts +2 -0
  112. package/dist/state.d.ts.map +1 -1
  113. package/dist/state.js +31 -2
  114. package/dist/state.js.map +1 -1
  115. package/dist/theme.d.ts +1 -0
  116. package/dist/theme.d.ts.map +1 -1
  117. package/dist/theme.js +23 -1
  118. package/dist/theme.js.map +1 -1
  119. package/dist/utils.d.ts.map +1 -1
  120. package/dist/utils.js +6 -1
  121. package/dist/utils.js.map +1 -1
  122. package/package.json +3 -3
  123. package/src/apis/environment.tsx +6 -0
  124. package/src/app.tsx +1492 -0
  125. package/src/assets/default-app-icon.png +0 -0
  126. package/src/cli.tsx +105 -0
  127. package/src/compile.tsx +5 -2
  128. package/src/components/actions.tsx +9 -6
  129. package/src/components/detail.tsx +33 -23
  130. package/src/components/dropdown.tsx +3 -2
  131. package/src/components/footer.tsx +40 -7
  132. package/src/components/form/checkbox.tsx +2 -17
  133. package/src/components/form/date-picker.tsx +2 -2
  134. package/src/components/form/description.tsx +1 -1
  135. package/src/components/form/dropdown.tsx +22 -3
  136. package/src/components/form/file-picker.tsx +33 -10
  137. package/src/components/form/index.tsx +11 -7
  138. package/src/components/form/password-field.tsx +3 -3
  139. package/src/components/form/text-area.tsx +31 -6
  140. package/src/components/form/text-field.tsx +3 -3
  141. package/src/components/graph.tsx +21 -24
  142. package/src/components/heatmap.tsx +602 -0
  143. package/src/components/list.tsx +147 -78
  144. package/src/components/markdown.tsx +30 -0
  145. package/src/components/metadata.tsx +9 -2
  146. package/src/components/progress-bar.tsx +112 -0
  147. package/src/components/table.tsx +88 -71
  148. package/src/diagram-parser.tsx +17 -3
  149. package/src/examples/bar-graph-weekly.vitest.tsx +4 -4
  150. package/src/examples/detail-metadata-showcase.vitest.tsx +12 -12
  151. package/src/examples/form-basic.vitest.tsx +117 -16
  152. package/src/examples/graph-bar-chart.vitest.tsx +7 -7
  153. package/src/examples/graph-row.vitest.tsx +45 -45
  154. package/src/examples/graph-styles.vitest.tsx +19 -19
  155. package/src/examples/internal/descendants-rerender.vitest.tsx +94 -46
  156. package/src/examples/internal/simple-scrollbox.vitest.tsx +38 -14
  157. package/src/examples/list-dropdown-default.vitest.tsx +78 -58
  158. package/src/examples/list-slot.tsx +38 -0
  159. package/src/examples/list-with-detail.vitest.tsx +8 -8
  160. package/src/examples/list-with-dropdown.tsx +2 -2
  161. package/src/examples/list-with-dropdown.vitest.tsx +16 -16
  162. package/src/examples/list-with-sections.vitest.tsx +45 -32
  163. package/src/examples/simple-detail-table.vitest.tsx +2 -2
  164. package/src/examples/simple-file-picker.vitest.tsx +1 -1
  165. package/src/examples/simple-grid.vitest.tsx +27 -53
  166. package/src/examples/simple-heatmap.tsx +63 -0
  167. package/src/examples/simple-heatmap.vitest.tsx +88 -0
  168. package/src/examples/simple-progress-bar.tsx +82 -0
  169. package/src/examples/simple-progress-bar.vitest.tsx +72 -0
  170. package/src/examples/table-edge-cases.vitest.tsx +1 -1
  171. package/src/index.tsx +19 -0
  172. package/src/internal/date-picker-widget.tsx +23 -12
  173. package/src/internal/navigation.tsx +7 -2
  174. package/src/internal/providers.tsx +48 -3
  175. package/src/logger.tsx +6 -1
  176. package/src/state.tsx +38 -2
  177. package/src/theme.tsx +26 -2
  178. 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
- return defaultThemeName
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.exit(0)
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