termcast 1.3.19 → 1.3.24

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 (412) hide show
  1. package/dist/ai.d.ts +104 -0
  2. package/dist/ai.d.ts.map +1 -0
  3. package/dist/ai.js +135 -0
  4. package/dist/ai.js.map +1 -0
  5. package/dist/apis/browser-extension.d.ts +18 -0
  6. package/dist/apis/browser-extension.d.ts.map +1 -0
  7. package/dist/apis/browser-extension.js +14 -0
  8. package/dist/apis/browser-extension.js.map +1 -0
  9. package/dist/apis/localstorage.d.ts.map +1 -1
  10. package/dist/apis/localstorage.js +4 -7
  11. package/dist/apis/localstorage.js.map +1 -1
  12. package/dist/apis/oauth.d.ts.map +1 -1
  13. package/dist/apis/oauth.js +5 -1
  14. package/dist/apis/oauth.js.map +1 -1
  15. package/dist/apis/preferences.d.ts.map +1 -1
  16. package/dist/apis/preferences.js +38 -19
  17. package/dist/apis/preferences.js.map +1 -1
  18. package/dist/build.d.ts.map +1 -1
  19. package/dist/build.js +2 -1
  20. package/dist/build.js.map +1 -1
  21. package/dist/cache.d.ts +32 -0
  22. package/dist/cache.d.ts.map +1 -0
  23. package/dist/cache.js +205 -0
  24. package/dist/cache.js.map +1 -0
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +69 -33
  27. package/dist/cli.js.map +1 -1
  28. package/dist/clipboard.d.ts +36 -0
  29. package/dist/clipboard.d.ts.map +1 -0
  30. package/dist/clipboard.js +154 -0
  31. package/dist/clipboard.js.map +1 -0
  32. package/dist/compile.d.ts.map +1 -1
  33. package/dist/compile.js +24 -6
  34. package/dist/compile.js.map +1 -1
  35. package/dist/components/actions.d.ts.map +1 -1
  36. package/dist/components/actions.js +56 -30
  37. package/dist/components/actions.js.map +1 -1
  38. package/dist/components/detail.d.ts.map +1 -1
  39. package/dist/components/detail.js +4 -0
  40. package/dist/components/detail.js.map +1 -1
  41. package/dist/components/dropdown.d.ts.map +1 -1
  42. package/dist/components/dropdown.js +38 -15
  43. package/dist/components/dropdown.js.map +1 -1
  44. package/dist/components/extension-preferences.d.ts.map +1 -1
  45. package/dist/components/extension-preferences.js +40 -13
  46. package/dist/components/extension-preferences.js.map +1 -1
  47. package/dist/components/form/checkbox.d.ts.map +1 -1
  48. package/dist/components/form/checkbox.js +5 -3
  49. package/dist/components/form/checkbox.js.map +1 -1
  50. package/dist/components/form/date-picker.d.ts.map +1 -1
  51. package/dist/components/form/date-picker.js +5 -3
  52. package/dist/components/form/date-picker.js.map +1 -1
  53. package/dist/components/form/description.d.ts.map +1 -1
  54. package/dist/components/form/description.js +2 -2
  55. package/dist/components/form/description.js.map +1 -1
  56. package/dist/components/form/dropdown.d.ts.map +1 -1
  57. package/dist/components/form/dropdown.js +84 -80
  58. package/dist/components/form/dropdown.js.map +1 -1
  59. package/dist/components/form/file-autocomplete.d.ts +3 -6
  60. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  61. package/dist/components/form/file-autocomplete.js +61 -66
  62. package/dist/components/form/file-autocomplete.js.map +1 -1
  63. package/dist/components/form/file-picker.d.ts.map +1 -1
  64. package/dist/components/form/file-picker.js +33 -30
  65. package/dist/components/form/file-picker.js.map +1 -1
  66. package/dist/components/form/form-end.d.ts.map +1 -1
  67. package/dist/components/form/form-end.js +21 -1
  68. package/dist/components/form/form-end.js.map +1 -1
  69. package/dist/components/form/form-type-only.d.ts +174 -0
  70. package/dist/components/form/form-type-only.d.ts.map +1 -0
  71. package/dist/components/form/form-type-only.js +2 -0
  72. package/dist/components/form/form-type-only.js.map +1 -0
  73. package/dist/components/form/index.d.ts +3 -1
  74. package/dist/components/form/index.d.ts.map +1 -1
  75. package/dist/components/form/index.js +100 -28
  76. package/dist/components/form/index.js.map +1 -1
  77. package/dist/components/form/password-field.d.ts.map +1 -1
  78. package/dist/components/form/password-field.js +5 -3
  79. package/dist/components/form/password-field.js.map +1 -1
  80. package/dist/components/form/text-area.d.ts.map +1 -1
  81. package/dist/components/form/text-area.js +5 -3
  82. package/dist/components/form/text-area.js.map +1 -1
  83. package/dist/components/form/text-field.d.ts.map +1 -1
  84. package/dist/components/form/text-field.js +6 -4
  85. package/dist/components/form/text-field.js.map +1 -1
  86. package/dist/components/form/types.d.ts +5 -0
  87. package/dist/components/form/types.d.ts.map +1 -1
  88. package/dist/components/form/use-form-handling.d.ts +4 -0
  89. package/dist/components/form/use-form-handling.d.ts.map +1 -0
  90. package/dist/components/form/use-form-handling.js +37 -0
  91. package/dist/components/form/use-form-handling.js.map +1 -0
  92. package/dist/components/form/with-left-border.d.ts +2 -1
  93. package/dist/components/form/with-left-border.d.ts.map +1 -1
  94. package/dist/components/form/with-left-border.js +27 -3
  95. package/dist/components/form/with-left-border.js.map +1 -1
  96. package/dist/components/icon.d.ts +1 -0
  97. package/dist/components/icon.d.ts.map +1 -1
  98. package/dist/components/icon.js +24 -8
  99. package/dist/components/icon.js.map +1 -1
  100. package/dist/components/list.d.ts +2 -2
  101. package/dist/components/list.d.ts.map +1 -1
  102. package/dist/components/list.js +140 -62
  103. package/dist/components/list.js.map +1 -1
  104. package/dist/components/loading-bar.d.ts.map +1 -1
  105. package/dist/components/loading-bar.js +2 -2
  106. package/dist/components/loading-bar.js.map +1 -1
  107. package/dist/components/loading-text.d.ts +8 -0
  108. package/dist/components/loading-text.d.ts.map +1 -0
  109. package/dist/components/loading-text.js +58 -0
  110. package/dist/components/loading-text.js.map +1 -0
  111. package/dist/descendants.js +1 -1
  112. package/dist/descendants.js.map +1 -1
  113. package/dist/dev-ui.d.ts +7 -0
  114. package/dist/dev-ui.d.ts.map +1 -0
  115. package/dist/dev-ui.js +118 -0
  116. package/dist/dev-ui.js.map +1 -0
  117. package/dist/environment.d.ts +63 -0
  118. package/dist/environment.d.ts.map +1 -0
  119. package/dist/environment.js +189 -0
  120. package/dist/environment.js.map +1 -0
  121. package/dist/examples/datepicker.d.ts +2 -0
  122. package/dist/examples/datepicker.d.ts.map +1 -0
  123. package/dist/examples/datepicker.js +344 -0
  124. package/dist/examples/datepicker.js.map +1 -0
  125. package/dist/examples/file-autocomplete.vitest.d.ts +2 -0
  126. package/dist/examples/file-autocomplete.vitest.d.ts.map +1 -0
  127. package/dist/examples/file-autocomplete.vitest.js +223 -0
  128. package/dist/examples/file-autocomplete.vitest.js.map +1 -0
  129. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +2 -0
  130. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +1 -0
  131. package/dist/examples/form-basic-arrow-keys.vitest.js +46 -0
  132. package/dist/examples/form-basic-arrow-keys.vitest.js.map +1 -0
  133. package/dist/examples/form-basic.vitest.d.ts +2 -0
  134. package/dist/examples/form-basic.vitest.d.ts.map +1 -0
  135. package/dist/examples/form-basic.vitest.js +630 -0
  136. package/dist/examples/form-basic.vitest.js.map +1 -0
  137. package/dist/examples/form-dropdown-with-sections.d.ts +2 -0
  138. package/dist/examples/form-dropdown-with-sections.d.ts.map +1 -0
  139. package/dist/examples/form-dropdown-with-sections.js +13 -0
  140. package/dist/examples/form-dropdown-with-sections.js.map +1 -0
  141. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +2 -0
  142. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +1 -0
  143. package/dist/examples/form-dropdown-with-sections.vitest.js +75 -0
  144. package/dist/examples/form-dropdown-with-sections.vitest.js.map +1 -0
  145. package/dist/examples/form-dropdown.vitest.d.ts +2 -0
  146. package/dist/examples/form-dropdown.vitest.d.ts.map +1 -0
  147. package/dist/examples/form-dropdown.vitest.js +854 -0
  148. package/dist/examples/form-dropdown.vitest.js.map +1 -0
  149. package/dist/examples/form-multiselect-dropdown.d.ts +2 -0
  150. package/dist/examples/form-multiselect-dropdown.d.ts.map +1 -0
  151. package/dist/examples/form-multiselect-dropdown.js +13 -0
  152. package/dist/examples/form-multiselect-dropdown.js.map +1 -0
  153. package/dist/examples/form-scroll.d.ts.map +1 -1
  154. package/dist/examples/form-scroll.js +7 -1
  155. package/dist/examples/form-scroll.js.map +1 -1
  156. package/dist/examples/form-scroll.vitest.d.ts +2 -0
  157. package/dist/examples/form-scroll.vitest.d.ts.map +1 -0
  158. package/dist/examples/form-scroll.vitest.js +211 -0
  159. package/dist/examples/form-scroll.vitest.js.map +1 -0
  160. package/dist/examples/form-tagpicker.vitest.d.ts +2 -0
  161. package/dist/examples/form-tagpicker.vitest.d.ts.map +1 -0
  162. package/dist/examples/form-tagpicker.vitest.js +736 -0
  163. package/dist/examples/form-tagpicker.vitest.js.map +1 -0
  164. package/dist/examples/internal/descendants-filtering.js +1 -1
  165. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  166. package/dist/examples/internal/descendants.js +1 -1
  167. package/dist/examples/internal/descendants.js.map +1 -1
  168. package/dist/examples/internal/nested-boxes.d.ts +2 -0
  169. package/dist/examples/internal/nested-boxes.d.ts.map +1 -0
  170. package/dist/examples/internal/nested-boxes.js +7 -0
  171. package/dist/examples/internal/nested-boxes.js.map +1 -0
  172. package/dist/examples/internal/rhf-custom-ref.js +2 -2
  173. package/dist/examples/internal/rhf-custom-ref.js.map +1 -1
  174. package/dist/examples/internal/scrollbox-demo.js +3 -22
  175. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  176. package/dist/examples/internal/scrollbox-descendants.d.ts +2 -0
  177. package/dist/examples/internal/scrollbox-descendants.d.ts.map +1 -0
  178. package/dist/examples/internal/scrollbox-descendants.js +83 -0
  179. package/dist/examples/internal/scrollbox-descendants.js.map +1 -0
  180. package/dist/examples/internal/scrollbox-with-descendants.js +4 -8
  181. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -1
  182. package/dist/examples/internal/simple-scrollbox.vitest.d.ts +2 -0
  183. package/dist/examples/internal/simple-scrollbox.vitest.d.ts.map +1 -0
  184. package/dist/examples/internal/simple-scrollbox.vitest.js +96 -0
  185. package/dist/examples/internal/simple-scrollbox.vitest.js.map +1 -0
  186. package/dist/examples/internal/unicode-square-repro.d.ts +2 -0
  187. package/dist/examples/internal/unicode-square-repro.d.ts.map +1 -0
  188. package/dist/examples/internal/unicode-square-repro.js +7 -0
  189. package/dist/examples/internal/unicode-square-repro.js.map +1 -0
  190. package/dist/examples/list-detail-metadata.d.ts +2 -0
  191. package/dist/examples/list-detail-metadata.d.ts.map +1 -0
  192. package/dist/examples/list-detail-metadata.js +8 -0
  193. package/dist/examples/list-detail-metadata.js.map +1 -0
  194. package/dist/examples/list-dropdown-default.vitest.d.ts +2 -0
  195. package/dist/examples/list-dropdown-default.vitest.d.ts.map +1 -0
  196. package/dist/examples/list-dropdown-default.vitest.js +234 -0
  197. package/dist/examples/list-dropdown-default.vitest.js.map +1 -0
  198. package/dist/examples/list-fetch-data.vitest.d.ts +2 -0
  199. package/dist/examples/list-fetch-data.vitest.d.ts.map +1 -0
  200. package/dist/examples/list-fetch-data.vitest.js +111 -0
  201. package/dist/examples/list-fetch-data.vitest.js.map +1 -0
  202. package/dist/examples/list-filter-navigation.d.ts +2 -0
  203. package/dist/examples/list-filter-navigation.d.ts.map +1 -0
  204. package/dist/examples/list-filter-navigation.js +8 -0
  205. package/dist/examples/list-filter-navigation.js.map +1 -0
  206. package/dist/examples/list-scrollbox.vitest.d.ts +2 -0
  207. package/dist/examples/list-scrollbox.vitest.d.ts.map +1 -0
  208. package/dist/examples/list-scrollbox.vitest.js +93 -0
  209. package/dist/examples/list-scrollbox.vitest.js.map +1 -0
  210. package/dist/examples/list-with-detail-long.d.ts +2 -0
  211. package/dist/examples/list-with-detail-long.d.ts.map +1 -0
  212. package/dist/examples/list-with-detail-long.js +53 -0
  213. package/dist/examples/list-with-detail-long.js.map +1 -0
  214. package/dist/examples/list-with-detail.vitest.d.ts +2 -0
  215. package/dist/examples/list-with-detail.vitest.d.ts.map +1 -0
  216. package/dist/examples/list-with-detail.vitest.js +434 -0
  217. package/dist/examples/list-with-detail.vitest.js.map +1 -0
  218. package/dist/examples/list-with-dropdown.vitest.d.ts +2 -0
  219. package/dist/examples/list-with-dropdown.vitest.d.ts.map +1 -0
  220. package/dist/examples/list-with-dropdown.vitest.js +337 -0
  221. package/dist/examples/list-with-dropdown.vitest.js.map +1 -0
  222. package/dist/examples/list-with-sections.js +5 -1
  223. package/dist/examples/list-with-sections.js.map +1 -1
  224. package/dist/examples/list-with-sections.vitest.d.ts +2 -0
  225. package/dist/examples/list-with-sections.vitest.d.ts.map +1 -0
  226. package/dist/examples/list-with-sections.vitest.js +601 -0
  227. package/dist/examples/list-with-sections.vitest.js.map +1 -0
  228. package/dist/examples/scrollbox-vertical-centering.d.ts +6 -0
  229. package/dist/examples/scrollbox-vertical-centering.d.ts.map +1 -0
  230. package/dist/examples/scrollbox-vertical-centering.js +17 -0
  231. package/dist/examples/scrollbox-vertical-centering.js.map +1 -0
  232. package/dist/examples/simple-file-picker.vitest.d.ts +2 -0
  233. package/dist/examples/simple-file-picker.vitest.d.ts.map +1 -0
  234. package/dist/examples/simple-file-picker.vitest.js +678 -0
  235. package/dist/examples/simple-file-picker.vitest.js.map +1 -0
  236. package/dist/examples/simple-grid.vitest.d.ts +2 -0
  237. package/dist/examples/simple-grid.vitest.d.ts.map +1 -0
  238. package/dist/examples/simple-grid.vitest.js +521 -0
  239. package/dist/examples/simple-grid.vitest.js.map +1 -0
  240. package/dist/examples/simple-navigation.js +10 -4
  241. package/dist/examples/simple-navigation.js.map +1 -1
  242. package/dist/examples/simple-navigation.vitest.d.ts +2 -0
  243. package/dist/examples/simple-navigation.vitest.d.ts.map +1 -0
  244. package/dist/examples/simple-navigation.vitest.js +718 -0
  245. package/dist/examples/simple-navigation.vitest.js.map +1 -0
  246. package/dist/examples/store.vitest.d.ts +2 -0
  247. package/dist/examples/store.vitest.d.ts.map +1 -0
  248. package/dist/examples/store.vitest.js +69 -0
  249. package/dist/examples/store.vitest.js.map +1 -0
  250. package/dist/extensions/dev.d.ts +4 -2
  251. package/dist/extensions/dev.d.ts.map +1 -1
  252. package/dist/extensions/dev.js +61 -10
  253. package/dist/extensions/dev.js.map +1 -1
  254. package/dist/extensions/dev.vitest.d.ts +2 -0
  255. package/dist/extensions/dev.vitest.d.ts.map +1 -0
  256. package/dist/extensions/dev.vitest.js +197 -0
  257. package/dist/extensions/dev.vitest.js.map +1 -0
  258. package/dist/extensions/home.d.ts.map +1 -1
  259. package/dist/extensions/home.js +3 -0
  260. package/dist/extensions/home.js.map +1 -1
  261. package/dist/home-command.d.ts +8 -0
  262. package/dist/home-command.d.ts.map +1 -0
  263. package/dist/home-command.js +181 -0
  264. package/dist/home-command.js.map +1 -0
  265. package/dist/hover-repro.d.ts +2 -0
  266. package/dist/hover-repro.d.ts.map +1 -0
  267. package/dist/hover-repro.js +20 -0
  268. package/dist/hover-repro.js.map +1 -0
  269. package/dist/index.d.ts +1 -0
  270. package/dist/index.d.ts.map +1 -1
  271. package/dist/index.js +2 -0
  272. package/dist/index.js.map +1 -1
  273. package/dist/internal/dialog.d.ts +1 -0
  274. package/dist/internal/dialog.d.ts.map +1 -1
  275. package/dist/internal/dialog.js +27 -18
  276. package/dist/internal/dialog.js.map +1 -1
  277. package/dist/internal/navigation.d.ts +9 -1
  278. package/dist/internal/navigation.d.ts.map +1 -1
  279. package/dist/internal/navigation.js +5 -5
  280. package/dist/internal/navigation.js.map +1 -1
  281. package/dist/internal/offscreen.d.ts +6 -0
  282. package/dist/internal/offscreen.d.ts.map +1 -0
  283. package/dist/internal/offscreen.js +10 -0
  284. package/dist/internal/offscreen.js.map +1 -0
  285. package/dist/internal/providers.d.ts.map +1 -1
  286. package/dist/internal/providers.js +2 -2
  287. package/dist/internal/providers.js.map +1 -1
  288. package/dist/internal/scrollbox.d.ts +1 -10
  289. package/dist/internal/scrollbox.d.ts.map +1 -1
  290. package/dist/internal/scrollbox.js +2 -1
  291. package/dist/internal/scrollbox.js.map +1 -1
  292. package/dist/localstorage.d.ts +13 -0
  293. package/dist/localstorage.d.ts.map +1 -0
  294. package/dist/localstorage.js +190 -0
  295. package/dist/localstorage.js.map +1 -0
  296. package/dist/oauth.d.ts +142 -0
  297. package/dist/oauth.d.ts.map +1 -0
  298. package/dist/oauth.js +551 -0
  299. package/dist/oauth.js.map +1 -0
  300. package/dist/preferences.d.ts +23 -0
  301. package/dist/preferences.d.ts.map +1 -0
  302. package/dist/preferences.js +105 -0
  303. package/dist/preferences.js.map +1 -0
  304. package/dist/state.d.ts +2 -0
  305. package/dist/state.d.ts.map +1 -1
  306. package/dist/state.js +3 -0
  307. package/dist/state.js.map +1 -1
  308. package/dist/store.d.ts +21 -0
  309. package/dist/store.d.ts.map +1 -0
  310. package/dist/store.js +84 -0
  311. package/dist/store.js.map +1 -0
  312. package/dist/swift-loader.d.ts +3 -0
  313. package/dist/swift-loader.d.ts.map +1 -0
  314. package/dist/swift-loader.js +193 -0
  315. package/dist/swift-loader.js.map +1 -0
  316. package/dist/swift-runtime.d.ts +2 -0
  317. package/dist/swift-runtime.d.ts.map +1 -0
  318. package/dist/swift-runtime.js +27 -0
  319. package/dist/swift-runtime.js.map +1 -0
  320. package/dist/toast.d.ts +44 -0
  321. package/dist/toast.d.ts.map +1 -0
  322. package/dist/toast.js +221 -0
  323. package/dist/toast.js.map +1 -0
  324. package/dist/utils/file-system.d.ts +9 -0
  325. package/dist/utils/file-system.d.ts.map +1 -1
  326. package/dist/utils/file-system.js +49 -0
  327. package/dist/utils/file-system.js.map +1 -1
  328. package/dist/utils/run-command.d.ts +25 -1
  329. package/dist/utils/run-command.d.ts.map +1 -1
  330. package/dist/utils/run-command.js +47 -4
  331. package/dist/utils/run-command.js.map +1 -1
  332. package/dist/window.d.ts +12 -0
  333. package/dist/window.d.ts.map +1 -0
  334. package/dist/window.js +48 -0
  335. package/dist/window.js.map +1 -0
  336. package/package.json +13 -11
  337. package/src/apis/browser-extension.tsx +29 -0
  338. package/src/apis/localstorage.test.ts +14 -6
  339. package/src/apis/localstorage.tsx +8 -5
  340. package/src/apis/oauth.tsx +5 -1
  341. package/src/apis/preferences.tsx +48 -22
  342. package/src/build.test.tsx +52 -0
  343. package/src/build.tsx +2 -1
  344. package/src/cli.tsx +80 -39
  345. package/src/compile.tsx +24 -6
  346. package/src/components/actions.tsx +94 -32
  347. package/src/components/detail.tsx +4 -0
  348. package/src/components/dropdown.tsx +47 -14
  349. package/src/components/extension-preferences.tsx +44 -16
  350. package/src/components/form/checkbox.tsx +12 -6
  351. package/src/components/form/date-picker.tsx +12 -6
  352. package/src/components/form/description.tsx +7 -2
  353. package/src/components/form/dropdown.tsx +131 -119
  354. package/src/components/form/file-autocomplete.tsx +90 -108
  355. package/src/components/form/file-picker.tsx +54 -43
  356. package/src/components/form/form-end.tsx +23 -2
  357. package/src/components/form/index.tsx +152 -34
  358. package/src/components/form/password-field.tsx +12 -6
  359. package/src/components/form/text-area.tsx +13 -6
  360. package/src/components/form/text-field.tsx +13 -6
  361. package/src/components/form/types.tsx +6 -0
  362. package/src/components/form/with-left-border.tsx +41 -8
  363. package/src/components/icon.tsx +27 -8
  364. package/src/components/list.tsx +193 -74
  365. package/src/components/loading-bar.tsx +3 -2
  366. package/src/components/loading-text.tsx +79 -0
  367. package/src/descendants.tsx +1 -0
  368. package/src/examples/file-autocomplete.vitest.tsx +130 -125
  369. package/src/examples/form-basic.vitest.tsx +376 -176
  370. package/src/examples/form-dropdown.vitest.tsx +126 -126
  371. package/src/examples/form-scroll.tsx +2 -0
  372. package/src/examples/form-scroll.vitest.tsx +58 -58
  373. package/src/examples/form-tagpicker.vitest.tsx +99 -99
  374. package/src/examples/internal/descendants-filtering.tsx +1 -0
  375. package/src/examples/internal/descendants.tsx +1 -0
  376. package/src/examples/internal/rhf-custom-ref.tsx +2 -0
  377. package/src/examples/internal/scrollbox-demo.tsx +3 -27
  378. package/src/examples/internal/scrollbox-with-descendants.tsx +4 -7
  379. package/src/examples/internal/simple-scrollbox.vitest.tsx +7 -5
  380. package/src/examples/list-detail-metadata.tsx +49 -0
  381. package/src/examples/list-detail-metadata.vitest.tsx +88 -0
  382. package/src/examples/list-dropdown-default.vitest.tsx +51 -51
  383. package/src/examples/list-fetch-data.vitest.tsx +4 -4
  384. package/src/examples/list-scrollbox.vitest.tsx +73 -14
  385. package/src/examples/list-with-detail-long.tsx +70 -0
  386. package/src/examples/list-with-detail.vitest.tsx +198 -92
  387. package/src/examples/list-with-dropdown.vitest.tsx +53 -53
  388. package/src/examples/list-with-sections.tsx +1 -0
  389. package/src/examples/list-with-sections.vitest.tsx +213 -89
  390. package/src/examples/list-with-toast.vitest.tsx +4 -4
  391. package/src/examples/simple-file-picker.vitest.tsx +61 -471
  392. package/src/examples/simple-grid.vitest.tsx +238 -233
  393. package/src/examples/simple-navigation.tsx +15 -7
  394. package/src/examples/simple-navigation.vitest.tsx +121 -210
  395. package/src/examples/store.vitest.tsx +1 -1
  396. package/src/examples/swift-extension.vitest.tsx +148 -0
  397. package/src/examples/synonyms.vitest.tsx +159 -0
  398. package/src/extensions/dev.tsx +74 -7
  399. package/src/extensions/dev.vitest.tsx +97 -31
  400. package/src/extensions/home.tsx +6 -0
  401. package/src/index.tsx +3 -0
  402. package/src/internal/dialog.tsx +43 -30
  403. package/src/internal/navigation.tsx +3 -1
  404. package/src/internal/offscreen.tsx +15 -0
  405. package/src/internal/providers.tsx +4 -2
  406. package/src/internal/scrollbox.tsx +4 -8
  407. package/src/keyboard.test.tsx +69 -0
  408. package/src/state.tsx +7 -0
  409. package/src/swift-loader.tsx +239 -0
  410. package/src/swift-runtime.tsx +36 -0
  411. package/src/utils/file-system.ts +61 -0
  412. package/src/utils/run-command.tsx +75 -6
@@ -6,9 +6,12 @@ import { Action, ActionPanel } from 'termcast'
6
6
  import { useNavigation } from 'termcast/src/internal/navigation'
7
7
  import { TermcastProvider } from 'termcast/src/internal/providers'
8
8
 
9
- function DetailView({ title }: { title: string }): any {
9
+ function GoBackAction(): any {
10
10
  const { pop } = useNavigation()
11
+ return <Action title='Go Back' onAction={() => pop()} />
12
+ }
11
13
 
14
+ function DetailView({ title }: { title: string }): any {
12
15
  return (
13
16
  <List
14
17
  searchBarPlaceholder='Detail view - Press ESC to go back'
@@ -21,7 +24,7 @@ function DetailView({ title }: { title: string }): any {
21
24
  subtitle='Press Enter to go back or ESC to navigate back'
22
25
  actions={
23
26
  <ActionPanel>
24
- <Action title='Go Back' onAction={() => pop()} />
27
+ <GoBackAction />
25
28
  <Action.CopyToClipboard content={title} title='Copy Title' />
26
29
  </ActionPanel>
27
30
  }
@@ -31,9 +34,17 @@ function DetailView({ title }: { title: string }): any {
31
34
  )
32
35
  }
33
36
 
34
- function MainView(): any {
37
+ function OpenDetailsAction({ title }: { title: string }): any {
35
38
  const { push } = useNavigation()
39
+ return (
40
+ <Action
41
+ title='Open Details'
42
+ onAction={() => push(<DetailView title={title} />)}
43
+ />
44
+ )
45
+ }
36
46
 
47
+ function MainView(): any {
37
48
  const items = [
38
49
  {
39
50
  id: 'first',
@@ -62,10 +73,7 @@ function MainView(): any {
62
73
  subtitle={item.subtitle}
63
74
  actions={
64
75
  <ActionPanel>
65
- <Action
66
- title='Open Details'
67
- onAction={() => push(<DetailView title={item.title} />)}
68
- />
76
+ <OpenDetailsAction title={item.title} />
69
77
  <Action.CopyToClipboard
70
78
  content={item.title}
71
79
  title='Copy Title'
@@ -19,13 +19,14 @@ afterEach(() => {
19
19
  test('navigation between main and detail views', async () => {
20
20
  await session.text({
21
21
  waitFor: (text) => {
22
- // wait for main view to show up
23
- return /Navigation Example/i.test(text)
22
+ // wait for main view with items to show up
23
+ return /Navigation Example/i.test(text) && /First Item/i.test(text)
24
24
  },
25
25
  })
26
26
 
27
- // Small delay to ensure all items are rendered
27
+ // Ensure all items are rendered and registered
28
28
  await session.waitIdle()
29
+ await new Promise((resolve) => setTimeout(resolve, 200))
29
30
 
30
31
  const initialSnapshot = await session.text()
31
32
 
@@ -53,11 +54,12 @@ test('navigation between main and detail views', async () => {
53
54
 
54
55
 
55
56
 
56
- select ↑↓ navigate ^k actions"
57
+ open details ↑↓ navigate ^k actions"
57
58
  `)
58
59
 
59
60
  // Navigate to second item
60
61
  await session.press('down')
62
+ await session.waitIdle()
61
63
 
62
64
  const afterDownSnapshot = await session.text()
63
65
  expect(afterDownSnapshot).toMatchInlineSnapshot(`
@@ -84,52 +86,19 @@ test('navigation between main and detail views', async () => {
84
86
 
85
87
 
86
88
 
87
- select ↑↓ navigate ^k actions"
89
+ open details ↑↓ navigate ^k actions"
88
90
  `)
89
91
 
90
- // Press Enter to open actions panel
91
- await session.press('enter')
92
-
93
- const actionsOpenSnapshot = await session.text()
94
- expect(actionsOpenSnapshot).toMatchInlineSnapshot(`
95
- "
96
-
97
-
98
- Navigation Example ─────────────────────────────────────────────
99
-
100
- Main view
101
-
102
- Items
103
- ┃ ┃
104
- ┃ esc ┃
105
- ┃ ┃
106
- ┃ Search actions... ┃
107
- ┃ ┃
108
- ┃ ›Open Details ┃
109
- ┃ Copy Title ┃
110
- ┃ ┃
111
- ┃ ┃
112
- ┃ ┃
113
- ┃ ┃
114
- ┃ ┃
115
- ┃ ┃
116
- ┃ ┃
117
- ┃ ┃
118
- ┃ ┃
119
- ┃ ↵ select ↑↓ navigate ┃
120
- ┃ ┃"
121
- `)
122
-
123
- // Press Enter again to select "Open Details" action
92
+ // Press Enter to open actions panel (auto-executes first action)
124
93
  await session.press('enter')
94
+ await session.waitIdle()
95
+ await new Promise((resolve) => setTimeout(resolve, 200))
125
96
 
126
- const detailViewSnapshot = await session.text({
127
- waitFor: (text) => {
128
- // wait for detail view to show up
129
- return /Detail: Second Item/i.test(text)
130
- },
97
+ const actionsOpenSnapshot = await session.text({
98
+ waitFor: (text) => /Detail: Second Item/i.test(text),
99
+ timeout: 3000,
131
100
  })
132
- expect(detailViewSnapshot).toMatchInlineSnapshot(`
101
+ expect(actionsOpenSnapshot).toMatchInlineSnapshot(`
133
102
  "
134
103
 
135
104
 
@@ -153,18 +122,22 @@ test('navigation between main and detail views', async () => {
153
122
 
154
123
 
155
124
 
156
- select ↑↓ navigate ^k actions"
125
+ go back ↑↓ navigate ^k actions"
157
126
  `)
158
127
 
159
- // Press ESC to go back to main view
160
- await session.press('esc')
128
+ // Press Enter in detail view triggers "Go Back" action, returning to main view
129
+ await session.press('enter')
130
+ await session.waitIdle()
131
+ await new Promise((resolve) => setTimeout(resolve, 200))
161
132
 
162
133
  const backToMainSnapshot = await session.text({
163
134
  waitFor: (text) => {
164
- // wait for main view to show up again
165
- return /Navigation Example/i.test(text)
135
+ // wait for main view to show up after going back
136
+ return /Main view/i.test(text) && /Second Item/i.test(text)
166
137
  },
138
+ timeout: 3000,
167
139
  })
140
+ // After "Go Back" action, we should be back on main view
168
141
  expect(backToMainSnapshot).toMatchInlineSnapshot(`
169
142
  "
170
143
 
@@ -189,10 +162,10 @@ test('navigation between main and detail views', async () => {
189
162
 
190
163
 
191
164
 
192
- select ↑↓ navigate ^k actions"
165
+ open details ↑↓ navigate ^k actions"
193
166
  `)
194
167
 
195
- // Navigate down to third item (we're back at first item after ESC)
168
+ // Navigate down to third item
196
169
  await session.press('down')
197
170
  await session.press('down')
198
171
 
@@ -221,7 +194,7 @@ test('navigation between main and detail views', async () => {
221
194
 
222
195
 
223
196
 
224
- select ↑↓ navigate ^k actions"
197
+ open details ↑↓ navigate ^k actions"
225
198
  `)
226
199
 
227
200
  // Open action panel for third item
@@ -232,43 +205,6 @@ test('navigation between main and detail views', async () => {
232
205
  "
233
206
 
234
207
 
235
- Navigation Example ─────────────────────────────────────────────
236
-
237
- Main view
238
-
239
- Items
240
- ┃ ┃
241
- ┃ esc ┃
242
- ┃ ┃
243
- ┃ Search actions... ┃
244
- ┃ ┃
245
- ┃ ›Open Details ┃
246
- ┃ Copy Title ┃
247
- ┃ ┃
248
- ┃ ┃
249
- ┃ ┃
250
- ┃ ┃
251
- ┃ ┃
252
- ┃ ┃
253
- ┃ ┃
254
- ┃ ┃
255
- ┃ ┃
256
- ┃ ↵ select ↑↓ navigate ┃
257
- ┃ ┃"
258
- `)
259
-
260
- // Navigate to detail
261
- await session.press('enter')
262
-
263
- const thirdDetailSnapshot = await session.text({
264
- waitFor: (text) => {
265
- return /Detail: Third Item/i.test(text)
266
- },
267
- })
268
- expect(thirdDetailSnapshot).toMatchInlineSnapshot(`
269
- "
270
-
271
-
272
208
  Detail: Third Item ─────────────────────────────────────────────
273
209
 
274
210
  Detail view - Press ESC to go back
@@ -289,49 +225,18 @@ test('navigation between main and detail views', async () => {
289
225
 
290
226
 
291
227
 
292
- select ↑↓ navigate ^k actions"
228
+ go back ↑↓ navigate ^k actions"
293
229
  `)
294
230
 
295
- // Use Enter to open actions and go back
296
- await session.press('enter')
297
-
298
- const thirdDetailActionsSnapshot = await session.text()
299
- expect(thirdDetailActionsSnapshot).toMatchInlineSnapshot(`
300
- "
301
-
302
-
303
- Detail: Third Item ─────────────────────────────────────────────
304
-
305
- Detail view - Press ESC to go back
306
-
307
- Details
308
- ┃ ┃
309
- ┃ esc ┃
310
- ┃ ┃
311
- ┃ Search actions... ┃
312
- ┃ ┃
313
- ┃ ›Go Back ┃
314
- ┃ Copy Title ┃
315
- ┃ ┃
316
- ┃ ┃
317
- ┃ ┃
318
- ┃ ┃
319
- ┃ ┃
320
- ┃ ┃
321
- ┃ ┃
322
- ┃ ┃
323
- ┃ ┃
324
- ┃ ↵ select ↑↓ navigate ┃
325
- ┃ ┃"
326
- `)
327
-
328
- // Select "Go Back" action
231
+ // Press enter in detail view triggers "Go Back" action, returning to main view
329
232
  await session.press('enter')
233
+ await session.waitIdle()
330
234
 
331
235
  const backFromThirdSnapshot = await session.text({
332
236
  waitFor: (text) => {
333
- return /Navigation Example/i.test(text)
237
+ return /Main view/i.test(text)
334
238
  },
239
+ timeout: 3000,
335
240
  })
336
241
  expect(backFromThirdSnapshot).toMatchInlineSnapshot(`
337
242
  "
@@ -357,7 +262,7 @@ test('navigation between main and detail views', async () => {
357
262
 
358
263
 
359
264
 
360
- select ↑↓ navigate ^k actions"
265
+ open details ↑↓ navigate ^k actions"
361
266
  `)
362
267
  }, 15000)
363
268
 
@@ -377,29 +282,29 @@ test('navigation with actions panel', async () => {
377
282
  "
378
283
 
379
284
 
380
- Navigation Example ─────────────────────────────────────────────
381
-
382
- Main view
383
-
384
- Items
385
- ┃ ┃
386
- ┃ esc ┃
387
-
388
- Search actions... ┃
389
-
390
- ›Open Details ┃
391
- Copy Title ┃
392
-
393
-
394
-
395
-
396
-
397
-
398
-
399
-
400
-
401
- ↵ select ↑↓ navigate ┃
402
- "
285
+ Navigation Example ─────────────────────────────────────────────
286
+
287
+ Main view
288
+
289
+ Items
290
+ ›First Item Navigate to first detail
291
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
292
+
293
+ esc
294
+
295
+ Search actions...
296
+
297
+ ›Open Details
298
+ Copy Title
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+ ┃"
403
308
  `)
404
309
 
405
310
  // Navigate down in actions panel
@@ -410,29 +315,29 @@ test('navigation with actions panel', async () => {
410
315
  "
411
316
 
412
317
 
413
- Navigation Example ─────────────────────────────────────────────
414
-
415
- Main view
416
-
417
- Items
418
- ┃ ┃
419
- ┃ esc ┃
420
-
421
- Search actions... ┃
422
-
423
- Open Details ┃
424
- ›Copy Title ┃
425
-
426
-
427
-
428
-
429
-
430
-
431
-
432
-
433
-
434
- ↵ select ↑↓ navigate ┃
435
- "
318
+ Navigation Example ─────────────────────────────────────────────
319
+
320
+ Main view
321
+
322
+ Items
323
+ ›First Item Navigate to first detail
324
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
325
+
326
+ esc
327
+
328
+ Search actions...
329
+
330
+ Open Details
331
+ ›Copy Title
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ ┃"
436
341
  `)
437
342
 
438
343
  // Select the Copy Title action
@@ -463,15 +368,21 @@ test('navigation with actions panel', async () => {
463
368
 
464
369
 
465
370
 
466
- select ↑↓ ┌────────────────────────────────────┐
371
+ open detail┌────────────────────────────────────┐
467
372
  │ ✓ Copied to Clipboard - First Item │
468
373
  └────────────────────────────────────┘"
469
374
  `)
470
375
 
471
- // Navigate to second item and open its detail
376
+ // Wait for toast to clear, then navigate to second item
377
+ await new Promise((resolve) => setTimeout(resolve, 500))
378
+
472
379
  await session.press('down')
380
+ await session.waitIdle()
381
+ await new Promise((resolve) => setTimeout(resolve, 200))
382
+
473
383
  await session.press('enter')
474
- await session.press('enter')
384
+ await session.waitIdle()
385
+ await new Promise((resolve) => setTimeout(resolve, 200))
475
386
 
476
387
  const secondDetailSnapshot = await session.text({
477
388
  waitFor: (text) => {
@@ -502,7 +413,7 @@ test('navigation with actions panel', async () => {
502
413
 
503
414
 
504
415
 
505
- select ↑↓ ┌────────────────────────────────────┐
416
+ go back ↑↓┌────────────────────────────────────┐
506
417
  │ ✓ Copied to Clipboard - First Item │
507
418
  └────────────────────────────────────┘"
508
419
  `)
@@ -515,29 +426,29 @@ test('navigation with actions panel', async () => {
515
426
  "
516
427
 
517
428
 
518
- Detail: Second Item ────────────────────────────────────────────
519
-
520
- Detail view - Press ESC to go back
521
-
522
- Details
523
- ┃ ┃
524
- ┃ esc ┃
525
-
526
- Search actions... ┃
527
-
528
- ›Go Back ┃
529
- Copy Title ┃
530
-
531
-
532
-
533
-
534
-
535
-
536
-
537
-
538
-
539
- select ↑↓ navigate ┃
540
- "
429
+ Detail: Second Item ────────────────────────────────────────────
430
+
431
+ Detail view - Press ESC to go back
432
+
433
+ Details
434
+ ›This is the detail view for Second Item Press Enter to go back
435
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
436
+
437
+ esc
438
+
439
+ Search actions...
440
+
441
+ ›Go Back
442
+ Copy Title
443
+
444
+
445
+
446
+
447
+
448
+
449
+ ┌────────────────────────────────────┐
450
+ Copied to Clipboard - First Item │
451
+ └────────────────────────────────────┘"
541
452
  `)
542
453
 
543
454
  // Select Go Back action
@@ -572,7 +483,7 @@ test('navigation with actions panel', async () => {
572
483
 
573
484
 
574
485
 
575
- select ↑↓ ┌────────────────────────────────────┐
486
+ open detail┌────────────────────────────────────┐
576
487
  │ ✓ Copied to Clipboard - First Item │
577
488
  └────────────────────────────────────┘"
578
489
  `)
@@ -618,7 +529,7 @@ test('search functionality in main and detail views', async () => {
618
529
 
619
530
 
620
531
 
621
- select ↑↓ navigate ^k actions"
532
+ open details ↑↓ navigate ^k actions"
622
533
  `)
623
534
 
624
535
  // Clear search
@@ -654,19 +565,19 @@ test('search functionality in main and detail views', async () => {
654
565
 
655
566
 
656
567
 
657
- select ↑↓ navigate ^k actions"
568
+ open details ↑↓ navigate ^k actions"
658
569
  `)
659
570
 
660
- // Open actions for first item
661
- await session.press('enter')
662
-
663
- // Navigate to first item detail
571
+ // Open first item detail (auto-executes Open Details action)
664
572
  await session.press('enter')
573
+ await session.waitIdle()
574
+ await new Promise((resolve) => setTimeout(resolve, 200))
665
575
 
666
576
  const firstDetailSnapshot = await session.text({
667
577
  waitFor: (text) => {
668
578
  return /Detail: First Item/i.test(text)
669
579
  },
580
+ timeout: 3000,
670
581
  })
671
582
  expect(firstDetailSnapshot).toMatchInlineSnapshot(`
672
583
  "
@@ -692,7 +603,7 @@ test('search functionality in main and detail views', async () => {
692
603
 
693
604
 
694
605
 
695
- select ↑↓ navigate ^k actions"
606
+ go back ↑↓ navigate ^k actions"
696
607
  `)
697
608
 
698
609
  // Type in detail view search bar
@@ -727,7 +638,7 @@ test('search functionality in main and detail views', async () => {
727
638
 
728
639
 
729
640
 
730
- select ↑↓ navigate ^k actions"
641
+ go back ↑↓ navigate ^k actions"
731
642
  `)
732
643
 
733
644
  // Press ESC to go back
@@ -762,6 +673,6 @@ test('search functionality in main and detail views', async () => {
762
673
 
763
674
 
764
675
 
765
- select ↑↓ navigate ^k actions"
676
+ open details ↑↓ navigate ^k actions"
766
677
  `)
767
678
  }, 10000)
@@ -71,6 +71,6 @@ test('Store extension - searching for spiceblow shows Database', async () => {
71
71
 
72
72
 
73
73
 
74
- ↵ select ↑↓ navigate ^k actions"
74
+ ↑↓ navigate ^k actions"
75
75
  `)
76
76
  }, 30000)