termcast 1.5.0 → 1.6.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 (68) hide show
  1. package/dist/build.d.ts.map +1 -1
  2. package/dist/build.js +22 -5
  3. package/dist/build.js.map +1 -1
  4. package/dist/compile.d.ts.map +1 -1
  5. package/dist/compile.js +7 -1
  6. package/dist/compile.js.map +1 -1
  7. package/dist/components/bar-graph.d.ts +4 -4
  8. package/dist/components/bar-graph.js +2 -2
  9. package/dist/components/list.d.ts +7 -0
  10. package/dist/components/list.d.ts.map +1 -1
  11. package/dist/components/list.js +74 -11
  12. package/dist/components/list.js.map +1 -1
  13. package/dist/examples/list-detail-height-ratchet.d.ts +2 -0
  14. package/dist/examples/list-detail-height-ratchet.d.ts.map +1 -0
  15. package/dist/examples/list-detail-height-ratchet.js +26 -0
  16. package/dist/examples/list-detail-height-ratchet.js.map +1 -0
  17. package/dist/extensions/dev.d.ts.map +1 -1
  18. package/dist/extensions/dev.js +1 -0
  19. package/dist/extensions/dev.js.map +1 -1
  20. package/dist/globals.js +8 -0
  21. package/dist/globals.js.map +1 -1
  22. package/dist/package-json.d.ts +2 -0
  23. package/dist/package-json.d.ts.map +1 -1
  24. package/dist/package-json.js +20 -17
  25. package/dist/package-json.js.map +1 -1
  26. package/dist/profiler.d.ts +2 -0
  27. package/dist/profiler.d.ts.map +1 -0
  28. package/dist/profiler.js +390 -0
  29. package/dist/profiler.js.map +1 -0
  30. package/package.json +14 -15
  31. package/src/build.tsx +27 -5
  32. package/src/cli.tsx +0 -0
  33. package/src/compile.tsx +9 -1
  34. package/src/compile.vitest.tsx +8 -8
  35. package/src/components/bar-graph.tsx +9 -9
  36. package/src/components/list.tsx +92 -11
  37. package/src/examples/action-shortcut.vitest.tsx +4 -4
  38. package/src/examples/actions-context.vitest.tsx +2 -2
  39. package/src/examples/bar-graph-weekly.vitest.tsx +97 -97
  40. package/src/examples/github.vitest.tsx +17 -26
  41. package/src/examples/graph-bar-chart.vitest.tsx +36 -36
  42. package/src/examples/graph-polymarket.vitest.tsx +24 -24
  43. package/src/examples/graph-row.vitest.tsx +4 -4
  44. package/src/examples/graph-styles.vitest.tsx +65 -65
  45. package/src/examples/horizontal-bar-graph-weekly.vitest.tsx +52 -52
  46. package/src/examples/list-detail-height-ratchet.tsx +48 -0
  47. package/src/examples/list-detail-height-ratchet.vitest.tsx +161 -0
  48. package/src/examples/list-detail-metadata.vitest.tsx +49 -49
  49. package/src/examples/list-dropdown-default.vitest.tsx +27 -27
  50. package/src/examples/list-fetch-data.vitest.tsx +3 -3
  51. package/src/examples/list-loading-empty-view.vitest.tsx +1 -1
  52. package/src/examples/list-no-actions.vitest.tsx +3 -3
  53. package/src/examples/list-scrollbox.vitest.tsx +6 -6
  54. package/src/examples/list-spacing-mode.vitest.tsx +1 -1
  55. package/src/examples/list-with-detail.vitest.tsx +9 -9
  56. package/src/examples/list-with-dropdown.vitest.tsx +6 -6
  57. package/src/examples/list-with-sections.vitest.tsx +20 -20
  58. package/src/examples/list-with-toast.vitest.tsx +4 -4
  59. package/src/examples/simple-candle-chart.vitest.tsx +61 -59
  60. package/src/examples/simple-navigation.vitest.tsx +25 -25
  61. package/src/examples/simple-progress-bar.vitest.tsx +7 -7
  62. package/src/examples/swift-extension.vitest.tsx +3 -3
  63. package/src/examples/toast-action.vitest.tsx +4 -4
  64. package/src/extensions/dev.tsx +2 -1
  65. package/src/extensions/dev.vitest.tsx +17 -17
  66. package/src/globals.ts +9 -0
  67. package/src/package-json.tsx +24 -23
  68. package/src/profiler.tsx +487 -0
@@ -36,7 +36,7 @@ test('initial render shows bar chart for Monthly Budget', async () => {
36
36
 
37
37
  ›Monthly Budget Spent / Remaining / Savings │ ┌Spent: 78.6%┐
38
38
  Disk Usage System / Apps / Media / Free │
39
- Inves...tfolioStocks / Bonds...o / Real Estate │
39
+ Investm...ortfoli Stocks / Bon.../ Real Estate │
40
40
  CPU Time User / System / IO Wait / Idle │ ────────────────────────────────────────────
41
41
  Revenue by Product 6 product lines │
42
42
  A/B Test Split Control vs Variant (50/50) │ Total: $6,174
@@ -45,18 +45,18 @@ test('initial render shows bar chart for Monthly Budget', async () => {
45
45
  Equal Distribution 10 equal segments │
46
46
  Custom Colors Explicit color per segment │ Saved: 10.0%
47
47
  Needs vs Wants 50/30/20 budget rule │
48
- Stress Test (20 items Many small...al segments │
48
+ Stress Test (20 items)Many small...al segments │
49
+
50
+
51
+
52
+
53
+
54
+
55
+
49
56
 
50
57
 
51
58
  ↵ open detail ↑↓ navigate ^k actions :vi │
52
59
 
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
60
  "
61
61
  `)
62
62
  expect(text).toContain('Monthly Budget')
@@ -93,7 +93,7 @@ test('navigate to Market Share - dominant + tiny segments', async () => {
93
93
 
94
94
  Monthly Budget Spent / Remaining / Savings │ ┌Leader: 85.0%┐
95
95
  Disk Usage System / Apps / Media / Free │
96
- Inves...tfolioStocks / Bonds...o / Real Estate │
96
+ Investm...ortfoli Stocks / Bon.../ Real Estate │
97
97
  CPU Time User / System / IO Wait / Idle │ ────────────────────────────────────────────
98
98
  Revenue by Product 6 product lines │
99
99
  A/B Test Split Control vs Variant (50/50) │ HHI: 7,264 (monopoly)
@@ -102,18 +102,18 @@ test('navigate to Market Share - dominant + tiny segments', async () => {
102
102
  Equal Distribution 10 equal segments │
103
103
  Custom Colors Explicit color per segment │ Visible: Tiny ones hidden
104
104
  Needs vs Wants 50/30/20 budget rule │
105
- Stress Test (20 items Many small...al segments │
105
+ Stress Test (20 items)Many small...al segments │
106
+
107
+
108
+
109
+
110
+
111
+
112
+
106
113
 
107
114
 
108
115
  ↵ open detail ↑↓ navigate ^k actions :vi │
109
116
 
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
117
  "
118
118
  `)
119
119
  expect(text).toContain('Market Share')
@@ -149,7 +149,7 @@ test('navigate to Equal Distribution - 10 segments', async () => {
149
149
 
150
150
  Monthly Budget Spent / Remaining / Savings │
151
151
  Disk Usage System / Apps / Media / Free │
152
- Inves...tfolioStocks / Bonds...o / Real Estate │ ────────────────────────────────────────────
152
+ Investm...ortfoli Stocks / Bon.../ Real Estate │ ────────────────────────────────────────────
153
153
  CPU Time User / System / IO Wait / Idle │
154
154
  Revenue by Product 6 product lines │ Segments: 10
155
155
  A/B Test Split Control vs Variant (50/50) │
@@ -158,18 +158,18 @@ test('navigate to Equal Distribution - 10 segments', async () => {
158
158
  ›Equal Distribution 10 equal segments │
159
159
  Custom Colors Explicit color per segment │
160
160
  Needs vs Wants 50/30/20 budget rule │
161
- Stress Test (20 items Many small...al segments │
161
+ Stress Test (20 items)Many small...al segments │
162
+
163
+
164
+
165
+
166
+
167
+
168
+
162
169
 
163
170
 
164
171
  ↵ open detail ↑↓ navigate ^k actions :vi │
165
172
 
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
173
  "
174
174
  `)
175
175
  expect(text).toContain('Equal Distribution')
@@ -205,7 +205,7 @@ test('navigate to Stress Test - 20 segments', async () => {
205
205
 
206
206
  Monthly Budget Spent / Remaining / Savings │
207
207
  Disk Usage System / Apps / Media / Free │
208
- Inves...tfolioStocks / Bonds...o / Real Estate │ ────────────────────────────────────────────
208
+ Investm...ortfoli Stocks / Bon.../ Real Estate │ ────────────────────────────────────────────
209
209
  CPU Time User / System / IO Wait / Idle │
210
210
  Revenue by Product 6 product lines │ Segments: 20
211
211
  A/B Test Split Control vs Variant (50/50) │
@@ -214,18 +214,18 @@ test('navigate to Stress Test - 20 segments', async () => {
214
214
  Equal Distribution 10 equal segments │
215
215
  Custom Colors Explicit color per segment │
216
216
  Needs vs Wants 50/30/20 budget rule │
217
- ›Stress Test (20 items Many small...al segments │
217
+ ›Stress Test (20 items)Many small...al segments │
218
+
219
+
220
+
221
+
222
+
223
+
224
+
218
225
 
219
226
 
220
227
  ↵ open detail ↑↓ navigate ^k actions :vi │
221
228
 
222
-
223
-
224
-
225
-
226
-
227
-
228
-
229
229
  "
230
230
  `)
231
231
  expect(text).toContain('Stress Test')
@@ -33,14 +33,14 @@ test('polymarket list with graph detail renders correctly', async () => {
33
33
  > Search markets...
34
34
 
35
35
  Trending Markets │ 100%│
36
- ›Bitcoin above $100k by EOY Crypto │ │ ⣠⣀
37
- ETH above $5k by Q2 2026 Crypto │ │ ⢠⣀ ⢀⣴⣷⡀ ⣰⣿⣿⣷⣀⣤⣴⣦⢀⣴
38
- Fed cuts rates below 4% Economics │ │⣠⣴⡀ ⢀ ⢠⣿⣿⣷⡀ ⣀⣤⣀⣀⣾⣿⣿⣿⣶⣴⣿⣿⣶⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
39
- S&P 500 reaches 6,000 Markets │ 50%│⣿⣿⣷⣄⢀⣴⣿⣿⣾⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
40
- Presidential pardon for SBF Politics │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
41
- AGI announced by major lab Tech │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
42
- Solana flips Ethereum market cap Crypto │ 0%│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
43
- US enters recession in 2026 Economics │ 30d 20d 10d Now
36
+ ›Bitcoin above $100k by EOY Crypto 72% │ │ ⣠⣀
37
+ ETH above $5k by Q2 2026 Crypto 38% │ │ ⢠⣀ ⢀⣴⣷⡀ ⣰⣿⣿⣷⣀⣤⣴⣦⢀⣴
38
+ Fed cuts rates below 4% Economics 61% │ │⣠⣴⡀ ⢀ ⢠⣿⣿⣷⡀ ⣀⣤⣀⣀⣾⣿⣿⣿⣶⣴⣿⣿⣶⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
39
+ S&P 500 reaches 6,000 Markets 55% │ 50%│⣿⣿⣷⣄⢀⣴⣿⣿⣾⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
40
+ Presidential pardon for SBF Politics 8% │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
41
+ AGI announced by major lab Tech 12% │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
42
+ Solana flips Ethereum market cap Crypto 18% │ 0%│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
43
+ US enters recession in 2026 Economics 28% │ 30d 20d 10d Now
44
44
 
45
45
  │ Odds: 72% Yes
46
46
 
@@ -50,10 +50,10 @@ test('polymarket list with graph detail renders correctly', async () => {
50
50
 
51
51
  │ ────────────────────────────────────────────
52
52
 
53
- ↵ buy yes ↑↓ navigate ^k actions :vim │ Probability (30d)
54
-
55
-
56
-
53
+ │ Probability (30d)
54
+
55
+
56
+ ↵ buy yes ↑↓ navigate ^k actions :vim │
57
57
 
58
58
  "
59
59
  `)
@@ -96,14 +96,14 @@ test('navigating to different market updates the graph', async () => {
96
96
  > Search markets...
97
97
 
98
98
  Trending Markets │ 100%│
99
- Bitcoin above $100k by EOY Crypto │ │
100
- ›ETH above $5k by Q2 2026 Crypto │ │ ⣀
101
- Fed cuts rates below 4% Economics │ │⣿⣿⣆ ⢀⡀ ⣀⣾⣶⣄ ⢀⣤⣦ ⢀⡀
102
- S&P 500 reaches 6,000 Markets │ 50%│⣿⣿⣿⣷⣴⣾⣿⣿⣿⣿⣿⣿⣿⣦⣤⣶⣷⣦⣤⣿⣿⣿⣷⣤⣀⣤⣤⣀⢀⣴⣿⣿⣧ ⣀⣀⡀ ⢀
103
- Presidential pardon for SBF Politics │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣴⣿
104
- AGI announced by major lab Tech │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
105
- Solana flips Ethereum market cap Crypto │ 0%│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
106
- US enters recession in 2026 Economics │ 30d 20d 10d Now
99
+ Bitcoin above $100k by EOY Crypto 72% │ │
100
+ ›ETH above $5k by Q2 2026 Crypto 38% │ │ ⣀
101
+ Fed cuts rates below 4% Economics 61% │ │⣿⣿⣆ ⢀⡀ ⣀⣾⣶⣄ ⢀⣤⣦ ⢀⡀
102
+ S&P 500 reaches 6,000 Markets 55% │ 50%│⣿⣿⣿⣷⣴⣾⣿⣿⣿⣿⣿⣿⣿⣦⣤⣶⣷⣦⣤⣿⣿⣿⣷⣤⣀⣤⣤⣀⢀⣴⣿⣿⣧ ⣀⣀⡀ ⢀
103
+ Presidential pardon for SBF Politics 8% │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣴⣿
104
+ AGI announced by major lab Tech 12% │ │⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
105
+ Solana flips Ethereum market cap Crypto 18% │ 0%│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
106
+ US enters recession in 2026 Economics 28% │ 30d 20d 10d Now
107
107
 
108
108
  │ Odds: 38% Yes
109
109
 
@@ -113,10 +113,10 @@ test('navigating to different market updates the graph', async () => {
113
113
 
114
114
  │ ────────────────────────────────────────────
115
115
 
116
- ↵ buy yes ↑↓ navigate ^k actions :vim │ Probability (30d)
117
-
118
-
119
-
116
+ │ Probability (30d)
117
+
118
+
119
+ ↵ buy yes ↑↓ navigate ^k actions :vim │
120
120
 
121
121
  "
122
122
  `)
@@ -37,7 +37,7 @@ test('side detail shows two graphs in a row', async () => {
37
37
  Revenue vs Expenses Striped comparison │ █
38
38
  Weather Station Temperature + Humidity │ Area chart (left) shows CPU with high █
39
39
  Mixed Variants Area left, Striped right │ variance. █
40
- Sparse ...(Zeros Filled vs Str...h zero values │ Filled chart (right) shows memory steadily █
40
+ Sparse ... (Zeros)Filled vs St...h zero values │ Filled chart (right) shows memory steadily █
41
41
  │ climbing. █
42
42
  │ █
43
43
  │ 100│ ⡀ 100│ █
@@ -156,7 +156,7 @@ test('esc returns from detail to list', async () => {
156
156
  Revenue vs Expenses Striped comparison │ █
157
157
  Weather Station Temperature + Humidity │ Area chart (left) shows CPU with high █
158
158
  Mixed Variants Area left, Striped right │ variance. █
159
- Sparse ...(Zeros Filled vs Str...h zero values │ Filled chart (right) shows memory steadily █
159
+ Sparse ... (Zeros)Filled vs St...h zero values │ Filled chart (right) shows memory steadily █
160
160
  │ climbing. █
161
161
  │ █
162
162
  │ 100│ ⡀ 100│ █
@@ -213,7 +213,7 @@ test('sparse data with zeros shows baseline', async () => {
213
213
  Revenue vs Expenses Striped comparison │ █
214
214
  Weather Station Temperature + Humidity │ Data with many zero values should show a █
215
215
  Mixed Variants Area left, Striped right │ thin █
216
- ›Sparse ...(Zeros Filled vs Str...h zero values │ baseline line so bars are visible even at █
216
+ ›Sparse ... (Zeros)Filled vs St...h zero values │ baseline line so bars are visible even at █
217
217
  │ zero. █
218
218
  │ █
219
219
  │ 100│ ▖ 100│ ▖ █
@@ -269,7 +269,7 @@ test('navigate to striped pair', async () => {
269
269
  ›Revenue vs Expenses Striped comparison │ █
270
270
  Weather Station Temperature + Humidity │ Revenue growing faster than expenses. █
271
271
  Mixed Variants Area left, Striped right │ Profit margin widening over the year. █
272
- Sparse ...(Zeros Filled vs Str...h zero values │ - Revenue: $10k** to **$75k █
272
+ Sparse ... (Zeros)Filled vs St...h zero values │ - Revenue: $10k** to **$75k █
273
273
  │ - Expenses: $8k** to **$45k
274
274
 
275
275
  │ 78│ ▖ 47│ ▖
@@ -32,19 +32,19 @@ test('area style renders braille characters', async () => {
32
32
 
33
33
  > Search...
34
34
 
35
- ›Area - ...k Price Orange ...lle dots │ 211│ ⣠ ▲
36
- Area - ... Series CPU + M... overlay │ │ ⢀⣴⣦⣼⣿ █
37
- Area...ave Purple + Ma...sine/cosine │ │ ⢠⣦⣄⣴⣿⣿⣿⣿⣿ █
38
- Area -...evenue Single s...uto range │ 189│ ⢀⣴⣷⣦⣿⣿⣿⣿⣿⣿⣿⣿⣿ █
39
- Filled...RevenueSolid bl...wth chart │ │ ⣠⣀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ▀
40
- Filled...en TempDaily te...ure curve │ │ ⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
41
- Filled ...low CPUHigh con... on dark │ 167│ ⢀⣴⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
42
- Filled ...a WavesSmooth c...h blocks │ │ ⣰⣤⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
43
- Striped...e/Orang Warm al...g colors │ │⢀⣴⡄⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
44
- Striped...lue/Re High con... stripes │ 145│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
45
- Striped...Defaul primary ...no prop) │ 1 5 10 15 20
46
- Striped -...en/YellowNature-inspired
47
- Striped .../MagentaWarm gr...nt feel │ ─────────────────────────────────
35
+ ›Area - Stock PriceOrange ...lle dots │ 211│ ⣠ ▲
36
+ Area - ...i Series CPU + M...overlay │ │ ⢀⣴⣦⣼⣿ █
37
+ Area - Wave Purple + M...sine/cosine │ │ ⢠⣦⣄⣴⣿⣿⣿⣿⣿ █
38
+ Area - ... Revenu Single ...to range │ 189│ ⢀⣴⣷⣦⣿⣿⣿⣿⣿⣿⣿⣿⣿ █
39
+ Filled ... RevenueSolid b...th chart │ │ ⣠⣀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ▀
40
+ Filled ...een Tem Daily t...re curve │ │ ⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
41
+ Filled ...llow CPUHigh co... on dark │ 167│ ⢀⣴⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
42
+ Filled -...nta Wave Smooth... blocks │ │ ⣰⣤⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
43
+ Striped -...le/Orang Warm a...colors │ │⢀⣴⡄⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
44
+ Striped - Blue/Re High co... stripes │ 145│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
45
+ Striped ...e Defaultprimar...o prop) │ 1 5 10 15 20
46
+ Striped - Green/Yello Natur...spired
47
+ Striped ...d/MagentaWarm g...nt feel │ ─────────────────────────────────
48
48
 
49
49
  │ Variant: area
50
50
  ↵ open detail ↑↓ navigate ^k act │ ▼
@@ -84,19 +84,19 @@ test('filled style renders block characters', async () => {
84
84
 
85
85
  > Search...
86
86
 
87
- Area - ...k Price Orange ...lle dots │ Revenue Growth ▲
88
- Area - ... Series CPU + M... overlay │ █
89
- Area...ave Purple + Ma...sine/cosine │
90
- Area -...evenue Single s...uto range │ Quarterly revenue from $10k** to
91
- ›Filled...RevenueSolid bl...wth chart │ **$75k.
92
- Filled...en TempDaily te...ure curve │ Q1: $10k → Q2: $25k (+150%)
93
- Filled ...low CPUHigh con... on dark │ Q2: $25k → Q3: $50k (+100%)
94
- Filled ...a WavesSmooth c...h blocks │ Q3: $50k → Q4: $75k (+50%)
95
- Striped...e/Orang Warm al...g colors │
96
- Striped...lue/Re High con... stripes │ 78│ ▖
97
- Striped...Defaul primary ...no prop) │ │ ▖▌▖▌▌
98
- Striped -...en/YellowNature-inspired │ │ ▖▖▖▌▌▌▌▌▌
99
- Striped .../MagentaWarm gr...nt feel │ 54│ ▖▌▌▌▌▌▌▌▌▌▌
87
+ Area - Stock PriceOrange ...lle dots │ Revenue Growth ▲
88
+ Area - ...i Series CPU + M...overlay │ █
89
+ Area - Wave Purple + M...sine/cosine │
90
+ Area - ... Revenu Single ...to range │ Quarterly revenue from $10k** to
91
+ ›Filled ... RevenueSolid b...th chart │ **$75k.
92
+ Filled ...een Tem Daily t...re curve │ Q1: $10k → Q2: $25k (+150%)
93
+ Filled ...llow CPUHigh co... on dark │ Q2: $25k → Q3: $50k (+100%)
94
+ Filled -...nta Wave Smooth... blocks │ Q3: $50k → Q4: $75k (+50%)
95
+ Striped -...le/Orang Warm a...colors │
96
+ Striped - Blue/Re High co... stripes │ 78│ ▖
97
+ Striped ...e Defaultprimar...o prop) │ │ ▖▌▖▌▌
98
+ Striped - Green/Yello Natur...spired │ │ ▖▖▖▌▌▌▌▌▌
99
+ Striped ...d/MagentaWarm g...nt feel │ 54│ ▖▌▌▌▌▌▌▌▌▌▌
100
100
  │ │ ▖▖▖▌▌▌▌▌▌▌▌▌▌▌▌
101
101
  │ │ ▖ ▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
102
102
  ↵ open detail ↑↓ navigate ^k act │ 31│ ▖▌▌▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌ ▼
@@ -136,19 +136,19 @@ test('striped style renders alternating columns', async () => {
136
136
 
137
137
  > Search...
138
138
 
139
- Area - ...k Price Orange ...lle dots │ 211│ ▖ ▲
140
- Area - ... Series CPU + M... overlay │ │ ▖▖▌▌ █
141
- Area...ave Purple + Ma...sine/cosine │ │ ▖▖▖▌▌▌▌▌ █
142
- Area -...evenue Single s...uto range │ 189│ ▖▖▌▖▌▌▌▌▌▌▌▌▌
143
- Filled...RevenueSolid bl...wth chart │ │ ▖▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌
144
- Filled...en TempDaily te...ure curve │ │ ▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
145
- Filled ...low CPUHigh con... on dark │ 167│ ▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
146
- Filled ...a WavesSmooth c...h blocks │ │ ▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
147
- ›Striped...e/Orang Warm al...g colors │ │▖▌▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
148
- Striped...lue/Re High con... stripes │ 145│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
149
- Striped...Defaul primary ...no prop) │ 1 5 10 15 20
150
- Striped -...en/YellowNature-inspired
151
- Striped .../MagentaWarm gr...nt feel │ ─────────────────────────────────
139
+ Area - Stock PriceOrange ...lle dots │ 211│ ▖ ▲
140
+ Area - ...i Series CPU + M...overlay │ │ ▖▖▌▌ █
141
+ Area - Wave Purple + M...sine/cosine │ │ ▖▖▖▌▌▌▌▌ █
142
+ Area - ... Revenu Single ...to range │ 189│ ▖▖▌▖▌▌▌▌▌▌▌▌▌
143
+ Filled ... RevenueSolid b...th chart │ │ ▖▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌
144
+ Filled ...een Tem Daily t...re curve │ │ ▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
145
+ Filled ...llow CPUHigh co... on dark │ 167│ ▖▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
146
+ Filled -...nta Wave Smooth... blocks │ │ ▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
147
+ ›Striped -...le/Orang Warm a...colors │ │▖▌▖▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
148
+ Striped - Blue/Re High co... stripes │ 145│▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
149
+ Striped ...e Defaultprimar...o prop) │ 1 5 10 15 20
150
+ Striped - Green/Yello Natur...spired
151
+ Striped ...d/MagentaWarm g...nt feel │ ─────────────────────────────────
152
152
 
153
153
  │ Even cols: Purple
154
154
  ↵ open detail ↑↓ navigate ^k act │ ▼
@@ -186,19 +186,19 @@ test('markdown + metadata detail view in list', async () => {
186
186
 
187
187
  > Search...
188
188
 
189
- Area - ...k Price Orange ...lle dots │ System Metrics ▲
190
- ›Area - ... Series CPU + M... overlay │ ▀
191
- Area...ave Purple + Ma...sine/cosine │
192
- Area -...evenue Single s...uto range │ CPU usage (blue) vs memory usage (
193
- Filled...RevenueSolid bl...wth chart │ green) over 24 hours.
194
- Filled...en TempDaily te...ure curve │ - Peak CPU at 90% around 15h
195
- Filled ...low CPUHigh con... on dark │ - Memory steadily climbing to 86%
196
- Filled ...a WavesSmooth c...h blocks │ - CPU has high variance, memory
197
- Striped...e/Orang Warm al...g colors │ is monotonic
198
- Striped...lue/Re High con... stripes │
199
- Striped...Defaul primary ...no prop) │ 100│
200
- Striped -...en/YellowNature-inspired │ │ ⣠⣶⣧ ⣀⣠⣤⣶
201
- Striped .../MagentaWarm gr...nt feel │ 75│ ⢀⣴⣧ ⢀⣰⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿
189
+ Area - Stock PriceOrange ...lle dots │ System Metrics ▲
190
+ ›Area - ...i Series CPU + M...overlay │ ▀
191
+ Area - Wave Purple + M...sine/cosine │
192
+ Area - ... Revenu Single ...to range │ CPU usage (blue) vs memory usage (
193
+ Filled ... RevenueSolid b...th chart │ green) over 24 hours.
194
+ Filled ...een Tem Daily t...re curve │ - Peak CPU at 90% around 15h
195
+ Filled ...llow CPUHigh co... on dark │ - Memory steadily climbing to 86%
196
+ Filled -...nta Wave Smooth... blocks │ - CPU has high variance, memory
197
+ Striped -...le/Orang Warm a...colors │ is monotonic
198
+ Striped - Blue/Re High co... stripes │
199
+ Striped ...e Defaultprimar...o prop) │ 100│
200
+ Striped - Green/Yello Natur...spired │ │ ⣠⣶⣧ ⣀⣠⣤⣶
201
+ Striped ...d/MagentaWarm g...nt feel │ 75│ ⢀⣴⣧ ⢀⣰⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿
202
202
  │ │ ⢀⣾⣿⣿⣧⢀⣀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
203
203
  │ │ ⢀⣾⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
204
204
  ↵ open detail ↑↓ navigate ^k act │ 50│⣀⣀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ▼
@@ -297,19 +297,19 @@ test('esc returns from detail to list', async () => {
297
297
 
298
298
  > Search...
299
299
 
300
- ›Area - ...k Price Orange ...lle dots │ 211│ ⣠ ▲
301
- Area - ... Series CPU + M... overlay │ │ ⢀⣴⣦⣼⣿ █
302
- Area...ave Purple + Ma...sine/cosine │ │ ⢠⣦⣄⣴⣿⣿⣿⣿⣿ █
303
- Area -...evenue Single s...uto range │ 189│ ⢀⣴⣷⣦⣿⣿⣿⣿⣿⣿⣿⣿⣿ █
304
- Filled...RevenueSolid bl...wth chart │ │ ⣠⣀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ▀
305
- Filled...en TempDaily te...ure curve │ │ ⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
306
- Filled ...low CPUHigh con... on dark │ 167│ ⢀⣴⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
307
- Filled ...a WavesSmooth c...h blocks │ │ ⣰⣤⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
308
- Striped...e/Orang Warm al...g colors │ │⢀⣴⡄⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
309
- Striped...lue/Re High con... stripes │ 145│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
310
- Striped...Defaul primary ...no prop) │ 1 5 10 15 20
311
- Striped -...en/YellowNature-inspired
312
- Striped .../MagentaWarm gr...nt feel │ ─────────────────────────────────
300
+ ›Area - Stock PriceOrange ...lle dots │ 211│ ⣠ ▲
301
+ Area - ...i Series CPU + M...overlay │ │ ⢀⣴⣦⣼⣿ █
302
+ Area - Wave Purple + M...sine/cosine │ │ ⢠⣦⣄⣴⣿⣿⣿⣿⣿ █
303
+ Area - ... Revenu Single ...to range │ 189│ ⢀⣴⣷⣦⣿⣿⣿⣿⣿⣿⣿⣿⣿ █
304
+ Filled ... RevenueSolid b...th chart │ │ ⣠⣀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ▀
305
+ Filled ...een Tem Daily t...re curve │ │ ⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
306
+ Filled ...llow CPUHigh co... on dark │ 167│ ⢀⣴⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
307
+ Filled -...nta Wave Smooth... blocks │ │ ⣰⣤⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
308
+ Striped -...le/Orang Warm a...colors │ │⢀⣴⡄⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
309
+ Striped - Blue/Re High co... stripes │ 145│⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
310
+ Striped ...e Defaultprimar...o prop) │ 1 5 10 15 20
311
+ Striped - Green/Yello Natur...spired
312
+ Striped ...d/MagentaWarm g...nt feel │ ─────────────────────────────────
313
313
 
314
314
  │ Variant: area
315
315
  ↵ open detail ↑↓ navigate ^k act │ ▼
@@ -34,29 +34,29 @@ test('renders horizontal stacked rows and compact legend', async () => {
34
34
 
35
35
  > Search...
36
36
 
37
- Wee...fficDirect / Organ... across 6 days │ category distribution legend
37
+ Weekl...affi Direct / Org...across 6 days │ category distribution legend
38
38
  Revenue by Region Americas / EMEA / APAC │ ──────── ──────────── ───────────────
39
- Lon...el The left label...ng legend space │ Mon ╻╻╻╻╻╻╻╻╻╻ ● Direct 42%
40
- Man...ie Legend grows o...s content needs │ Tue ╻╻╻╻╻╻╻╻╻╻ ● Organic 35%
39
+ Lon...belsThe left label...g legend space │ Mon ╻╻╻╻╻╻╻╻╻╻ ● Direct 42%
40
+ Man...riesLegend grows o... content needs │ Tue ╻╻╻╻╻╻╻╻╻╻ ● Organic 35%
41
41
  │ Wed ╻╻╻╻╻ ● Referral 23%
42
42
  │ Thu ╻╻╻╻╻
43
43
  │ Fri ╻╻╻╻╻╻╻╻╻╻╻╻
44
44
  │ Sat ╻╻╻╻╻╻╻╻╻╻
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
45
58
  ↵ open detail ↑↓ navigate ^k actions │
46
59
 
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
60
  "
61
61
  `)
62
62
  expect(text).toContain('Mon')
@@ -65,13 +65,13 @@ test('renders horizontal stacked rows and compact legend', async () => {
65
65
  }, 30000)
66
66
 
67
67
  test('long labels truncate and leave legend visible', async () => {
68
- await session.text({ waitFor: (content) => content.includes('Lon...el'), timeout: 10000 })
68
+ await session.text({ waitFor: (content) => content.includes('The left label'), timeout: 10000 })
69
69
  session.sendKey('down')
70
70
  session.sendKey('down')
71
71
 
72
72
  const text = await session.text({
73
73
  waitFor: (content) => {
74
- return content.includes('›Lon...el') && content.includes('Views')
74
+ return content.includes('›Lon') && content.includes('Views')
75
75
  },
76
76
  timeout: 10000,
77
77
  })
@@ -84,29 +84,29 @@ test('long labels truncate and leave legend visible', async () => {
84
84
 
85
85
  > Search...
86
86
 
87
- Wee...fficDirect / Organ... across 6 days │ day traffi source
87
+ Weekl...affi Direct / Org...across 6 days │ day traffi source
88
88
  Revenue by Region Americas / EMEA / APAC │ ──────────────── ────── ─────────────
89
- ›Lon...el The left label...ng legend space │ Monday ╻╻╻╻╻ ● Views 65%
90
- Man...ie Legend grows o...s content needs │ Tuesday ╻╻╻╻ ● Clicks 35%
89
+ ›Lon...belsThe left label...g legend space │ Monday ╻╻╻╻╻ ● Views 65%
90
+ Man...riesLegend grows o... content needs │ Tuesday ╻╻╻╻ ● Clicks 35%
91
91
  │ Wednesday ╻╻╻
92
92
  │ Thursday ╻╻
93
93
  │ Friday ╻╻╻╻╻╻
94
94
  │ Saturday & Sund… ╻╻╻╻╻
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
95
108
  ↵ open detail ↑↓ navigate ^k actions │
96
109
 
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
110
  "
111
111
  `)
112
112
  expect(text).toContain('Saturday')
@@ -114,14 +114,14 @@ test('long labels truncate and leave legend visible', async () => {
114
114
  }, 30000)
115
115
 
116
116
  test('many series keeps bars readable and clips legend vertically', async () => {
117
- await session.text({ waitFor: (content) => content.includes('Man...ie'), timeout: 10000 })
117
+ await session.text({ waitFor: (content) => content.includes('Legend grows'), timeout: 10000 })
118
118
  session.sendKey('down')
119
119
  session.sendKey('down')
120
120
  session.sendKey('down')
121
121
 
122
122
  const text = await session.text({
123
123
  waitFor: (content) => {
124
- return content.includes('›Man...ie') && content.includes('Series 8')
124
+ return content.includes('›Man') && content.includes('Series 8')
125
125
  },
126
126
  timeout: 10000,
127
127
  })
@@ -134,29 +134,29 @@ test('many series keeps bars readable and clips legend vertically', async () =>
134
134
 
135
135
  > Search...
136
136
 
137
- Wee...fficDirect / Organ... across 6 days │ category distribution legend
137
+ Weekl...affi Direct / Org...across 6 days │ category distribution legend
138
138
  Revenue by Region Americas / EMEA / APAC │ ──────── ──────────── ───────────────
139
- Lon...el The left label...ng legend space │ Mon ╻╻╻╻╻╻╻╻ ● Series 8 20%
140
- ›Man...ie Legend grows o...s content needs │ Tue ╻╻╻╻╻╻╻ ● Series 7 18%
139
+ Lon...belsThe left label...g legend space │ Mon ╻╻╻╻╻╻╻╻ ● Series 8 20%
140
+ ›Man...riesLegend grows o... content needs │ Tue ╻╻╻╻╻╻╻ ● Series 7 18%
141
141
  │ Wed ╻╻╻╻╻╻ ● Series 6 16%
142
142
  │ Thu ╻╻╻╻╻╻ ● Series 5 14%
143
143
  │ Fri ╻╻╻╻╻╻╻╻╻╻╻╻ ● Series 4 11%
144
144
  │ Sat ╻╻╻╻╻╻╻╻╻ ● Series 3 9%
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
145
158
  ↵ open detail ↑↓ navigate ^k actions │
146
159
 
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
160
160
  "
161
161
  `)
162
162
  expect(text).toContain('Series 8')