termcast 1.3.21 → 1.3.25

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 (429) 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/apis/toast.d.ts +5 -0
  19. package/dist/apis/toast.d.ts.map +1 -1
  20. package/dist/apis/toast.js +7 -43
  21. package/dist/apis/toast.js.map +1 -1
  22. package/dist/build.d.ts.map +1 -1
  23. package/dist/build.js +3 -1
  24. package/dist/build.js.map +1 -1
  25. package/dist/cache.d.ts +32 -0
  26. package/dist/cache.d.ts.map +1 -0
  27. package/dist/cache.js +205 -0
  28. package/dist/cache.js.map +1 -0
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +87 -41
  31. package/dist/cli.js.map +1 -1
  32. package/dist/clipboard.d.ts +36 -0
  33. package/dist/clipboard.d.ts.map +1 -0
  34. package/dist/clipboard.js +154 -0
  35. package/dist/clipboard.js.map +1 -0
  36. package/dist/compile.d.ts +2 -1
  37. package/dist/compile.d.ts.map +1 -1
  38. package/dist/compile.js +31 -12
  39. package/dist/compile.js.map +1 -1
  40. package/dist/components/actions.d.ts.map +1 -1
  41. package/dist/components/actions.js +56 -30
  42. package/dist/components/actions.js.map +1 -1
  43. package/dist/components/detail.d.ts.map +1 -1
  44. package/dist/components/detail.js +4 -0
  45. package/dist/components/detail.js.map +1 -1
  46. package/dist/components/dropdown.d.ts.map +1 -1
  47. package/dist/components/dropdown.js +38 -15
  48. package/dist/components/dropdown.js.map +1 -1
  49. package/dist/components/extension-preferences.d.ts.map +1 -1
  50. package/dist/components/extension-preferences.js +40 -13
  51. package/dist/components/extension-preferences.js.map +1 -1
  52. package/dist/components/form/checkbox.d.ts.map +1 -1
  53. package/dist/components/form/checkbox.js +5 -3
  54. package/dist/components/form/checkbox.js.map +1 -1
  55. package/dist/components/form/date-picker.d.ts.map +1 -1
  56. package/dist/components/form/date-picker.js +5 -3
  57. package/dist/components/form/date-picker.js.map +1 -1
  58. package/dist/components/form/description.d.ts.map +1 -1
  59. package/dist/components/form/description.js +2 -2
  60. package/dist/components/form/description.js.map +1 -1
  61. package/dist/components/form/dropdown.d.ts.map +1 -1
  62. package/dist/components/form/dropdown.js +84 -80
  63. package/dist/components/form/dropdown.js.map +1 -1
  64. package/dist/components/form/file-autocomplete.d.ts +3 -6
  65. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  66. package/dist/components/form/file-autocomplete.js +61 -66
  67. package/dist/components/form/file-autocomplete.js.map +1 -1
  68. package/dist/components/form/file-picker.d.ts.map +1 -1
  69. package/dist/components/form/file-picker.js +33 -30
  70. package/dist/components/form/file-picker.js.map +1 -1
  71. package/dist/components/form/form-end.d.ts.map +1 -1
  72. package/dist/components/form/form-end.js +21 -1
  73. package/dist/components/form/form-end.js.map +1 -1
  74. package/dist/components/form/form-type-only.d.ts +174 -0
  75. package/dist/components/form/form-type-only.d.ts.map +1 -0
  76. package/dist/components/form/form-type-only.js +2 -0
  77. package/dist/components/form/form-type-only.js.map +1 -0
  78. package/dist/components/form/index.d.ts +3 -1
  79. package/dist/components/form/index.d.ts.map +1 -1
  80. package/dist/components/form/index.js +104 -30
  81. package/dist/components/form/index.js.map +1 -1
  82. package/dist/components/form/password-field.d.ts.map +1 -1
  83. package/dist/components/form/password-field.js +5 -3
  84. package/dist/components/form/password-field.js.map +1 -1
  85. package/dist/components/form/text-area.d.ts.map +1 -1
  86. package/dist/components/form/text-area.js +5 -3
  87. package/dist/components/form/text-area.js.map +1 -1
  88. package/dist/components/form/text-field.d.ts.map +1 -1
  89. package/dist/components/form/text-field.js +6 -4
  90. package/dist/components/form/text-field.js.map +1 -1
  91. package/dist/components/form/types.d.ts +5 -0
  92. package/dist/components/form/types.d.ts.map +1 -1
  93. package/dist/components/form/use-form-handling.d.ts +4 -0
  94. package/dist/components/form/use-form-handling.d.ts.map +1 -0
  95. package/dist/components/form/use-form-handling.js +37 -0
  96. package/dist/components/form/use-form-handling.js.map +1 -0
  97. package/dist/components/form/with-left-border.d.ts +2 -1
  98. package/dist/components/form/with-left-border.d.ts.map +1 -1
  99. package/dist/components/form/with-left-border.js +27 -3
  100. package/dist/components/form/with-left-border.js.map +1 -1
  101. package/dist/components/icon.d.ts +1 -0
  102. package/dist/components/icon.d.ts.map +1 -1
  103. package/dist/components/icon.js +24 -8
  104. package/dist/components/icon.js.map +1 -1
  105. package/dist/components/list.d.ts +2 -2
  106. package/dist/components/list.d.ts.map +1 -1
  107. package/dist/components/list.js +155 -70
  108. package/dist/components/list.js.map +1 -1
  109. package/dist/components/loading-bar.d.ts.map +1 -1
  110. package/dist/components/loading-bar.js +2 -2
  111. package/dist/components/loading-bar.js.map +1 -1
  112. package/dist/components/loading-text.d.ts +8 -0
  113. package/dist/components/loading-text.d.ts.map +1 -0
  114. package/dist/components/loading-text.js +58 -0
  115. package/dist/components/loading-text.js.map +1 -0
  116. package/dist/descendants.js +1 -1
  117. package/dist/descendants.js.map +1 -1
  118. package/dist/dev-ui.d.ts +7 -0
  119. package/dist/dev-ui.d.ts.map +1 -0
  120. package/dist/dev-ui.js +118 -0
  121. package/dist/dev-ui.js.map +1 -0
  122. package/dist/environment.d.ts +63 -0
  123. package/dist/environment.d.ts.map +1 -0
  124. package/dist/environment.js +189 -0
  125. package/dist/environment.js.map +1 -0
  126. package/dist/examples/datepicker.d.ts +2 -0
  127. package/dist/examples/datepicker.d.ts.map +1 -0
  128. package/dist/examples/datepicker.js +344 -0
  129. package/dist/examples/datepicker.js.map +1 -0
  130. package/dist/examples/file-autocomplete.vitest.d.ts +2 -0
  131. package/dist/examples/file-autocomplete.vitest.d.ts.map +1 -0
  132. package/dist/examples/file-autocomplete.vitest.js +223 -0
  133. package/dist/examples/file-autocomplete.vitest.js.map +1 -0
  134. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +2 -0
  135. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +1 -0
  136. package/dist/examples/form-basic-arrow-keys.vitest.js +46 -0
  137. package/dist/examples/form-basic-arrow-keys.vitest.js.map +1 -0
  138. package/dist/examples/form-basic.vitest.d.ts +2 -0
  139. package/dist/examples/form-basic.vitest.d.ts.map +1 -0
  140. package/dist/examples/form-basic.vitest.js +630 -0
  141. package/dist/examples/form-basic.vitest.js.map +1 -0
  142. package/dist/examples/form-dropdown-with-sections.d.ts +2 -0
  143. package/dist/examples/form-dropdown-with-sections.d.ts.map +1 -0
  144. package/dist/examples/form-dropdown-with-sections.js +13 -0
  145. package/dist/examples/form-dropdown-with-sections.js.map +1 -0
  146. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +2 -0
  147. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +1 -0
  148. package/dist/examples/form-dropdown-with-sections.vitest.js +75 -0
  149. package/dist/examples/form-dropdown-with-sections.vitest.js.map +1 -0
  150. package/dist/examples/form-dropdown.vitest.d.ts +2 -0
  151. package/dist/examples/form-dropdown.vitest.d.ts.map +1 -0
  152. package/dist/examples/form-dropdown.vitest.js +854 -0
  153. package/dist/examples/form-dropdown.vitest.js.map +1 -0
  154. package/dist/examples/form-multiselect-dropdown.d.ts +2 -0
  155. package/dist/examples/form-multiselect-dropdown.d.ts.map +1 -0
  156. package/dist/examples/form-multiselect-dropdown.js +13 -0
  157. package/dist/examples/form-multiselect-dropdown.js.map +1 -0
  158. package/dist/examples/form-scroll.d.ts.map +1 -1
  159. package/dist/examples/form-scroll.js +7 -1
  160. package/dist/examples/form-scroll.js.map +1 -1
  161. package/dist/examples/form-scroll.vitest.d.ts +2 -0
  162. package/dist/examples/form-scroll.vitest.d.ts.map +1 -0
  163. package/dist/examples/form-scroll.vitest.js +211 -0
  164. package/dist/examples/form-scroll.vitest.js.map +1 -0
  165. package/dist/examples/form-tagpicker.vitest.d.ts +2 -0
  166. package/dist/examples/form-tagpicker.vitest.d.ts.map +1 -0
  167. package/dist/examples/form-tagpicker.vitest.js +736 -0
  168. package/dist/examples/form-tagpicker.vitest.js.map +1 -0
  169. package/dist/examples/internal/descendants-filtering.js +1 -1
  170. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  171. package/dist/examples/internal/descendants.js +1 -1
  172. package/dist/examples/internal/descendants.js.map +1 -1
  173. package/dist/examples/internal/nested-boxes.d.ts +2 -0
  174. package/dist/examples/internal/nested-boxes.d.ts.map +1 -0
  175. package/dist/examples/internal/nested-boxes.js +7 -0
  176. package/dist/examples/internal/nested-boxes.js.map +1 -0
  177. package/dist/examples/internal/rhf-custom-ref.js +2 -2
  178. package/dist/examples/internal/rhf-custom-ref.js.map +1 -1
  179. package/dist/examples/internal/scrollbox-demo.js +3 -22
  180. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  181. package/dist/examples/internal/scrollbox-descendants.d.ts +2 -0
  182. package/dist/examples/internal/scrollbox-descendants.d.ts.map +1 -0
  183. package/dist/examples/internal/scrollbox-descendants.js +83 -0
  184. package/dist/examples/internal/scrollbox-descendants.js.map +1 -0
  185. package/dist/examples/internal/scrollbox-with-descendants.js +4 -8
  186. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -1
  187. package/dist/examples/internal/simple-scrollbox.vitest.d.ts +2 -0
  188. package/dist/examples/internal/simple-scrollbox.vitest.d.ts.map +1 -0
  189. package/dist/examples/internal/simple-scrollbox.vitest.js +96 -0
  190. package/dist/examples/internal/simple-scrollbox.vitest.js.map +1 -0
  191. package/dist/examples/internal/unicode-square-repro.d.ts +2 -0
  192. package/dist/examples/internal/unicode-square-repro.d.ts.map +1 -0
  193. package/dist/examples/internal/unicode-square-repro.js +7 -0
  194. package/dist/examples/internal/unicode-square-repro.js.map +1 -0
  195. package/dist/examples/list-detail-metadata.d.ts +2 -0
  196. package/dist/examples/list-detail-metadata.d.ts.map +1 -0
  197. package/dist/examples/list-detail-metadata.js +8 -0
  198. package/dist/examples/list-detail-metadata.js.map +1 -0
  199. package/dist/examples/list-dropdown-default.vitest.d.ts +2 -0
  200. package/dist/examples/list-dropdown-default.vitest.d.ts.map +1 -0
  201. package/dist/examples/list-dropdown-default.vitest.js +234 -0
  202. package/dist/examples/list-dropdown-default.vitest.js.map +1 -0
  203. package/dist/examples/list-fetch-data.vitest.d.ts +2 -0
  204. package/dist/examples/list-fetch-data.vitest.d.ts.map +1 -0
  205. package/dist/examples/list-fetch-data.vitest.js +111 -0
  206. package/dist/examples/list-fetch-data.vitest.js.map +1 -0
  207. package/dist/examples/list-filter-navigation.d.ts +2 -0
  208. package/dist/examples/list-filter-navigation.d.ts.map +1 -0
  209. package/dist/examples/list-filter-navigation.js +8 -0
  210. package/dist/examples/list-filter-navigation.js.map +1 -0
  211. package/dist/examples/list-scrollbox.vitest.d.ts +2 -0
  212. package/dist/examples/list-scrollbox.vitest.d.ts.map +1 -0
  213. package/dist/examples/list-scrollbox.vitest.js +93 -0
  214. package/dist/examples/list-scrollbox.vitest.js.map +1 -0
  215. package/dist/examples/list-with-detail-long.d.ts +2 -0
  216. package/dist/examples/list-with-detail-long.d.ts.map +1 -0
  217. package/dist/examples/list-with-detail-long.js +53 -0
  218. package/dist/examples/list-with-detail-long.js.map +1 -0
  219. package/dist/examples/list-with-detail.vitest.d.ts +2 -0
  220. package/dist/examples/list-with-detail.vitest.d.ts.map +1 -0
  221. package/dist/examples/list-with-detail.vitest.js +434 -0
  222. package/dist/examples/list-with-detail.vitest.js.map +1 -0
  223. package/dist/examples/list-with-dropdown.vitest.d.ts +2 -0
  224. package/dist/examples/list-with-dropdown.vitest.d.ts.map +1 -0
  225. package/dist/examples/list-with-dropdown.vitest.js +337 -0
  226. package/dist/examples/list-with-dropdown.vitest.js.map +1 -0
  227. package/dist/examples/list-with-sections.js +5 -1
  228. package/dist/examples/list-with-sections.js.map +1 -1
  229. package/dist/examples/list-with-sections.vitest.d.ts +2 -0
  230. package/dist/examples/list-with-sections.vitest.d.ts.map +1 -0
  231. package/dist/examples/list-with-sections.vitest.js +601 -0
  232. package/dist/examples/list-with-sections.vitest.js.map +1 -0
  233. package/dist/examples/scrollbox-vertical-centering.d.ts +6 -0
  234. package/dist/examples/scrollbox-vertical-centering.d.ts.map +1 -0
  235. package/dist/examples/scrollbox-vertical-centering.js +17 -0
  236. package/dist/examples/scrollbox-vertical-centering.js.map +1 -0
  237. package/dist/examples/simple-file-picker.vitest.d.ts +2 -0
  238. package/dist/examples/simple-file-picker.vitest.d.ts.map +1 -0
  239. package/dist/examples/simple-file-picker.vitest.js +678 -0
  240. package/dist/examples/simple-file-picker.vitest.js.map +1 -0
  241. package/dist/examples/simple-grid.vitest.d.ts +2 -0
  242. package/dist/examples/simple-grid.vitest.d.ts.map +1 -0
  243. package/dist/examples/simple-grid.vitest.js +521 -0
  244. package/dist/examples/simple-grid.vitest.js.map +1 -0
  245. package/dist/examples/simple-navigation.js +10 -4
  246. package/dist/examples/simple-navigation.js.map +1 -1
  247. package/dist/examples/simple-navigation.vitest.d.ts +2 -0
  248. package/dist/examples/simple-navigation.vitest.d.ts.map +1 -0
  249. package/dist/examples/simple-navigation.vitest.js +718 -0
  250. package/dist/examples/simple-navigation.vitest.js.map +1 -0
  251. package/dist/examples/store.vitest.d.ts +2 -0
  252. package/dist/examples/store.vitest.d.ts.map +1 -0
  253. package/dist/examples/store.vitest.js +69 -0
  254. package/dist/examples/store.vitest.js.map +1 -0
  255. package/dist/examples/toast-variations.d.ts +2 -0
  256. package/dist/examples/toast-variations.d.ts.map +1 -0
  257. package/dist/examples/toast-variations.js +122 -0
  258. package/dist/examples/toast-variations.js.map +1 -0
  259. package/dist/extensions/dev.d.ts +4 -2
  260. package/dist/extensions/dev.d.ts.map +1 -1
  261. package/dist/extensions/dev.js +61 -10
  262. package/dist/extensions/dev.js.map +1 -1
  263. package/dist/extensions/dev.vitest.d.ts +2 -0
  264. package/dist/extensions/dev.vitest.d.ts.map +1 -0
  265. package/dist/extensions/dev.vitest.js +197 -0
  266. package/dist/extensions/dev.vitest.js.map +1 -0
  267. package/dist/extensions/home.d.ts.map +1 -1
  268. package/dist/extensions/home.js +3 -0
  269. package/dist/extensions/home.js.map +1 -1
  270. package/dist/home-command.d.ts +8 -0
  271. package/dist/home-command.d.ts.map +1 -0
  272. package/dist/home-command.js +181 -0
  273. package/dist/home-command.js.map +1 -0
  274. package/dist/hover-repro.d.ts +2 -0
  275. package/dist/hover-repro.d.ts.map +1 -0
  276. package/dist/hover-repro.js +20 -0
  277. package/dist/hover-repro.js.map +1 -0
  278. package/dist/index.d.ts +1 -0
  279. package/dist/index.d.ts.map +1 -1
  280. package/dist/index.js +2 -0
  281. package/dist/index.js.map +1 -1
  282. package/dist/internal/dialog.d.ts +1 -0
  283. package/dist/internal/dialog.d.ts.map +1 -1
  284. package/dist/internal/dialog.js +27 -18
  285. package/dist/internal/dialog.js.map +1 -1
  286. package/dist/internal/navigation.d.ts +9 -1
  287. package/dist/internal/navigation.d.ts.map +1 -1
  288. package/dist/internal/navigation.js +5 -5
  289. package/dist/internal/navigation.js.map +1 -1
  290. package/dist/internal/offscreen.d.ts +6 -0
  291. package/dist/internal/offscreen.d.ts.map +1 -0
  292. package/dist/internal/offscreen.js +10 -0
  293. package/dist/internal/offscreen.js.map +1 -0
  294. package/dist/internal/providers.d.ts.map +1 -1
  295. package/dist/internal/providers.js +2 -2
  296. package/dist/internal/providers.js.map +1 -1
  297. package/dist/internal/scrollbox.d.ts +1 -10
  298. package/dist/internal/scrollbox.d.ts.map +1 -1
  299. package/dist/internal/scrollbox.js +2 -1
  300. package/dist/internal/scrollbox.js.map +1 -1
  301. package/dist/localstorage.d.ts +13 -0
  302. package/dist/localstorage.d.ts.map +1 -0
  303. package/dist/localstorage.js +190 -0
  304. package/dist/localstorage.js.map +1 -0
  305. package/dist/oauth.d.ts +142 -0
  306. package/dist/oauth.d.ts.map +1 -0
  307. package/dist/oauth.js +551 -0
  308. package/dist/oauth.js.map +1 -0
  309. package/dist/preferences.d.ts +23 -0
  310. package/dist/preferences.d.ts.map +1 -0
  311. package/dist/preferences.js +105 -0
  312. package/dist/preferences.js.map +1 -0
  313. package/dist/release.d.ts +1 -1
  314. package/dist/release.d.ts.map +1 -1
  315. package/dist/release.js +29 -33
  316. package/dist/release.js.map +1 -1
  317. package/dist/state.d.ts +2 -0
  318. package/dist/state.d.ts.map +1 -1
  319. package/dist/state.js +3 -0
  320. package/dist/state.js.map +1 -1
  321. package/dist/store.d.ts +21 -0
  322. package/dist/store.d.ts.map +1 -0
  323. package/dist/store.js +84 -0
  324. package/dist/store.js.map +1 -0
  325. package/dist/swift-loader.d.ts +3 -0
  326. package/dist/swift-loader.d.ts.map +1 -0
  327. package/dist/swift-loader.js +193 -0
  328. package/dist/swift-loader.js.map +1 -0
  329. package/dist/swift-runtime.d.ts +2 -0
  330. package/dist/swift-runtime.d.ts.map +1 -0
  331. package/dist/swift-runtime.js +27 -0
  332. package/dist/swift-runtime.js.map +1 -0
  333. package/dist/toast.d.ts +44 -0
  334. package/dist/toast.d.ts.map +1 -0
  335. package/dist/toast.js +221 -0
  336. package/dist/toast.js.map +1 -0
  337. package/dist/utils/file-system.d.ts +9 -0
  338. package/dist/utils/file-system.d.ts.map +1 -1
  339. package/dist/utils/file-system.js +49 -0
  340. package/dist/utils/file-system.js.map +1 -1
  341. package/dist/utils/run-command.d.ts +26 -1
  342. package/dist/utils/run-command.d.ts.map +1 -1
  343. package/dist/utils/run-command.js +53 -4
  344. package/dist/utils/run-command.js.map +1 -1
  345. package/dist/window.d.ts +12 -0
  346. package/dist/window.d.ts.map +1 -0
  347. package/dist/window.js +48 -0
  348. package/dist/window.js.map +1 -0
  349. package/package.json +12 -12
  350. package/src/apis/browser-extension.tsx +29 -0
  351. package/src/apis/localstorage.test.ts +14 -6
  352. package/src/apis/localstorage.tsx +8 -5
  353. package/src/apis/oauth.tsx +5 -1
  354. package/src/apis/preferences.tsx +48 -22
  355. package/src/apis/toast.tsx +37 -62
  356. package/src/build.test.tsx +52 -0
  357. package/src/build.tsx +3 -1
  358. package/src/cli.tsx +99 -48
  359. package/src/compile.tsx +32 -11
  360. package/src/components/actions.tsx +94 -32
  361. package/src/components/detail.tsx +4 -0
  362. package/src/components/dropdown.tsx +47 -14
  363. package/src/components/extension-preferences.tsx +44 -16
  364. package/src/components/form/checkbox.tsx +12 -6
  365. package/src/components/form/date-picker.tsx +12 -6
  366. package/src/components/form/description.tsx +7 -2
  367. package/src/components/form/dropdown.tsx +131 -119
  368. package/src/components/form/file-autocomplete.tsx +90 -108
  369. package/src/components/form/file-picker.tsx +54 -43
  370. package/src/components/form/form-end.tsx +23 -2
  371. package/src/components/form/index.tsx +168 -41
  372. package/src/components/form/password-field.tsx +12 -6
  373. package/src/components/form/text-area.tsx +13 -6
  374. package/src/components/form/text-field.tsx +13 -6
  375. package/src/components/form/types.tsx +6 -0
  376. package/src/components/form/with-left-border.tsx +41 -8
  377. package/src/components/icon.tsx +27 -8
  378. package/src/components/list.tsx +243 -101
  379. package/src/components/loading-bar.tsx +3 -2
  380. package/src/components/loading-text.tsx +79 -0
  381. package/src/descendants.tsx +1 -0
  382. package/src/examples/file-autocomplete.vitest.tsx +130 -125
  383. package/src/examples/form-basic.vitest.tsx +376 -176
  384. package/src/examples/form-dropdown.vitest.tsx +126 -126
  385. package/src/examples/form-scroll.tsx +2 -0
  386. package/src/examples/form-scroll.vitest.tsx +58 -58
  387. package/src/examples/form-tagpicker.vitest.tsx +99 -99
  388. package/src/examples/internal/descendants-filtering.tsx +1 -0
  389. package/src/examples/internal/descendants.tsx +1 -0
  390. package/src/examples/internal/rhf-custom-ref.tsx +2 -0
  391. package/src/examples/internal/scrollbox-demo.tsx +3 -27
  392. package/src/examples/internal/scrollbox-with-descendants.tsx +4 -7
  393. package/src/examples/internal/simple-scrollbox.vitest.tsx +7 -5
  394. package/src/examples/list-detail-metadata.tsx +49 -0
  395. package/src/examples/list-detail-metadata.vitest.tsx +88 -0
  396. package/src/examples/list-dropdown-default.vitest.tsx +51 -51
  397. package/src/examples/list-fetch-data.vitest.tsx +4 -4
  398. package/src/examples/list-scrollbox.vitest.tsx +73 -14
  399. package/src/examples/list-with-detail-long.tsx +70 -0
  400. package/src/examples/list-with-detail.vitest.tsx +191 -85
  401. package/src/examples/list-with-dropdown.vitest.tsx +53 -53
  402. package/src/examples/list-with-sections.tsx +1 -0
  403. package/src/examples/list-with-sections.vitest.tsx +221 -97
  404. package/src/examples/list-with-toast.vitest.tsx +16 -16
  405. package/src/examples/simple-file-picker.vitest.tsx +63 -469
  406. package/src/examples/simple-grid.vitest.tsx +238 -233
  407. package/src/examples/simple-navigation.tsx +15 -7
  408. package/src/examples/simple-navigation.vitest.tsx +130 -219
  409. package/src/examples/store.vitest.tsx +1 -1
  410. package/src/examples/swift-extension.vitest.tsx +148 -0
  411. package/src/examples/synonyms.vitest.tsx +159 -0
  412. package/src/examples/toast-variations.tsx +150 -0
  413. package/src/examples/toast-variations.vitest.tsx +370 -0
  414. package/src/extensions/dev.tsx +74 -7
  415. package/src/extensions/dev.vitest.tsx +102 -34
  416. package/src/extensions/home.tsx +6 -0
  417. package/src/index.tsx +3 -0
  418. package/src/internal/dialog.tsx +43 -30
  419. package/src/internal/navigation.tsx +3 -1
  420. package/src/internal/offscreen.tsx +15 -0
  421. package/src/internal/providers.tsx +4 -2
  422. package/src/internal/scrollbox.tsx +4 -8
  423. package/src/keyboard.test.tsx +69 -0
  424. package/src/release.tsx +32 -38
  425. package/src/state.tsx +7 -0
  426. package/src/swift-loader.tsx +239 -0
  427. package/src/swift-runtime.tsx +36 -0
  428. package/src/utils/file-system.ts +61 -0
  429. package/src/utils/run-command.tsx +82 -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 (
@@ -43,9 +43,10 @@ test('file picker with autocomplete', async () => {
43
43
 
44
44
 
45
45
 
46
+
46
47
  ◆ Your Name
47
- John Doe
48
-
48
+ John Doe
49
+
49
50
  ◇ Select Files
50
51
  │ Enter file path...
51
52
 
@@ -76,18 +77,24 @@ test('file picker with autocomplete', async () => {
76
77
 
77
78
 
78
79
 
79
- ctrl ↵ submit ↑↓ navigate ^k actions"
80
+ ctrl ↵ submit tab navigate ^k actions"
80
81
  `)
82
+ }, 10000)
81
83
 
82
- // Tab to navigate to file picker field
84
+ test('typing opens autocomplete dialog with file list', async () => {
85
+ await session.text({
86
+ waitFor: (text) => /Your Name/i.test(text),
87
+ })
88
+
89
+ // Tab to file picker field
83
90
  await session.press('tab')
84
91
  await session.press('tab')
85
92
 
86
- // Type "src" to trigger autocomplete
87
- await session.type('src')
93
+ // Type to trigger autocomplete
94
+ await session.type('s')
88
95
 
89
96
  const autocompleteSnapshot = await session.text({
90
- waitFor: (text) => text.includes('📁 src'),
97
+ waitFor: (text) => text.includes('Filter:') && text.includes('📁'),
91
98
  })
92
99
  expect(autocompleteSnapshot).toMatchInlineSnapshot(`
93
100
  "
@@ -105,199 +112,23 @@ test('file picker with autocomplete', async () => {
105
112
 
106
113
 
107
114
 
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
-
115
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
116
+ ◇┃
117
+ │┃ Filter: s
118
+ │┃
119
+ ◇┃ 📁 extensions/
120
+ │┃ 📁 extensions/messages/
121
+ │┃ 📁 extensions/messages/assets/
122
+ │┃ 📁 extensions/messages/metadata/
123
+ │┃ 📁 extensions/messages/src/
124
+ ◆┃ 📁 extensions/messages/src/api/
125
+ │┃ 📁 extensions/messages/src/components/
126
+ │┃ 📁 extensions/messages/src/hooks/
127
+ │┃ 📁 extensions/messages/src/tools/
128
+ │┃ 📁 extensions/messages/swift/
129
+ ◇┃
130
+ │┃ ↑↓ navigate ⏎/tab select esc close
131
+ │━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
301
132
  │ Choose exactly one file
302
133
 
303
134
 
@@ -315,146 +146,32 @@ test('file picker with autocomplete', async () => {
315
146
 
316
147
 
317
148
 
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"
149
+ ctrl ↵ submit tab navigate ^k actions"
381
150
  `)
382
151
  }, 15000)
383
152
 
384
- test('file picker keyboard navigation', async () => {
153
+ test('escape closes autocomplete without going back', async () => {
385
154
  await session.text({
386
- waitFor: (text) => {
387
- return /Your Name/i.test(text)
388
- },
155
+ waitFor: (text) => /Your Name/i.test(text),
389
156
  })
390
157
 
391
- // Tab to file picker
158
+ // Tab to file picker field
392
159
  await session.press('tab')
393
160
  await session.press('tab')
394
161
 
395
162
  // Type to trigger autocomplete
396
- await session.type('.')
163
+ await session.type('s')
397
164
 
398
- const withDotSnapshot = await session.text({
399
- waitFor: (text) => text.includes('📁 .termcast-bundle'),
165
+ await session.text({
166
+ waitFor: (text) => text.includes('Filter:'),
400
167
  })
401
- expect(withDotSnapshot).toMatchInlineSnapshot(`
402
- "
403
-
404
-
405
-
406
-
407
-
408
168
 
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
169
+ // Press escape to close autocomplete
454
170
  await session.press('esc')
455
171
 
172
+ // Verify form is still visible (didn't navigate away)
456
173
  const afterEscapeSnapshot = await session.text({
457
- waitFor: (text) => text.includes('Select Folder') && !text.includes('📁 .termcast-bundle'),
174
+ waitFor: (text) => text.includes('Select Folder') && !text.includes('Filter:'),
458
175
  })
459
176
  expect(afterEscapeSnapshot).toMatchInlineSnapshot(`
460
177
  "
@@ -472,6 +189,7 @@ test('file picker keyboard navigation', async () => {
472
189
 
473
190
 
474
191
 
192
+
475
193
  ◇ Your Name
476
194
  │ John Doe
477
195
 
@@ -481,77 +199,10 @@ test('file picker keyboard navigation', async () => {
481
199
  │ Choose one or more files to upload
482
200
 
483
201
  ◆ Select Folder
484
- .
485
-
486
- ┃ Choose a folder for output
487
-
488
- ◇ Select Single File
489
- │ Enter file path...
202
+ s
490
203
 
491
- │ Choose exactly one file
492
-
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
204
+ │ Choose a folder for output
549
205
 
550
- ◆ Select Folder
551
- ┃ .s
552
-
553
- ┃ Choose a folder for output
554
-
555
206
  ◇ Select Single File
556
207
  │ Enter file path...
557
208
 
@@ -572,35 +223,35 @@ test('file picker keyboard navigation', async () => {
572
223
 
573
224
 
574
225
 
575
- ctrl ↵ submit ↑↓ navigate ^k actions"
226
+ ctrl ↵ submit tab navigate ^k actions"
576
227
  `)
577
- }, 10000)
228
+ }, 15000)
578
229
 
579
- test('right arrow selects item and left arrow removes last selection', async () => {
230
+ test('selecting first item with enter adds it to the list', async () => {
580
231
  await session.text({
581
- waitFor: (text) => {
582
- return /Your Name/i.test(text)
583
- },
232
+ waitFor: (text) => /Your Name/i.test(text),
584
233
  })
585
234
 
586
- // Tab to file picker
235
+ // Tab to folder picker field (which shows directories)
587
236
  await session.press('tab')
588
237
  await session.press('tab')
589
238
 
590
239
  // Type to trigger autocomplete
591
- await session.type('src')
240
+ await session.type('s')
592
241
 
242
+ // Wait for dialog to appear with folders
593
243
  await session.text({
594
- waitFor: (text) => text.includes('📁 src'),
244
+ waitFor: (text) => text.includes('📁'),
595
245
  })
596
246
 
597
- // Use right arrow to select folder (instead of tab)
598
- await session.press('right')
247
+ // Press enter to select first match
248
+ await session.press('enter')
599
249
 
600
- const afterRightArrowSnapshot = await session.text({
601
- waitFor: (text) => text.includes('Selected files:') && text.includes('• src'),
250
+ // Verify file was added
251
+ const afterSelectSnapshot = await session.text({
252
+ waitFor: (text) => text.includes('Selected files:'),
602
253
  })
603
- expect(afterRightArrowSnapshot).toMatchInlineSnapshot(`
254
+ expect(afterSelectSnapshot).toMatchInlineSnapshot(`
604
255
  "
605
256
 
606
257
 
@@ -624,69 +275,13 @@ test('right arrow selects item and left arrow removes last selection', async ()
624
275
  │ Choose one or more files to upload
625
276
 
626
277
  ◆ 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
278
  │ Enter file path...
636
279
 
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...
280
+ Selected files:
281
+ │ • extensions
682
282
 
683
- │ Choose one or more files to upload
283
+ │ Choose a folder for output
684
284
 
685
- ◆ Select Folder
686
- ┃ Enter file path...
687
-
688
- ┃ Choose a folder for output
689
-
690
285
  ◇ Select Single File
691
286
  │ Enter file path...
692
287
 
@@ -706,7 +301,6 @@ test('right arrow selects item and left arrow removes last selection', async ()
706
301
 
707
302
 
708
303
 
709
-
710
- ctrl ↵ submit ↑↓ navigate ^k actions"
304
+ ctrl ↵ submit tab navigate ^k actions"
711
305
  `)
712
306
  }, 15000)