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
@@ -16,7 +16,7 @@ afterEach(() => {
16
16
  session?.close()
17
17
  })
18
18
 
19
- test('file picker with autocomplete', async () => {
19
+ test('file picker shows form fields', async () => {
20
20
  const initialSnapshot = await session.text({
21
21
  waitFor: (text) => {
22
22
  return (
@@ -44,8 +44,8 @@ test('file picker with autocomplete', async () => {
44
44
 
45
45
 
46
46
  ◆ Your Name
47
- John Doe
48
-
47
+ John Doe
48
+
49
49
  ◇ Select Files
50
50
  │ Enter file path...
51
51
 
@@ -76,18 +76,24 @@ test('file picker with autocomplete', async () => {
76
76
 
77
77
 
78
78
 
79
- ctrl ↵ submit ↑↓ navigate ^k actions"
79
+ ctrl ↵ submit tab navigate ^k actions"
80
80
  `)
81
+ }, 10000)
82
+
83
+ test('typing opens autocomplete dialog with file list', async () => {
84
+ await session.text({
85
+ waitFor: (text) => /Your Name/i.test(text),
86
+ })
81
87
 
82
- // Tab to navigate to file picker field
88
+ // Tab to file picker field
83
89
  await session.press('tab')
84
90
  await session.press('tab')
85
91
 
86
- // Type "src" to trigger autocomplete
87
- await session.type('src')
92
+ // Type to trigger autocomplete
93
+ await session.type('s')
88
94
 
89
95
  const autocompleteSnapshot = await session.text({
90
- waitFor: (text) => text.includes('📁 src'),
96
+ waitFor: (text) => text.includes('Filter:') && text.includes('📁'),
91
97
  })
92
98
  expect(autocompleteSnapshot).toMatchInlineSnapshot(`
93
99
  "
@@ -105,200 +111,23 @@ test('file picker with autocomplete', async () => {
105
111
 
106
112
 
107
113
 
108
- ◇ Your Name
109
- │ John Doe
110
-
111
- ◇ Select Files
112
- Enter file path...
113
- ┌────────────────────────────────────────────────────────────┐
114
- 📁 src │
115
- ↑↓ navigate ⏎ open folder → select folder esc close │
116
- └────────────────────────────────────────────────────────────┘
117
- src
118
-
119
- Choose a folder for output
120
-
121
- Select Single File
122
- │ Enter file path...
123
-
124
- │ Choose exactly one file
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
- ctrl ↵ submit ↑↓ navigate ^k actions"
142
- `)
143
-
144
- // Navigate down in autocomplete
145
- await session.press('down')
146
-
147
- const afterDownSnapshot = await session.text({
148
- waitFor: (text) => text.includes('📁 src'),
149
- })
150
- expect(afterDownSnapshot).toMatchInlineSnapshot(`
151
- "
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
- ◇ Your Name
167
- │ John Doe
168
-
169
- ◇ Select Files
170
- │ Enter file path...
171
- │ ┌────────────────────────────────────────────────────────────┐
172
- │ │ 📁 src │
173
- │ │ ↑↓ navigate ⏎ open folder → select folder esc close │
174
- ◆ └────────────────────────────────────────────────────────────┘
175
- ┃ src
176
-
177
- ┃ Choose a folder for output
178
-
179
- ◇ Select Single File
180
- │ Enter file path...
181
-
182
- │ Choose exactly one file
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
- ctrl ↵ submit ↑↓ navigate ^k actions"
200
- `)
201
-
202
- // Select item with Enter
203
- await session.press('enter')
204
-
205
- const afterSelectSnapshot = await session.text({
206
- waitFor: (text) => text.includes('src/') && text.includes('📁 apis'),
207
- })
208
- expect(afterSelectSnapshot).toMatchInlineSnapshot(`
209
- "
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
220
-
221
-
222
- ┌────────────────────────────────────────────────────────────┐
223
- │ 📁 apis │
224
- ◇ │ 📁 components │
225
- │ │ 📁 examples │
226
- │ │ 📁 extensions │
227
- ◇ │ 📁 hooks │
228
- │ │ 📁 internal │
229
- │ │ 📁 store-api │
230
- │ │ 📁 utils │
231
- │ │ ↑↓ navigate ⏎ open folder → select folder esc close │
232
- ◆ └────────────────────────────────────────────────────────────┘
233
- ┃ src/
234
-
235
- ┃ Choose a folder for output
236
-
237
- ◇ Select Single File
238
- │ Enter file path...
239
-
240
- │ Choose exactly one file
241
-
242
-
243
-
244
-
245
-
246
-
247
-
248
-
249
-
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
- ctrl ↵ submit ↑↓ navigate ^k actions"
258
- `)
259
-
260
- // Clear and test absolute path
261
- await session.press('backspace')
262
- await session.press('backspace')
263
- await session.press('backspace')
264
- await session.type('/tmp')
265
-
266
- const absolutePathSnapshot = await session.text({
267
- waitFor: (text) => text.includes('/tmp'),
268
- })
269
- expect(absolutePathSnapshot).toMatchInlineSnapshot(`
270
- "
271
-
272
-
273
-
274
-
275
-
276
-
277
-
278
-
279
-
280
-
281
-
282
-
283
-
284
-
285
- ◇ Your Name
286
- │ John Doe
287
-
288
- ◇ Select Files
289
- │ Enter file path...
290
-
291
- │ Choose one or more files to upload
292
-
293
- ◆ Select Folder
294
- ┃ s/tmp
295
-
296
- ┃ Choose a folder for output
297
-
298
- ◇ Select Single File
299
- │ Enter file path...
300
-
301
- │ Choose exactly one file
114
+ ◇┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
115
+ │┃
116
+ │┃ Filter: s
117
+ ◇┃
118
+ │┃ 📁 extensions/
119
+ │┃ 📁 extensions/messages/
120
+ │┃ 📁 extensions/messages/assets/
121
+ │┃ 📁 extensions/messages/metadata/
122
+ ◆┃ 📁 extensions/messages/src/
123
+ │┃ 📁 extensions/messages/src/api/
124
+ │┃ 📁 extensions/messages/src/components/
125
+ │┃ 📁 extensions/messages/src/hooks/
126
+ │┃ 📁 extensions/messages/src/tools/
127
+ ◇┃ 📁 extensions/messages/swift/
128
+ │┃
129
+ │┃ ↑↓ navigate ⏎/tab select esc close
130
+ │━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
302
131
 
303
132
 
304
133
 
@@ -315,146 +144,32 @@ test('file picker with autocomplete', async () => {
315
144
 
316
145
 
317
146
 
318
- ctrl ↵ submit ↑↓ navigate ^k actions"
319
- `)
320
-
321
- // Test ~ home directory expansion
322
- await session.press('backspace')
323
- await session.press('backspace')
324
- await session.press('backspace')
325
- await session.press('backspace')
326
- await session.type('~/')
327
-
328
- const homeDirectorySnapshot = await session.text({
329
- waitFor: (text) => text.includes('~/'),
330
- })
331
- expect(homeDirectorySnapshot).toMatchInlineSnapshot(`
332
- "
333
-
334
-
335
-
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
-
345
-
346
-
347
- ◇ Your Name
348
- │ John Doe
349
-
350
- ◇ Select Files
351
- │ Enter file path...
352
-
353
- │ Choose one or more files to upload
354
-
355
- ◆ Select Folder
356
- ┃ s~/
357
-
358
- ┃ Choose a folder for output
359
-
360
- ◇ Select Single File
361
- │ Enter file path...
362
-
363
- │ Choose exactly one file
364
-
365
-
366
-
367
-
368
-
369
-
370
-
371
-
372
-
373
-
374
-
375
-
376
-
377
-
378
-
379
-
380
- ctrl ↵ submit ↑↓ navigate ^k actions"
147
+ ctrl ↵ submit tab navigate ^k actions"
381
148
  `)
382
149
  }, 15000)
383
150
 
384
- test('file picker keyboard navigation', async () => {
151
+ test('escape closes autocomplete without going back', async () => {
385
152
  await session.text({
386
- waitFor: (text) => {
387
- return /Your Name/i.test(text)
388
- },
153
+ waitFor: (text) => /Your Name/i.test(text),
389
154
  })
390
155
 
391
- // Tab to file picker
156
+ // Tab to file picker field
392
157
  await session.press('tab')
393
158
  await session.press('tab')
394
159
 
395
160
  // Type to trigger autocomplete
396
- await session.type('.')
161
+ await session.type('s')
397
162
 
398
- const withDotSnapshot = await session.text({
399
- waitFor: (text) => text.includes('📁 .termcast-bundle'),
163
+ await session.text({
164
+ waitFor: (text) => text.includes('Filter:'),
400
165
  })
401
- expect(withDotSnapshot).toMatchInlineSnapshot(`
402
- "
403
-
404
-
405
-
406
-
407
-
408
166
 
409
-
410
-
411
-
412
-
413
-
414
-
415
-
416
-
417
- ◇ Your Name
418
- │ John Doe
419
-
420
- ◇ Select Files
421
- │ Enter file path...
422
- │ ┌────────────────────────────────────────────────────────────┐
423
- │ │ 📁 .termcast-bundle │
424
- │ │ ↑↓ navigate ⏎ open folder → select folder esc close │
425
- ◆ └────────────────────────────────────────────────────────────┘
426
- ┃ .
427
-
428
- ┃ Choose a folder for output
429
-
430
- ◇ Select Single File
431
- │ Enter file path...
432
-
433
- │ Choose exactly one file
434
-
435
-
436
-
437
-
438
-
439
-
440
-
441
-
442
-
443
-
444
-
445
-
446
-
447
-
448
-
449
-
450
- ctrl ↵ submit ↑↓ navigate ^k actions"
451
- `)
452
-
453
- // Test escape key to close autocomplete
167
+ // Press escape to close autocomplete
454
168
  await session.press('esc')
455
169
 
170
+ // Verify form is still visible (didn't navigate away)
456
171
  const afterEscapeSnapshot = await session.text({
457
- waitFor: (text) => text.includes('Select Folder') && !text.includes('📁 .termcast-bundle'),
172
+ waitFor: (text) => text.includes('Select Folder') && !text.includes('Filter:'),
458
173
  })
459
174
  expect(afterEscapeSnapshot).toMatchInlineSnapshot(`
460
175
  "
@@ -481,77 +196,10 @@ test('file picker keyboard navigation', async () => {
481
196
  │ Choose one or more files to upload
482
197
 
483
198
  ◆ Select Folder
484
- .
485
-
486
- ┃ Choose a folder for output
487
-
488
- ◇ Select Single File
489
- │ Enter file path...
490
-
491
- │ Choose exactly one file
199
+ s
492
200
 
493
-
494
-
495
-
496
-
497
-
498
-
499
-
500
-
501
-
502
-
503
-
504
-
505
-
506
-
507
-
508
- ctrl ↵ submit ↑↓ navigate ^k actions"
509
- `)
510
-
511
- // Type again and navigate with arrows
512
- await session.type('s')
513
-
514
- await session.text({
515
- waitFor: (text) => text.includes('.s'),
516
- })
517
-
518
- // Navigate down multiple times
519
- await session.press('down')
520
- await session.press('down')
521
- await session.press('up')
522
-
523
- const afterNavigationSnapshot = await session.text({
524
- waitFor: (text) => text.includes('.s') && text.includes('Select Folder'),
525
- })
526
- expect(afterNavigationSnapshot).toMatchInlineSnapshot(`
527
- "
528
-
529
-
530
-
531
-
532
-
533
-
534
-
535
-
536
-
537
-
538
-
539
-
540
-
541
-
542
- ◇ Your Name
543
- │ John Doe
544
-
545
- ◇ Select Files
546
- │ Enter file path...
547
-
548
- │ Choose one or more files to upload
201
+ │ Choose a folder for output
549
202
 
550
- ◆ Select Folder
551
- ┃ .s
552
-
553
- ┃ Choose a folder for output
554
-
555
203
  ◇ Select Single File
556
204
  │ Enter file path...
557
205
 
@@ -572,35 +220,35 @@ test('file picker keyboard navigation', async () => {
572
220
 
573
221
 
574
222
 
575
- ctrl ↵ submit ↑↓ navigate ^k actions"
223
+ ctrl ↵ submit tab navigate ^k actions"
576
224
  `)
577
- }, 10000)
225
+ }, 15000)
578
226
 
579
- test('right arrow selects item and left arrow removes last selection', async () => {
227
+ test('selecting first item with enter adds it to the list', async () => {
580
228
  await session.text({
581
- waitFor: (text) => {
582
- return /Your Name/i.test(text)
583
- },
229
+ waitFor: (text) => /Your Name/i.test(text),
584
230
  })
585
231
 
586
- // Tab to file picker
232
+ // Tab to folder picker field (which shows directories)
587
233
  await session.press('tab')
588
234
  await session.press('tab')
589
235
 
590
236
  // Type to trigger autocomplete
591
- await session.type('src')
237
+ await session.type('s')
592
238
 
239
+ // Wait for dialog to appear with folders
593
240
  await session.text({
594
- waitFor: (text) => text.includes('📁 src'),
241
+ waitFor: (text) => text.includes('📁'),
595
242
  })
596
243
 
597
- // Use right arrow to select folder (instead of tab)
598
- await session.press('right')
244
+ // Press enter to select first match
245
+ await session.press('enter')
599
246
 
600
- const afterRightArrowSnapshot = await session.text({
601
- waitFor: (text) => text.includes('Selected files:') && text.includes('• src'),
247
+ // Verify file was added
248
+ const afterSelectSnapshot = await session.text({
249
+ waitFor: (text) => text.includes('Selected files:'),
602
250
  })
603
- expect(afterRightArrowSnapshot).toMatchInlineSnapshot(`
251
+ expect(afterSelectSnapshot).toMatchInlineSnapshot(`
604
252
  "
605
253
 
606
254
 
@@ -624,69 +272,13 @@ test('right arrow selects item and left arrow removes last selection', async ()
624
272
  │ Choose one or more files to upload
625
273
 
626
274
  ◆ Select Folder
627
- ┃ Enter file path...
628
-
629
- ┃ Selected files:
630
- ┃ • src
631
-
632
- ┃ Choose a folder for output
633
-
634
- ◇ Select Single File
635
275
  │ Enter file path...
636
276
 
637
- Choose exactly one file
638
-
639
-
640
-
641
-
642
-
643
-
644
-
645
-
646
-
647
-
648
-
649
-
650
-
651
-
652
- ctrl ↵ submit ↑↓ navigate ^k actions"
653
- `)
654
-
655
- // Use left arrow to remove the selection (input should be empty)
656
- await session.press('left')
657
-
658
- const afterLeftArrowSnapshot = await session.text({
659
- waitFor: (text) => !text.includes('Selected files:'),
660
- })
661
- expect(afterLeftArrowSnapshot).toMatchInlineSnapshot(`
662
- "
663
-
664
-
665
-
666
-
667
-
668
-
669
-
670
-
671
-
672
-
673
-
674
-
675
-
676
-
677
- ◇ Your Name
678
- │ John Doe
679
-
680
- ◇ Select Files
681
- │ Enter file path...
277
+ Selected files:
278
+ │ • extensions
682
279
 
683
- │ Choose one or more files to upload
280
+ │ Choose a folder for output
684
281
 
685
- ◆ Select Folder
686
- ┃ Enter file path...
687
-
688
- ┃ Choose a folder for output
689
-
690
282
  ◇ Select Single File
691
283
  │ Enter file path...
692
284
 
@@ -705,8 +297,6 @@ test('right arrow selects item and left arrow removes last selection', async ()
705
297
 
706
298
 
707
299
 
708
-
709
-
710
- ctrl ↵ submit ↑↓ navigate ^k actions"
300
+ ctrl ↵ submit tab navigate ^k actions"
711
301
  `)
712
302
  }, 15000)