termcast 1.3.21 → 1.3.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/dist/ai.d.ts +104 -0
  2. package/dist/ai.d.ts.map +1 -0
  3. package/dist/ai.js +135 -0
  4. package/dist/ai.js.map +1 -0
  5. package/dist/apis/browser-extension.d.ts +18 -0
  6. package/dist/apis/browser-extension.d.ts.map +1 -0
  7. package/dist/apis/browser-extension.js +14 -0
  8. package/dist/apis/browser-extension.js.map +1 -0
  9. package/dist/apis/localstorage.d.ts.map +1 -1
  10. package/dist/apis/localstorage.js +4 -7
  11. package/dist/apis/localstorage.js.map +1 -1
  12. package/dist/apis/oauth.d.ts.map +1 -1
  13. package/dist/apis/oauth.js +5 -1
  14. package/dist/apis/oauth.js.map +1 -1
  15. package/dist/apis/preferences.d.ts.map +1 -1
  16. package/dist/apis/preferences.js +38 -19
  17. package/dist/apis/preferences.js.map +1 -1
  18. package/dist/build.d.ts.map +1 -1
  19. package/dist/build.js +2 -1
  20. package/dist/build.js.map +1 -1
  21. package/dist/cache.d.ts +32 -0
  22. package/dist/cache.d.ts.map +1 -0
  23. package/dist/cache.js +205 -0
  24. package/dist/cache.js.map +1 -0
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +67 -31
  27. package/dist/cli.js.map +1 -1
  28. package/dist/clipboard.d.ts +36 -0
  29. package/dist/clipboard.d.ts.map +1 -0
  30. package/dist/clipboard.js +154 -0
  31. package/dist/clipboard.js.map +1 -0
  32. package/dist/compile.d.ts.map +1 -1
  33. package/dist/compile.js +22 -5
  34. package/dist/compile.js.map +1 -1
  35. package/dist/components/actions.d.ts.map +1 -1
  36. package/dist/components/actions.js +56 -30
  37. package/dist/components/actions.js.map +1 -1
  38. package/dist/components/detail.d.ts.map +1 -1
  39. package/dist/components/detail.js +4 -0
  40. package/dist/components/detail.js.map +1 -1
  41. package/dist/components/dropdown.d.ts.map +1 -1
  42. package/dist/components/dropdown.js +38 -15
  43. package/dist/components/dropdown.js.map +1 -1
  44. package/dist/components/extension-preferences.d.ts.map +1 -1
  45. package/dist/components/extension-preferences.js +40 -13
  46. package/dist/components/extension-preferences.js.map +1 -1
  47. package/dist/components/form/checkbox.d.ts.map +1 -1
  48. package/dist/components/form/checkbox.js +5 -3
  49. package/dist/components/form/checkbox.js.map +1 -1
  50. package/dist/components/form/date-picker.d.ts.map +1 -1
  51. package/dist/components/form/date-picker.js +5 -3
  52. package/dist/components/form/date-picker.js.map +1 -1
  53. package/dist/components/form/description.d.ts.map +1 -1
  54. package/dist/components/form/description.js +2 -2
  55. package/dist/components/form/description.js.map +1 -1
  56. package/dist/components/form/dropdown.d.ts.map +1 -1
  57. package/dist/components/form/dropdown.js +84 -80
  58. package/dist/components/form/dropdown.js.map +1 -1
  59. package/dist/components/form/file-autocomplete.d.ts +3 -6
  60. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  61. package/dist/components/form/file-autocomplete.js +61 -66
  62. package/dist/components/form/file-autocomplete.js.map +1 -1
  63. package/dist/components/form/file-picker.d.ts.map +1 -1
  64. package/dist/components/form/file-picker.js +33 -30
  65. package/dist/components/form/file-picker.js.map +1 -1
  66. package/dist/components/form/form-end.d.ts.map +1 -1
  67. package/dist/components/form/form-end.js +21 -1
  68. package/dist/components/form/form-end.js.map +1 -1
  69. package/dist/components/form/form-type-only.d.ts +174 -0
  70. package/dist/components/form/form-type-only.d.ts.map +1 -0
  71. package/dist/components/form/form-type-only.js +2 -0
  72. package/dist/components/form/form-type-only.js.map +1 -0
  73. package/dist/components/form/index.d.ts +3 -1
  74. package/dist/components/form/index.d.ts.map +1 -1
  75. package/dist/components/form/index.js +100 -28
  76. package/dist/components/form/index.js.map +1 -1
  77. package/dist/components/form/password-field.d.ts.map +1 -1
  78. package/dist/components/form/password-field.js +5 -3
  79. package/dist/components/form/password-field.js.map +1 -1
  80. package/dist/components/form/text-area.d.ts.map +1 -1
  81. package/dist/components/form/text-area.js +5 -3
  82. package/dist/components/form/text-area.js.map +1 -1
  83. package/dist/components/form/text-field.d.ts.map +1 -1
  84. package/dist/components/form/text-field.js +6 -4
  85. package/dist/components/form/text-field.js.map +1 -1
  86. package/dist/components/form/types.d.ts +5 -0
  87. package/dist/components/form/types.d.ts.map +1 -1
  88. package/dist/components/form/use-form-handling.d.ts +4 -0
  89. package/dist/components/form/use-form-handling.d.ts.map +1 -0
  90. package/dist/components/form/use-form-handling.js +37 -0
  91. package/dist/components/form/use-form-handling.js.map +1 -0
  92. package/dist/components/form/with-left-border.d.ts +2 -1
  93. package/dist/components/form/with-left-border.d.ts.map +1 -1
  94. package/dist/components/form/with-left-border.js +27 -3
  95. package/dist/components/form/with-left-border.js.map +1 -1
  96. package/dist/components/icon.d.ts +1 -0
  97. package/dist/components/icon.d.ts.map +1 -1
  98. package/dist/components/icon.js +24 -8
  99. package/dist/components/icon.js.map +1 -1
  100. package/dist/components/list.d.ts +2 -2
  101. package/dist/components/list.d.ts.map +1 -1
  102. package/dist/components/list.js +140 -62
  103. package/dist/components/list.js.map +1 -1
  104. package/dist/components/loading-bar.d.ts.map +1 -1
  105. package/dist/components/loading-bar.js +2 -2
  106. package/dist/components/loading-bar.js.map +1 -1
  107. package/dist/components/loading-text.d.ts +8 -0
  108. package/dist/components/loading-text.d.ts.map +1 -0
  109. package/dist/components/loading-text.js +58 -0
  110. package/dist/components/loading-text.js.map +1 -0
  111. package/dist/descendants.js +1 -1
  112. package/dist/descendants.js.map +1 -1
  113. package/dist/dev-ui.d.ts +7 -0
  114. package/dist/dev-ui.d.ts.map +1 -0
  115. package/dist/dev-ui.js +118 -0
  116. package/dist/dev-ui.js.map +1 -0
  117. package/dist/environment.d.ts +63 -0
  118. package/dist/environment.d.ts.map +1 -0
  119. package/dist/environment.js +189 -0
  120. package/dist/environment.js.map +1 -0
  121. package/dist/examples/datepicker.d.ts +2 -0
  122. package/dist/examples/datepicker.d.ts.map +1 -0
  123. package/dist/examples/datepicker.js +344 -0
  124. package/dist/examples/datepicker.js.map +1 -0
  125. package/dist/examples/file-autocomplete.vitest.d.ts +2 -0
  126. package/dist/examples/file-autocomplete.vitest.d.ts.map +1 -0
  127. package/dist/examples/file-autocomplete.vitest.js +223 -0
  128. package/dist/examples/file-autocomplete.vitest.js.map +1 -0
  129. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +2 -0
  130. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +1 -0
  131. package/dist/examples/form-basic-arrow-keys.vitest.js +46 -0
  132. package/dist/examples/form-basic-arrow-keys.vitest.js.map +1 -0
  133. package/dist/examples/form-basic.vitest.d.ts +2 -0
  134. package/dist/examples/form-basic.vitest.d.ts.map +1 -0
  135. package/dist/examples/form-basic.vitest.js +630 -0
  136. package/dist/examples/form-basic.vitest.js.map +1 -0
  137. package/dist/examples/form-dropdown-with-sections.d.ts +2 -0
  138. package/dist/examples/form-dropdown-with-sections.d.ts.map +1 -0
  139. package/dist/examples/form-dropdown-with-sections.js +13 -0
  140. package/dist/examples/form-dropdown-with-sections.js.map +1 -0
  141. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +2 -0
  142. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +1 -0
  143. package/dist/examples/form-dropdown-with-sections.vitest.js +75 -0
  144. package/dist/examples/form-dropdown-with-sections.vitest.js.map +1 -0
  145. package/dist/examples/form-dropdown.vitest.d.ts +2 -0
  146. package/dist/examples/form-dropdown.vitest.d.ts.map +1 -0
  147. package/dist/examples/form-dropdown.vitest.js +854 -0
  148. package/dist/examples/form-dropdown.vitest.js.map +1 -0
  149. package/dist/examples/form-multiselect-dropdown.d.ts +2 -0
  150. package/dist/examples/form-multiselect-dropdown.d.ts.map +1 -0
  151. package/dist/examples/form-multiselect-dropdown.js +13 -0
  152. package/dist/examples/form-multiselect-dropdown.js.map +1 -0
  153. package/dist/examples/form-scroll.d.ts.map +1 -1
  154. package/dist/examples/form-scroll.js +7 -1
  155. package/dist/examples/form-scroll.js.map +1 -1
  156. package/dist/examples/form-scroll.vitest.d.ts +2 -0
  157. package/dist/examples/form-scroll.vitest.d.ts.map +1 -0
  158. package/dist/examples/form-scroll.vitest.js +211 -0
  159. package/dist/examples/form-scroll.vitest.js.map +1 -0
  160. package/dist/examples/form-tagpicker.vitest.d.ts +2 -0
  161. package/dist/examples/form-tagpicker.vitest.d.ts.map +1 -0
  162. package/dist/examples/form-tagpicker.vitest.js +736 -0
  163. package/dist/examples/form-tagpicker.vitest.js.map +1 -0
  164. package/dist/examples/internal/descendants-filtering.js +1 -1
  165. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  166. package/dist/examples/internal/descendants.js +1 -1
  167. package/dist/examples/internal/descendants.js.map +1 -1
  168. package/dist/examples/internal/nested-boxes.d.ts +2 -0
  169. package/dist/examples/internal/nested-boxes.d.ts.map +1 -0
  170. package/dist/examples/internal/nested-boxes.js +7 -0
  171. package/dist/examples/internal/nested-boxes.js.map +1 -0
  172. package/dist/examples/internal/rhf-custom-ref.js +2 -2
  173. package/dist/examples/internal/rhf-custom-ref.js.map +1 -1
  174. package/dist/examples/internal/scrollbox-demo.js +3 -22
  175. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  176. package/dist/examples/internal/scrollbox-descendants.d.ts +2 -0
  177. package/dist/examples/internal/scrollbox-descendants.d.ts.map +1 -0
  178. package/dist/examples/internal/scrollbox-descendants.js +83 -0
  179. package/dist/examples/internal/scrollbox-descendants.js.map +1 -0
  180. package/dist/examples/internal/scrollbox-with-descendants.js +4 -8
  181. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -1
  182. package/dist/examples/internal/simple-scrollbox.vitest.d.ts +2 -0
  183. package/dist/examples/internal/simple-scrollbox.vitest.d.ts.map +1 -0
  184. package/dist/examples/internal/simple-scrollbox.vitest.js +96 -0
  185. package/dist/examples/internal/simple-scrollbox.vitest.js.map +1 -0
  186. package/dist/examples/internal/unicode-square-repro.d.ts +2 -0
  187. package/dist/examples/internal/unicode-square-repro.d.ts.map +1 -0
  188. package/dist/examples/internal/unicode-square-repro.js +7 -0
  189. package/dist/examples/internal/unicode-square-repro.js.map +1 -0
  190. package/dist/examples/list-detail-metadata.d.ts +2 -0
  191. package/dist/examples/list-detail-metadata.d.ts.map +1 -0
  192. package/dist/examples/list-detail-metadata.js +8 -0
  193. package/dist/examples/list-detail-metadata.js.map +1 -0
  194. package/dist/examples/list-dropdown-default.vitest.d.ts +2 -0
  195. package/dist/examples/list-dropdown-default.vitest.d.ts.map +1 -0
  196. package/dist/examples/list-dropdown-default.vitest.js +234 -0
  197. package/dist/examples/list-dropdown-default.vitest.js.map +1 -0
  198. package/dist/examples/list-fetch-data.vitest.d.ts +2 -0
  199. package/dist/examples/list-fetch-data.vitest.d.ts.map +1 -0
  200. package/dist/examples/list-fetch-data.vitest.js +111 -0
  201. package/dist/examples/list-fetch-data.vitest.js.map +1 -0
  202. package/dist/examples/list-filter-navigation.d.ts +2 -0
  203. package/dist/examples/list-filter-navigation.d.ts.map +1 -0
  204. package/dist/examples/list-filter-navigation.js +8 -0
  205. package/dist/examples/list-filter-navigation.js.map +1 -0
  206. package/dist/examples/list-scrollbox.vitest.d.ts +2 -0
  207. package/dist/examples/list-scrollbox.vitest.d.ts.map +1 -0
  208. package/dist/examples/list-scrollbox.vitest.js +93 -0
  209. package/dist/examples/list-scrollbox.vitest.js.map +1 -0
  210. package/dist/examples/list-with-detail-long.d.ts +2 -0
  211. package/dist/examples/list-with-detail-long.d.ts.map +1 -0
  212. package/dist/examples/list-with-detail-long.js +53 -0
  213. package/dist/examples/list-with-detail-long.js.map +1 -0
  214. package/dist/examples/list-with-detail.vitest.d.ts +2 -0
  215. package/dist/examples/list-with-detail.vitest.d.ts.map +1 -0
  216. package/dist/examples/list-with-detail.vitest.js +434 -0
  217. package/dist/examples/list-with-detail.vitest.js.map +1 -0
  218. package/dist/examples/list-with-dropdown.vitest.d.ts +2 -0
  219. package/dist/examples/list-with-dropdown.vitest.d.ts.map +1 -0
  220. package/dist/examples/list-with-dropdown.vitest.js +337 -0
  221. package/dist/examples/list-with-dropdown.vitest.js.map +1 -0
  222. package/dist/examples/list-with-sections.js +5 -1
  223. package/dist/examples/list-with-sections.js.map +1 -1
  224. package/dist/examples/list-with-sections.vitest.d.ts +2 -0
  225. package/dist/examples/list-with-sections.vitest.d.ts.map +1 -0
  226. package/dist/examples/list-with-sections.vitest.js +601 -0
  227. package/dist/examples/list-with-sections.vitest.js.map +1 -0
  228. package/dist/examples/scrollbox-vertical-centering.d.ts +6 -0
  229. package/dist/examples/scrollbox-vertical-centering.d.ts.map +1 -0
  230. package/dist/examples/scrollbox-vertical-centering.js +17 -0
  231. package/dist/examples/scrollbox-vertical-centering.js.map +1 -0
  232. package/dist/examples/simple-file-picker.vitest.d.ts +2 -0
  233. package/dist/examples/simple-file-picker.vitest.d.ts.map +1 -0
  234. package/dist/examples/simple-file-picker.vitest.js +678 -0
  235. package/dist/examples/simple-file-picker.vitest.js.map +1 -0
  236. package/dist/examples/simple-grid.vitest.d.ts +2 -0
  237. package/dist/examples/simple-grid.vitest.d.ts.map +1 -0
  238. package/dist/examples/simple-grid.vitest.js +521 -0
  239. package/dist/examples/simple-grid.vitest.js.map +1 -0
  240. package/dist/examples/simple-navigation.js +10 -4
  241. package/dist/examples/simple-navigation.js.map +1 -1
  242. package/dist/examples/simple-navigation.vitest.d.ts +2 -0
  243. package/dist/examples/simple-navigation.vitest.d.ts.map +1 -0
  244. package/dist/examples/simple-navigation.vitest.js +718 -0
  245. package/dist/examples/simple-navigation.vitest.js.map +1 -0
  246. package/dist/examples/store.vitest.d.ts +2 -0
  247. package/dist/examples/store.vitest.d.ts.map +1 -0
  248. package/dist/examples/store.vitest.js +69 -0
  249. package/dist/examples/store.vitest.js.map +1 -0
  250. package/dist/extensions/dev.d.ts +4 -2
  251. package/dist/extensions/dev.d.ts.map +1 -1
  252. package/dist/extensions/dev.js +61 -10
  253. package/dist/extensions/dev.js.map +1 -1
  254. package/dist/extensions/dev.vitest.d.ts +2 -0
  255. package/dist/extensions/dev.vitest.d.ts.map +1 -0
  256. package/dist/extensions/dev.vitest.js +197 -0
  257. package/dist/extensions/dev.vitest.js.map +1 -0
  258. package/dist/extensions/home.d.ts.map +1 -1
  259. package/dist/extensions/home.js +3 -0
  260. package/dist/extensions/home.js.map +1 -1
  261. package/dist/home-command.d.ts +8 -0
  262. package/dist/home-command.d.ts.map +1 -0
  263. package/dist/home-command.js +181 -0
  264. package/dist/home-command.js.map +1 -0
  265. package/dist/hover-repro.d.ts +2 -0
  266. package/dist/hover-repro.d.ts.map +1 -0
  267. package/dist/hover-repro.js +20 -0
  268. package/dist/hover-repro.js.map +1 -0
  269. package/dist/index.d.ts +1 -0
  270. package/dist/index.d.ts.map +1 -1
  271. package/dist/index.js +2 -0
  272. package/dist/index.js.map +1 -1
  273. package/dist/internal/dialog.d.ts +1 -0
  274. package/dist/internal/dialog.d.ts.map +1 -1
  275. package/dist/internal/dialog.js +27 -18
  276. package/dist/internal/dialog.js.map +1 -1
  277. package/dist/internal/navigation.d.ts +9 -1
  278. package/dist/internal/navigation.d.ts.map +1 -1
  279. package/dist/internal/navigation.js +5 -5
  280. package/dist/internal/navigation.js.map +1 -1
  281. package/dist/internal/offscreen.d.ts +6 -0
  282. package/dist/internal/offscreen.d.ts.map +1 -0
  283. package/dist/internal/offscreen.js +10 -0
  284. package/dist/internal/offscreen.js.map +1 -0
  285. package/dist/internal/providers.d.ts.map +1 -1
  286. package/dist/internal/providers.js +2 -2
  287. package/dist/internal/providers.js.map +1 -1
  288. package/dist/internal/scrollbox.d.ts +1 -10
  289. package/dist/internal/scrollbox.d.ts.map +1 -1
  290. package/dist/internal/scrollbox.js +2 -1
  291. package/dist/internal/scrollbox.js.map +1 -1
  292. package/dist/localstorage.d.ts +13 -0
  293. package/dist/localstorage.d.ts.map +1 -0
  294. package/dist/localstorage.js +190 -0
  295. package/dist/localstorage.js.map +1 -0
  296. package/dist/oauth.d.ts +142 -0
  297. package/dist/oauth.d.ts.map +1 -0
  298. package/dist/oauth.js +551 -0
  299. package/dist/oauth.js.map +1 -0
  300. package/dist/preferences.d.ts +23 -0
  301. package/dist/preferences.d.ts.map +1 -0
  302. package/dist/preferences.js +105 -0
  303. package/dist/preferences.js.map +1 -0
  304. package/dist/state.d.ts +2 -0
  305. package/dist/state.d.ts.map +1 -1
  306. package/dist/state.js +3 -0
  307. package/dist/state.js.map +1 -1
  308. package/dist/store.d.ts +21 -0
  309. package/dist/store.d.ts.map +1 -0
  310. package/dist/store.js +84 -0
  311. package/dist/store.js.map +1 -0
  312. package/dist/swift-loader.d.ts +3 -0
  313. package/dist/swift-loader.d.ts.map +1 -0
  314. package/dist/swift-loader.js +193 -0
  315. package/dist/swift-loader.js.map +1 -0
  316. package/dist/swift-runtime.d.ts +2 -0
  317. package/dist/swift-runtime.d.ts.map +1 -0
  318. package/dist/swift-runtime.js +27 -0
  319. package/dist/swift-runtime.js.map +1 -0
  320. package/dist/toast.d.ts +44 -0
  321. package/dist/toast.d.ts.map +1 -0
  322. package/dist/toast.js +221 -0
  323. package/dist/toast.js.map +1 -0
  324. package/dist/utils/file-system.d.ts +9 -0
  325. package/dist/utils/file-system.d.ts.map +1 -1
  326. package/dist/utils/file-system.js +49 -0
  327. package/dist/utils/file-system.js.map +1 -1
  328. package/dist/utils/run-command.d.ts +25 -1
  329. package/dist/utils/run-command.d.ts.map +1 -1
  330. package/dist/utils/run-command.js +47 -4
  331. package/dist/utils/run-command.js.map +1 -1
  332. package/dist/window.d.ts +12 -0
  333. package/dist/window.d.ts.map +1 -0
  334. package/dist/window.js +48 -0
  335. package/dist/window.js.map +1 -0
  336. package/package.json +12 -10
  337. package/src/apis/browser-extension.tsx +29 -0
  338. package/src/apis/localstorage.test.ts +14 -6
  339. package/src/apis/localstorage.tsx +8 -5
  340. package/src/apis/oauth.tsx +5 -1
  341. package/src/apis/preferences.tsx +48 -22
  342. package/src/build.test.tsx +52 -0
  343. package/src/build.tsx +2 -1
  344. package/src/cli.tsx +78 -37
  345. package/src/compile.tsx +22 -5
  346. package/src/components/actions.tsx +94 -32
  347. package/src/components/detail.tsx +4 -0
  348. package/src/components/dropdown.tsx +47 -14
  349. package/src/components/extension-preferences.tsx +44 -16
  350. package/src/components/form/checkbox.tsx +12 -6
  351. package/src/components/form/date-picker.tsx +12 -6
  352. package/src/components/form/description.tsx +7 -2
  353. package/src/components/form/dropdown.tsx +131 -119
  354. package/src/components/form/file-autocomplete.tsx +90 -108
  355. package/src/components/form/file-picker.tsx +54 -43
  356. package/src/components/form/form-end.tsx +23 -2
  357. package/src/components/form/index.tsx +152 -34
  358. package/src/components/form/password-field.tsx +12 -6
  359. package/src/components/form/text-area.tsx +13 -6
  360. package/src/components/form/text-field.tsx +13 -6
  361. package/src/components/form/types.tsx +6 -0
  362. package/src/components/form/with-left-border.tsx +41 -8
  363. package/src/components/icon.tsx +27 -8
  364. package/src/components/list.tsx +193 -74
  365. package/src/components/loading-bar.tsx +3 -2
  366. package/src/components/loading-text.tsx +79 -0
  367. package/src/descendants.tsx +1 -0
  368. package/src/examples/file-autocomplete.vitest.tsx +130 -125
  369. package/src/examples/form-basic.vitest.tsx +376 -176
  370. package/src/examples/form-dropdown.vitest.tsx +126 -126
  371. package/src/examples/form-scroll.tsx +2 -0
  372. package/src/examples/form-scroll.vitest.tsx +58 -58
  373. package/src/examples/form-tagpicker.vitest.tsx +99 -99
  374. package/src/examples/internal/descendants-filtering.tsx +1 -0
  375. package/src/examples/internal/descendants.tsx +1 -0
  376. package/src/examples/internal/rhf-custom-ref.tsx +2 -0
  377. package/src/examples/internal/scrollbox-demo.tsx +3 -27
  378. package/src/examples/internal/scrollbox-with-descendants.tsx +4 -7
  379. package/src/examples/internal/simple-scrollbox.vitest.tsx +7 -5
  380. package/src/examples/list-detail-metadata.tsx +49 -0
  381. package/src/examples/list-detail-metadata.vitest.tsx +88 -0
  382. package/src/examples/list-dropdown-default.vitest.tsx +51 -51
  383. package/src/examples/list-fetch-data.vitest.tsx +4 -4
  384. package/src/examples/list-scrollbox.vitest.tsx +73 -14
  385. package/src/examples/list-with-detail-long.tsx +70 -0
  386. package/src/examples/list-with-detail.vitest.tsx +198 -92
  387. package/src/examples/list-with-dropdown.vitest.tsx +53 -53
  388. package/src/examples/list-with-sections.tsx +1 -0
  389. package/src/examples/list-with-sections.vitest.tsx +213 -89
  390. package/src/examples/list-with-toast.vitest.tsx +4 -4
  391. package/src/examples/simple-file-picker.vitest.tsx +61 -471
  392. package/src/examples/simple-grid.vitest.tsx +238 -233
  393. package/src/examples/simple-navigation.tsx +15 -7
  394. package/src/examples/simple-navigation.vitest.tsx +121 -210
  395. package/src/examples/store.vitest.tsx +1 -1
  396. package/src/examples/swift-extension.vitest.tsx +148 -0
  397. package/src/examples/synonyms.vitest.tsx +159 -0
  398. package/src/extensions/dev.tsx +74 -7
  399. package/src/extensions/dev.vitest.tsx +97 -31
  400. package/src/extensions/home.tsx +6 -0
  401. package/src/index.tsx +3 -0
  402. package/src/internal/dialog.tsx +43 -30
  403. package/src/internal/navigation.tsx +3 -1
  404. package/src/internal/offscreen.tsx +15 -0
  405. package/src/internal/providers.tsx +4 -2
  406. package/src/internal/scrollbox.tsx +4 -8
  407. package/src/keyboard.test.tsx +69 -0
  408. package/src/state.tsx +7 -0
  409. package/src/swift-loader.tsx +239 -0
  410. package/src/swift-runtime.tsx +36 -0
  411. package/src/utils/file-system.ts +61 -0
  412. package/src/utils/run-command.tsx +75 -6
@@ -0,0 +1,79 @@
1
+ import React, { useState, useEffect, useRef } from 'react'
2
+ import { colord } from 'colord'
3
+
4
+ interface LoadingTextProps {
5
+ children: string
6
+ isLoading?: boolean
7
+ color: string
8
+ }
9
+
10
+ /**
11
+ * Generate wave colors based on base color
12
+ * Creates a gradient from base color to a lighter version and back
13
+ * Uses a shorter wave (12 chars) compared to LoadingBar
14
+ */
15
+ function generateWaveColors(baseColor: string): string[] {
16
+ const base = colord(baseColor)
17
+ // Shorter wave for text - lighten factors from 0 to 0.5 and back
18
+ const steps = [0, 10, 20, 30, 40, 50, 40, 30, 20, 10, 0, 0]
19
+ return steps.map((percent) => base.lighten(percent / 100).toHex())
20
+ }
21
+
22
+ export function LoadingText(props: LoadingTextProps): any {
23
+ const { children, isLoading = false, color = '#FFC000' } = props
24
+ const [position, setPosition] = useState(0)
25
+ const intervalRef = useRef<NodeJS.Timeout | null>(null)
26
+
27
+ const characters = children.split('')
28
+ const waveColors = generateWaveColors(color)
29
+ const waveWidth = waveColors.length
30
+ // Add padding at the end to create a delay before the next loop
31
+ const endPadding = 10
32
+ const totalLength = characters.length + waveWidth + endPadding
33
+
34
+ useEffect(() => {
35
+ if (isLoading) {
36
+ intervalRef.current = setInterval(() => {
37
+ setPosition((prev) => (prev + 1) % totalLength)
38
+ }, 30)
39
+ } else {
40
+ if (intervalRef.current) {
41
+ clearInterval(intervalRef.current)
42
+ intervalRef.current = null
43
+ }
44
+ setPosition(0)
45
+ }
46
+
47
+ return () => {
48
+ if (intervalRef.current) {
49
+ clearInterval(intervalRef.current)
50
+ }
51
+ }
52
+ }, [isLoading, totalLength])
53
+
54
+ const getCharacterColor = (index: number): string => {
55
+ if (!isLoading) {
56
+ return color
57
+ }
58
+
59
+ const distance = position - index
60
+
61
+ // If character is within the wave (behind the current position)
62
+ if (distance >= 0 && distance < waveWidth) {
63
+ return waveColors[distance]
64
+ }
65
+
66
+ // Default to base color for characters outside the wave
67
+ return color
68
+ }
69
+
70
+ return (
71
+ <box flexDirection="row">
72
+ {characters.map((char, index) => (
73
+ <text key={index} fg={getCharacterColor(index)} flexShrink={0}>
74
+ {char}
75
+ </text>
76
+ ))}
77
+ </box>
78
+ )
79
+ }
@@ -113,6 +113,7 @@ const MenuExample = () => {
113
113
  <textarea
114
114
  ref={inputRef}
115
115
  height={1}
116
+ wrapMode='none'
116
117
  keyBindings={[
117
118
  { name: 'return', action: 'submit' },
118
119
  { name: 'linefeed', action: 'submit' },
@@ -16,18 +16,19 @@ afterEach(() => {
16
16
  session?.close()
17
17
  })
18
18
 
19
- test('autocomplete shows on ./ input with proper background', async () => {
19
+ test('autocomplete shows flat file list in dialog', async () => {
20
20
  await session.text({
21
21
  waitFor: (text) => text.includes('Select Files') && text.includes('Select Folder'),
22
22
  })
23
23
 
24
+ // Navigate to folder picker (canChooseDirectories=true)
24
25
  await session.press('tab')
25
26
  await session.press('tab')
26
27
 
27
- await session.type('./')
28
+ await session.type('s')
28
29
 
29
30
  const snapshot = await session.text({
30
- waitFor: (text) => text.includes('📁'),
31
+ waitFor: (text) => text.includes('Filter:') && text.includes('📁'),
31
32
  })
32
33
  expect(snapshot).toMatchInlineSnapshot(`
33
34
  "
@@ -37,74 +38,28 @@ test('autocomplete shows on ./ input with proper background', async () => {
37
38
 
38
39
  ◇ Your Name
39
40
  │ John Doe
40
- │ ┌────────────────────────────────────────────────────────────┐
41
- ◇ │ 📁 dist │
42
- │ │ 📁 fixtures │
43
- │ │ 📁 node_modules │
44
- │ │ 📁 src │
45
- │ │ ↑↓ navigate ⏎ open folder ⇥ select folder esc close │
46
- ◆ └────────────────────────────────────────────────────────────┘
47
- ┃ ./
48
-
49
- ┃ Choose a folder for output
50
-
51
- ◇ Select Single File
52
- │ Enter file path...
53
41
 
54
- Choose exactly one file
55
-
56
-
57
-
58
-
59
-
60
-
61
- ctrl ↵ submit ↑↓ navigate ^k actions"
62
- `)
63
- }, 10000)
64
-
65
- test('autocomplete dropdown covers background content', async () => {
66
- await session.text({
67
- waitFor: (text) => text.includes('Select Files'),
68
- })
69
-
70
- await session.press('tab')
71
- await session.press('tab')
72
-
73
- await session.type('src/')
74
-
75
- const snapshot = await session.text({
76
- waitFor: (text) => text.includes('📁 apis'),
77
- })
78
- expect(snapshot).toMatchInlineSnapshot(`
79
- "
80
-
81
-
82
- ┌────────────────────────────────────────────────────────────┐
83
- │ 📁 apis │
84
- ◇ │ 📁 components │
85
- │ │ 📁 examples │
86
- │ │ 📁 extensions │
87
- ◇ │ 📁 hooks │
88
- │ │ 📁 internal │
89
- │ │ 📁 store-api │
90
- │ │ 📁 utils │
91
- │ │ ↑↓ navigate ⏎ open folder ⇥ select folder esc close │
92
- ◆ └────────────────────────────────────────────────────────────┘
93
- ┃ src/
94
-
95
- ┃ Choose a folder for output
96
-
97
- ◇ Select Single File
42
+ Select Files
98
43
  │ Enter file path...
99
-
100
- │ Choose exactly one file
101
-
102
-
103
-
104
-
105
-
106
-
107
- ctrl ↵ submit ↑↓ navigate ^k actions"
44
+ │┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
45
+ │┃
46
+ │┃ Filter: s
47
+ ◆┃
48
+ │┃ 📁 extensions/
49
+ │┃ 📁 extensions/messages/
50
+ │┃ 📁 extensions/messages/assets/
51
+ │┃ 📁 extensions/messages/metadata/
52
+ ◇┃ 📁 extensions/messages/src/
53
+ │┃ 📁 extensions/messages/src/api/
54
+ │┃ 📁 extensions/messages/src/components/
55
+ │┃ 📁 extensions/messages/src/hooks/
56
+ │┃ 📁 extensions/messages/src/tools/
57
+ └┃ 📁 extensions/messages/swift/
58
+
59
+ ┃ ↑↓ navigate ⏎/tab select esc close
60
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
61
+
62
+ ctrl ↵ submit tab navigate ^k actions"
108
63
  `)
109
64
  }, 10000)
110
65
 
@@ -115,10 +70,10 @@ test('autocomplete navigation with down/up keys', async () => {
115
70
 
116
71
  await session.press('tab')
117
72
  await session.press('tab')
118
- await session.type('src/')
73
+ await session.type('s')
119
74
 
120
75
  await session.text({
121
- waitFor: (text) => text.includes('📁 apis'),
76
+ waitFor: (text) => text.includes('📁'),
122
77
  })
123
78
 
124
79
  await session.press('down')
@@ -129,32 +84,32 @@ test('autocomplete navigation with down/up keys', async () => {
129
84
  "
130
85
 
131
86
 
132
- ┌────────────────────────────────────────────────────────────┐
133
- │ 📁 apis │
134
- ◇ │ 📁 components │
135
- │ │ 📁 examples │
136
- │ │ 📁 extensions │
137
- ◇ │ 📁 hooks │
138
- │ │ 📁 internal │
139
- │ │ 📁 store-api │
140
- │ │ 📁 utils │
141
- │ │ ↑↓ navigate ⏎ open folder ⇥ select folder esc close │
142
- ◆ └────────────────────────────────────────────────────────────┘
143
- ┃ src/
144
-
145
- ┃ Choose a folder for output
146
-
147
- ◇ Select Single File
148
- │ Enter file path...
149
-
150
- │ Choose exactly one file
151
-
152
-
153
-
154
-
155
87
 
156
88
 
157
- ctrl ↵ submit ↑↓ navigate ^k actions"
89
+ ◇ Your Name
90
+ │ John Doe
91
+
92
+ ◇ Select Files
93
+ │ Enter file path...
94
+ │┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
95
+ │┃
96
+ │┃ Filter: s
97
+ ◆┃
98
+ │┃ 📁 extensions/
99
+ │┃ 📁 extensions/messages/
100
+ │┃ 📁 extensions/messages/assets/
101
+ │┃ 📁 extensions/messages/metadata/
102
+ ◇┃ 📁 extensions/messages/src/
103
+ │┃ 📁 extensions/messages/src/api/
104
+ │┃ 📁 extensions/messages/src/components/
105
+ │┃ 📁 extensions/messages/src/hooks/
106
+ │┃ 📁 extensions/messages/src/tools/
107
+ └┃ 📁 extensions/messages/swift/
108
+
109
+ ┃ ↑↓ navigate ⏎/tab select esc close
110
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
111
+
112
+ ctrl ↵ submit tab navigate ^k actions"
158
113
  `)
159
114
 
160
115
  await session.press('up')
@@ -164,52 +119,102 @@ test('autocomplete navigation with down/up keys', async () => {
164
119
  "
165
120
 
166
121
 
167
- ┌────────────────────────────────────────────────────────────┐
168
- │ 📁 apis │
169
- 📁 components │
170
- 📁 examples │
171
- │ │ 📁 extensions │
172
- ◇ │ 📁 hooks │
173
- │ │ 📁 internal │
174
- │ │ 📁 store-api │
175
- │ │ 📁 utils │
176
- │ │ ↑↓ navigate ⏎ open folder ⇥ select folder esc close │
177
- ◆ └────────────────────────────────────────────────────────────┘
178
- ┃ src/
179
-
180
- ┃ Choose a folder for output
181
-
182
- ◇ Select Single File
183
- │ Enter file path...
184
-
185
- │ Choose exactly one file
122
+
123
+
124
+ Your Name
125
+ John Doe
186
126
 
187
-
127
+ ◇ Select Files
128
+ │ Enter file path...
129
+ │┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
130
+ │┃
131
+ │┃ Filter: s
132
+ ◆┃
133
+ │┃ 📁 extensions/
134
+ │┃ 📁 extensions/messages/
135
+ │┃ 📁 extensions/messages/assets/
136
+ │┃ 📁 extensions/messages/metadata/
137
+ ◇┃ 📁 extensions/messages/src/
138
+ │┃ 📁 extensions/messages/src/api/
139
+ │┃ 📁 extensions/messages/src/components/
140
+ │┃ 📁 extensions/messages/src/hooks/
141
+ │┃ 📁 extensions/messages/src/tools/
142
+ └┃ 📁 extensions/messages/swift/
143
+
144
+ ┃ ↑↓ navigate ⏎/tab select esc close
145
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
146
+
147
+ ctrl ↵ submit tab navigate ^k actions"
148
+ `)
149
+ }, 10000)
150
+
151
+ test('file picker shows only files, not folders', async () => {
152
+ await session.text({
153
+ waitFor: (text) => text.includes('Select Files'),
154
+ })
155
+
156
+ // Navigate to file picker (canChooseFiles=true, canChooseDirectories=false)
157
+ await session.press('tab') // to Select Files field
158
+
159
+ await session.type('t')
160
+
161
+ const snapshot = await session.text({
162
+ waitFor: (text) => text.includes('Filter:') && text.includes('📄'),
163
+ })
164
+
165
+ // Should show files (📄) not folders (📁)
166
+ expect(snapshot).toMatchInlineSnapshot(`
167
+ "
188
168
 
189
169
 
190
170
 
191
171
 
192
- ctrl ↵ submit ↑↓ navigate ^k actions"
172
+ ◇ Your Name
173
+ │ John Doe
174
+
175
+ ◆ Select Files
176
+ │ t
177
+ │┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
178
+ │┃
179
+ │┃ Filter: t
180
+ ◇┃
181
+ │┃ 📄 ARCHITECTURE.md
182
+ │┃ 📄 EXTENSIONS.md
183
+ │┃ 📄 OAUTH_SETUP.md
184
+ │┃ 📄 RAYCAST_SCROLLING.md
185
+ ◇┃ 📄 TESTING_RAYCAST_EXTENSIONS.md
186
+ │┃ 📄 bunfig.toml
187
+ │┃ 📄 extensions/messages/CHANGELOG.md
188
+ │┃ 📄 extensions/messages/README.md
189
+ │┃ 📄 extensions/messages/assets/apple-messages-icon.png
190
+ └┃ 📄 extensions/messages/bun.lock
191
+
192
+ ┃ ↑↓ navigate ⏎/tab select esc close
193
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
194
+
195
+ ctrl ↵ submit tab navigate ^k actions"
193
196
  `)
197
+ expect(snapshot).toContain('📄')
198
+ expect(snapshot).not.toContain('📁')
194
199
  }, 10000)
195
200
 
196
- test('escape closes autocomplete', async () => {
201
+ test('escape closes autocomplete and form stays visible', async () => {
197
202
  await session.text({
198
203
  waitFor: (text) => text.includes('Select Files'),
199
204
  })
200
205
 
201
206
  await session.press('tab')
202
207
  await session.press('tab')
203
- await session.type('./')
208
+ await session.type('s')
204
209
 
205
210
  await session.text({
206
- waitFor: (text) => text.includes('📁'),
211
+ waitFor: (text) => text.includes('Filter:'),
207
212
  })
208
213
 
209
214
  await session.press('esc')
210
215
 
211
216
  const afterEsc = await session.text({
212
- waitFor: (text) => !text.includes('📁'),
217
+ waitFor: (text) => text.includes('Select Folder') && !text.includes('Filter:'),
213
218
  })
214
219
  expect(afterEsc).toMatchInlineSnapshot(`
215
220
  "
@@ -226,10 +231,10 @@ test('escape closes autocomplete', async () => {
226
231
  │ Choose one or more files to upload
227
232
 
228
233
  ◆ Select Folder
229
- ./
230
-
231
- Choose a folder for output
232
-
234
+ s
235
+
236
+ Choose a folder for output
237
+
233
238
  ◇ Select Single File
234
239
  │ Enter file path...
235
240
 
@@ -240,6 +245,6 @@ test('escape closes autocomplete', async () => {
240
245
 
241
246
 
242
247
 
243
- ctrl ↵ submit ↑↓ navigate ^k actions"
248
+ ctrl ↵ submit tab navigate ^k actions"
244
249
  `)
245
250
  }, 10000)