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,370 @@
1
+ import { test, expect, afterEach, beforeEach } from 'vitest'
2
+ import { launchTerminal, Session } from 'tuistory/src'
3
+
4
+ let session: Session
5
+
6
+ beforeEach(async () => {
7
+ session = await launchTerminal({
8
+ command: 'bun',
9
+ args: ['src/examples/toast-variations.tsx'],
10
+ cols: 80,
11
+ rows: 30,
12
+ })
13
+ })
14
+
15
+ afterEach(() => {
16
+ session?.close()
17
+ })
18
+
19
+ test('toast variations display correctly', async () => {
20
+ // Simple Success
21
+ const simpleSuccess = await session.text({
22
+ waitFor: (text) => text.includes('Simple Success') && text.includes('Success'),
23
+ })
24
+ expect(simpleSuccess).toMatchInlineSnapshot(`
25
+ "
26
+
27
+
28
+ Toast Variations ─────────────────────────────────────────────────────────
29
+
30
+ Search...
31
+
32
+ ›Simple Success
33
+ Simple Failure
34
+ With Short Message
35
+ With Long Message
36
+ With Super Long Message
37
+ With Primary Action
38
+ With Both Actions
39
+ Long Title with Actions
40
+ Animated Loading
41
+ Error with Retry
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+ ┌──────────────────────────────────────────────────────────────────────────┐
52
+ │ ✓ Success │
53
+ └──────────────────────────────────────────────────────────────────────────┘"
54
+ `)
55
+
56
+ // Simple Failure
57
+ await session.press('down')
58
+ const simpleFailure = await session.text()
59
+ expect(simpleFailure).toMatchInlineSnapshot(`
60
+ "
61
+
62
+
63
+ Toast Variations ─────────────────────────────────────────────────────────
64
+
65
+ Search...
66
+
67
+ Simple Success
68
+ ›Simple Failure
69
+ With Short Message
70
+ With Long Message
71
+ With Super Long Message
72
+ With Primary Action
73
+ With Both Actions
74
+ Long Title with Actions
75
+ Animated Loading
76
+ Error with Retry
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+ ┌──────────────────────────────────────────────────────────────────────────┐
87
+ │ ✗ Error │
88
+ └──────────────────────────────────────────────────────────────────────────┘"
89
+ `)
90
+
91
+ // With Short Message
92
+ await session.press('down')
93
+ const shortMessage = await session.text()
94
+ expect(shortMessage).toMatchInlineSnapshot(`
95
+ "
96
+
97
+
98
+ Toast Variations ─────────────────────────────────────────────────────────
99
+
100
+ Search...
101
+
102
+ Simple Success
103
+ Simple Failure
104
+ ›With Short Message
105
+ With Long Message
106
+ With Super Long Message
107
+ With Primary Action
108
+ With Both Actions
109
+ Long Title with Actions
110
+ Animated Loading
111
+ Error with Retry
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+ ┌──────────────────────────────────────────────────────────────────────────┐
121
+ │ ✓ Copied │
122
+ │ Text copied to clipboard │
123
+ └──────────────────────────────────────────────────────────────────────────┘"
124
+ `)
125
+
126
+ // With Long Message
127
+ await session.press('down')
128
+ const longMessage = await session.text()
129
+ expect(longMessage).toMatchInlineSnapshot(`
130
+ "
131
+
132
+
133
+ Toast Variations ─────────────────────────────────────────────────────────
134
+
135
+ Search...
136
+
137
+ Simple Success
138
+ Simple Failure
139
+ With Short Message
140
+ ›With Long Message
141
+ With Super Long Message
142
+ With Primary Action
143
+ With Both Actions
144
+ Long Title with Actions
145
+ Animated Loading
146
+ Error with Retry
147
+
148
+
149
+
150
+
151
+
152
+
153
+ ┌──────────────────────────────────────────────────────────────────────────┐
154
+ │ ✗ Error │
155
+ │ This is a very long error message that should wrap to multiple lines │
156
+ │ when displayed in the toast component. It contains detailed │
157
+ │ information about what went wrong during the operation. │
158
+ └──────────────────────────────────────────────────────────────────────────┘"
159
+ `)
160
+
161
+ // With Super Long Message
162
+ await session.press('down')
163
+ const superLongMessage = await session.text()
164
+ expect(superLongMessage).toMatchInlineSnapshot(`
165
+ "
166
+
167
+
168
+ Toast Variations ─────────────────────────────────────────────────────────
169
+
170
+ Search...
171
+
172
+ Simple Success
173
+ Simple Failure
174
+ With Short Message
175
+ With Long Message
176
+ ›With Super Long Message
177
+ With Primary Action
178
+ With Both Actions
179
+ Long Title with Actions
180
+ Animated Loading
181
+ Error with Retry
182
+
183
+
184
+
185
+ ┌──────────────────────────────────────────────────────────────────────────┐
186
+ │ ✗ Warning │
187
+ │ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do │
188
+ │ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim │
189
+ │ ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut │
190
+ │ aliquip ex ea commodo consequat. Duis aute irure dolor in │
191
+ │ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla │
192
+ │ pariatur. │
193
+ └──────────────────────────────────────────────────────────────────────────┘"
194
+ `)
195
+
196
+ // With Primary Action
197
+ await session.press('down')
198
+ const primaryAction = await session.text()
199
+ expect(primaryAction).toMatchInlineSnapshot(`
200
+ "
201
+
202
+
203
+ Toast Variations ─────────────────────────────────────────────────────────
204
+
205
+ Search...
206
+
207
+ Simple Success
208
+ Simple Failure
209
+ With Short Message
210
+ With Long Message
211
+ With Super Long Message
212
+ ›With Primary Action
213
+ With Both Actions
214
+ Long Title with Actions
215
+ Animated Loading
216
+ Error with Retry
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+ ┌──────────────────────────────────────────────────────────────────────────┐
226
+ │ ✓ File Deleted [Undo ↵] │
227
+ │ document.pdf was moved to trash │
228
+ └──────────────────────────────────────────────────────────────────────────┘"
229
+ `)
230
+
231
+ // With Both Actions
232
+ await session.press('down')
233
+ const bothActions = await session.text()
234
+ expect(bothActions).toMatchInlineSnapshot(`
235
+ "
236
+
237
+
238
+ Toast Variations ─────────────────────────────────────────────────────────
239
+
240
+ Search...
241
+
242
+ Simple Success
243
+ Simple Failure
244
+ With Short Message
245
+ With Long Message
246
+ With Super Long Message
247
+ With Primary Action
248
+ ›With Both Actions
249
+ Long Title with Actions
250
+ Animated Loading
251
+ Error with Retry
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+ ┌──────────────────────────────────────────────────────────────────────────┐
261
+ │ ✓ Update Available [Install ↵] [Later ⇥] │
262
+ │ Version 2.0 is ready to install │
263
+ └──────────────────────────────────────────────────────────────────────────┘"
264
+ `)
265
+
266
+ // Long Title with Actions
267
+ await session.press('down')
268
+ const longTitleActions = await session.text()
269
+ expect(longTitleActions).toMatchInlineSnapshot(`
270
+ "
271
+
272
+
273
+ Toast Variations ─────────────────────────────────────────────────────────
274
+
275
+ Search...
276
+
277
+ Simple Success
278
+ Simple Failure
279
+ With Short Message
280
+ With Long Message
281
+ With Super Long Message
282
+ With Primary Action
283
+ With Both Actions
284
+ ›Long Title with Actions
285
+ Animated Loading
286
+ Error with Retry
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+ ┌──────────────────────────────────────────────────────────────────────────┐
296
+ │ ✓ Operation Completed Successfully [View Results ↵] [Dismiss ⇥] │
297
+ │ All files have been processed │
298
+ └──────────────────────────────────────────────────────────────────────────┘"
299
+ `)
300
+
301
+ // Animated Loading
302
+ await session.press('down')
303
+ const animatedLoading = await session.text()
304
+ expect(animatedLoading).toMatchInlineSnapshot(`
305
+ "
306
+
307
+
308
+ Toast Variations ─────────────────────────────────────────────────────────
309
+
310
+ Search...
311
+
312
+ Simple Success
313
+ Simple Failure
314
+ With Short Message
315
+ With Long Message
316
+ With Super Long Message
317
+ With Primary Action
318
+ With Both Actions
319
+ Long Title with Actions
320
+ ›Animated Loading
321
+ Error with Retry
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+ ┌──────────────────────────────────────────────────────────────────────────┐
331
+ │ ⣽ Processing │
332
+ │ Please wait while we process your request... │
333
+ └──────────────────────────────────────────────────────────────────────────┘"
334
+ `)
335
+
336
+ // Error with Retry
337
+ await session.press('down')
338
+ const errorRetry = await session.text()
339
+ expect(errorRetry).toMatchInlineSnapshot(`
340
+ "
341
+
342
+
343
+ Toast Variations ─────────────────────────────────────────────────────────
344
+
345
+ Search...
346
+
347
+ Simple Success
348
+ Simple Failure
349
+ With Short Message
350
+ With Long Message
351
+ With Super Long Message
352
+ With Primary Action
353
+ With Both Actions
354
+ Long Title with Actions
355
+ Animated Loading
356
+ ›Error with Retry
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+ ┌──────────────────────────────────────────────────────────────────────────┐
365
+ │ ✗ Connection Failed [Retry ↵] │
366
+ │ Unable to connect to the server. Please check your internet │
367
+ │ connection and try again. │
368
+ └──────────────────────────────────────────────────────────────────────────┘"
369
+ `)
370
+ }, 30000)
@@ -11,7 +11,12 @@ import { showToast, Toast } from 'termcast/src/apis/toast'
11
11
  import { Icon } from 'termcast'
12
12
  import { getCommandsWithFiles, CommandWithFile } from '../package-json'
13
13
  import { buildExtensionCommands } from '../build'
14
- import { runCommand, clearCommandArguments } from '../utils/run-command'
14
+ import {
15
+ runCommand,
16
+ clearCommandArguments,
17
+ parseExtensionArgs,
18
+ handleHelpFlag,
19
+ } from '../utils/run-command'
15
20
 
16
21
  interface BundledCommand extends CommandWithFile {
17
22
  bundledPath: string
@@ -21,15 +26,18 @@ interface BundledCommand extends CommandWithFile {
21
26
  function ExtensionCommandsList({
22
27
  extensionPath,
23
28
  commands,
29
+ skipArgv,
24
30
  }: {
25
31
  extensionPath: string
26
32
  commands: BundledCommand[]
33
+ skipArgv?: number
27
34
  }): any {
28
35
  const { push } = useNavigation()
29
36
  const { packageJson } = getCommandsWithFiles({
30
37
  packageJsonPath: path.join(extensionPath, 'package.json'),
31
38
  })
32
- const devRebuildCount = useStore((state) => state.devRebuildCount)
39
+
40
+ const visibleCommands = commands.filter((cmd) => cmd.mode !== 'menu-bar')
33
41
 
34
42
  const handleCommandSelect = async (command: BundledCommand) => {
35
43
  clearCommandArguments()
@@ -51,7 +59,6 @@ function ExtensionCommandsList({
51
59
  bundledPath: command.bundledPath,
52
60
  Component: command.Component,
53
61
  push,
54
- cacheBustParam: String(devRebuildCount),
55
62
  })
56
63
  } catch (error: any) {
57
64
  await showToast({
@@ -62,13 +69,43 @@ function ExtensionCommandsList({
62
69
  }
63
70
  }
64
71
 
72
+ // Auto-run command from CLI arg or single command
73
+ React.useLayoutEffect(() => {
74
+ // Only parse argv on initial load (when skipArgv is provided), not on rebuilds
75
+ if (skipArgv != null) {
76
+ const { commandName } = parseExtensionArgs({ skipArgv })
77
+
78
+ if (commandName) {
79
+ const command = visibleCommands.find((cmd) => cmd.name === commandName)
80
+ if (command) {
81
+ handleCommandSelect(command)
82
+ } else {
83
+ showToast({
84
+ style: Toast.Style.Failure,
85
+ title: 'Command not found',
86
+ message: `No command named "${commandName}"`,
87
+ })
88
+ }
89
+ return
90
+ }
91
+ }
92
+
93
+ if (visibleCommands.length === 1) {
94
+ handleCommandSelect(visibleCommands[0])
95
+ }
96
+ }, [])
97
+
98
+ if (visibleCommands.length === 1) {
99
+ return null
100
+ }
101
+
65
102
  return (
66
103
  <List
67
104
  navigationTitle={packageJson.title || 'Extension Commands'}
68
105
  searchBarPlaceholder='Search commands...'
69
106
  >
70
107
  <List.Section title='Commands'>
71
- {commands.filter((cmd) => cmd.mode !== 'menu-bar').map((command) => (
108
+ {visibleCommands.map((command) => (
72
109
  <List.Item
73
110
  key={command.name}
74
111
  id={command.name}
@@ -111,7 +148,7 @@ function ExtensionCommandsList({
111
148
  ))}
112
149
  </List.Section>
113
150
 
114
- {commands.length === 0 && (
151
+ {visibleCommands.length === 0 && (
115
152
  <List.Section title='No Commands'>
116
153
  <List.Item
117
154
  title='No commands found'
@@ -125,8 +162,10 @@ function ExtensionCommandsList({
125
162
 
126
163
  export async function startDevMode({
127
164
  extensionPath,
165
+ skipArgv = 0,
128
166
  }: {
129
167
  extensionPath: string
168
+ skipArgv?: number
130
169
  }): Promise<void> {
131
170
  const resolvedPath = path.resolve(extensionPath)
132
171
 
@@ -149,13 +188,24 @@ export async function startDevMode({
149
188
  target: 'bun',
150
189
  })
151
190
 
191
+ // Handle --help before rendering
192
+ handleHelpFlag({
193
+ extensionName: packageJson.title || packageJson.name,
194
+ commands: commands.map((cmd) => ({
195
+ name: cmd.name,
196
+ title: cmd.title,
197
+ description: cmd.description,
198
+ })),
199
+ skipArgv,
200
+ })
201
+
152
202
  // Reset state and set extension information
153
203
  useStore.setState({
154
204
  ...useStore.getInitialState(),
155
205
  extensionPath: resolvedPath,
156
206
  extensionPackageJson: packageJson,
157
207
  devElement: (
158
- <ExtensionCommandsList extensionPath={resolvedPath} commands={commands} />
208
+ <ExtensionCommandsList extensionPath={resolvedPath} commands={commands} skipArgv={skipArgv} />
159
209
  ),
160
210
  devRebuildCount: 1,
161
211
  })
@@ -174,6 +224,7 @@ export async function startDevMode({
174
224
  export async function startCompiledExtension({
175
225
  extensionPath,
176
226
  compiledCommands,
227
+ skipArgv = 0,
177
228
  }: {
178
229
  extensionPath: string
179
230
  compiledCommands: Array<{
@@ -181,6 +232,7 @@ export async function startCompiledExtension({
181
232
  bundledPath: string
182
233
  Component: (props: any) => any
183
234
  }>
235
+ skipArgv?: number
184
236
  }): Promise<void> {
185
237
  const packageJsonPath = path.join(extensionPath, 'package.json')
186
238
  const { packageJson, commands: commandsMetadata } = getCommandsWithFiles({
@@ -196,13 +248,25 @@ export async function startCompiledExtension({
196
248
  }
197
249
  })
198
250
 
251
+ // Handle --help before rendering
252
+ handleHelpFlag({
253
+ extensionName: packageJson.title || packageJson.name,
254
+ commands: commands.map((cmd) => ({
255
+ name: cmd.name,
256
+ title: cmd.title,
257
+ description: cmd.description,
258
+ })),
259
+ skipArgv,
260
+ })
261
+
199
262
  useStore.setState({
200
263
  ...useStore.getInitialState(),
201
264
  extensionPath,
202
265
  extensionPackageJson: packageJson,
203
266
  devElement: (
204
- <ExtensionCommandsList extensionPath={extensionPath} commands={commands} />
267
+ <ExtensionCommandsList extensionPath={extensionPath} commands={commands} skipArgv={skipArgv} />
205
268
  ),
269
+ devRebuildCount: 1,
206
270
  })
207
271
 
208
272
  function App(): any {
@@ -242,6 +306,9 @@ export async function triggerRebuild({
242
306
  />
243
307
  ),
244
308
  devRebuildCount: state.devRebuildCount + 1,
309
+ navigationStack: [], // Reset navigation so NavigationProvider re-initializes with new devElement
310
+ dialogStack: [], // Clear any open dialogs/toasts on rebuild
311
+ toast: null,
245
312
  })
246
313
  } catch (error: any) {
247
314
  await showToast({