termcast 1.3.54 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/action-utils.d.ts.map +1 -1
  2. package/dist/action-utils.js +17 -132
  3. package/dist/action-utils.js.map +1 -1
  4. package/dist/apis/cache.d.ts +8 -30
  5. package/dist/apis/cache.d.ts.map +1 -1
  6. package/dist/apis/cache.js +9 -271
  7. package/dist/apis/cache.js.map +1 -1
  8. package/dist/apis/clipboard.d.ts +4 -2
  9. package/dist/apis/clipboard.d.ts.map +1 -1
  10. package/dist/apis/clipboard.js +18 -31
  11. package/dist/apis/clipboard.js.map +1 -1
  12. package/dist/apis/environment.d.ts.map +1 -1
  13. package/dist/apis/environment.js +14 -49
  14. package/dist/apis/environment.js.map +1 -1
  15. package/dist/apis/localstorage.d.ts +7 -12
  16. package/dist/apis/localstorage.d.ts.map +1 -1
  17. package/dist/apis/localstorage.js +7 -184
  18. package/dist/apis/localstorage.js.map +1 -1
  19. package/dist/app.d.ts.map +1 -1
  20. package/dist/app.js +16 -15
  21. package/dist/app.js.map +1 -1
  22. package/dist/cli.js +7 -6
  23. package/dist/cli.js.map +1 -1
  24. package/dist/components/actions.d.ts.map +1 -1
  25. package/dist/components/actions.js +13 -2
  26. package/dist/components/actions.js.map +1 -1
  27. package/dist/components/extension-preferences.d.ts.map +1 -1
  28. package/dist/components/extension-preferences.js +7 -8
  29. package/dist/components/extension-preferences.js.map +1 -1
  30. package/dist/components/form/file-autocomplete.js +2 -2
  31. package/dist/components/form/file-autocomplete.js.map +1 -1
  32. package/dist/components/list.d.ts.map +1 -1
  33. package/dist/components/list.js +242 -14
  34. package/dist/components/list.js.map +1 -1
  35. package/dist/e2e-node.d.ts.map +1 -1
  36. package/dist/e2e-node.js +5 -4
  37. package/dist/e2e-node.js.map +1 -1
  38. package/dist/extensions/dev.d.ts.map +1 -1
  39. package/dist/extensions/dev.js +5 -2
  40. package/dist/extensions/dev.js.map +1 -1
  41. package/dist/globals.d.ts.map +1 -1
  42. package/dist/globals.js +2 -1
  43. package/dist/globals.js.map +1 -1
  44. package/dist/internal/error-handler.d.ts.map +1 -1
  45. package/dist/internal/error-handler.js +21 -19
  46. package/dist/internal/error-handler.js.map +1 -1
  47. package/dist/internal/providers.d.ts.map +1 -1
  48. package/dist/internal/providers.js +41 -1
  49. package/dist/internal/providers.js.map +1 -1
  50. package/dist/logger.d.ts.map +1 -1
  51. package/dist/logger.js +31 -29
  52. package/dist/logger.js.map +1 -1
  53. package/dist/platform/browser/cache.d.ts +41 -0
  54. package/dist/platform/browser/cache.d.ts.map +1 -0
  55. package/dist/platform/browser/cache.js +262 -0
  56. package/dist/platform/browser/cache.js.map +1 -0
  57. package/dist/platform/browser/localstorage.d.ts +20 -0
  58. package/dist/platform/browser/localstorage.d.ts.map +1 -0
  59. package/dist/platform/browser/localstorage.js +102 -0
  60. package/dist/platform/browser/localstorage.js.map +1 -0
  61. package/dist/platform/browser/runtime.d.ts +51 -0
  62. package/dist/platform/browser/runtime.d.ts.map +1 -0
  63. package/dist/platform/browser/runtime.js +164 -0
  64. package/dist/platform/browser/runtime.js.map +1 -0
  65. package/dist/platform/bun/sqlite.d.ts +17 -0
  66. package/dist/platform/bun/sqlite.d.ts.map +1 -0
  67. package/dist/platform/bun/sqlite.js +6 -0
  68. package/dist/platform/bun/sqlite.js.map +1 -0
  69. package/dist/platform/node/cache.d.ts +35 -0
  70. package/dist/platform/node/cache.d.ts.map +1 -0
  71. package/dist/platform/node/cache.js +269 -0
  72. package/dist/platform/node/cache.js.map +1 -0
  73. package/dist/platform/node/localstorage.d.ts +17 -0
  74. package/dist/platform/node/localstorage.d.ts.map +1 -0
  75. package/dist/platform/node/localstorage.js +186 -0
  76. package/dist/platform/node/localstorage.js.map +1 -0
  77. package/dist/platform/node/runtime.d.ts +52 -0
  78. package/dist/platform/node/runtime.d.ts.map +1 -0
  79. package/dist/platform/node/runtime.js +230 -0
  80. package/dist/platform/node/runtime.js.map +1 -0
  81. package/dist/platform/node/sqlite.d.ts +27 -0
  82. package/dist/platform/node/sqlite.d.ts.map +1 -0
  83. package/dist/platform/node/sqlite.js +21 -0
  84. package/dist/platform/node/sqlite.js.map +1 -0
  85. package/dist/state.d.ts +5 -0
  86. package/dist/state.d.ts.map +1 -1
  87. package/dist/state.js +6 -28
  88. package/dist/state.js.map +1 -1
  89. package/dist/utils/file-system.d.ts.map +1 -1
  90. package/dist/utils/file-system.js +17 -22
  91. package/dist/utils/file-system.js.map +1 -1
  92. package/dist/utils.d.ts +1 -1
  93. package/dist/utils.d.ts.map +1 -1
  94. package/dist/utils.js +42 -47
  95. package/dist/utils.js.map +1 -1
  96. package/dist/vim-mode.d.ts +40 -0
  97. package/dist/vim-mode.d.ts.map +1 -0
  98. package/dist/vim-mode.js +135 -0
  99. package/dist/vim-mode.js.map +1 -0
  100. package/fonts/Inconsolata.otf +0 -0
  101. package/fonts/SIL Open Font License.txt +41 -0
  102. package/package.json +60 -8
  103. package/src/action-utils.tsx +27 -124
  104. package/src/apis/cache.test.ts +1 -1
  105. package/src/apis/cache.tsx +9 -373
  106. package/src/apis/clipboard.tsx +29 -38
  107. package/src/apis/environment.tsx +25 -52
  108. package/src/apis/localstorage.tsx +8 -214
  109. package/src/app.tsx +16 -15
  110. package/src/cli.tsx +14 -15
  111. package/src/compile.vitest.tsx +2 -2
  112. package/src/components/actions.tsx +19 -1
  113. package/src/components/extension-preferences.tsx +7 -8
  114. package/src/components/form/file-autocomplete.tsx +2 -2
  115. package/src/components/list.tsx +279 -14
  116. package/src/e2e-node.tsx +7 -7
  117. package/src/examples/action-shortcut.vitest.tsx +2 -2
  118. package/src/examples/actions-context.vitest.tsx +1 -1
  119. package/src/examples/bar-graph-weekly.vitest.tsx +10 -36
  120. package/src/examples/detail-metadata-showcase.vitest.tsx +36 -36
  121. package/src/examples/form-basic.vitest.tsx +21 -17
  122. package/src/examples/github.vitest.tsx +4 -4
  123. package/src/examples/graph-bar-chart.vitest.tsx +13 -11
  124. package/src/examples/graph-polymarket.vitest.tsx +2 -2
  125. package/src/examples/graph-row.vitest.tsx +66 -66
  126. package/src/examples/graph-styles.vitest.tsx +12 -12
  127. package/src/examples/internal/simple-scrollbox.vitest.tsx +14 -48
  128. package/src/examples/list-detail-metadata.vitest.tsx +5 -5
  129. package/src/examples/list-fetch-data.vitest.tsx +3 -3
  130. package/src/examples/list-item-accessories.vitest.tsx +2 -2
  131. package/src/examples/list-loading-empty-view.vitest.tsx +1 -1
  132. package/src/examples/list-no-actions.vitest.tsx +2 -2
  133. package/src/examples/list-scrollbox.vitest.tsx +5 -5
  134. package/src/examples/list-spacing-mode.vitest.tsx +3 -3
  135. package/src/examples/list-with-detail.vitest.tsx +68 -68
  136. package/src/examples/list-with-dropdown.vitest.tsx +5 -5
  137. package/src/examples/list-with-sections.vitest.tsx +27 -27
  138. package/src/examples/simple-candle-chart.vitest.tsx +7 -7
  139. package/src/examples/simple-detail-markdown.vitest.tsx +8 -8
  140. package/src/examples/simple-detail-table.vitest.tsx +8 -8
  141. package/src/examples/simple-graph.vitest.tsx +3 -3
  142. package/src/examples/simple-grid.vitest.tsx +14 -14
  143. package/src/examples/simple-heatmap.vitest.tsx +1 -1
  144. package/src/examples/simple-navigation.vitest.tsx +17 -17
  145. package/src/examples/simple-progress-bar.vitest.tsx +1 -1
  146. package/src/examples/store.vitest.tsx +1 -1
  147. package/src/examples/swift-extension.vitest.tsx +2 -2
  148. package/src/examples/table-edge-cases.vitest.tsx +18 -18
  149. package/src/examples/toast-action.vitest.tsx +2 -2
  150. package/src/extensions/dev.tsx +5 -2
  151. package/src/extensions/dev.vitest.tsx +3 -3
  152. package/src/globals.ts +2 -1
  153. package/src/internal/error-handler.tsx +19 -21
  154. package/src/internal/providers.tsx +39 -0
  155. package/src/logger.tsx +38 -41
  156. package/src/platform/browser/cache.ts +327 -0
  157. package/src/platform/browser/localstorage.ts +119 -0
  158. package/src/platform/browser/runtime.ts +209 -0
  159. package/src/platform/bun/sqlite.ts +19 -0
  160. package/src/platform/node/cache.ts +372 -0
  161. package/src/platform/node/localstorage.ts +214 -0
  162. package/src/platform/node/runtime.ts +264 -0
  163. package/src/platform/node/sqlite.ts +43 -0
  164. package/src/state.tsx +17 -28
  165. package/src/utils/file-system.ts +17 -22
  166. package/src/utils.test.tsx +1 -1
  167. package/src/utils.tsx +56 -47
  168. package/src/vim-mode.tsx +153 -0
  169. package/src/apis/sqlite.ts +0 -14
@@ -221,7 +221,7 @@ test('form date picker selection with space and enter', async () => {
221
221
  ◇ Date of Birth
222
222
 
223
223
  │ ← 2026 →
224
- │ ← February
224
+ │ ← April
225
225
 
226
226
 
227
227
  ctrl ↵ submit tab navigate ^k actions
@@ -279,7 +279,7 @@ test('form date picker selection with space and enter', async () => {
279
279
  ◇ Date of Birth
280
280
 
281
281
  │ ← 2026 →
282
- │ ← February
282
+ │ ← April
283
283
 
284
284
 
285
285
  ctrl ↵ submit tab navigate ^k actions
@@ -338,7 +338,7 @@ test('form date picker selection with space and enter', async () => {
338
338
  ◇ Date of Birth
339
339
 
340
340
  │ ← 2026 →
341
- │ ← February
341
+ │ ← April
342
342
 
343
343
 
344
344
  ctrl ↵ submit tab navigate ^k actions
@@ -413,7 +413,7 @@ test('form dropdown navigation', async () => {
413
413
  ◇ Date of Birth
414
414
 
415
415
  │ ← 2026 →
416
- │ ← February
416
+ │ ← April
417
417
 
418
418
 
419
419
  ctrl ↵ submit tab navigate ^k actions
@@ -471,7 +471,7 @@ test('form dropdown navigation', async () => {
471
471
  ◇ Date of Birth
472
472
 
473
473
  │ ← 2026 →
474
- │ ← February
474
+ │ ← April
475
475
 
476
476
 
477
477
  ctrl ↵ submit tab navigate ^k actions
@@ -531,7 +531,7 @@ test('form dropdown navigation', async () => {
531
531
  ◇ Date of Birth
532
532
 
533
533
  │ ← 2026 →
534
- │ ← February
534
+ │ ← April
535
535
 
536
536
 
537
537
  ctrl ↵ submit tab navigate ^k actions
@@ -589,7 +589,7 @@ test('form dropdown navigation', async () => {
589
589
  ◇ Date of Birth
590
590
 
591
591
  │ ← 2026 →
592
- │ ← February
592
+ │ ← April
593
593
 
594
594
 
595
595
  ctrl ↵ submit tab navigate ^k actions
@@ -648,17 +648,17 @@ test('form scrolls with mouse wheel', async () => {
648
648
 
649
649
 
650
650
 
651
- │ This demonstrates all available form input types. Use arrow ▀
652
- │ keys or Tab to navigate between fields.
653
-
654
- ◇ Username
655
651
  │ Enter your username
656
-
652
+
657
653
  │ Required field
658
654
 
659
655
  ◇ Password
660
656
  │ Enter secure password
661
657
 
658
+ │ Must be at least 8 characters
659
+
660
+ ◇ Biography
661
+ │ Tell us about yourself...
662
662
 
663
663
 
664
664
  ctrl ↵ submit tab navigate ^k actions
@@ -676,9 +676,7 @@ test('form scrolls with mouse wheel', async () => {
676
676
 
677
677
 
678
678
 
679
- Form Component Demo ▀
680
- │ This demonstrates all available form input types. Use arrow
681
- │ keys or Tab to navigate between fields.
679
+ keys or Tab to navigate between fields. ▄
682
680
 
683
681
  ◇ Username
684
682
  │ Enter your username
@@ -687,6 +685,8 @@ test('form scrolls with mouse wheel', async () => {
687
685
 
688
686
  ◇ Password
689
687
  │ Enter secure password
688
+
689
+ │ Must be at least 8 characters
690
690
 
691
691
 
692
692
  ctrl ↵ submit tab navigate ^k actions
@@ -763,7 +763,7 @@ test('arrow down from checkbox to dropdown lands on first item', async () => {
763
763
  ◇ Date of Birth
764
764
 
765
765
  │ ← 2026 →
766
- │ ← February
766
+ │ ← April
767
767
 
768
768
 
769
769
  ctrl ↵ submit tab navigate ^k actions
@@ -855,13 +855,17 @@ test('date picker down boundary moves focus to next form field', async () => {
855
855
  const datePickerFocusedSnapshot = await session.text()
856
856
  expect(datePickerFocusedSnapshot).toMatch(/◆\s+Date of Birth/)
857
857
 
858
- await session.type('10')
858
+ // Type day 5: always needs exactly 4 downs to exit the calendar
859
+ // regardless of month length (5→12→19→26→exit works for 28-31 day months).
860
+ // Day 10 is month-dependent: 4 downs in 31-day months, 3 downs in 30-day months.
861
+ await session.type('5')
859
862
  await session.press('down')
860
863
 
861
864
  const nonBoundaryDownSnapshot = await session.text()
862
865
  expect(nonBoundaryDownSnapshot).toMatch(/◆\s+Date of Birth/)
863
866
  expect(nonBoundaryDownSnapshot).not.toMatch(/◆\s+Upload Documents/)
864
867
 
868
+ await session.press('down')
865
869
  await session.press('down')
866
870
  await session.press('down')
867
871
 
@@ -97,7 +97,7 @@ test.skipIf(!extensionExists)('github extension shows command list on launch', a
97
97
 
98
98
 
99
99
 
100
- ↵ run command ↑↓ navigate ^k actions powered by termcast.app
100
+ ↵ run command ↑↓ navigate ^k actions :vim powered by termcast.app
101
101
 
102
102
 
103
103
 
@@ -146,7 +146,7 @@ test.skipIf(!extensionExists)('github extension can navigate commands', async ()
146
146
 
147
147
 
148
148
 
149
- ↵ run command ↑↓ navigate ^k actions powered by termcast.app
149
+ ↵ run command ↑↓ navigate ^k actions :vim powered by termcast.app
150
150
 
151
151
 
152
152
 
@@ -192,10 +192,10 @@ test.skipIf(!extensionExists)('github extension can open actions panel', async (
192
192
  │ Settings │
193
193
  │ Configure GitHub... ⌃⇧, │
194
194
  │ Change Theme... │
195
+ │ Enable Vim Mode │
195
196
  │ Toggle Console Logs │
196
197
  │ │
197
198
  │ │
198
- │ │
199
199
  │ ↵ select ↑↓ navigate │
200
200
  │ │
201
201
  ╰──────────────────────────────────────────────────────────────────────────╯
@@ -239,7 +239,7 @@ test.skipIf(!extensionExists)('github extension can search commands', async () =
239
239
 
240
240
 
241
241
 
242
- ↵ run command ↑↓ navigate ^k actions powered by termcast.app
242
+ ↵ run command ↑↓ navigate ^k actions :vim powered by termcast.app
243
243
 
244
244
 
245
245
 
@@ -17,12 +17,14 @@ afterEach(() => {
17
17
  })
18
18
 
19
19
  test('initial render shows bar chart for Monthly Budget', async () => {
20
- const text = await session.text({
20
+ await session.text({
21
21
  waitFor: (text) => {
22
22
  return text.includes('Monthly Budget') && text.includes('Spent')
23
23
  },
24
24
  timeout: 10000,
25
25
  })
26
+ await session.waitIdle()
27
+ const text = await session.text()
26
28
 
27
29
  expect(text).toMatchInlineSnapshot(`
28
30
  "
@@ -46,7 +48,7 @@ test('initial render shows bar chart for Monthly Budget', async () => {
46
48
  Stress Test (20 items) Many small equal segmen │
47
49
 
48
50
 
49
- ↵ open detail ↑↓ navigate ^k actions
51
+ ↵ open detail ↑↓ navigate ^k actions :vi
50
52
 
51
53
 
52
54
 
@@ -103,7 +105,7 @@ test('navigate to Market Share - dominant + tiny segments', async () => {
103
105
  Stress Test (20 items) Many small equal segmen │
104
106
 
105
107
 
106
- ↵ open detail ↑↓ navigate ^k actions
108
+ ↵ open detail ↑↓ navigate ^k actions :vi
107
109
 
108
110
 
109
111
 
@@ -159,7 +161,7 @@ test('navigate to Equal Distribution - 10 segments', async () => {
159
161
  Stress Test (20 items) Many small equal segmen │
160
162
 
161
163
 
162
- ↵ open detail ↑↓ navigate ^k actions
164
+ ↵ open detail ↑↓ navigate ^k actions :vi
163
165
 
164
166
 
165
167
 
@@ -215,7 +217,7 @@ test('navigate to Stress Test - 20 segments', async () => {
215
217
  ›Stress Test (20 items) Many small equal segmen │
216
218
 
217
219
 
218
- ↵ open detail ↑↓ navigate ^k actions
220
+ ↵ open detail ↑↓ navigate ^k actions :vi
219
221
 
220
222
 
221
223
 
@@ -253,18 +255,16 @@ test('enter pushes full detail view with bar chart', async () => {
253
255
 
254
256
 
255
257
  Monthly Budget █
256
-
257
- Spent / Remaining / Savings
258
-
258
+
259
+
260
+ Spent / Remaining / Savings ▀
259
261
  Monthly Budget
260
262
 
261
- Budget allocation for the current month.
262
263
 
264
+ Budget allocation for the current month.
263
265
  - Spent: $4,850 (78.6%)
264
266
  - Remaining: $707 (11.5%)
265
267
  - Savings: $617 (10.0%)
266
-
267
-
268
268
  Segments: 3
269
269
  Total: 6,174
270
270
 
@@ -273,6 +273,8 @@ test('enter pushes full detail view with bar chart', async () => {
273
273
 
274
274
  ────────────────────────────────────────────────────────────────────────────────────────────
275
275
 
276
+ Total: $6,174
277
+
276
278
 
277
279
 
278
280
  esc go back ^k actions ↵ Go Back powered by termcast.app
@@ -50,7 +50,7 @@ test('polymarket list with graph detail renders correctly', async () => {
50
50
 
51
51
  │ ────────────────────────────────────────────
52
52
 
53
- ↵ buy yes ↑↓ navigate ^k actions │ Probability (30d)
53
+ ↵ buy yes ↑↓ navigate ^k actions :vim │ Probability (30d)
54
54
 
55
55
 
56
56
 
@@ -113,7 +113,7 @@ test('navigating to different market updates the graph', async () => {
113
113
 
114
114
  │ ────────────────────────────────────────────
115
115
 
116
- ↵ buy yes ↑↓ navigate ^k actions │ Probability (30d)
116
+ ↵ buy yes ↑↓ navigate ^k actions :vim │ Probability (30d)
117
117
 
118
118
 
119
119
 
@@ -32,28 +32,28 @@ test('side detail shows two graphs in a row', async () => {
32
32
 
33
33
  > Search...
34
34
 
35
- ›CPU vs Memory Area + Filled side by side │ CPU vs Memory
36
- Disk I/O Read vs Write operations │
37
- Revenue vs Expenses Striped comparison │ Area chart (left) shows CPU with high
38
- Weather Station Temperature + Humidity │ variance.
39
- Mixed Variants Area left, Striped right │ Filled chart (right) shows memory steadily
40
- Sparse Data (Zeros) Filled vs Striped with zer │ climbing.
41
-
42
- 100│ ⡀ 100│
43
- ⣠ ⢠⣾⣷⡀ ▖▖▌▌
44
- 67 ⣰⣿⣧ ⢀⣿⣿⣿⣇ 67 ▖▖▌▌▌▌▌▌▌
45
- ⢠⣷⣿⣿⣿⣆ ⣾⣿⣿⣿⣿⡄ ▖▖▌▌▌▌▌▌▌▌▌▌▌▌
46
- │ │ ⢀⣿⣿⣿⣿⣿⣿⣆⣸⣿⣿⣿⣿⣿⣿⣄ │▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
47
- 33│⣀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧ 33│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
48
- │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
49
- 0│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 0│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
50
- 0h 6h 12h 18h24h 0h 6h 12h 18h24h
35
+ ›CPU vs Memory Area + Filled side by side │
36
+ Disk I/O Read vs Write operations │
37
+ Revenue vs Expenses Striped comparison │
38
+ Weather Station Temperature + Humidity │
39
+ Mixed Variants Area left, Striped right │
40
+ Sparse Data (Zeros) Filled vs Striped with zer │
41
+
42
+
43
+ 100 100
44
+ ⡄ ⣼⣷⡀ ▖▖▌▌ █
45
+ 67 ⣸⣿⡄ ⣸⣿⣿⣧ 67│ ▖▖▌▌▌▌▌▌▌ █
46
+ │ │ ⣼⣶⣿⣿⣷⡀ ⢰⣿⣿⣿⣿⣧ │ ▖▖▌▌▌▌▌▌▌▌▌▌▌▌
47
+ │ ⢸⣿⣿⣿⣿⣿⣷⣀⣿⣿⣿⣿⣿⣿⣇ │▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
48
+ 33│⣀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧ 33│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
49
+ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
50
+ 0│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 0│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
51
+ │ 0h 6h 12h 18h24h 0h 6h 12h 18h24h
51
52
 
52
- ────────────────────────────────────────────
53
+ ───────────────────────────────────────────
53
54
 
54
55
  │ CPU Peak: 90%
55
-
56
- ↵ open detail ↑↓ navigate ^k actions │ Mem Peak: 86%
56
+ ↵ open detail ↑↓ navigate ^k actions :vi
57
57
 
58
58
  "
59
59
  `)
@@ -88,10 +88,11 @@ test('enter pushes full detail with two graphs', async () => {
88
88
 
89
89
  CPU vs Memory ▀
90
90
 
91
- Area + Filled side by side
92
91
 
92
+ Area + Filled side by side
93
93
  CPU vs Memory
94
94
 
95
+
95
96
  Area chart (left) shows CPU with high variance.
96
97
  Filled chart (right) shows memory steadily climbing.
97
98
 
@@ -106,7 +107,6 @@ test('enter pushes full detail with two graphs', async () => {
106
107
  │⣀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
107
108
  │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
108
109
  │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
109
- 0│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 0│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
110
110
 
111
111
 
112
112
  esc go back ^k actions ↵ Go Back powered by termcast.app
@@ -151,28 +151,28 @@ test('esc returns from detail to list', async () => {
151
151
 
152
152
  > Search...
153
153
 
154
- ›CPU vs Memory Area + Filled side by side │ CPU vs Memory
155
- Disk I/O Read vs Write operations │
156
- Revenue vs Expenses Striped comparison │ Area chart (left) shows CPU with high
157
- Weather Station Temperature + Humidity │ variance.
158
- Mixed Variants Area left, Striped right │ Filled chart (right) shows memory steadily
159
- Sparse Data (Zeros) Filled vs Striped with zer │ climbing.
160
-
161
- 100│ ⡀ 100│
162
- ⣠ ⢠⣾⣷⡀ ▖▖▌▌
163
- 67 ⣰⣿⣧ ⢀⣿⣿⣿⣇ 67 ▖▖▌▌▌▌▌▌▌
164
- ⢠⣷⣿⣿⣿⣆ ⣾⣿⣿⣿⣿⡄ ▖▖▌▌▌▌▌▌▌▌▌▌▌▌
165
- │ │ ⢀⣿⣿⣿⣿⣿⣿⣆⣸⣿⣿⣿⣿⣿⣿⣄ │▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
166
- 33│⣀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧ 33│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
167
- │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
168
- 0│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 0│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
169
- 0h 6h 12h 18h24h 0h 6h 12h 18h24h
154
+ ›CPU vs Memory Area + Filled side by side │ CPU vs Memory
155
+ Disk I/O Read vs Write operations │
156
+ Revenue vs Expenses Striped comparison │
157
+ Weather Station Temperature + Humidity │ Area chart (left) shows CPU with high █
158
+ Mixed Variants Area left, Striped right │ variance. █
159
+ Sparse Data (Zeros) Filled vs Striped with zer │ Filled chart (right) shows memory steadily █
160
+ climbing. █
161
+
162
+ 100 100
163
+ ⡄ ⣼⣷⡀ ▖▖▌▌ █
164
+ 67 ⣸⣿⡄ ⣸⣿⣿⣧ 67│ ▖▖▌▌▌▌▌▌▌ █
165
+ │ │ ⣼⣶⣿⣿⣷⡀ ⢰⣿⣿⣿⣿⣧ │ ▖▖▌▌▌▌▌▌▌▌▌▌▌▌
166
+ │ ⢸⣿⣿⣿⣿⣿⣷⣀⣿⣿⣿⣿⣿⣿⣇ │▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
167
+ 33│⣀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧ 33│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
168
+ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ │▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
169
+ 0│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 0│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
170
+ │ 0h 6h 12h 18h24h 0h 6h 12h 18h24h
170
171
 
171
- ────────────────────────────────────────────
172
+ ───────────────────────────────────────────
172
173
 
173
174
  │ CPU Peak: 90%
174
-
175
- ↵ open detail ↑↓ navigate ^k actions │ Mem Peak: 86%
175
+ ↵ open detail ↑↓ navigate ^k actions :vi
176
176
 
177
177
  "
178
178
  `)
@@ -208,28 +208,28 @@ test('sparse data with zeros shows baseline', async () => {
208
208
 
209
209
  > Search...
210
210
 
211
- CPU vs Memory Area + Filled side by side │ Sparse Data
212
- Disk I/O Read vs Write operations │
213
- Revenue vs Expenses Striped comparison │ Data with many zero values should show a
214
- Weather Station Temperature + Humidity │ thin
215
- Mixed Variants Area left, Striped right │ baseline line so bars are visible even at
216
- ›Sparse Data (Zeros) Filled vs Striped with zer │ zero.
217
-
218
- 100│ ▖ 100│ ▖
219
- ▖▌ ▖▌
220
- 67▌ ▌▌ 67 ▌▌
221
- │ │ ▌▌ ▖▌ ▌▌ │ ▌▌ ▖▌ ▌▌
222
- │ │ ▌▌ ▌▌ ▌▌▖ │ ▌▌ ▌▌ ▌▌▖
223
- 33 ▖ ▌▌▌ ▌▌▖▌▌▌▌ 33│ ▖ ▌▌▌ ▌▌▖ ▌▌▌
224
- ▌▌▌▌▌▌ ▌▌▌▌▌▌▌▌ ▌▌▌▌▌▌▌▌▌▌ ▌▌▌
225
- 0│▖▌▌▌▌▌▌▌▖▌▌▌▌▌▌▌▌▖ 0│▖▌▌▌▌▌▌▌▌▌▌▌▖▌▌▌▖
226
- 0h 6h 12h 18h24h 0h 6h 12h 18h24h
211
+ CPU vs Memory Area + Filled side by side │ Sparse Data
212
+ Disk I/O Read vs Write operations │
213
+ Revenue vs Expenses Striped comparison │
214
+ Weather Station Temperature + Humidity │ Data with many zero values should show a █
215
+ Mixed Variants Area left, Striped right │ thin █
216
+ ›Sparse Data (Zeros) Filled vs Striped with zer │ baseline line so bars are visible even at █
217
+ zero. █
218
+
219
+ 100 100
220
+ ▖ ▖▌ ▖▌ █
221
+ 67│ ▌ ▌▌ 67▌▌
222
+ │ │ ▌▌ ▖▌ ▌▌ │ ▌▌ ▖▌ ▌▌
223
+ │ ▌▌ ▌▌ ▌▌▖ ▌▌ ▌▌ ▌▌▖
224
+ 33 ▌▌▌ ▌▌▖ ▌▌▌ 33 ▌▌▌ ▌▌▖ ▌▌▌
225
+ │ ▌▌▌▌▌▌▌▌▌▌ ▌▌▌ │ ▌▌▌▌▌▌▌▌▌▌ ▌▌▌
226
+ 0│▖▌▌▌▌▌▌▌▌▌▌▌▖▌▌▌▖ 0│▖▌▌▌▌▌▌▌▌▌▌▌▖▌▌▌▖
227
+ │ 0h 6h 12h 18h24h 0h 6h 12h 18h24h
227
228
 
228
- ────────────────────────────────────────────
229
+ ───────────────────────────────────────────
229
230
 
230
231
  │ Zeros: 12 of 20
231
-
232
- ↵ open detail ↑↓ navigate ^k actions │ Peak: 90
232
+ ↵ open detail ↑↓ navigate ^k actions :vi
233
233
 
234
234
  "
235
235
  `)
@@ -266,12 +266,11 @@ test('navigate to striped pair', async () => {
266
266
 
267
267
  CPU vs Memory Area + Filled side by side │ Revenue vs Expenses ▲
268
268
  Disk I/O Read vs Write operations │ █
269
- ›Revenue vs Expenses Striped comparison │ Revenue growing faster than expenses.
270
- Weather Station Temperature + Humidity │ Profit margin widening over the year. █
271
- Mixed Variants Area left, Striped right │
272
- Sparse Data (Zeros) Filled vs Striped with zer │ - Revenue: $10k to $75k
273
- │ - Expenses: $8k to $45k
274
-
269
+ ›Revenue vs Expenses Striped comparison │
270
+ Weather Station Temperature + Humidity │ Revenue growing faster than expenses. █
271
+ Mixed Variants Area left, Striped right │ Profit margin widening over the year.
272
+ Sparse Data (Zeros) Filled vs Striped with zer │ - Revenue: $10k** to **$75k
273
+ │ - Expenses: $8k** to **$45k
275
274
 
276
275
  │ 78│ ▖ 47│ ▖
277
276
  │ │ ▖▌▌▌ │ ▖▖▌▌▌
@@ -285,7 +284,8 @@ test('navigate to striped pair', async () => {
285
284
 
286
285
  │ ───────────────────────────────────────────
287
286
 
288
- ↵ open detail ↑↓ navigate ^k actions │ Revenue: $75k
287
+ │ Revenue: $75k
288
+ ↵ open detail ↑↓ navigate ^k actions :vi │ ▼
289
289
 
290
290
  "
291
291
  `)
@@ -86,9 +86,9 @@ test('filled style renders block characters', async () => {
86
86
 
87
87
  Area - Stock Price Orange braille do │ Revenue Growth ▲
88
88
  Area - Multi Series CPU + Memory ove │ █
89
- Area - Waves Purple + Magenta sine/c │ Quarterly revenue from $10k to
90
- Area - Blue Revenue Single series, a │ $75k.
91
- ›Filled - Red Revenue Solid block gro │
89
+ Area - Waves Purple + Magenta sine/c │
90
+ Area - Blue Revenue Single series, a │ Quarterly revenue from $10k** to
91
+ ›Filled - Red Revenue Solid block gro │ **$75k.
92
92
  Filled - Green Temp Daily temperatur │ Q1: $10k → Q2: $25k (+150%)
93
93
  Filled - Yellow CPU High contrast on │ Q2: $25k → Q3: $50k (+100%)
94
94
  Filled - Magenta Waves Smooth curve │ Q3: $50k → Q4: $75k (+50%)
@@ -188,20 +188,20 @@ test('markdown + metadata detail view in list', async () => {
188
188
 
189
189
  Area - Stock Price Orange braille do │ System Metrics ▲
190
190
  ›Area - Multi Series CPU + Memory ove │ ▀
191
- Area - Waves Purple + Magenta sine/c │ CPU usage (blue) vs memory usage (
192
- Area - Blue Revenue Single series, a │ green) over 24 hours.
193
- Filled - Red Revenue Solid block gro │
191
+ Area - Waves Purple + Magenta sine/c │
192
+ Area - Blue Revenue Single series, a │ CPU usage (blue) vs memory usage (
193
+ Filled - Red Revenue Solid block gro │ green) over 24 hours.
194
194
  Filled - Green Temp Daily temperatur │ - Peak CPU at 90% around 15h
195
195
  Filled - Yellow CPU High contrast on │ - Memory steadily climbing to 86%
196
196
  Filled - Magenta Waves Smooth curve │ - CPU has high variance, memory
197
197
  Striped - Purple/Orange Warm alterna │ is monotonic
198
198
  Striped - Blue/Red High contrast str │
199
- Striped - Theme Default primary + ac │
200
- Striped - Green/Yellow Nature-inspir │ 100
201
- Striped - Red/Magenta Warm gradient │ ⣠⣶⣧ ⣀⣠⣤⣶
202
- │ 75│ ⢀⣴⣧ ⢀⣰⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿
199
+ Striped - Theme Default primary + ac │ 100│
200
+ Striped - Green/Yellow Nature-inspir │ ⣠⣶⣧ ⣀⣠⣤⣶
201
+ Striped - Red/Magenta Warm gradient │ 75 ⢀⣴⣧ ⢀⣰⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿
203
202
  │ │ ⢀⣾⣿⣿⣧⢀⣀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
204
- ↵ open detail ↑↓ navigate ^k act │ │ ⢀⣾⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
203
+ │ │ ⢀⣾⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
204
+ ↵ open detail ↑↓ navigate ^k act │ 50│⣀⣀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ▼
205
205
 
206
206
  "
207
207
  `)
@@ -236,8 +236,8 @@ test('enter pushes full detail view with graph', async () => {
236
236
 
237
237
  Area - Stock Price
238
238
 
239
- Orange braille dots
240
239
 
240
+ Orange braille dots
241
241
  Variant: area
242
242
  Data points: 20
243
243
 
@@ -5,6 +5,8 @@ test('simple scrollbox navigation and scrolling', async () => {
5
5
  const session = await launchTerminal({
6
6
  command: 'bun',
7
7
  args: ['src/examples/internal/simple-scrollbox.tsx'],
8
+ cols: 80,
9
+ rows: 20,
8
10
  })
9
11
 
10
12
  // Wait for initial render with Item 1 visible
@@ -23,34 +25,18 @@ test('simple scrollbox navigation and scrolling', async () => {
23
25
 
24
26
 
25
27
  Simple ScrollBox Demo
26
-
27
- Item 1 - This is content for item number 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
28
-
29
-
30
-
31
- Item 2 - This is content for item number 2. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
32
-
33
-
34
-
35
- Item 3 - This is content for item number 3. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
36
-
37
-
38
-
39
- Item 4 - This is content for item number 4. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
40
-
41
-
42
-
43
- Item 5 - This is content for item number 5. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
44
-
45
-
28
+
29
+ Item 1 - This is content for item number 1. Lorem ipsum dolor sit amet,
30
+ consectetur adipiscing elit.
46
31
 
47
- Item 6 - This is content for item number 6. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
48
32
 
49
33
 
34
+ Item 2 - This is content for item number 2. Lorem ipsum dolor sit amet,
35
+ consectetur adipiscing elit.
50
36
 
51
- Item 7 - This is content for item number 7. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
52
37
 
53
38
 
39
+ Item 3 - This is content for item number 3. Lorem ipsum dolor sit amet,
54
40
 
55
41
  Use mouse scroll or arrow keys | Press [q] to quit
56
42
 
@@ -71,34 +57,18 @@ test('simple scrollbox navigation and scrolling', async () => {
71
57
 
72
58
 
73
59
  Simple ScrollBox Demo
74
- Item 1 - This is content for item number 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
75
-
76
-
77
-
78
- Item 2 - This is content for item number 2. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
79
-
80
-
81
-
82
- Item 3 - This is content for item number 3. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
83
-
84
-
85
-
86
- Item 4 - This is content for item number 4. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
87
-
88
-
89
-
90
- Item 5 - This is content for item number 5. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
91
-
92
-
93
-
94
- Item 6 - This is content for item number 6. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
60
+
61
+ Item 2 - This is content for item number 2. Lorem ipsum dolor sit amet,
62
+ consectetur adipiscing elit.
95
63
 
96
64
 
97
65
 
98
- Item 7 - This is content for item number 7. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
66
+ Item 3 - This is content for item number 3. Lorem ipsum dolor sit amet,
67
+ consectetur adipiscing elit.
99
68
 
100
69
 
101
70
 
71
+ Item 4 - This is content for item number 4. Lorem ipsum dolor sit amet,
102
72
 
103
73
  Use mouse scroll or arrow keys | Press [q] to quit
104
74
 
@@ -131,10 +101,6 @@ test('simple scrollbox navigation and scrolling', async () => {
131
101
 
132
102
 
133
103
  Item 3 - This is content for item number 3. Lorem ipsum dolor sit amet,
134
- consectetur adipiscing elit.
135
-
136
-
137
-
138
104
 
139
105
  Use mouse scroll or arrow keys | Press [q] to quit
140
106