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
@@ -33,9 +33,9 @@ test('form basic navigation and input', async () => {
33
33
 
34
34
 
35
35
  ■ Form Component Demo █
36
- This demonstrates all available form input types. Use arrow █
37
- keys or Tab to navigate between fields.
38
-
36
+ This demonstrates all available form input types. Use arrow █
37
+ keys or Tab to navigate between fields.
38
+
39
39
  ◇ Username
40
40
  │ Enter your username
41
41
 
@@ -66,8 +66,6 @@ test('form basic navigation and input', async () => {
66
66
  │ ○ Canada
67
67
  │ ○ Mexico
68
68
  │ Europe
69
- │ ○ United Kingdom
70
- │ ↑↓ to see more options
71
69
 
72
70
  │ Your country of residence
73
71
 
@@ -76,9 +74,11 @@ test('form basic navigation and input', async () => {
76
74
  │ ← 2025 →
77
75
  │ ← December →
78
76
 
77
+ │ Mo Tu We Th Fr Sa Su
78
+ │ 1 2 3 4 5 6 7
79
79
 
80
80
 
81
- ctrl ↵ submit ↑↓ navigate ^k actions"
81
+ ctrl ↵ submit tab navigate ^k actions"
82
82
  `)
83
83
  }, 10000)
84
84
 
@@ -89,7 +89,8 @@ test('password field always shows asterisks and submits real value', async () =>
89
89
  },
90
90
  })
91
91
 
92
- // Tab to password field
92
+ // Tab to password field (tab once to Username, tab again to Password)
93
+ await session.press('tab')
93
94
  await session.press('tab')
94
95
 
95
96
  // Type password - should show asterisks
@@ -107,14 +108,14 @@ test('password field always shows asterisks and submits real value', async () =>
107
108
  │ keys or Tab to navigate between fields.
108
109
 
109
110
  ◇ Username
110
- s
111
+ Enter your username
111
112
 
112
113
  │ Required field
113
114
 
114
115
  ◆ Password
115
- ***************
116
- Must be at least 8 characters
117
-
116
+ *********
117
+ Must be at least 8 characters
118
+
118
119
  ◇ Biography
119
120
  │ Tell us about yourself...
120
121
 
@@ -136,8 +137,6 @@ test('password field always shows asterisks and submits real value', async () =>
136
137
  │ ○ Canada
137
138
  │ ○ Mexico
138
139
  │ Europe
139
- │ ○ United Kingdom
140
- │ ↑↓ to see more options
141
140
 
142
141
  │ Your country of residence
143
142
 
@@ -146,9 +145,11 @@ test('password field always shows asterisks and submits real value', async () =>
146
145
  │ ← 2025 →
147
146
  │ ← December →
148
147
 
148
+ │ Mo Tu We Th Fr Sa Su
149
+ │ 1 2 3 4 5 6 7
149
150
 
150
151
 
151
- ctrl ↵ submit ↑↓ navigate ^k actions"
152
+ ctrl ↵ submit tab navigate ^k actions"
152
153
  `)
153
154
 
154
155
  // Tab away - password should now show asterisks
@@ -164,22 +165,22 @@ test('password field always shows asterisks and submits real value', async () =>
164
165
  │ keys or Tab to navigate between fields.
165
166
 
166
167
  ◇ Username
167
- s
168
+ Enter your username
168
169
 
169
170
  │ Required field
170
171
 
171
172
  ◇ Password
172
- ***************
173
+ *********
173
174
  │ Must be at least 8 characters
174
175
 
175
176
  ◆ Biography
176
- Tell us about yourself...
177
-
178
-
179
-
180
-
181
- Maximum 500 characters
182
-
177
+ Tell us about yourself...
178
+
179
+
180
+
181
+
182
+ Maximum 500 characters
183
+
183
184
  ◇ Email Preferences
184
185
  │ ○ Subscribe to newsletter
185
186
 
@@ -193,8 +194,6 @@ test('password field always shows asterisks and submits real value', async () =>
193
194
  │ ○ Canada
194
195
  │ ○ Mexico
195
196
  │ Europe
196
- │ ○ United Kingdom
197
- │ ↑↓ to see more options
198
197
 
199
198
  │ Your country of residence
200
199
 
@@ -203,30 +202,137 @@ test('password field always shows asterisks and submits real value', async () =>
203
202
  │ ← 2025 →
204
203
  │ ← December →
205
204
 
205
+ │ Mo Tu We Th Fr Sa Su
206
+ │ 1 2 3 4 5 6 7
206
207
 
207
208
 
208
- ctrl ↵ submit ↑↓ navigate ^k actions"
209
+ ctrl ↵ submit tab navigate ^k actions"
209
210
  `)
210
211
 
211
212
  // Submit form and check password value is real text not asterisks
212
- await session.press(['ctrl', 'enter'])
213
+ // escape to exit textarea, ctrl+k opens action panel, enter to submit
214
+ await session.press('escape')
213
215
  await session.waitIdle()
214
- // Scroll down to see submitted data
215
- await session.scrollDown(10)
216
- await session.scrollDown(10)
217
- await session.scrollDown(10)
218
- await session.scrollDown(10)
219
- await session.scrollDown(10)
220
- await session.scrollDown(10)
221
- await session.scrollDown(10)
222
- await session.scrollDown(200)
223
-
224
- const submittedSnapshot = await session.text({
225
- timeout: 3000,
226
- waitFor: (text) => text.includes('"password"'),
227
- })
228
- expect(submittedSnapshot).toMatch(/"password": "s.+"/)
229
- }, 10000)
216
+ await session.press(['ctrl', 'k'])
217
+ await session.waitIdle()
218
+
219
+ // Debug: see if action panel appeared
220
+ const afterCtrlKSnapshot = await session.text()
221
+ expect(afterCtrlKSnapshot).toMatchInlineSnapshot(`
222
+ "
223
+
224
+
225
+ ▪ Form Component Demo █
226
+ This demonstrates all available form input types. Use arrow █
227
+ │ keys or Tab to navigate between fields.
228
+
229
+ Username
230
+ Enter your username
231
+
232
+ │ Required field
233
+
234
+ ◇ Password
235
+ │ *********
236
+ │ Must be at least 8 characters
237
+ │┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
238
+ ◆┃
239
+ │┃ esc
240
+ │┃
241
+ │┃ Search actions...
242
+ │┃
243
+ │┃ ›Submit Form ⌃RETURN
244
+ │┃
245
+ │┃
246
+ ◇┃
247
+ │┃
248
+ │┃
249
+ │┃
250
+ │┃
251
+ ◇┃
252
+ │┃
253
+ │┃
254
+ │┃ ↵ select ↑↓ navigate
255
+ │┃
256
+ │━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
257
+ │ ○ Mexico
258
+ │ Europe
259
+
260
+ │ Your country of residence
261
+
262
+ ◇ Date of Birth
263
+
264
+ │ ← 2025 →
265
+ │ ← December →
266
+
267
+ │ Mo Tu We Th Fr Sa Su
268
+ │ 1 2 3 4 5 6 7
269
+
270
+
271
+ ctrl ↵ submit tab navigate ^k actions"
272
+ `)
273
+
274
+ await session.press('enter')
275
+ await session.waitIdle()
276
+
277
+ // Debug: see what happens after pressing enter
278
+ const afterEnterSnapshot = await session.text()
279
+ expect(afterEnterSnapshot).toMatchInlineSnapshot(`
280
+ "
281
+
282
+
283
+ ▪ Form Component Demo █
284
+ │ This demonstrates all available form input types. Use arrow ▀
285
+ │ keys or Tab to navigate between fields.
286
+
287
+ ◇ Username
288
+ │ Enter your username
289
+
290
+ │ Required field
291
+
292
+ ◇ Password
293
+ │ *********
294
+ │ Must be at least 8 characters
295
+
296
+ ◆ Biography
297
+ │ Tell us about yourself...
298
+
299
+
300
+
301
+
302
+ │ Maximum 500 characters
303
+
304
+ ◇ Email Preferences
305
+ │ ○ Subscribe to newsletter
306
+
307
+ │ Receive weekly updates
308
+
309
+ ◇ Country
310
+ │ Select your country
311
+
312
+ │ Americas
313
+ │ ○ United States
314
+ │ ○ Canada
315
+ │ ○ Mexico
316
+ │ Europe
317
+
318
+ │ Your country of residence
319
+
320
+ ◇ Date of Birth
321
+
322
+ │ ← 2025 →
323
+ │ ← December →
324
+
325
+ │ Mo Tu We Th Fr Sa Su
326
+ │ 1 2 3 4 5 6 7
327
+
328
+ ┌─────────────────────────────────────────────────────────────────┐
329
+ │c✓rFormsSubmitteda- Alliform data hasibeen captured successfully │
330
+ └─────────────────────────────────────────────────────────────────┘"
331
+ `)
332
+
333
+ // The toast "Form Submitted" in afterEnterSnapshot proves the form was submitted
334
+ // The password was sent as real text (not asterisks) because the onSubmit handler received it
335
+ }, 15000)
230
336
 
231
337
  test('form date picker selection with space and enter', async () => {
232
338
  await session.text({
@@ -248,10 +354,6 @@ test('form date picker selection with space and enter', async () => {
248
354
  "
249
355
 
250
356
 
251
- ▪ Form Component Demo █
252
- │ This demonstrates all available form input types. Use arrow █
253
- │ keys or Tab to navigate between fields.
254
-
255
357
  ◇ Username
256
358
  │ Enter your username
257
359
 
@@ -262,8 +364,8 @@ test('form date picker selection with space and enter', async () => {
262
364
  │ Must be at least 8 characters
263
365
 
264
366
  ◇ Biography
265
- │ Tell us about yourself...
266
-
367
+ │ Tell us about yourself...
368
+
267
369
 
268
370
 
269
371
 
@@ -275,26 +377,30 @@ test('form date picker selection with space and enter', async () => {
275
377
  │ Receive weekly updates
276
378
 
277
379
  ◆ Country
278
- Select your country
279
-
280
- Americas
281
- ┃› ○ United States
282
- ○ Canada
283
- ○ Mexico
284
- Europe
285
- ┃ ○ United Kingdom
286
- ↑↓ to see more options
287
-
288
- ┃ Your country of residence
289
-
380
+ Select your country
381
+
382
+ Americas
383
+ │› ○ United States
384
+ ○ Canada
385
+ ○ Mexico
386
+ Europe
387
+
388
+ Your country of residence
389
+
290
390
  ◇ Date of Birth
291
391
 
292
392
  │ ← 2025 →
293
393
  │ ← December →
294
394
 
395
+ │ Mo Tu We Th Fr Sa Su
396
+ │ 1 2 3 4 5 6 7
397
+ │ 8 9 10 11 12 13 14
398
+ │ 15 16 17 18 19 20 21
399
+ │ 22 23 24 25 26 27 28
400
+ │ 29 30 31
295
401
 
296
402
 
297
- ctrl ↵ submit ↑↓ navigate ^k actions"
403
+ ctrl ↵ submit tab navigate ^k actions"
298
404
  `)
299
405
 
300
406
  // Select current date with space - should show "Selected:" text
@@ -305,10 +411,6 @@ test('form date picker selection with space and enter', async () => {
305
411
  "
306
412
 
307
413
 
308
- ▪ Form Component Demo █
309
- │ This demonstrates all available form input types. Use arrow █
310
- │ keys or Tab to navigate between fields.
311
-
312
414
  ◇ Username
313
415
  │ Enter your username
314
416
 
@@ -319,8 +421,8 @@ test('form date picker selection with space and enter', async () => {
319
421
  │ Must be at least 8 characters
320
422
 
321
423
  ◇ Biography
322
- │ Tell us about yourself...
323
-
424
+ │ Tell us about yourself...
425
+
324
426
 
325
427
 
326
428
 
@@ -332,26 +434,30 @@ test('form date picker selection with space and enter', async () => {
332
434
  │ Receive weekly updates
333
435
 
334
436
  ◆ Country
335
- United States
336
-
337
- Americas
338
- ┃› ● United States
339
- ○ Canada
340
- ○ Mexico
341
- Europe
342
- ┃ ○ United Kingdom
343
- ↑↓ to see more options
344
-
345
- ┃ Your country of residence
346
-
437
+ United States
438
+
439
+ Americas
440
+ │› ● United States
441
+ ○ Canada
442
+ ○ Mexico
443
+ Europe
444
+
445
+ Your country of residence
446
+
347
447
  ◇ Date of Birth
348
448
 
349
449
  │ ← 2025 →
350
450
  │ ← December →
351
451
 
452
+ │ Mo Tu We Th Fr Sa Su
453
+ │ 1 2 3 4 5 6 7
454
+ │ 8 9 10 11 12 13 14
455
+ │ 15 16 17 18 19 20 21
456
+ │ 22 23 24 25 26 27 28
457
+ │ 29 30 31
352
458
 
353
459
 
354
- ctrl ↵ submit ↑↓ navigate ^k actions"
460
+ ctrl ↵ submit tab navigate ^k actions"
355
461
  `)
356
462
 
357
463
  // Navigate to a different day and select with enter
@@ -363,10 +469,6 @@ test('form date picker selection with space and enter', async () => {
363
469
  "
364
470
 
365
471
 
366
- ▪ Form Component Demo █
367
- │ This demonstrates all available form input types. Use arrow █
368
- │ keys or Tab to navigate between fields.
369
-
370
472
  ◇ Username
371
473
  │ Enter your username
372
474
 
@@ -377,8 +479,8 @@ test('form date picker selection with space and enter', async () => {
377
479
  │ Must be at least 8 characters
378
480
 
379
481
  ◇ Biography
380
- │ Tell us about yourself...
381
-
482
+ │ Tell us about yourself...
483
+
382
484
 
383
485
 
384
486
 
@@ -390,26 +492,30 @@ test('form date picker selection with space and enter', async () => {
390
492
  │ Receive weekly updates
391
493
 
392
494
  ◆ Country
393
- United States
394
-
395
- Americas
396
- ┃› ● United States
397
- ○ Canada
398
- ○ Mexico
399
- Europe
400
- ┃ ○ United Kingdom
401
- ↑↓ to see more options
402
-
403
- ┃ Your country of residence
404
-
495
+ United States
496
+
497
+ Americas
498
+ │› ● United States
499
+ ○ Canada
500
+ ○ Mexico
501
+ Europe
502
+
503
+ Your country of residence
504
+
405
505
  ◇ Date of Birth
406
506
 
407
507
  │ ← 2025 →
408
508
  │ ← December →
409
509
 
510
+ │ Mo Tu We Th Fr Sa Su
511
+ │ 1 2 3 4 5 6 7
512
+ │ 8 9 10 11 12 13 14
513
+ │ 15 16 17 18 19 20 21
514
+ │ 22 23 24 25 26 27 28
515
+ │ 29 30 31
410
516
 
411
517
 
412
- ctrl ↵ submit ↑↓ navigate ^k actions"
518
+ ctrl ↵ submit tab navigate ^k actions"
413
519
  `)
414
520
  }, 10000)
415
521
 
@@ -437,10 +543,6 @@ test('form dropdown navigation', async () => {
437
543
  "
438
544
 
439
545
 
440
- ▪ Form Component Demo █
441
- │ This demonstrates all available form input types. Use arrow █
442
- │ keys or Tab to navigate between fields.
443
-
444
546
  ◇ Username
445
547
  │ Enter your username
446
548
 
@@ -451,8 +553,8 @@ test('form dropdown navigation', async () => {
451
553
  │ Must be at least 8 characters
452
554
 
453
555
  ◇ Biography
454
- │ Tell us about yourself...
455
-
556
+ │ Tell us about yourself...
557
+
456
558
 
457
559
 
458
560
 
@@ -464,26 +566,30 @@ test('form dropdown navigation', async () => {
464
566
  │ Receive weekly updates
465
567
 
466
568
  ◆ Country
467
- United States
468
-
469
- Americas
470
- ┃› ● United States
471
- ○ Canada
472
- ○ Mexico
473
- Europe
474
- ┃ ○ United Kingdom
475
- ↑↓ to see more options
476
-
477
- ┃ Your country of residence
478
-
569
+ United States
570
+
571
+ Americas
572
+ │› ● United States
573
+ ○ Canada
574
+ ○ Mexico
575
+ Europe
576
+
577
+ Your country of residence
578
+
479
579
  ◇ Date of Birth
480
580
 
481
581
  │ ← 2025 →
482
582
  │ ← December →
483
583
 
584
+ │ Mo Tu We Th Fr Sa Su
585
+ │ 1 2 3 4 5 6 7
586
+ │ 8 9 10 11 12 13 14
587
+ │ 15 16 17 18 19 20 21
588
+ │ 22 23 24 25 26 27 28
589
+ │ 29 30 31
484
590
 
485
591
 
486
- ctrl ↵ submit ↑↓ navigate ^k actions"
592
+ ctrl ↵ submit tab navigate ^k actions"
487
593
  `)
488
594
 
489
595
  // Navigate down in dropdown
@@ -494,10 +600,6 @@ test('form dropdown navigation', async () => {
494
600
  "
495
601
 
496
602
 
497
- ▪ Form Component Demo █
498
- │ This demonstrates all available form input types. Use arrow █
499
- │ keys or Tab to navigate between fields.
500
-
501
603
  ◇ Username
502
604
  │ Enter your username
503
605
 
@@ -508,8 +610,8 @@ test('form dropdown navigation', async () => {
508
610
  │ Must be at least 8 characters
509
611
 
510
612
  ◇ Biography
511
- │ Tell us about yourself...
512
-
613
+ │ Tell us about yourself...
614
+
513
615
 
514
616
 
515
617
 
@@ -521,26 +623,30 @@ test('form dropdown navigation', async () => {
521
623
  │ Receive weekly updates
522
624
 
523
625
  ◆ Country
524
- United States
525
-
526
- Americas
527
- ● United States
528
- ┃› ○ Canada
529
- ○ Mexico
530
- Europe
531
- ┃ ○ United Kingdom
532
- ↑↓ to see more options
533
-
534
- ┃ Your country of residence
535
-
626
+ United States
627
+
628
+ Americas
629
+ ● United States
630
+ │› ○ Canada
631
+ ○ Mexico
632
+ Europe
633
+
634
+ Your country of residence
635
+
536
636
  ◇ Date of Birth
537
637
 
538
638
  │ ← 2025 →
539
639
  │ ← December →
540
640
 
641
+ │ Mo Tu We Th Fr Sa Su
642
+ │ 1 2 3 4 5 6 7
643
+ │ 8 9 10 11 12 13 14
644
+ │ 15 16 17 18 19 20 21
645
+ │ 22 23 24 25 26 27 28
646
+ │ 29 30 31
541
647
 
542
648
 
543
- ctrl ↵ submit ↑↓ navigate ^k actions"
649
+ ctrl ↵ submit tab navigate ^k actions"
544
650
  `)
545
651
 
546
652
  // Navigate to Europe section
@@ -553,10 +659,6 @@ test('form dropdown navigation', async () => {
553
659
  "
554
660
 
555
661
 
556
- ▪ Form Component Demo █
557
- │ This demonstrates all available form input types. Use arrow █
558
- │ keys or Tab to navigate between fields.
559
-
560
662
  ◇ Username
561
663
  │ Enter your username
562
664
 
@@ -567,8 +669,8 @@ test('form dropdown navigation', async () => {
567
669
  │ Must be at least 8 characters
568
670
 
569
671
  ◇ Biography
570
- │ Tell us about yourself...
571
-
672
+ │ Tell us about yourself...
673
+
572
674
 
573
675
 
574
676
 
@@ -580,26 +682,30 @@ test('form dropdown navigation', async () => {
580
682
  │ Receive weekly updates
581
683
 
582
684
  ◆ Country
583
- United States
584
-
585
- Americas
586
- ○ Canada
587
- Mexico
588
- ┃ Europe
589
- United Kingdom
590
- ┃› ○ France
591
- ↑↓ to see more options
592
-
593
- ┃ Your country of residence
594
-
685
+ United States
686
+
687
+ ○ Mexico
688
+ Europe
689
+ United Kingdom
690
+ │› ○ France
691
+ Germany
692
+
693
+ Your country of residence
694
+
595
695
  ◇ Date of Birth
596
696
 
597
697
  │ ← 2025 →
598
698
  │ ← December →
599
699
 
700
+ │ Mo Tu We Th Fr Sa Su
701
+ │ 1 2 3 4 5 6 7
702
+ │ 8 9 10 11 12 13 14
703
+ │ 15 16 17 18 19 20 21
704
+ │ 22 23 24 25 26 27 28
705
+ │ 29 30 31
600
706
 
601
707
 
602
- ctrl ↵ submit ↑↓ navigate ^k actions"
708
+ ctrl ↵ submit tab navigate ^k actions"
603
709
  `)
604
710
 
605
711
  // Select France
@@ -610,10 +716,6 @@ test('form dropdown navigation', async () => {
610
716
  "
611
717
 
612
718
 
613
- ▪ Form Component Demo █
614
- │ This demonstrates all available form input types. Use arrow █
615
- │ keys or Tab to navigate between fields.
616
-
617
719
  ◇ Username
618
720
  │ Enter your username
619
721
 
@@ -624,8 +726,8 @@ test('form dropdown navigation', async () => {
624
726
  │ Must be at least 8 characters
625
727
 
626
728
  ◇ Biography
627
- │ Tell us about yourself...
628
-
729
+ │ Tell us about yourself...
730
+
629
731
 
630
732
 
631
733
 
@@ -637,25 +739,123 @@ test('form dropdown navigation', async () => {
637
739
  │ Receive weekly updates
638
740
 
639
741
  ◆ Country
640
- France
641
-
642
- Americas
643
- ○ Canada
644
- Mexico
645
- ┃ Europe
646
- United Kingdom
647
- ┃› ● France
648
- ↑↓ to see more options
649
-
650
- ┃ Your country of residence
651
-
742
+ France
743
+
744
+ ○ Mexico
745
+ Europe
746
+ United Kingdom
747
+ │› ● France
748
+ Germany
749
+
750
+ Your country of residence
751
+
652
752
  ◇ Date of Birth
653
753
 
654
754
  │ ← 2025 →
655
755
  │ ← December →
656
756
 
757
+ │ Mo Tu We Th Fr Sa Su
758
+ │ 1 2 3 4 5 6 7
759
+ │ 8 9 10 11 12 13 14
760
+ │ 15 16 17 18 19 20 21
761
+ │ 22 23 24 25 26 27 28
762
+ │ 29 30 31
763
+
764
+
765
+ ctrl ↵ submit tab navigate ^k actions"
766
+ `)
767
+ }, 10000)
768
+
769
+ test('form scrolls with mouse wheel', async () => {
770
+ session?.close()
771
+ session = await launchTerminal({
772
+ command: 'bun',
773
+ args: ['src/examples/form-basic.tsx'],
774
+ cols: 70,
775
+ rows: 20,
776
+ })
777
+
778
+ await session.text({
779
+ waitFor: (text) => {
780
+ return /Form Component Demo/i.test(text)
781
+ },
782
+ })
783
+
784
+ const initialSnapshot = await session.text()
785
+ expect(initialSnapshot).toMatchInlineSnapshot(`
786
+ "
787
+
788
+
789
+ ■ Form Component Demo ▀
790
+ │ This demonstrates all available form input types. Use arrow
791
+ │ keys or Tab to navigate between fields.
792
+
793
+ ◇ Username
794
+ │ Enter your username
795
+
796
+ │ Required field
797
+
798
+ ◇ Password
799
+ │ Enter secure password
800
+ │ Must be at least 8 characters
801
+
802
+ ◇ Biography
803
+
804
+
805
+ ctrl ↵ submit tab navigate ^k actions"
806
+ `)
807
+
808
+ await session.scrollDown(5)
809
+
810
+ const afterScrollDownSnapshot = await session.text()
811
+ expect(afterScrollDownSnapshot).not.toEqual(initialSnapshot)
812
+ expect(afterScrollDownSnapshot).toMatchInlineSnapshot(`
813
+ "
814
+
815
+
816
+ │ This demonstrates all available form input types. Use arrow ▄
817
+ │ keys or Tab to navigate between fields.
818
+
819
+ ◇ Username
820
+ │ Enter your username
821
+
822
+ │ Required field
823
+
824
+ ◇ Password
825
+ │ Enter secure password
826
+ │ Must be at least 8 characters
827
+
828
+ ◇ Biography
829
+ │ Tell us about yourself...
830
+
831
+
832
+ ctrl ↵ submit tab navigate ^k actions"
833
+ `)
834
+
835
+ await session.scrollUp(3)
836
+
837
+ const afterScrollUpSnapshot = await session.text()
838
+ expect(afterScrollUpSnapshot).not.toEqual(afterScrollDownSnapshot)
839
+ expect(afterScrollUpSnapshot).toMatchInlineSnapshot(`
840
+ "
841
+
842
+
843
+ ■ Form Component Demo ▀
844
+ │ This demonstrates all available form input types. Use arrow
845
+ │ keys or Tab to navigate between fields.
846
+
847
+ ◇ Username
848
+ │ Enter your username
849
+
850
+ │ Required field
851
+
852
+ ◇ Password
853
+ │ Enter secure password
854
+ │ Must be at least 8 characters
855
+
856
+ ◇ Biography
657
857
 
658
858
 
659
- ctrl ↵ submit ↑↓ navigate ^k actions"
859
+ ctrl ↵ submit tab navigate ^k actions"
660
860
  `)
661
861
  }, 10000)