termcast 1.3.33 → 1.3.35

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 (88) hide show
  1. package/dist/apis/cache.d.ts +1 -2
  2. package/dist/apis/cache.d.ts.map +1 -1
  3. package/dist/apis/cache.js +134 -52
  4. package/dist/apis/cache.js.map +1 -1
  5. package/dist/build.d.ts.map +1 -1
  6. package/dist/build.js +25 -0
  7. package/dist/build.js.map +1 -1
  8. package/dist/cli.js +6 -8
  9. package/dist/cli.js.map +1 -1
  10. package/dist/components/dropdown.js +3 -3
  11. package/dist/components/dropdown.js.map +1 -1
  12. package/dist/components/footer.d.ts.map +1 -1
  13. package/dist/components/footer.js +1 -1
  14. package/dist/components/footer.js.map +1 -1
  15. package/dist/components/icon.d.ts.map +1 -1
  16. package/dist/components/icon.js +386 -23
  17. package/dist/components/icon.js.map +1 -1
  18. package/dist/components/list.d.ts.map +1 -1
  19. package/dist/components/list.js +90 -22
  20. package/dist/components/list.js.map +1 -1
  21. package/dist/examples/list-controlled-search.d.ts +2 -0
  22. package/dist/examples/list-controlled-search.d.ts.map +1 -0
  23. package/dist/examples/list-controlled-search.js +12 -0
  24. package/dist/examples/list-controlled-search.js.map +1 -0
  25. package/dist/extensions/home.js +1 -1
  26. package/dist/extensions/home.js.map +1 -1
  27. package/dist/extensions/react-refresh-init.d.ts.map +1 -1
  28. package/dist/extensions/react-refresh-init.js +4 -3
  29. package/dist/extensions/react-refresh-init.js.map +1 -1
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/internal/dialog.d.ts.map +1 -1
  34. package/dist/internal/dialog.js +4 -5
  35. package/dist/internal/dialog.js.map +1 -1
  36. package/dist/internal/providers.d.ts.map +1 -1
  37. package/dist/internal/providers.js +18 -5
  38. package/dist/internal/providers.js.map +1 -1
  39. package/dist/state.d.ts +1 -0
  40. package/dist/state.d.ts.map +1 -1
  41. package/dist/state.js.map +1 -1
  42. package/dist/theme.d.ts.map +1 -1
  43. package/dist/theme.js +6 -2
  44. package/dist/theme.js.map +1 -1
  45. package/dist/utils/run-command.js +3 -3
  46. package/dist/utils/run-command.js.map +1 -1
  47. package/dist/utils.d.ts +16 -1
  48. package/dist/utils.d.ts.map +1 -1
  49. package/dist/utils.js +28 -1
  50. package/dist/utils.js.map +1 -1
  51. package/dist/watcher.d.ts.map +1 -1
  52. package/dist/watcher.js +24 -4
  53. package/dist/watcher.js.map +1 -1
  54. package/package.json +10 -9
  55. package/src/apis/cache.test.ts +35 -3
  56. package/src/apis/cache.tsx +180 -57
  57. package/src/build.tsx +28 -0
  58. package/src/cli.tsx +8 -10
  59. package/src/compile.vitest.tsx +42 -24
  60. package/src/components/dropdown.tsx +3 -3
  61. package/src/components/footer.tsx +4 -2
  62. package/src/components/icon.tsx +385 -23
  63. package/src/components/list.tsx +104 -28
  64. package/src/examples/github.vitest.tsx +37 -37
  65. package/src/examples/list-controlled-search.tsx +28 -0
  66. package/src/examples/list-controlled-search.vitest.tsx +49 -0
  67. package/src/examples/list-detail-metadata.vitest.tsx +1 -1
  68. package/src/examples/list-dropdown-default.vitest.tsx +9 -9
  69. package/src/examples/list-scrollbox.vitest.tsx +55 -41
  70. package/src/examples/list-with-detail.vitest.tsx +35 -36
  71. package/src/examples/list-with-dropdown.vitest.tsx +2 -2
  72. package/src/examples/list-with-sections.vitest.tsx +153 -118
  73. package/src/examples/simple-file-picker.vitest.tsx +1 -1
  74. package/src/examples/simple-grid.vitest.tsx +44 -44
  75. package/src/examples/simple-navigation.vitest.tsx +43 -12
  76. package/src/examples/store.vitest.tsx +1 -1
  77. package/src/examples/swift-extension.vitest.tsx +3 -3
  78. package/src/extensions/dev.vitest.tsx +69 -34
  79. package/src/extensions/home.tsx +1 -1
  80. package/src/extensions/react-refresh-init.tsx +4 -3
  81. package/src/index.tsx +1 -0
  82. package/src/internal/dialog.tsx +21 -23
  83. package/src/internal/providers.tsx +18 -5
  84. package/src/state.tsx +1 -0
  85. package/src/theme.tsx +6 -2
  86. package/src/utils/run-command.tsx +3 -3
  87. package/src/utils.tsx +41 -1
  88. package/src/watcher.tsx +26 -6
@@ -27,7 +27,8 @@ test('list startup shows first content near instantly', async () => {
27
27
  })
28
28
 
29
29
  const loadTimeMs = Date.now() - sessionStartMs
30
- expect(loadTimeMs).toBeLessThan(700)
30
+ // Allow more headroom in CI where machine speed varies
31
+ expect(loadTimeMs).toBeLessThan(1500)
31
32
  }, 10000)
32
33
 
33
34
  test('list with sections navigation', async () => {
@@ -47,15 +48,15 @@ test('list with sections navigation', async () => {
47
48
 
48
49
  > Search items...
49
50
 
50
- Fruits
51
- ›Apple Red and sweet Fresh [Popular]
52
- Banana Yellow and nutritious Ripe
53
- Orange Citrus and juicy Fresh
54
- Grape Sweet clusters [Seasonal]
55
- Mango Tropical delight Imported
51
+ Fruits
52
+ ›Apple Red and sweet Fresh [Popular]
53
+ Banana Yellow and nutritious Ripe
54
+ Orange Citrus and juicy Fresh
55
+ Grape Sweet clusters [Seasonal]
56
+ Mango Tropical delight Imported
56
57
  Pineapple Sweet and tangy
57
- Strawberry Red and sweet [Popular]
58
-
58
+ Strawberry Red and sweet [Popular]
59
+
59
60
 
60
61
 
61
62
  ↵ view details ↑↓ navigate ^k actions
@@ -80,15 +81,15 @@ test('list with sections navigation', async () => {
80
81
 
81
82
  > Search items...
82
83
 
83
- Fruits
84
- Apple Red and sweet Fresh [Popular]
85
- ›Banana Yellow and nutritious Ripe
86
- Orange Citrus and juicy Fresh
87
- Grape Sweet clusters [Seasonal]
88
- Mango Tropical delight Imported
84
+ Fruits
85
+ Apple Red and sweet Fresh [Popular]
86
+ ›Banana Yellow and nutritious Ripe
87
+ Orange Citrus and juicy Fresh
88
+ Grape Sweet clusters [Seasonal]
89
+ Mango Tropical delight Imported
89
90
  Pineapple Sweet and tangy
90
- Strawberry Red and sweet [Popular]
91
-
91
+ Strawberry Red and sweet [Popular]
92
+
92
93
 
93
94
 
94
95
  ↵ view details ↑↓ navigate ^k actions
@@ -107,15 +108,15 @@ test('list with sections navigation', async () => {
107
108
 
108
109
  > Search items...
109
110
 
110
- Fruits
111
- Apple Red and sweet Fresh [Popular]
112
- Banana Yellow and nutritious Ripe
113
- ›Orange Citrus and juicy Fresh
114
- Grape Sweet clusters [Seasonal]
115
- Mango Tropical delight Imported
111
+ Fruits
112
+ Apple Red and sweet Fresh [Popular]
113
+ Banana Yellow and nutritious Ripe
114
+ ›Orange Citrus and juicy Fresh
115
+ Grape Sweet clusters [Seasonal]
116
+ Mango Tropical delight Imported
116
117
  Pineapple Sweet and tangy
117
- Strawberry Red and sweet [Popular]
118
-
118
+ Strawberry Red and sweet [Popular]
119
+
119
120
 
120
121
 
121
122
  ↑↓ navigate ^k actions
@@ -138,15 +139,15 @@ test('list with sections navigation', async () => {
138
139
 
139
140
  > Search items...
140
141
 
141
- Fruits
142
- Apple Red and sweet Fresh [Popular]
143
- Banana Yellow and nutritious Ripe
144
- ›Orange Citrus and juicy Fresh
145
- Grape Sweet clusters [Seasonal]
146
- Mango Tropical delight Imported
142
+ Fruits
143
+ Apple Red and sweet Fresh [Popular]
144
+ Banana Yellow and nutritious Ripe
145
+ ›Orange Citrus and juicy Fresh
146
+ Grape Sweet clusters [Seasonal]
147
+ Mango Tropical delight Imported
147
148
  Pineapple Sweet and tangy
148
- Strawberry Red and sweet [Popular]
149
-
149
+ Strawberry Red and sweet [Popular]
150
+
150
151
 
151
152
 
152
153
  ↑↓ navigate ^k actions
@@ -182,7 +183,7 @@ test('list with sections search functionality', async () => {
182
183
 
183
184
  > ban
184
185
 
185
- ›Banana Yellow and nutritious Ripe
186
+ ›Banana Yellow and nutritious Ripe
186
187
 
187
188
 
188
189
 
@@ -248,15 +249,15 @@ test('list with sections search functionality', async () => {
248
249
 
249
250
  > Search items...
250
251
 
251
- Fruits
252
- ›Apple Red and sweet Fresh [Popular]
253
- Banana Yellow and nutritious Ripe
254
- Orange Citrus and juicy Fresh
255
- Grape Sweet clusters [Seasonal]
256
- Mango Tropical delight Imported
252
+ Fruits
253
+ ›Apple Red and sweet Fresh [Popular]
254
+ Banana Yellow and nutritious Ripe
255
+ Orange Citrus and juicy Fresh
256
+ Grape Sweet clusters [Seasonal]
257
+ Mango Tropical delight Imported
257
258
  Pineapple Sweet and tangy
258
- Strawberry Red and sweet [Popular]
259
-
259
+ Strawberry Red and sweet [Popular]
260
+
260
261
 
261
262
 
262
263
  ↵ view details ↑↓ navigate ^k actions
@@ -281,7 +282,7 @@ test('list with sections search functionality', async () => {
281
282
 
282
283
  > bread
283
284
 
284
- ›Bread Freshly baked Today [New]
285
+ ›Bread Freshly baked Today [New]
285
286
 
286
287
 
287
288
 
@@ -345,15 +346,15 @@ test('list click functionality', async () => {
345
346
 
346
347
  > Search items...
347
348
 
348
- Fruits
349
- Apple Red and sweet Fresh [Popular]
350
- ›Banana Yellow and nutritious Ripe
351
- Orange Citrus and juicy Fresh
352
- Grape Sweet clusters [Seasonal]
353
- Mango Tropical delight Imported
349
+ Fruits
350
+ Apple Red and sweet Fresh [Popular]
351
+ ›Banana Yellow and nutritious Ripe
352
+ Orange Citrus and juicy Fresh
353
+ Grape Sweet clusters [Seasonal]
354
+ Mango Tropical delight Imported
354
355
  Pineapple Sweet and tangy
355
- Strawberry Red and sweet [Popular]
356
-
356
+ Strawberry Red and sweet [Popular]
357
+
357
358
 
358
359
 
359
360
  ↵ view details ↑↓ navigate ^k actions
@@ -373,15 +374,15 @@ test('list click functionality', async () => {
373
374
 
374
375
  > Search items...
375
376
 
376
- Fruits
377
- ›Apple Red and sweet Fresh [Popular]
378
- Banana Yellow and nutritious Ripe
379
- Orange Citrus and juicy Fresh
380
- Grape Sweet clusters [Seasonal]
381
- Mango Tropical delight Imported
377
+ Fruits
378
+ ›Apple Red and sweet Fresh [Popular]
379
+ Banana Yellow and nutritious Ripe
380
+ Orange Citrus and juicy Fresh
381
+ Grape Sweet clusters [Seasonal]
382
+ Mango Tropical delight Imported
382
383
  Pineapple Sweet and tangy
383
- Strawberry Red and sweet [Popular]
384
-
384
+ Strawberry Red and sweet [Popular]
385
+
385
386
 
386
387
 
387
388
  ↵ view details ↑↓ navigate ^k actions
@@ -401,15 +402,15 @@ test('list click functionality', async () => {
401
402
 
402
403
  > Search items...
403
404
 
404
- Fruits
405
- Apple Red and sweet Fresh [Popular]
406
- Banana Yellow and nutritious Ripe
407
- Orange Citrus and juicy Fresh
408
- ›Grape Sweet clusters [Seasonal]
409
- Mango Tropical delight Imported
405
+ Fruits
406
+ Apple Red and sweet Fresh [Popular]
407
+ Banana Yellow and nutritious Ripe
408
+ Orange Citrus and juicy Fresh
409
+ ›Grape Sweet clusters [Seasonal]
410
+ Mango Tropical delight Imported
410
411
  Pineapple Sweet and tangy
411
- Strawberry Red and sweet [Popular]
412
-
412
+ Strawberry Red and sweet [Popular]
413
+
413
414
 
414
415
 
415
416
  ↑↓ navigate ^k actions
@@ -439,7 +440,7 @@ test('list actions panel with ctrl+k', async () => {
439
440
  "
440
441
 
441
442
 
442
-
443
+ Simple List Example ────────────────────────────────────────────
443
444
 
444
445
  ╭────────────────────────────────────────────────────────────────╮
445
446
  │ │
@@ -467,7 +468,7 @@ test('list actions panel with ctrl+k', async () => {
467
468
  "
468
469
 
469
470
 
470
-
471
+ Simple List Example ────────────────────────────────────────────
471
472
 
472
473
  ╭────────────────────────────────────────────────────────────────╮
473
474
  │ │
@@ -499,15 +500,15 @@ test('list actions panel with ctrl+k', async () => {
499
500
 
500
501
  > Search items...
501
502
 
502
- Fruits
503
- ›Apple Red and sweet Fresh [Popular]
504
- Banana Yellow and nutritious Ripe
505
- Orange Citrus and juicy Fresh
506
- Grape Sweet clusters [Seasonal]
507
- Mango Tropical delight Imported
503
+ Fruits
504
+ ›Apple Red and sweet Fresh [Popular]
505
+ Banana Yellow and nutritious Ripe
506
+ Orange Citrus and juicy Fresh
507
+ Grape Sweet clusters [Seasonal]
508
+ Mango Tropical delight Imported
508
509
  Pineapple Sweet and tangy
509
- Strawberry Red and sweet [Popular]
510
-
510
+ Strawberry Red and sweet [Popular]
511
+
511
512
 
512
513
 
513
514
  ✓ Added to Cart Apple has been added to your cart
@@ -552,8 +553,8 @@ test('filtering selects first visible item and navigation works', async () => {
552
553
 
553
554
  > ora
554
555
 
555
- ›Orange Citrus and juicy Fresh
556
- Carrot Orange and crunchy [Healthy]
556
+ ›Orange Citrus and juicy Fresh
557
+ Carrot Orange and crunchy [Healthy]
557
558
 
558
559
 
559
560
 
@@ -580,8 +581,8 @@ test('filtering selects first visible item and navigation works', async () => {
580
581
 
581
582
  > ora
582
583
 
583
- Orange Citrus and juicy Fresh
584
- ›Carrot Orange and crunchy [Healthy]
584
+ Orange Citrus and juicy Fresh
585
+ ›Carrot Orange and crunchy [Healthy]
585
586
 
586
587
 
587
588
 
@@ -608,8 +609,8 @@ test('filtering selects first visible item and navigation works', async () => {
608
609
 
609
610
  > ora
610
611
 
611
- ›Orange Citrus and juicy Fresh
612
- Carrot Orange and crunchy [Healthy]
612
+ ›Orange Citrus and juicy Fresh
613
+ Carrot Orange and crunchy [Healthy]
613
614
 
614
615
 
615
616
 
@@ -636,8 +637,8 @@ test('filtering selects first visible item and navigation works', async () => {
636
637
 
637
638
  > ora
638
639
 
639
- Orange Citrus and juicy Fresh
640
- ›Carrot Orange and crunchy [Healthy]
640
+ Orange Citrus and juicy Fresh
641
+ ›Carrot Orange and crunchy [Healthy]
641
642
 
642
643
 
643
644
 
@@ -669,15 +670,15 @@ test('list scrollbox scrolling with sections', async () => {
669
670
 
670
671
  > Search items...
671
672
 
672
- Fruits
673
- ›Apple Red and sweet Fresh [Popular]
674
- Banana Yellow and nutritious Ripe
675
- Orange Citrus and juicy Fresh
676
- Grape Sweet clusters [Seasonal]
677
- Mango Tropical delight Imported
673
+ Fruits
674
+ ›Apple Red and sweet Fresh [Popular]
675
+ Banana Yellow and nutritious Ripe
676
+ Orange Citrus and juicy Fresh
677
+ Grape Sweet clusters [Seasonal]
678
+ Mango Tropical delight Imported
678
679
  Pineapple Sweet and tangy
679
- Strawberry Red and sweet [Popular]
680
-
680
+ Strawberry Red and sweet [Popular]
681
+
681
682
 
682
683
 
683
684
  ↵ view details ↑↓ navigate ^k actions
@@ -702,15 +703,15 @@ test('list scrollbox scrolling with sections', async () => {
702
703
 
703
704
  > Search items...
704
705
 
705
- Orange Citrus and juicy Fresh
706
- Grape Sweet clusters [Seasonal]
707
- Mango Tropical delight Imported
708
- Pineapple Sweet and tangy
709
- ›Strawberry Red and sweet [Popular]
706
+ Orange Citrus and juicy Fresh
707
+ Grape Sweet clusters [Seasonal]
708
+ Mango Tropical delight Imported
709
+ Pineapple Sweet and tangy
710
+ ›Strawberry Red and sweet [Popular]
710
711
 
711
712
  Vegetables
712
- Carrot Orange and crunchy [Healthy]
713
- Lettuce Green and fresh
713
+ Carrot Orange and crunchy [Healthy]
714
+ Lettuce Green and fresh
714
715
 
715
716
 
716
717
  ↑↓ navigate ^k actions
@@ -732,15 +733,15 @@ test('list scrollbox scrolling with sections', async () => {
732
733
 
733
734
  > Search items...
734
735
 
735
-
736
+
736
737
  Vegetables
737
- Carrot Orange and crunchy [Healthy]
738
+ Carrot Orange and crunchy [Healthy]
738
739
  Lettuce Green and fresh
739
- ›Broccoli Green florets [Healthy]
740
- Spinach Leafy greens Organic
741
- Tomato Red and ripe
740
+ ›Broccoli Green florets [Healthy]
741
+ Spinach Leafy greens Organic
742
+ Tomato Red and ripe
742
743
  Cucumber Cool and crisp
743
- Bell Pepper Colorful and crunchy [Fresh]
744
+ Bell Pepper Colorful and crunchy [Fresh]
744
745
 
745
746
 
746
747
  ↑↓ navigate ^k actions
@@ -764,15 +765,15 @@ test('list scrollbox scrolling with sections', async () => {
764
765
 
765
766
  > Search items...
766
767
 
767
- Carrot Orange and crunchy [Healthy]
768
+ Carrot Orange and crunchy [Healthy]
768
769
  Lettuce Green and fresh
769
- Broccoli Green florets [Healthy]
770
- Spinach Leafy greens Organic
770
+ Broccoli Green florets [Healthy]
771
+ Spinach Leafy greens Organic
771
772
  Tomato Red and ripe
772
773
  Cucumber Cool and crisp
773
- Bell Pepper Colorful and crunchy [Fresh]
774
-
775
- ›Bread Freshly baked Today [New]
774
+ Bell Pepper Colorful and crunchy [Fresh]
775
+
776
+ ›Bread Freshly baked Today [New]
776
777
 
777
778
 
778
779
  ↵ view details ↑↓ navigate ^k actions
@@ -794,15 +795,15 @@ test('list scrollbox scrolling with sections', async () => {
794
795
 
795
796
  > Search items...
796
797
 
797
- Carrot Orange and crunchy [Healthy]
798
+ Carrot Orange and crunchy [Healthy]
798
799
  Lettuce Green and fresh
799
- Broccoli Green florets [Healthy]
800
- Spinach Leafy greens Organic
800
+ Broccoli Green florets [Healthy]
801
+ Spinach Leafy greens Organic
801
802
  Tomato Red and ripe
802
803
  Cucumber Cool and crisp
803
- Bell Pepper Colorful and crunchy [Fresh]
804
-
805
- ›Bread Freshly baked Today [New]
804
+ Bell Pepper Colorful and crunchy [Fresh]
805
+
806
+ ›Bread Freshly baked Today [New]
806
807
 
807
808
 
808
809
  ↵ view details ↑↓ navigate ^k actions
@@ -810,3 +811,37 @@ test('list scrollbox scrolling with sections', async () => {
810
811
  "
811
812
  `)
812
813
  }, 15000)
814
+
815
+ test('search resets selection to first visible item without flash', async () => {
816
+ await session.text({
817
+ waitFor: (text) => {
818
+ return /search/i.test(text)
819
+ },
820
+ })
821
+
822
+ // Navigate down to select Grape (4th item, index 3)
823
+ await session.press('down')
824
+ await session.press('down')
825
+ await session.press('down')
826
+
827
+ const beforeSearch = await session.text()
828
+ expect(beforeSearch).toContain('›Grape')
829
+
830
+ // Type one char at a time and check each intermediate frame:
831
+ // After each keystroke, the › marker must be on the first visible match.
832
+ // A flash bug would show › on a stale item or missing entirely.
833
+ await session.press('l')
834
+ const afterL = await session.text()
835
+ // 'l' matches: Lettuce, Apple, Bell Pepper, … — first visible must be selected
836
+ expect(afterL).toMatch(/›\S/)
837
+
838
+ await session.press('e')
839
+ const afterLe = await session.text()
840
+ expect(afterLe).toMatch(/›\S/)
841
+
842
+ await session.press('t')
843
+ const afterLet = await session.text()
844
+ // Only "Lettuce" matches "let"
845
+ expect(afterLet).toContain('›Lettuce')
846
+ expect(afterLet).not.toContain('›Grape')
847
+ }, 10000)
@@ -51,6 +51,7 @@ test('file picker shows form fields', async () => {
51
51
 
52
52
 
53
53
 
54
+ ctrl ↵ submit tab navigate ^k actions
54
55
 
55
56
 
56
57
 
@@ -76,7 +77,6 @@ test('file picker shows form fields', async () => {
76
77
 
77
78
 
78
79
 
79
- ctrl ↵ submit tab navigate ^k actions
80
80
 
81
81
  "
82
82
  `)