termcast 1.3.19 → 1.3.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/dist/ai.d.ts +104 -0
  2. package/dist/ai.d.ts.map +1 -0
  3. package/dist/ai.js +135 -0
  4. package/dist/ai.js.map +1 -0
  5. package/dist/apis/browser-extension.d.ts +18 -0
  6. package/dist/apis/browser-extension.d.ts.map +1 -0
  7. package/dist/apis/browser-extension.js +14 -0
  8. package/dist/apis/browser-extension.js.map +1 -0
  9. package/dist/apis/localstorage.d.ts.map +1 -1
  10. package/dist/apis/localstorage.js +4 -7
  11. package/dist/apis/localstorage.js.map +1 -1
  12. package/dist/apis/oauth.d.ts.map +1 -1
  13. package/dist/apis/oauth.js +5 -1
  14. package/dist/apis/oauth.js.map +1 -1
  15. package/dist/apis/preferences.d.ts.map +1 -1
  16. package/dist/apis/preferences.js +38 -19
  17. package/dist/apis/preferences.js.map +1 -1
  18. package/dist/build.d.ts.map +1 -1
  19. package/dist/build.js +2 -1
  20. package/dist/build.js.map +1 -1
  21. package/dist/cache.d.ts +32 -0
  22. package/dist/cache.d.ts.map +1 -0
  23. package/dist/cache.js +205 -0
  24. package/dist/cache.js.map +1 -0
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +69 -33
  27. package/dist/cli.js.map +1 -1
  28. package/dist/clipboard.d.ts +36 -0
  29. package/dist/clipboard.d.ts.map +1 -0
  30. package/dist/clipboard.js +154 -0
  31. package/dist/clipboard.js.map +1 -0
  32. package/dist/compile.d.ts.map +1 -1
  33. package/dist/compile.js +24 -6
  34. package/dist/compile.js.map +1 -1
  35. package/dist/components/actions.d.ts.map +1 -1
  36. package/dist/components/actions.js +56 -30
  37. package/dist/components/actions.js.map +1 -1
  38. package/dist/components/detail.d.ts.map +1 -1
  39. package/dist/components/detail.js +4 -0
  40. package/dist/components/detail.js.map +1 -1
  41. package/dist/components/dropdown.d.ts.map +1 -1
  42. package/dist/components/dropdown.js +38 -15
  43. package/dist/components/dropdown.js.map +1 -1
  44. package/dist/components/extension-preferences.d.ts.map +1 -1
  45. package/dist/components/extension-preferences.js +40 -13
  46. package/dist/components/extension-preferences.js.map +1 -1
  47. package/dist/components/form/checkbox.d.ts.map +1 -1
  48. package/dist/components/form/checkbox.js +5 -3
  49. package/dist/components/form/checkbox.js.map +1 -1
  50. package/dist/components/form/date-picker.d.ts.map +1 -1
  51. package/dist/components/form/date-picker.js +5 -3
  52. package/dist/components/form/date-picker.js.map +1 -1
  53. package/dist/components/form/description.d.ts.map +1 -1
  54. package/dist/components/form/description.js +2 -2
  55. package/dist/components/form/description.js.map +1 -1
  56. package/dist/components/form/dropdown.d.ts.map +1 -1
  57. package/dist/components/form/dropdown.js +84 -80
  58. package/dist/components/form/dropdown.js.map +1 -1
  59. package/dist/components/form/file-autocomplete.d.ts +3 -6
  60. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  61. package/dist/components/form/file-autocomplete.js +61 -66
  62. package/dist/components/form/file-autocomplete.js.map +1 -1
  63. package/dist/components/form/file-picker.d.ts.map +1 -1
  64. package/dist/components/form/file-picker.js +33 -30
  65. package/dist/components/form/file-picker.js.map +1 -1
  66. package/dist/components/form/form-end.d.ts.map +1 -1
  67. package/dist/components/form/form-end.js +21 -1
  68. package/dist/components/form/form-end.js.map +1 -1
  69. package/dist/components/form/form-type-only.d.ts +174 -0
  70. package/dist/components/form/form-type-only.d.ts.map +1 -0
  71. package/dist/components/form/form-type-only.js +2 -0
  72. package/dist/components/form/form-type-only.js.map +1 -0
  73. package/dist/components/form/index.d.ts +3 -1
  74. package/dist/components/form/index.d.ts.map +1 -1
  75. package/dist/components/form/index.js +100 -28
  76. package/dist/components/form/index.js.map +1 -1
  77. package/dist/components/form/password-field.d.ts.map +1 -1
  78. package/dist/components/form/password-field.js +5 -3
  79. package/dist/components/form/password-field.js.map +1 -1
  80. package/dist/components/form/text-area.d.ts.map +1 -1
  81. package/dist/components/form/text-area.js +5 -3
  82. package/dist/components/form/text-area.js.map +1 -1
  83. package/dist/components/form/text-field.d.ts.map +1 -1
  84. package/dist/components/form/text-field.js +6 -4
  85. package/dist/components/form/text-field.js.map +1 -1
  86. package/dist/components/form/types.d.ts +5 -0
  87. package/dist/components/form/types.d.ts.map +1 -1
  88. package/dist/components/form/use-form-handling.d.ts +4 -0
  89. package/dist/components/form/use-form-handling.d.ts.map +1 -0
  90. package/dist/components/form/use-form-handling.js +37 -0
  91. package/dist/components/form/use-form-handling.js.map +1 -0
  92. package/dist/components/form/with-left-border.d.ts +2 -1
  93. package/dist/components/form/with-left-border.d.ts.map +1 -1
  94. package/dist/components/form/with-left-border.js +27 -3
  95. package/dist/components/form/with-left-border.js.map +1 -1
  96. package/dist/components/icon.d.ts +1 -0
  97. package/dist/components/icon.d.ts.map +1 -1
  98. package/dist/components/icon.js +24 -8
  99. package/dist/components/icon.js.map +1 -1
  100. package/dist/components/list.d.ts +2 -2
  101. package/dist/components/list.d.ts.map +1 -1
  102. package/dist/components/list.js +140 -62
  103. package/dist/components/list.js.map +1 -1
  104. package/dist/components/loading-bar.d.ts.map +1 -1
  105. package/dist/components/loading-bar.js +2 -2
  106. package/dist/components/loading-bar.js.map +1 -1
  107. package/dist/components/loading-text.d.ts +8 -0
  108. package/dist/components/loading-text.d.ts.map +1 -0
  109. package/dist/components/loading-text.js +58 -0
  110. package/dist/components/loading-text.js.map +1 -0
  111. package/dist/descendants.js +1 -1
  112. package/dist/descendants.js.map +1 -1
  113. package/dist/dev-ui.d.ts +7 -0
  114. package/dist/dev-ui.d.ts.map +1 -0
  115. package/dist/dev-ui.js +118 -0
  116. package/dist/dev-ui.js.map +1 -0
  117. package/dist/environment.d.ts +63 -0
  118. package/dist/environment.d.ts.map +1 -0
  119. package/dist/environment.js +189 -0
  120. package/dist/environment.js.map +1 -0
  121. package/dist/examples/datepicker.d.ts +2 -0
  122. package/dist/examples/datepicker.d.ts.map +1 -0
  123. package/dist/examples/datepicker.js +344 -0
  124. package/dist/examples/datepicker.js.map +1 -0
  125. package/dist/examples/file-autocomplete.vitest.d.ts +2 -0
  126. package/dist/examples/file-autocomplete.vitest.d.ts.map +1 -0
  127. package/dist/examples/file-autocomplete.vitest.js +223 -0
  128. package/dist/examples/file-autocomplete.vitest.js.map +1 -0
  129. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +2 -0
  130. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +1 -0
  131. package/dist/examples/form-basic-arrow-keys.vitest.js +46 -0
  132. package/dist/examples/form-basic-arrow-keys.vitest.js.map +1 -0
  133. package/dist/examples/form-basic.vitest.d.ts +2 -0
  134. package/dist/examples/form-basic.vitest.d.ts.map +1 -0
  135. package/dist/examples/form-basic.vitest.js +630 -0
  136. package/dist/examples/form-basic.vitest.js.map +1 -0
  137. package/dist/examples/form-dropdown-with-sections.d.ts +2 -0
  138. package/dist/examples/form-dropdown-with-sections.d.ts.map +1 -0
  139. package/dist/examples/form-dropdown-with-sections.js +13 -0
  140. package/dist/examples/form-dropdown-with-sections.js.map +1 -0
  141. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +2 -0
  142. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +1 -0
  143. package/dist/examples/form-dropdown-with-sections.vitest.js +75 -0
  144. package/dist/examples/form-dropdown-with-sections.vitest.js.map +1 -0
  145. package/dist/examples/form-dropdown.vitest.d.ts +2 -0
  146. package/dist/examples/form-dropdown.vitest.d.ts.map +1 -0
  147. package/dist/examples/form-dropdown.vitest.js +854 -0
  148. package/dist/examples/form-dropdown.vitest.js.map +1 -0
  149. package/dist/examples/form-multiselect-dropdown.d.ts +2 -0
  150. package/dist/examples/form-multiselect-dropdown.d.ts.map +1 -0
  151. package/dist/examples/form-multiselect-dropdown.js +13 -0
  152. package/dist/examples/form-multiselect-dropdown.js.map +1 -0
  153. package/dist/examples/form-scroll.d.ts.map +1 -1
  154. package/dist/examples/form-scroll.js +7 -1
  155. package/dist/examples/form-scroll.js.map +1 -1
  156. package/dist/examples/form-scroll.vitest.d.ts +2 -0
  157. package/dist/examples/form-scroll.vitest.d.ts.map +1 -0
  158. package/dist/examples/form-scroll.vitest.js +211 -0
  159. package/dist/examples/form-scroll.vitest.js.map +1 -0
  160. package/dist/examples/form-tagpicker.vitest.d.ts +2 -0
  161. package/dist/examples/form-tagpicker.vitest.d.ts.map +1 -0
  162. package/dist/examples/form-tagpicker.vitest.js +736 -0
  163. package/dist/examples/form-tagpicker.vitest.js.map +1 -0
  164. package/dist/examples/internal/descendants-filtering.js +1 -1
  165. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  166. package/dist/examples/internal/descendants.js +1 -1
  167. package/dist/examples/internal/descendants.js.map +1 -1
  168. package/dist/examples/internal/nested-boxes.d.ts +2 -0
  169. package/dist/examples/internal/nested-boxes.d.ts.map +1 -0
  170. package/dist/examples/internal/nested-boxes.js +7 -0
  171. package/dist/examples/internal/nested-boxes.js.map +1 -0
  172. package/dist/examples/internal/rhf-custom-ref.js +2 -2
  173. package/dist/examples/internal/rhf-custom-ref.js.map +1 -1
  174. package/dist/examples/internal/scrollbox-demo.js +3 -22
  175. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  176. package/dist/examples/internal/scrollbox-descendants.d.ts +2 -0
  177. package/dist/examples/internal/scrollbox-descendants.d.ts.map +1 -0
  178. package/dist/examples/internal/scrollbox-descendants.js +83 -0
  179. package/dist/examples/internal/scrollbox-descendants.js.map +1 -0
  180. package/dist/examples/internal/scrollbox-with-descendants.js +4 -8
  181. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -1
  182. package/dist/examples/internal/simple-scrollbox.vitest.d.ts +2 -0
  183. package/dist/examples/internal/simple-scrollbox.vitest.d.ts.map +1 -0
  184. package/dist/examples/internal/simple-scrollbox.vitest.js +96 -0
  185. package/dist/examples/internal/simple-scrollbox.vitest.js.map +1 -0
  186. package/dist/examples/internal/unicode-square-repro.d.ts +2 -0
  187. package/dist/examples/internal/unicode-square-repro.d.ts.map +1 -0
  188. package/dist/examples/internal/unicode-square-repro.js +7 -0
  189. package/dist/examples/internal/unicode-square-repro.js.map +1 -0
  190. package/dist/examples/list-detail-metadata.d.ts +2 -0
  191. package/dist/examples/list-detail-metadata.d.ts.map +1 -0
  192. package/dist/examples/list-detail-metadata.js +8 -0
  193. package/dist/examples/list-detail-metadata.js.map +1 -0
  194. package/dist/examples/list-dropdown-default.vitest.d.ts +2 -0
  195. package/dist/examples/list-dropdown-default.vitest.d.ts.map +1 -0
  196. package/dist/examples/list-dropdown-default.vitest.js +234 -0
  197. package/dist/examples/list-dropdown-default.vitest.js.map +1 -0
  198. package/dist/examples/list-fetch-data.vitest.d.ts +2 -0
  199. package/dist/examples/list-fetch-data.vitest.d.ts.map +1 -0
  200. package/dist/examples/list-fetch-data.vitest.js +111 -0
  201. package/dist/examples/list-fetch-data.vitest.js.map +1 -0
  202. package/dist/examples/list-filter-navigation.d.ts +2 -0
  203. package/dist/examples/list-filter-navigation.d.ts.map +1 -0
  204. package/dist/examples/list-filter-navigation.js +8 -0
  205. package/dist/examples/list-filter-navigation.js.map +1 -0
  206. package/dist/examples/list-scrollbox.vitest.d.ts +2 -0
  207. package/dist/examples/list-scrollbox.vitest.d.ts.map +1 -0
  208. package/dist/examples/list-scrollbox.vitest.js +93 -0
  209. package/dist/examples/list-scrollbox.vitest.js.map +1 -0
  210. package/dist/examples/list-with-detail-long.d.ts +2 -0
  211. package/dist/examples/list-with-detail-long.d.ts.map +1 -0
  212. package/dist/examples/list-with-detail-long.js +53 -0
  213. package/dist/examples/list-with-detail-long.js.map +1 -0
  214. package/dist/examples/list-with-detail.vitest.d.ts +2 -0
  215. package/dist/examples/list-with-detail.vitest.d.ts.map +1 -0
  216. package/dist/examples/list-with-detail.vitest.js +434 -0
  217. package/dist/examples/list-with-detail.vitest.js.map +1 -0
  218. package/dist/examples/list-with-dropdown.vitest.d.ts +2 -0
  219. package/dist/examples/list-with-dropdown.vitest.d.ts.map +1 -0
  220. package/dist/examples/list-with-dropdown.vitest.js +337 -0
  221. package/dist/examples/list-with-dropdown.vitest.js.map +1 -0
  222. package/dist/examples/list-with-sections.js +5 -1
  223. package/dist/examples/list-with-sections.js.map +1 -1
  224. package/dist/examples/list-with-sections.vitest.d.ts +2 -0
  225. package/dist/examples/list-with-sections.vitest.d.ts.map +1 -0
  226. package/dist/examples/list-with-sections.vitest.js +601 -0
  227. package/dist/examples/list-with-sections.vitest.js.map +1 -0
  228. package/dist/examples/scrollbox-vertical-centering.d.ts +6 -0
  229. package/dist/examples/scrollbox-vertical-centering.d.ts.map +1 -0
  230. package/dist/examples/scrollbox-vertical-centering.js +17 -0
  231. package/dist/examples/scrollbox-vertical-centering.js.map +1 -0
  232. package/dist/examples/simple-file-picker.vitest.d.ts +2 -0
  233. package/dist/examples/simple-file-picker.vitest.d.ts.map +1 -0
  234. package/dist/examples/simple-file-picker.vitest.js +678 -0
  235. package/dist/examples/simple-file-picker.vitest.js.map +1 -0
  236. package/dist/examples/simple-grid.vitest.d.ts +2 -0
  237. package/dist/examples/simple-grid.vitest.d.ts.map +1 -0
  238. package/dist/examples/simple-grid.vitest.js +521 -0
  239. package/dist/examples/simple-grid.vitest.js.map +1 -0
  240. package/dist/examples/simple-navigation.js +10 -4
  241. package/dist/examples/simple-navigation.js.map +1 -1
  242. package/dist/examples/simple-navigation.vitest.d.ts +2 -0
  243. package/dist/examples/simple-navigation.vitest.d.ts.map +1 -0
  244. package/dist/examples/simple-navigation.vitest.js +718 -0
  245. package/dist/examples/simple-navigation.vitest.js.map +1 -0
  246. package/dist/examples/store.vitest.d.ts +2 -0
  247. package/dist/examples/store.vitest.d.ts.map +1 -0
  248. package/dist/examples/store.vitest.js +69 -0
  249. package/dist/examples/store.vitest.js.map +1 -0
  250. package/dist/extensions/dev.d.ts +4 -2
  251. package/dist/extensions/dev.d.ts.map +1 -1
  252. package/dist/extensions/dev.js +61 -10
  253. package/dist/extensions/dev.js.map +1 -1
  254. package/dist/extensions/dev.vitest.d.ts +2 -0
  255. package/dist/extensions/dev.vitest.d.ts.map +1 -0
  256. package/dist/extensions/dev.vitest.js +197 -0
  257. package/dist/extensions/dev.vitest.js.map +1 -0
  258. package/dist/extensions/home.d.ts.map +1 -1
  259. package/dist/extensions/home.js +3 -0
  260. package/dist/extensions/home.js.map +1 -1
  261. package/dist/home-command.d.ts +8 -0
  262. package/dist/home-command.d.ts.map +1 -0
  263. package/dist/home-command.js +181 -0
  264. package/dist/home-command.js.map +1 -0
  265. package/dist/hover-repro.d.ts +2 -0
  266. package/dist/hover-repro.d.ts.map +1 -0
  267. package/dist/hover-repro.js +20 -0
  268. package/dist/hover-repro.js.map +1 -0
  269. package/dist/index.d.ts +1 -0
  270. package/dist/index.d.ts.map +1 -1
  271. package/dist/index.js +2 -0
  272. package/dist/index.js.map +1 -1
  273. package/dist/internal/dialog.d.ts +1 -0
  274. package/dist/internal/dialog.d.ts.map +1 -1
  275. package/dist/internal/dialog.js +27 -18
  276. package/dist/internal/dialog.js.map +1 -1
  277. package/dist/internal/navigation.d.ts +9 -1
  278. package/dist/internal/navigation.d.ts.map +1 -1
  279. package/dist/internal/navigation.js +5 -5
  280. package/dist/internal/navigation.js.map +1 -1
  281. package/dist/internal/offscreen.d.ts +6 -0
  282. package/dist/internal/offscreen.d.ts.map +1 -0
  283. package/dist/internal/offscreen.js +10 -0
  284. package/dist/internal/offscreen.js.map +1 -0
  285. package/dist/internal/providers.d.ts.map +1 -1
  286. package/dist/internal/providers.js +2 -2
  287. package/dist/internal/providers.js.map +1 -1
  288. package/dist/internal/scrollbox.d.ts +1 -10
  289. package/dist/internal/scrollbox.d.ts.map +1 -1
  290. package/dist/internal/scrollbox.js +2 -1
  291. package/dist/internal/scrollbox.js.map +1 -1
  292. package/dist/localstorage.d.ts +13 -0
  293. package/dist/localstorage.d.ts.map +1 -0
  294. package/dist/localstorage.js +190 -0
  295. package/dist/localstorage.js.map +1 -0
  296. package/dist/oauth.d.ts +142 -0
  297. package/dist/oauth.d.ts.map +1 -0
  298. package/dist/oauth.js +551 -0
  299. package/dist/oauth.js.map +1 -0
  300. package/dist/preferences.d.ts +23 -0
  301. package/dist/preferences.d.ts.map +1 -0
  302. package/dist/preferences.js +105 -0
  303. package/dist/preferences.js.map +1 -0
  304. package/dist/state.d.ts +2 -0
  305. package/dist/state.d.ts.map +1 -1
  306. package/dist/state.js +3 -0
  307. package/dist/state.js.map +1 -1
  308. package/dist/store.d.ts +21 -0
  309. package/dist/store.d.ts.map +1 -0
  310. package/dist/store.js +84 -0
  311. package/dist/store.js.map +1 -0
  312. package/dist/swift-loader.d.ts +3 -0
  313. package/dist/swift-loader.d.ts.map +1 -0
  314. package/dist/swift-loader.js +193 -0
  315. package/dist/swift-loader.js.map +1 -0
  316. package/dist/swift-runtime.d.ts +2 -0
  317. package/dist/swift-runtime.d.ts.map +1 -0
  318. package/dist/swift-runtime.js +27 -0
  319. package/dist/swift-runtime.js.map +1 -0
  320. package/dist/toast.d.ts +44 -0
  321. package/dist/toast.d.ts.map +1 -0
  322. package/dist/toast.js +221 -0
  323. package/dist/toast.js.map +1 -0
  324. package/dist/utils/file-system.d.ts +9 -0
  325. package/dist/utils/file-system.d.ts.map +1 -1
  326. package/dist/utils/file-system.js +49 -0
  327. package/dist/utils/file-system.js.map +1 -1
  328. package/dist/utils/run-command.d.ts +25 -1
  329. package/dist/utils/run-command.d.ts.map +1 -1
  330. package/dist/utils/run-command.js +47 -4
  331. package/dist/utils/run-command.js.map +1 -1
  332. package/dist/window.d.ts +12 -0
  333. package/dist/window.d.ts.map +1 -0
  334. package/dist/window.js +48 -0
  335. package/dist/window.js.map +1 -0
  336. package/package.json +13 -11
  337. package/src/apis/browser-extension.tsx +29 -0
  338. package/src/apis/localstorage.test.ts +14 -6
  339. package/src/apis/localstorage.tsx +8 -5
  340. package/src/apis/oauth.tsx +5 -1
  341. package/src/apis/preferences.tsx +48 -22
  342. package/src/build.test.tsx +52 -0
  343. package/src/build.tsx +2 -1
  344. package/src/cli.tsx +80 -39
  345. package/src/compile.tsx +24 -6
  346. package/src/components/actions.tsx +94 -32
  347. package/src/components/detail.tsx +4 -0
  348. package/src/components/dropdown.tsx +47 -14
  349. package/src/components/extension-preferences.tsx +44 -16
  350. package/src/components/form/checkbox.tsx +12 -6
  351. package/src/components/form/date-picker.tsx +12 -6
  352. package/src/components/form/description.tsx +7 -2
  353. package/src/components/form/dropdown.tsx +131 -119
  354. package/src/components/form/file-autocomplete.tsx +90 -108
  355. package/src/components/form/file-picker.tsx +54 -43
  356. package/src/components/form/form-end.tsx +23 -2
  357. package/src/components/form/index.tsx +152 -34
  358. package/src/components/form/password-field.tsx +12 -6
  359. package/src/components/form/text-area.tsx +13 -6
  360. package/src/components/form/text-field.tsx +13 -6
  361. package/src/components/form/types.tsx +6 -0
  362. package/src/components/form/with-left-border.tsx +41 -8
  363. package/src/components/icon.tsx +27 -8
  364. package/src/components/list.tsx +193 -74
  365. package/src/components/loading-bar.tsx +3 -2
  366. package/src/components/loading-text.tsx +79 -0
  367. package/src/descendants.tsx +1 -0
  368. package/src/examples/file-autocomplete.vitest.tsx +130 -125
  369. package/src/examples/form-basic.vitest.tsx +376 -176
  370. package/src/examples/form-dropdown.vitest.tsx +126 -126
  371. package/src/examples/form-scroll.tsx +2 -0
  372. package/src/examples/form-scroll.vitest.tsx +58 -58
  373. package/src/examples/form-tagpicker.vitest.tsx +99 -99
  374. package/src/examples/internal/descendants-filtering.tsx +1 -0
  375. package/src/examples/internal/descendants.tsx +1 -0
  376. package/src/examples/internal/rhf-custom-ref.tsx +2 -0
  377. package/src/examples/internal/scrollbox-demo.tsx +3 -27
  378. package/src/examples/internal/scrollbox-with-descendants.tsx +4 -7
  379. package/src/examples/internal/simple-scrollbox.vitest.tsx +7 -5
  380. package/src/examples/list-detail-metadata.tsx +49 -0
  381. package/src/examples/list-detail-metadata.vitest.tsx +88 -0
  382. package/src/examples/list-dropdown-default.vitest.tsx +51 -51
  383. package/src/examples/list-fetch-data.vitest.tsx +4 -4
  384. package/src/examples/list-scrollbox.vitest.tsx +73 -14
  385. package/src/examples/list-with-detail-long.tsx +70 -0
  386. package/src/examples/list-with-detail.vitest.tsx +198 -92
  387. package/src/examples/list-with-dropdown.vitest.tsx +53 -53
  388. package/src/examples/list-with-sections.tsx +1 -0
  389. package/src/examples/list-with-sections.vitest.tsx +213 -89
  390. package/src/examples/list-with-toast.vitest.tsx +4 -4
  391. package/src/examples/simple-file-picker.vitest.tsx +61 -471
  392. package/src/examples/simple-grid.vitest.tsx +238 -233
  393. package/src/examples/simple-navigation.tsx +15 -7
  394. package/src/examples/simple-navigation.vitest.tsx +121 -210
  395. package/src/examples/store.vitest.tsx +1 -1
  396. package/src/examples/swift-extension.vitest.tsx +148 -0
  397. package/src/examples/synonyms.vitest.tsx +159 -0
  398. package/src/extensions/dev.tsx +74 -7
  399. package/src/extensions/dev.vitest.tsx +97 -31
  400. package/src/extensions/home.tsx +6 -0
  401. package/src/index.tsx +3 -0
  402. package/src/internal/dialog.tsx +43 -30
  403. package/src/internal/navigation.tsx +3 -1
  404. package/src/internal/offscreen.tsx +15 -0
  405. package/src/internal/providers.tsx +4 -2
  406. package/src/internal/scrollbox.tsx +4 -8
  407. package/src/keyboard.test.tsx +69 -0
  408. package/src/state.tsx +7 -0
  409. package/src/swift-loader.tsx +239 -0
  410. package/src/swift-runtime.tsx +36 -0
  411. package/src/utils/file-system.ts +61 -0
  412. package/src/utils/run-command.tsx +75 -6
@@ -0,0 +1,49 @@
1
+ import React from 'react'
2
+ import { List } from 'termcast'
3
+ import { renderWithProviders } from '../utils'
4
+
5
+ const ListDetailMetadataExample = () => {
6
+ return (
7
+ <List
8
+ navigationTitle="Metadata Test"
9
+ searchBarPlaceholder="Search..."
10
+ isShowingDetail={true}
11
+ >
12
+ <List.Item
13
+ id="item1"
14
+ title="Item with Metadata"
15
+ detail={
16
+ <List.Item.Detail
17
+ markdown="# Details"
18
+ metadata={
19
+ <List.Item.Detail.Metadata>
20
+ <List.Item.Detail.Metadata.Label title="Name" text="John Doe" />
21
+ <List.Item.Detail.Metadata.Label title="Email" text="john@example.com" />
22
+ <List.Item.Detail.Metadata.Separator />
23
+ <List.Item.Detail.Metadata.Label title="Status" text="Active" />
24
+ <List.Item.Detail.Metadata.Link title="Website" target="https://example.com" text="example.com" />
25
+ </List.Item.Detail.Metadata>
26
+ }
27
+ />
28
+ }
29
+ />
30
+ <List.Item
31
+ id="item2"
32
+ title="Another Item"
33
+ detail={
34
+ <List.Item.Detail
35
+ markdown="# Info"
36
+ metadata={
37
+ <List.Item.Detail.Metadata>
38
+ <List.Item.Detail.Metadata.Label title="Count" text="42" />
39
+ <List.Item.Detail.Metadata.Label title="Price" text="$99.99" />
40
+ </List.Item.Detail.Metadata>
41
+ }
42
+ />
43
+ }
44
+ />
45
+ </List>
46
+ )
47
+ }
48
+
49
+ await renderWithProviders(<ListDetailMetadataExample />)
@@ -0,0 +1,88 @@
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/list-detail-metadata.tsx'],
10
+ cols: 80,
11
+ rows: 20,
12
+ })
13
+ })
14
+
15
+ afterEach(() => {
16
+ session?.close()
17
+ })
18
+
19
+ test('list detail metadata label renders title and text in column layout', async () => {
20
+ const snapshot = await session.text({
21
+ waitFor: (text) => {
22
+ return (
23
+ text.includes('Metadata Test') &&
24
+ text.includes('Name') &&
25
+ text.includes('John Doe') &&
26
+ text.includes('Email')
27
+ )
28
+ },
29
+ })
30
+
31
+ expect(snapshot).toMatchInlineSnapshot(`
32
+ "
33
+
34
+
35
+ Metadata Test ────────────────────────────────────────────────────────────
36
+
37
+ Search...
38
+
39
+ ›Item with Metadata
40
+ Another Item │ ▲
41
+ │ ───────────────────────────────── █
42
+ │ ▀
43
+ │ Name:
44
+ │ John Doe
45
+
46
+ │ Email:
47
+ │ john@example.com
48
+ │ ─────────────────
49
+
50
+ ↑↓ navigate ^k actions │ Status: ▼"
51
+ `)
52
+ }, 10000)
53
+
54
+ test('list detail metadata navigation shows different metadata', async () => {
55
+ await session.text({
56
+ waitFor: (text) => text.includes('Metadata Test'),
57
+ })
58
+
59
+ await session.press('down')
60
+
61
+ const snapshot = await session.text({
62
+ waitFor: (text) => {
63
+ return text.includes('Count') && text.includes('42')
64
+ },
65
+ })
66
+
67
+ expect(snapshot).toMatchInlineSnapshot(`
68
+ "
69
+
70
+
71
+ Metadata Test ────────────────────────────────────────────────────────────
72
+
73
+ Search...
74
+
75
+ Item with Metadata
76
+ ›Another Item │ Info
77
+ │ ──────────────────────────────────
78
+
79
+ │ Count:
80
+ │ 42
81
+
82
+ │ Price:
83
+ │ $99.99
84
+
85
+
86
+ ↑↓ navigate ^k actions │"
87
+ `)
88
+ }, 10000)
@@ -56,7 +56,7 @@ test('dropdown defaults to first item when no value is provided', async () => {
56
56
 
57
57
 
58
58
 
59
- select ↑↓ navigate ^k actions"
59
+ show selected fruit ↑↓ navigate ^k actions"
60
60
  `)
61
61
  }, 10000)
62
62
 
@@ -75,20 +75,22 @@ test('dropdown opens and shows items', async () => {
75
75
 
76
76
 
77
77
  Dropdown Default Value Example ───────────────────────────────────────────
78
- ┃ ┃
79
- ┃ Filter by category esc ┃
80
- ┃ ┃
81
- ┃ Select category... ┃
82
- ┃ ┃
83
- ┃ ›Apple ┃
84
- ┃ Banana ┃
85
- ┃ Orange ┃
86
- ┃ Grape ┃
87
- ┃ ┃
88
- ┃ ┃
89
- ┃ ↵ select ↑↓ navigate ┃
90
- ┃ ┃
91
78
 
79
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
80
+ S┃ ┃
81
+ ┃ Filter by category esc ┃
82
+ ›F┃ ┃
83
+ S┃ Select category... ┃
84
+ V┃ ┃
85
+ C┃ ›Apple ┃
86
+ ┃ Banana ┃
87
+ ┃ Orange ┃
88
+ ┃ Grape ┃
89
+ ┃ ┃
90
+ ┃ ┃
91
+ ┃ ↵ select ↑↓ navigate ┃
92
+ ┃ ┃
93
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
92
94
 
93
95
 
94
96
 
@@ -97,9 +99,7 @@ test('dropdown opens and shows items', async () => {
97
99
 
98
100
 
99
101
 
100
-
101
-
102
- ↵ select ↑↓ navigate ^k actions"
102
+ ↵ show selected fruit ↑↓ navigate ^k actions"
103
103
  `)
104
104
 
105
105
  await session.press('down')
@@ -110,21 +110,22 @@ test('dropdown opens and shows items', async () => {
110
110
 
111
111
 
112
112
  Dropdown Default Value Example ───────────────────────────────────────────
113
- ┃ ┃
114
- ┃ Filter by category esc ┃
115
- ┃ ┃
116
- ┃ Select category... ┃
117
- ┃ ┃
118
- ┃ Apple ┃
119
- ┃ ›Banana ┃
120
- ┃ Orange ┃
121
- ┃ Grape ┃
122
- ┃ ┃
123
- ┃ ┃
124
- ┃ ↵ select ↑↓ navigate ┃
125
- ┃ ┃
126
-
127
113
 
114
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
115
+ S┃ ┃
116
+ ┃ Filter by category esc ┃
117
+ ›F┃ ┃
118
+ S┃ Select category... ┃
119
+ V┃ ┃
120
+ C┃ Apple ┃
121
+ ┃ ›Banana ┃
122
+ ┃ Orange ┃
123
+ ┃ Grape ┃
124
+ ┃ ┃
125
+ ┃ ┃
126
+ ┃ ↵ select ↑↓ navigate ┃
127
+ ┃ ┃
128
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
128
129
 
129
130
 
130
131
 
@@ -133,8 +134,7 @@ test('dropdown opens and shows items', async () => {
133
134
 
134
135
 
135
136
 
136
-
137
- ↵ select ↑↓ navigate ^k actions"
137
+ ↵ show selected fruit ↑↓ navigate ^k actions"
138
138
  `)
139
139
 
140
140
  await session.press('enter')
@@ -169,7 +169,7 @@ test('dropdown opens and shows items', async () => {
169
169
 
170
170
 
171
171
 
172
- select ↑↓ navigate ^k actions"
172
+ show selected fruit ↑↓ navigate ^k actions"
173
173
  `)
174
174
  }, 10000)
175
175
 
@@ -188,22 +188,22 @@ test('clicking dropdown opens it', async () => {
188
188
 
189
189
 
190
190
  Dropdown Default Value Example ───────────────────────────────────────────
191
- ┃ ┃
192
- ┃ Filter by category esc ┃
193
- ┃ ┃
194
- ┃ Select category... ┃
195
- ┃ ┃
196
- ┃ ›Apple ┃
197
- ┃ Banana ┃
198
- ┃ Orange ┃
199
- ┃ Grape ┃
200
- ┃ ┃
201
- ┃ ┃
202
- ┃ ↵ select ↑↓ navigate ┃
203
- ┃ ┃
204
-
205
-
206
191
 
192
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
193
+ S┃ ┃
194
+ ┃ Filter by category esc ┃
195
+ ›F┃ ┃
196
+ S┃ Select category... ┃
197
+ V┃ ┃
198
+ C┃ ›Apple ┃
199
+ ┃ Banana ┃
200
+ ┃ Orange ┃
201
+ ┃ Grape ┃
202
+ ┃ ┃
203
+ ┃ ┃
204
+ ┃ ↵ select ↑↓ navigate ┃
205
+ ┃ ┃
206
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
207
207
 
208
208
 
209
209
 
@@ -212,7 +212,7 @@ test('clicking dropdown opens it', async () => {
212
212
 
213
213
 
214
214
 
215
- select ↑↓ navigate ^k actions"
215
+ show selected fruit ↑↓ navigate ^k actions"
216
216
  `)
217
217
 
218
218
  await session.click('Orange', { first: true })
@@ -247,6 +247,6 @@ test('clicking dropdown opens it', async () => {
247
247
 
248
248
 
249
249
 
250
- select ↑↓ navigate ^k actions"
250
+ show selected fruit ↑↓ navigate ^k actions"
251
251
  `)
252
252
  }, 10000)
@@ -44,7 +44,7 @@ test('list shows initial items after fetch', async () => {
44
44
 
45
45
  Illustrations
46
46
  Welcome Banner Category: Illustrations
47
- Hero
47
+ Hero Image Category: Illustrations
48
48
 
49
49
 
50
50
 
@@ -53,7 +53,7 @@ test('list shows initial items after fetch', async () => {
53
53
 
54
54
 
55
55
 
56
- ↵ select ↑↓ navigate ^k actions"
56
+ ↑↓ navigate ^k actions"
57
57
  `)
58
58
 
59
59
 
@@ -84,7 +84,7 @@ test('list shows initial items after fetch', async () => {
84
84
 
85
85
 
86
86
 
87
- ↵ select ↑↓ navigate ^k actions"
87
+ ↑↓ navigate ^k actions"
88
88
  `)
89
89
 
90
90
  await session.press('down')
@@ -114,6 +114,6 @@ test('list shows initial items after fetch', async () => {
114
114
 
115
115
 
116
116
 
117
- ↵ select ↑↓ navigate ^k actions"
117
+ ↑↓ navigate ^k actions"
118
118
  `)
119
119
  }, 10000)
@@ -29,13 +29,13 @@ test('list scrollbox auto-scrolls when navigating down', async () => {
29
29
 
30
30
 
31
31
  Scrollbox Test ─────────────────────────────
32
- Search items...
33
32
 
34
- ›♠ Item 1 Description for item 1 ▲
35
- ■ Item 2 Description for item 2 ▼
33
+ Search items...
36
34
 
35
+ ›▲ Item 1 Description for item 1 ▲
36
+
37
37
 
38
- ↵ select ↑↓ navigate ^k actions"
38
+ ↑↓ navigate ^k actions"
39
39
  `)
40
40
 
41
41
  await session.press('down')
@@ -50,13 +50,13 @@ test('list scrollbox auto-scrolls when navigating down', async () => {
50
50
 
51
51
 
52
52
  Scrollbox Test ─────────────────────────────
53
- Search items...
54
53
 
55
- Item 5 Description for item 5 ▲
56
- ›♦ Item 6 Description for item 6 ▼
54
+ Search items...
57
55
 
56
+ ›● Item 6 Description for item 6 ▲
57
+
58
58
 
59
- ↵ select ↑↓ navigate ^k actions"
59
+ ↑↓ navigate ^k actions"
60
60
  `)
61
61
 
62
62
  await session.press('down')
@@ -69,13 +69,13 @@ test('list scrollbox auto-scrolls when navigating down', async () => {
69
69
 
70
70
 
71
71
  Scrollbox Test ─────────────────────────────
72
- Search items...
73
72
 
74
- Item 8 Description for item 8 ▲
75
- ›■ Item 9 Description for item 9 ▼
73
+ Search items...
76
74
 
75
+ ›■ Item 9 Description for item 9 ▲
76
+
77
77
 
78
- ↵ select ↑↓ navigate ^k actions"
78
+ ↑↓ navigate ^k actions"
79
79
  `)
80
80
 
81
81
  await session.press('up')
@@ -92,12 +92,71 @@ test('list scrollbox auto-scrolls when navigating down', async () => {
92
92
 
93
93
 
94
94
  Scrollbox Test ─────────────────────────────
95
+
95
96
  Search items...
96
97
 
97
98
  ›■ Item 2 Description for item 2 ▲
98
- ♠ Item 3 Description for item 3
99
+
100
+
101
+ ↑↓ navigate ^k actions"
102
+ `)
103
+ }, 15000)
104
+
105
+ test('list scrollbox scrolls with mouse wheel', async () => {
106
+ await session.text({
107
+ waitFor: (text) => {
108
+ return /Item 1/i.test(text)
109
+ },
110
+ })
111
+
112
+ const initialSnapshot = await session.text()
113
+ expect(initialSnapshot).toMatchInlineSnapshot(`
114
+ "
115
+
116
+
117
+ Scrollbox Test ─────────────────────────────
118
+
119
+ Search items...
120
+
121
+ ›▲ Item 1 Description for item 1 ▲
122
+
123
+
124
+ ↑↓ navigate ^k actions"
125
+ `)
126
+
127
+ await session.scrollDown(3)
128
+
129
+ const afterScrollDownSnapshot = await session.text()
130
+ expect(afterScrollDownSnapshot).not.toEqual(initialSnapshot)
131
+ expect(afterScrollDownSnapshot).toMatchInlineSnapshot(`
132
+ "
133
+
134
+
135
+ Scrollbox Test ─────────────────────────────
136
+
137
+ Search items...
138
+
139
+ ■ Item 2 Description for item 2 ▲
140
+
141
+
142
+ ↑↓ navigate ^k actions"
143
+ `)
144
+
145
+ await session.scrollUp(2)
146
+
147
+ const afterScrollUpSnapshot = await session.text()
148
+ expect(afterScrollUpSnapshot).not.toEqual(afterScrollDownSnapshot)
149
+ expect(afterScrollUpSnapshot).toMatchInlineSnapshot(`
150
+ "
151
+
152
+
153
+ Scrollbox Test ─────────────────────────────
154
+
155
+ Search items...
99
156
 
157
+ ›▲ Item 1 Description for item 1 ▲
158
+
100
159
 
101
- ↵ select ↑↓ navigate ^k actions"
160
+ ↑↓ navigate ^k actions"
102
161
  `)
103
162
  }, 15000)
@@ -0,0 +1,70 @@
1
+ import React from 'react'
2
+ import { List } from 'termcast'
3
+ import { renderWithProviders } from '../utils'
4
+
5
+ const items = [
6
+ {
7
+ id: 'short',
8
+ title: 'Short Detail',
9
+ markdown: `# Brief content
10
+
11
+ This is short.`,
12
+ },
13
+ {
14
+ id: 'long',
15
+ title: 'Long Detail',
16
+ markdown: `# This item has extensive detail content
17
+
18
+ ## Section 1
19
+ This is a very long description that contains multiple paragraphs and sections to test how the layout behaves when the detail panel content overflows.
20
+
21
+ ## Section 2
22
+ More content here to ensure we have enough text to cause vertical overflow in the detail panel scrollbox.
23
+
24
+ ## Section 3
25
+ Even more content. We want to make sure the detail panel definitely needs to scroll.
26
+
27
+ ## Section 4
28
+ Additional paragraphs to push the content height beyond what fits in the viewport.
29
+
30
+ ## Section 5
31
+ The goal is to have the scrollbar appear in the detail panel.
32
+
33
+ ## Section 6
34
+ This should be enough content now to cause overflow.
35
+
36
+ ## Section 7
37
+ Just a bit more to be safe.
38
+
39
+ ## Section 8
40
+ And some final content here.`,
41
+ },
42
+ {
43
+ id: 'another',
44
+ title: 'Another Item',
45
+ markdown: `# Another
46
+
47
+ Some content.`,
48
+ },
49
+ ]
50
+
51
+ const ListWithDetailLongExample = () => {
52
+ return (
53
+ <List
54
+ navigationTitle="Detail Length Test"
55
+ searchBarPlaceholder="Search..."
56
+ isShowingDetail={true}
57
+ >
58
+ {items.map((item) => (
59
+ <List.Item
60
+ key={item.id}
61
+ id={item.id}
62
+ title={item.title}
63
+ detail={<List.Item.Detail markdown={item.markdown} />}
64
+ />
65
+ ))}
66
+ </List>
67
+ )
68
+ }
69
+
70
+ await renderWithProviders(<ListWithDetailLongExample />)