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
@@ -0,0 +1,148 @@
1
+ import { test, expect, beforeEach, afterEach } from 'vitest'
2
+ import { launchTerminal, Session } from 'tuistory/src'
3
+ import { execSync } from 'node:child_process'
4
+ import fs from 'node:fs'
5
+ import path from 'node:path'
6
+
7
+ const fixtureDir = path.resolve(__dirname, '../../fixtures/swift-extension')
8
+
9
+ // Find binary - check debug first, then release
10
+ function findSwiftBinary(): string {
11
+ const debugPath = path.join(fixtureDir, 'swift/.build/debug/SwiftAPI')
12
+ const releasePath = path.join(fixtureDir, 'swift/.build/release/SwiftAPI')
13
+ if (fs.existsSync(debugPath)) {
14
+ return debugPath
15
+ }
16
+ if (fs.existsSync(releasePath)) {
17
+ return releasePath
18
+ }
19
+ throw new Error(`Swift binary not found at ${debugPath} or ${releasePath}`)
20
+ }
21
+
22
+ const swiftBinary = findSwiftBinary()
23
+
24
+ test('swift binary returns items correctly', () => {
25
+ const stdout = execSync(`${swiftBinary} getItems`, { encoding: 'utf-8' })
26
+ expect(JSON.parse(stdout)).toMatchInlineSnapshot(`
27
+ [
28
+ {
29
+ "id": "1",
30
+ "subtitle": "Generated by Swift",
31
+ "title": "Swift Item One",
32
+ },
33
+ {
34
+ "id": "2",
35
+ "subtitle": "From native code",
36
+ "title": "Swift Item Two",
37
+ },
38
+ {
39
+ "id": "3",
40
+ "subtitle": "Fast and safe",
41
+ "title": "Swift Item Three",
42
+ },
43
+ ]
44
+ `)
45
+ })
46
+
47
+ test('swift binary greet function works', () => {
48
+ const stdout = execSync(`${swiftBinary} greet '"World"'`, { encoding: 'utf-8' })
49
+ expect(JSON.parse(stdout)).toMatchInlineSnapshot(`"Hello, World! Greetings from Swift."`)
50
+ })
51
+
52
+ let session: Session
53
+
54
+ beforeEach(async () => {
55
+ session = await launchTerminal({
56
+ command: 'bun',
57
+ args: ['src/cli.tsx', 'dev', fixtureDir],
58
+ cwd: path.resolve(__dirname, '../..'),
59
+ cols: 70,
60
+ rows: 25,
61
+ })
62
+ })
63
+
64
+ afterEach(() => {
65
+ session?.close()
66
+ })
67
+
68
+ test('swift extension dev mode shows command list', async () => {
69
+ // Wait for command list to appear
70
+ const commandList = await session.text({
71
+ waitFor: (text) => /Swift List/i.test(text),
72
+ timeout: 30000,
73
+ })
74
+
75
+ expect(commandList).toMatchInlineSnapshot(`
76
+ "
77
+
78
+
79
+ Swift Test Extension ───────────────────────────────────────────
80
+
81
+ Search commands...
82
+
83
+ Commands
84
+ ›List Items Displays a simple list with some items view
85
+ Swift List Displays a list of items returned by a Swift fu view
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+ ↵ run command ↑↓ navigate ^k actions"
100
+ `)
101
+ }, 60000)
102
+
103
+ test('swift extension runs Swift List command and shows items', async () => {
104
+ // Wait for command list to appear
105
+ await session.text({
106
+ waitFor: (text) => /Swift List/i.test(text),
107
+ timeout: 30000,
108
+ })
109
+
110
+ // Navigate down to Swift List (it's the second item)
111
+ await session.press('down')
112
+
113
+ // Select the Swift List command
114
+ await session.press('return')
115
+
116
+ // Wait for Swift items to load and display
117
+ const swiftListOutput = await session.text({
118
+ waitFor: (text) => text.includes('Swift Item One'),
119
+ timeout: 30000,
120
+ })
121
+
122
+ expect(swiftListOutput).toMatchInlineSnapshot(`
123
+ "
124
+
125
+
126
+ Swift Items ────────────────────────────────────────────────────
127
+
128
+ Search...
129
+
130
+ Items from Swift
131
+ ›Swift Item One Generated by Swift
132
+ Swift Item Two From native code
133
+ Swift Item Three Fast and safe
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+ ↑↓ navigate ^k actions"
147
+ `)
148
+ }, 60000)
@@ -0,0 +1,159 @@
1
+ import { test, expect, beforeEach, afterEach, beforeAll } from 'vitest'
2
+ import { launchTerminal, Session } from 'tuistory/src'
3
+ import { execSync } from 'node:child_process'
4
+ import path from 'node:path'
5
+
6
+ const extensionDir = path.resolve(__dirname, '../../extensions/synonyms')
7
+
8
+ // Install dependencies before running tests
9
+ beforeAll(() => {
10
+ execSync('bun install', { cwd: extensionDir, stdio: 'inherit' })
11
+ }, 60000)
12
+
13
+ let session: Session
14
+
15
+ beforeEach(async () => {
16
+ session = await launchTerminal({
17
+ command: 'bun',
18
+ args: ['src/cli.tsx', 'dev', extensionDir],
19
+ cwd: path.resolve(__dirname, '../..'),
20
+ cols: 80,
21
+ rows: 30,
22
+ })
23
+ })
24
+
25
+ afterEach(() => {
26
+ session?.close()
27
+ })
28
+
29
+ test('synonyms extension shows preferences form on first launch', async () => {
30
+ // Wait for preferences form to appear (extension requires LLM provider setup)
31
+ await session.text({
32
+ waitFor: (text) => /LLM Provider/i.test(text),
33
+ timeout: 30000,
34
+ })
35
+
36
+ // Wait for auto-focus to settle
37
+ await session.waitIdle()
38
+
39
+ const preferencesForm = await session.text()
40
+
41
+ expect(preferencesForm).toMatchInlineSnapshot(`
42
+ "
43
+
44
+
45
+ ◇ LLM Provider ▀
46
+ │ Select...
47
+
48
+ │ ○ Raycast AI
49
+ │ ○ OpenAI
50
+ │ ○ OpenAI Compatible
51
+ │ ○ Anthropic
52
+ │ ○ Fireworks.ai
53
+
54
+ │ Select the LLM provider you want to use
55
+
56
+ ◇ OpenAI API Key
57
+
58
+ │ API Key for OpenAI
59
+
60
+ ◇ OpenAI Model
61
+ │ gpt-4.1-mini
62
+
63
+ │ Model name for OpenAI
64
+
65
+ ◇ OpenAI Compatible URL
66
+
67
+
68
+ │ Base URL for OpenAI compatible provider
69
+
70
+
71
+ ctrl ↵ submit tab navigate ^k actions"
72
+ `)
73
+ }, 60000)
74
+
75
+ test('synonyms extension preferences form can be navigated', async () => {
76
+ // Wait for preferences form to appear
77
+ await session.text({
78
+ waitFor: (text) => /LLM Provider/i.test(text),
79
+ timeout: 30000,
80
+ })
81
+
82
+ // Wait for auto-focus to settle
83
+ await session.waitIdle()
84
+
85
+ // Navigate down in the dropdown
86
+ await session.press('down')
87
+ await session.press('down')
88
+
89
+ const afterNavigate = await session.text()
90
+ expect(afterNavigate).toMatchInlineSnapshot(`
91
+ "
92
+
93
+
94
+ ◇ LLM Provider ▀
95
+ │ Select...
96
+
97
+ │ ○ Raycast AI
98
+ │ ○ OpenAI
99
+ │ ○ OpenAI Compatible
100
+ │ ○ Anthropic
101
+ │ ○ Fireworks.ai
102
+
103
+ │ Select the LLM provider you want to use
104
+
105
+ ◇ OpenAI API Key
106
+
107
+ │ API Key for OpenAI
108
+
109
+ ◇ OpenAI Model
110
+ │ gpt-4.1-mini
111
+
112
+ │ Model name for OpenAI
113
+
114
+ ◇ OpenAI Compatible URL
115
+
116
+
117
+ │ Base URL for OpenAI compatible provider
118
+
119
+
120
+ ctrl ↵ submit tab navigate ^k actions"
121
+ `)
122
+
123
+ // Press tab to move to next field
124
+ await session.press('tab')
125
+
126
+ const afterTab = await session.text()
127
+ expect(afterTab).toMatchInlineSnapshot(`
128
+ "
129
+
130
+
131
+ ◆ LLM Provider ▀
132
+ │ Select...
133
+
134
+ │› ○ Raycast AI
135
+ │ ○ OpenAI
136
+ │ ○ OpenAI Compatible
137
+ │ ○ Anthropic
138
+ │ ○ Fireworks.ai
139
+
140
+ │ Select the LLM provider you want to use
141
+
142
+ ◇ OpenAI API Key
143
+
144
+ │ API Key for OpenAI
145
+
146
+ ◇ OpenAI Model
147
+ │ gpt-4.1-mini
148
+
149
+ │ Model name for OpenAI
150
+
151
+ ◇ OpenAI Compatible URL
152
+
153
+
154
+ │ Base URL for OpenAI compatible provider
155
+
156
+
157
+ ctrl ↵ submit tab navigate ^k actions"
158
+ `)
159
+ }, 60000)
@@ -0,0 +1,150 @@
1
+ import React, { useState } from 'react'
2
+ import { List, ActionPanel, Action, renderWithProviders } from 'termcast'
3
+ import { Toast, ToastContent } from 'termcast/src/apis/toast'
4
+
5
+ const toastVariations = [
6
+ {
7
+ name: 'Simple Success',
8
+ toast: new Toast({
9
+ title: 'Success',
10
+ style: Toast.Style.Success,
11
+ }),
12
+ },
13
+ {
14
+ name: 'Simple Failure',
15
+ toast: new Toast({
16
+ title: 'Error',
17
+ style: Toast.Style.Failure,
18
+ }),
19
+ },
20
+ {
21
+ name: 'With Short Message',
22
+ toast: new Toast({
23
+ title: 'Copied',
24
+ message: 'Text copied to clipboard',
25
+ style: Toast.Style.Success,
26
+ }),
27
+ },
28
+ {
29
+ name: 'With Long Message',
30
+ toast: new Toast({
31
+ title: 'Error',
32
+ message:
33
+ 'This is a very long error message that should wrap to multiple lines when displayed in the toast component. It contains detailed information about what went wrong during the operation.',
34
+ style: Toast.Style.Failure,
35
+ }),
36
+ },
37
+ {
38
+ name: 'With Super Long Message',
39
+ toast: new Toast({
40
+ title: 'Warning',
41
+ message:
42
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.',
43
+ style: Toast.Style.Failure,
44
+ }),
45
+ },
46
+ {
47
+ name: 'With Primary Action',
48
+ toast: new Toast({
49
+ title: 'File Deleted',
50
+ message: 'document.pdf was moved to trash',
51
+ style: Toast.Style.Success,
52
+ primaryAction: {
53
+ title: 'Undo',
54
+ onAction: () => {},
55
+ },
56
+ }),
57
+ },
58
+ {
59
+ name: 'With Both Actions',
60
+ toast: new Toast({
61
+ title: 'Update Available',
62
+ message: 'Version 2.0 is ready to install',
63
+ style: Toast.Style.Success,
64
+ primaryAction: {
65
+ title: 'Install',
66
+ onAction: () => {},
67
+ },
68
+ secondaryAction: {
69
+ title: 'Later',
70
+ onAction: () => {},
71
+ },
72
+ }),
73
+ },
74
+ {
75
+ name: 'Long Title with Actions',
76
+ toast: new Toast({
77
+ title: 'Operation Completed Successfully',
78
+ message: 'All files have been processed',
79
+ style: Toast.Style.Success,
80
+ primaryAction: {
81
+ title: 'View Results',
82
+ onAction: () => {},
83
+ },
84
+ secondaryAction: {
85
+ title: 'Dismiss',
86
+ onAction: () => {},
87
+ },
88
+ }),
89
+ },
90
+ {
91
+ name: 'Animated Loading',
92
+ toast: new Toast({
93
+ title: 'Processing',
94
+ message: 'Please wait while we process your request...',
95
+ style: Toast.Style.Animated,
96
+ }),
97
+ },
98
+ {
99
+ name: 'Error with Retry',
100
+ toast: new Toast({
101
+ title: 'Connection Failed',
102
+ message:
103
+ 'Unable to connect to the server. Please check your internet connection and try again.',
104
+ style: Toast.Style.Failure,
105
+ primaryAction: {
106
+ title: 'Retry',
107
+ onAction: () => {},
108
+ },
109
+ }),
110
+ },
111
+ ]
112
+
113
+ function ToastVariationsExample(): any {
114
+ const [selectedIndex, setSelectedIndex] = useState(0)
115
+ const selectedToast = toastVariations[selectedIndex]
116
+
117
+ return (
118
+ <box flexDirection="column" width="100%" height="100%">
119
+ <List
120
+ navigationTitle="Toast Variations"
121
+ onSelectionChange={(id) => {
122
+ if (id) {
123
+ const index = toastVariations.findIndex((v) => v.name === id)
124
+ if (index !== -1) {
125
+ setSelectedIndex(index)
126
+ }
127
+ }
128
+ }}
129
+ >
130
+ {toastVariations.map((variation) => (
131
+ <List.Item
132
+ key={variation.name}
133
+ id={variation.name}
134
+ title={variation.name}
135
+ actions={
136
+ <ActionPanel>
137
+ <Action title="Select" onAction={() => {}} />
138
+ </ActionPanel>
139
+ }
140
+ />
141
+ ))}
142
+ </List>
143
+ <box position="absolute" bottom={0} left={0} width="100%">
144
+ <ToastContent toast={selectedToast.toast} onHide={() => {}} />
145
+ </box>
146
+ </box>
147
+ )
148
+ }
149
+
150
+ renderWithProviders(<ToastVariationsExample />)