termcast 1.3.9 → 1.3.16

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 (559) hide show
  1. package/dist/action-utils.js +1 -1
  2. package/dist/action-utils.js.map +1 -1
  3. package/dist/apis/ai.js +1 -1
  4. package/dist/apis/ai.js.map +1 -1
  5. package/dist/apis/clipboard.js +2 -2
  6. package/dist/apis/clipboard.js.map +1 -1
  7. package/dist/apis/hud.d.ts +2 -2
  8. package/dist/apis/hud.d.ts.map +1 -1
  9. package/dist/apis/hud.js +5 -5
  10. package/dist/apis/hud.js.map +1 -1
  11. package/dist/apis/oauth.d.ts +1 -1
  12. package/dist/apis/oauth.d.ts.map +1 -1
  13. package/dist/apis/oauth.js +8 -8
  14. package/dist/apis/oauth.js.map +1 -1
  15. package/dist/apis/preferences.js +4 -4
  16. package/dist/apis/preferences.js.map +1 -1
  17. package/dist/apis/toast.d.ts +1 -5
  18. package/dist/apis/toast.d.ts.map +1 -1
  19. package/dist/apis/toast.js +26 -20
  20. package/dist/apis/toast.js.map +1 -1
  21. package/dist/build.d.ts +2 -0
  22. package/dist/build.d.ts.map +1 -1
  23. package/dist/build.js +9 -8
  24. package/dist/build.js.map +1 -1
  25. package/dist/cli.js +44 -2
  26. package/dist/cli.js.map +1 -1
  27. package/dist/colors.d.ts +8 -1
  28. package/dist/colors.d.ts.map +1 -1
  29. package/dist/colors.js +12 -0
  30. package/dist/colors.js.map +1 -1
  31. package/dist/compile.d.ts +30 -0
  32. package/dist/compile.d.ts.map +1 -0
  33. package/dist/compile.js +156 -0
  34. package/dist/compile.js.map +1 -0
  35. package/dist/components/actions.d.ts +2 -1
  36. package/dist/components/actions.d.ts.map +1 -1
  37. package/dist/components/actions.js +11 -8
  38. package/dist/components/actions.js.map +1 -1
  39. package/dist/components/alert.js +4 -4
  40. package/dist/components/alert.js.map +1 -1
  41. package/dist/components/command-arguments.d.ts +9 -0
  42. package/dist/components/command-arguments.d.ts.map +1 -0
  43. package/dist/components/command-arguments.js +21 -0
  44. package/dist/components/command-arguments.js.map +1 -0
  45. package/dist/components/detail.d.ts +3 -3
  46. package/dist/components/detail.d.ts.map +1 -1
  47. package/dist/components/detail.js +20 -42
  48. package/dist/components/detail.js.map +1 -1
  49. package/dist/components/dropdown.d.ts +2 -1
  50. package/dist/components/dropdown.d.ts.map +1 -1
  51. package/dist/components/dropdown.js +81 -25
  52. package/dist/components/dropdown.js.map +1 -1
  53. package/dist/components/extension-preferences.d.ts.map +1 -1
  54. package/dist/components/extension-preferences.js +23 -33
  55. package/dist/components/extension-preferences.js.map +1 -1
  56. package/dist/components/form/checkbox.d.ts.map +1 -1
  57. package/dist/components/form/checkbox.js +11 -4
  58. package/dist/components/form/checkbox.js.map +1 -1
  59. package/dist/components/form/date-picker.d.ts.map +1 -1
  60. package/dist/components/form/date-picker.js +18 -31
  61. package/dist/components/form/date-picker.js.map +1 -1
  62. package/dist/components/form/description.d.ts +2 -0
  63. package/dist/components/form/description.d.ts.map +1 -1
  64. package/dist/components/form/description.js +21 -3
  65. package/dist/components/form/description.js.map +1 -1
  66. package/dist/components/form/dropdown.d.ts.map +1 -1
  67. package/dist/components/form/dropdown.js +17 -32
  68. package/dist/components/form/dropdown.js.map +1 -1
  69. package/dist/components/form/file-autocomplete.d.ts +7 -4
  70. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  71. package/dist/components/form/file-autocomplete.js +56 -48
  72. package/dist/components/form/file-autocomplete.js.map +1 -1
  73. package/dist/components/form/file-picker.d.ts +5 -0
  74. package/dist/components/form/file-picker.d.ts.map +1 -1
  75. package/dist/components/form/file-picker.js +48 -51
  76. package/dist/components/form/file-picker.js.map +1 -1
  77. package/dist/components/form/form-end.js +1 -1
  78. package/dist/components/form/form-end.js.map +1 -1
  79. package/dist/components/form/form-ref.d.ts +43 -0
  80. package/dist/components/form/form-ref.d.ts.map +1 -0
  81. package/dist/components/form/form-ref.js +53 -0
  82. package/dist/components/form/form-ref.js.map +1 -0
  83. package/dist/components/form/index.d.ts +16 -0
  84. package/dist/components/form/index.d.ts.map +1 -1
  85. package/dist/components/form/index.js +90 -27
  86. package/dist/components/form/index.js.map +1 -1
  87. package/dist/components/form/password-field.d.ts.map +1 -1
  88. package/dist/components/form/password-field.js +33 -17
  89. package/dist/components/form/password-field.js.map +1 -1
  90. package/dist/components/form/separator.js +1 -1
  91. package/dist/components/form/separator.js.map +1 -1
  92. package/dist/components/form/tagpicker.d.ts +1 -1
  93. package/dist/components/form/tagpicker.d.ts.map +1 -1
  94. package/dist/components/form/text-area.d.ts.map +1 -1
  95. package/dist/components/form/text-area.js +33 -16
  96. package/dist/components/form/text-area.js.map +1 -1
  97. package/dist/components/form/text-field.d.ts.map +1 -1
  98. package/dist/components/form/text-field.js +38 -18
  99. package/dist/components/form/text-field.js.map +1 -1
  100. package/dist/components/form/use-form-navigation.d.ts +4 -0
  101. package/dist/components/form/use-form-navigation.d.ts.map +1 -1
  102. package/dist/components/form/use-form-navigation.js +35 -18
  103. package/dist/components/form/use-form-navigation.js.map +1 -1
  104. package/dist/components/form/with-left-border.d.ts.map +1 -1
  105. package/dist/components/form/with-left-border.js +3 -3
  106. package/dist/components/form/with-left-border.js.map +1 -1
  107. package/dist/components/icon.d.ts +3 -1
  108. package/dist/components/icon.d.ts.map +1 -1
  109. package/dist/components/icon.js +494 -469
  110. package/dist/components/icon.js.map +1 -1
  111. package/dist/components/image.js +1 -1
  112. package/dist/components/image.js.map +1 -1
  113. package/dist/components/list.d.ts +12 -8
  114. package/dist/components/list.d.ts.map +1 -1
  115. package/dist/components/list.js +172 -40
  116. package/dist/components/list.js.map +1 -1
  117. package/dist/components/loading-bar.js +2 -2
  118. package/dist/components/loading-bar.js.map +1 -1
  119. package/dist/components/menubar-extra.d.ts +1 -1
  120. package/dist/components/menubar-extra.d.ts.map +1 -1
  121. package/dist/components/menubar-extra.js +2 -2
  122. package/dist/components/menubar-extra.js.map +1 -1
  123. package/dist/descendants.d.ts.map +1 -1
  124. package/dist/descendants.js +8 -5
  125. package/dist/descendants.js.map +1 -1
  126. package/dist/e2e-node.d.ts +2 -0
  127. package/dist/e2e-node.d.ts.map +1 -1
  128. package/dist/e2e-node.js +14 -0
  129. package/dist/e2e-node.js.map +1 -1
  130. package/dist/examples/action-show-in-finder.js +3 -3
  131. package/dist/examples/action-show-in-finder.js.map +1 -1
  132. package/dist/examples/environment-test.js +4 -4
  133. package/dist/examples/environment-test.js.map +1 -1
  134. package/dist/examples/error-boundary.js +5 -5
  135. package/dist/examples/error-boundary.js.map +1 -1
  136. package/dist/examples/form-basic.d.ts.map +1 -1
  137. package/dist/examples/form-basic.js +6 -6
  138. package/dist/examples/form-basic.js.map +1 -1
  139. package/dist/examples/form-dropdown.js +3 -3
  140. package/dist/examples/form-dropdown.js.map +1 -1
  141. package/dist/examples/form-scroll.d.ts +2 -0
  142. package/dist/examples/form-scroll.d.ts.map +1 -0
  143. package/dist/examples/form-scroll.js +8 -0
  144. package/dist/examples/form-scroll.js.map +1 -0
  145. package/dist/examples/form-tagpicker.js +3 -3
  146. package/dist/examples/form-tagpicker.js.map +1 -1
  147. package/dist/examples/internal/descendants-filtering.js +10 -5
  148. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  149. package/dist/examples/internal/descendants.js +13 -6
  150. package/dist/examples/internal/descendants.js.map +1 -1
  151. package/dist/examples/internal/rhf-custom-ref.d.ts +2 -0
  152. package/dist/examples/internal/rhf-custom-ref.d.ts.map +1 -0
  153. package/dist/examples/internal/rhf-custom-ref.js +67 -0
  154. package/dist/examples/internal/rhf-custom-ref.js.map +1 -0
  155. package/dist/examples/internal/scrollbox-demo.js +4 -8
  156. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  157. package/dist/examples/internal/scrollbox-with-descendants.d.ts +2 -0
  158. package/dist/examples/internal/scrollbox-with-descendants.d.ts.map +1 -0
  159. package/dist/examples/internal/scrollbox-with-descendants.js +63 -0
  160. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -0
  161. package/dist/examples/internal/simple-dialog.js +7 -7
  162. package/dist/examples/internal/simple-dialog.js.map +1 -1
  163. package/dist/examples/internal/simple-scrollbox.d.ts +2 -0
  164. package/dist/examples/internal/simple-scrollbox.d.ts.map +1 -0
  165. package/dist/examples/internal/simple-scrollbox.js +25 -0
  166. package/dist/examples/internal/simple-scrollbox.js.map +1 -0
  167. package/dist/examples/internal/text-stacking.js +4 -2
  168. package/dist/examples/internal/text-stacking.js.map +1 -1
  169. package/dist/examples/list-dropdown-default.js +3 -3
  170. package/dist/examples/list-dropdown-default.js.map +1 -1
  171. package/dist/examples/list-fetch-data.js +3 -3
  172. package/dist/examples/list-fetch-data.js.map +1 -1
  173. package/dist/examples/list-scrollbox.d.ts +2 -0
  174. package/dist/examples/list-scrollbox.d.ts.map +1 -0
  175. package/dist/examples/list-scrollbox.js +29 -0
  176. package/dist/examples/list-scrollbox.js.map +1 -0
  177. package/dist/examples/list-with-detail.js +2 -2
  178. package/dist/examples/list-with-detail.js.map +1 -1
  179. package/dist/examples/list-with-dropdown.js +2 -2
  180. package/dist/examples/list-with-dropdown.js.map +1 -1
  181. package/dist/examples/list-with-sections.js +6 -6
  182. package/dist/examples/list-with-sections.js.map +1 -1
  183. package/dist/examples/miscellaneous.js +14 -14
  184. package/dist/examples/miscellaneous.js.map +1 -1
  185. package/dist/examples/nested-navigation.js +9 -7
  186. package/dist/examples/nested-navigation.js.map +1 -1
  187. package/dist/examples/preferences-test.js +4 -4
  188. package/dist/examples/preferences-test.js.map +1 -1
  189. package/dist/examples/simple-dropdown.js +4 -4
  190. package/dist/examples/simple-dropdown.js.map +1 -1
  191. package/dist/examples/simple-file-picker.js +3 -3
  192. package/dist/examples/simple-file-picker.js.map +1 -1
  193. package/dist/examples/simple-grid.js +2 -2
  194. package/dist/examples/simple-grid.js.map +1 -1
  195. package/dist/examples/simple-hud.js +4 -4
  196. package/dist/examples/simple-hud.js.map +1 -1
  197. package/dist/examples/simple-list-search.js +21 -5
  198. package/dist/examples/simple-list-search.js.map +1 -1
  199. package/dist/examples/simple-list.js +4 -4
  200. package/dist/examples/simple-list.js.map +1 -1
  201. package/dist/examples/simple-navigation.js +9 -7
  202. package/dist/examples/simple-navigation.js.map +1 -1
  203. package/dist/examples/store.js +1 -1
  204. package/dist/examples/store.js.map +1 -1
  205. package/dist/examples/submodule-diff.d.ts +2 -0
  206. package/dist/examples/submodule-diff.d.ts.map +1 -0
  207. package/dist/examples/submodule-diff.js +99 -0
  208. package/dist/examples/submodule-diff.js.map +1 -0
  209. package/dist/examples/tanstack-demo.js +3 -3
  210. package/dist/examples/tanstack-demo.js.map +1 -1
  211. package/dist/examples/use-promise-demo.js +3 -3
  212. package/dist/examples/use-promise-demo.js.map +1 -1
  213. package/dist/extensions/dev.d.ts +8 -0
  214. package/dist/extensions/dev.d.ts.map +1 -1
  215. package/dist/extensions/dev.js +60 -35
  216. package/dist/extensions/dev.js.map +1 -1
  217. package/dist/extensions/home.d.ts.map +1 -1
  218. package/dist/extensions/home.js +22 -97
  219. package/dist/extensions/home.js.map +1 -1
  220. package/dist/extensions/store.js +2 -2
  221. package/dist/extensions/store.js.map +1 -1
  222. package/dist/globals.js +1 -1
  223. package/dist/globals.js.map +1 -1
  224. package/dist/hooks/index.d.ts +1 -1
  225. package/dist/hooks/index.d.ts.map +1 -1
  226. package/dist/hooks/index.js +1 -1
  227. package/dist/hooks/index.js.map +1 -1
  228. package/dist/hooks/use-action-panel.js +1 -1
  229. package/dist/hooks/use-action-panel.js.map +1 -1
  230. package/dist/hooks/use-unstable-ai.js +1 -1
  231. package/dist/hooks/use-unstable-ai.js.map +1 -1
  232. package/dist/index.d.ts +57 -55
  233. package/dist/index.d.ts.map +1 -1
  234. package/dist/index.js +42 -38
  235. package/dist/index.js.map +1 -1
  236. package/dist/internal/date-picker-widget.d.ts.map +1 -1
  237. package/dist/internal/date-picker-widget.js +56 -48
  238. package/dist/internal/date-picker-widget.js.map +1 -1
  239. package/dist/internal/dialog.d.ts +3 -3
  240. package/dist/internal/dialog.d.ts.map +1 -1
  241. package/dist/internal/dialog.js +10 -10
  242. package/dist/internal/dialog.js.map +1 -1
  243. package/dist/internal/error-handler.js +2 -2
  244. package/dist/internal/error-handler.js.map +1 -1
  245. package/dist/internal/focus-context.d.ts +1 -1
  246. package/dist/internal/focus-context.d.ts.map +1 -1
  247. package/dist/internal/navigation.d.ts +1 -1
  248. package/dist/internal/navigation.d.ts.map +1 -1
  249. package/dist/internal/navigation.js +2 -2
  250. package/dist/internal/navigation.js.map +1 -1
  251. package/dist/internal/providers.d.ts +2 -2
  252. package/dist/internal/providers.d.ts.map +1 -1
  253. package/dist/internal/providers.js +9 -9
  254. package/dist/internal/providers.js.map +1 -1
  255. package/dist/internal/scrollbox.d.ts +12 -0
  256. package/dist/internal/scrollbox.d.ts.map +1 -0
  257. package/dist/internal/scrollbox.js +34 -0
  258. package/dist/internal/scrollbox.js.map +1 -0
  259. package/dist/preload.js +1 -1
  260. package/dist/preload.js.map +1 -1
  261. package/dist/release.d.ts +11 -0
  262. package/dist/release.d.ts.map +1 -0
  263. package/dist/release.js +113 -0
  264. package/dist/release.js.map +1 -0
  265. package/dist/state.d.ts +1 -0
  266. package/dist/state.d.ts.map +1 -1
  267. package/dist/state.js +1 -0
  268. package/dist/state.js.map +1 -1
  269. package/dist/theme.d.ts +11 -8
  270. package/dist/theme.d.ts.map +1 -1
  271. package/dist/theme.js +31 -8
  272. package/dist/theme.js.map +1 -1
  273. package/dist/utils/run-command.d.ts +22 -0
  274. package/dist/utils/run-command.d.ts.map +1 -0
  275. package/dist/utils/run-command.js +127 -0
  276. package/dist/utils/run-command.js.map +1 -0
  277. package/dist/utils.d.ts +1 -1
  278. package/dist/utils.d.ts.map +1 -1
  279. package/dist/utils.js +6 -4
  280. package/dist/utils.js.map +1 -1
  281. package/package.json +13 -8
  282. package/src/apis/toast.tsx +38 -17
  283. package/src/build.tsx +5 -3
  284. package/src/cli.tsx +46 -0
  285. package/src/colors.tsx +22 -1
  286. package/src/compile.tsx +219 -0
  287. package/src/components/actions.tsx +7 -1
  288. package/src/components/command-arguments.tsx +81 -0
  289. package/src/components/detail.tsx +26 -58
  290. package/src/components/dropdown.tsx +108 -23
  291. package/src/components/extension-preferences.tsx +55 -35
  292. package/src/components/form/checkbox.tsx +13 -5
  293. package/src/components/form/date-picker.tsx +24 -29
  294. package/src/components/form/description.tsx +35 -7
  295. package/src/components/form/dropdown.tsx +16 -30
  296. package/src/components/form/file-autocomplete.tsx +87 -77
  297. package/src/components/form/file-picker.tsx +69 -57
  298. package/src/components/form/form-ref.tsx +68 -0
  299. package/src/components/form/index.tsx +152 -41
  300. package/src/components/form/password-field.tsx +35 -22
  301. package/src/components/form/text-area.tsx +78 -58
  302. package/src/components/form/text-field.tsx +82 -61
  303. package/src/components/form/use-form-navigation.tsx +43 -23
  304. package/src/components/form/with-left-border.tsx +2 -1
  305. package/src/components/icon.tsx +497 -469
  306. package/src/components/list.tsx +279 -112
  307. package/src/components/loading-bar.tsx +1 -1
  308. package/src/descendants.tsx +15 -5
  309. package/src/e2e-node.tsx +16 -0
  310. package/src/examples/action-show-in-finder.tsx +1 -1
  311. package/src/examples/environment-test.tsx +1 -1
  312. package/src/examples/error-boundary.tsx +1 -1
  313. package/src/examples/file-autocomplete.vitest.tsx +245 -0
  314. package/src/examples/form-basic.tsx +12 -12
  315. package/src/examples/form-basic.vitest.tsx +297 -671
  316. package/src/examples/form-dropdown.tsx +1 -1
  317. package/src/examples/form-dropdown.vitest.tsx +353 -221
  318. package/src/examples/form-scroll.tsx +56 -0
  319. package/src/examples/form-scroll.vitest.tsx +228 -0
  320. package/src/examples/form-tagpicker.tsx +1 -1
  321. package/src/examples/form-tagpicker.vitest.tsx +438 -193
  322. package/src/examples/internal/descendants-filtering.tsx +13 -5
  323. package/src/examples/internal/descendants.tsx +17 -5
  324. package/src/examples/internal/rhf-custom-ref.tsx +152 -0
  325. package/src/examples/internal/scrollbox-demo.tsx +15 -7
  326. package/src/examples/internal/scrollbox-with-descendants.tsx +94 -0
  327. package/src/examples/internal/simple-dialog.tsx +1 -1
  328. package/src/examples/internal/simple-scrollbox.tsx +58 -0
  329. package/src/examples/internal/simple-scrollbox.vitest.tsx +104 -0
  330. package/src/examples/internal/text-stacking.tsx +4 -2
  331. package/src/examples/list-dropdown-default.tsx +1 -1
  332. package/src/examples/list-dropdown-default.vitest.tsx +136 -71
  333. package/src/examples/list-fetch-data.tsx +1 -1
  334. package/src/examples/list-fetch-data.vitest.tsx +42 -33
  335. package/src/examples/list-scrollbox.tsx +46 -0
  336. package/src/examples/list-scrollbox.vitest.tsx +103 -0
  337. package/src/examples/list-with-detail.tsx +1 -1
  338. package/src/examples/list-with-detail.vitest.tsx +290 -294
  339. package/src/examples/list-with-dropdown.tsx +1 -1
  340. package/src/examples/list-with-dropdown.vitest.tsx +190 -150
  341. package/src/examples/list-with-sections.tsx +12 -1
  342. package/src/examples/list-with-sections.vitest.tsx +390 -218
  343. package/src/examples/miscellaneous.tsx +1 -1
  344. package/src/examples/nested-navigation.tsx +7 -5
  345. package/src/examples/preferences-test.tsx +1 -1
  346. package/src/examples/simple-dropdown.tsx +1 -1
  347. package/src/examples/simple-file-picker.tsx +1 -1
  348. package/src/examples/simple-file-picker.vitest.tsx +533 -127
  349. package/src/examples/simple-grid.tsx +1 -1
  350. package/src/examples/simple-grid.vitest.tsx +258 -234
  351. package/src/examples/simple-hud.tsx +1 -1
  352. package/src/examples/simple-list-search.tsx +42 -1
  353. package/src/examples/simple-list.tsx +1 -1
  354. package/src/examples/simple-navigation.tsx +7 -5
  355. package/src/examples/simple-navigation.vitest.tsx +434 -238
  356. package/src/examples/store.tsx +1 -1
  357. package/src/examples/store.vitest.tsx +31 -14
  358. package/src/examples/submodule-diff.tsx +153 -0
  359. package/src/examples/tanstack-demo.tsx +1 -1
  360. package/src/examples/use-promise-demo.tsx +1 -1
  361. package/src/extensions/dev.tsx +76 -38
  362. package/src/extensions/dev.vitest.tsx +220 -0
  363. package/src/extensions/home.tsx +20 -121
  364. package/src/globals.ts +1 -1
  365. package/src/index.tsx +12 -25
  366. package/src/internal/date-picker-widget.tsx +56 -46
  367. package/src/internal/dialog.tsx +6 -6
  368. package/src/internal/providers.tsx +1 -1
  369. package/src/internal/scrollbox.tsx +63 -0
  370. package/src/release.tsx +159 -0
  371. package/src/state.tsx +2 -0
  372. package/src/store-api/search.test.tsx +4 -13
  373. package/src/theme.tsx +33 -8
  374. package/src/utils/run-command.tsx +204 -0
  375. package/src/utils.tsx +6 -4
  376. package/dist/ai.d.ts +0 -104
  377. package/dist/ai.d.ts.map +0 -1
  378. package/dist/ai.js +0 -135
  379. package/dist/ai.js.map +0 -1
  380. package/dist/apis/cache.test.d.ts +0 -2
  381. package/dist/apis/cache.test.d.ts.map +0 -1
  382. package/dist/apis/cache.test.js +0 -246
  383. package/dist/apis/cache.test.js.map +0 -1
  384. package/dist/apis/localstorage.test.d.ts +0 -2
  385. package/dist/apis/localstorage.test.d.ts.map +0 -1
  386. package/dist/apis/localstorage.test.js +0 -131
  387. package/dist/apis/localstorage.test.js.map +0 -1
  388. package/dist/apis/toast.test.d.ts +0 -2
  389. package/dist/apis/toast.test.d.ts.map +0 -1
  390. package/dist/apis/toast.test.js +0 -67
  391. package/dist/apis/toast.test.js.map +0 -1
  392. package/dist/build.test.d.ts +0 -2
  393. package/dist/build.test.d.ts.map +0 -1
  394. package/dist/build.test.js +0 -73
  395. package/dist/build.test.js.map +0 -1
  396. package/dist/cache.d.ts +0 -32
  397. package/dist/cache.d.ts.map +0 -1
  398. package/dist/cache.js +0 -205
  399. package/dist/cache.js.map +0 -1
  400. package/dist/cache.test.d.ts +0 -2
  401. package/dist/cache.test.d.ts.map +0 -1
  402. package/dist/cache.test.js +0 -246
  403. package/dist/cache.test.js.map +0 -1
  404. package/dist/clipboard.d.ts +0 -36
  405. package/dist/clipboard.d.ts.map +0 -1
  406. package/dist/clipboard.js +0 -154
  407. package/dist/clipboard.js.map +0 -1
  408. package/dist/components/form/form-type-only.d.ts +0 -174
  409. package/dist/components/form/form-type-only.d.ts.map +0 -1
  410. package/dist/components/form/form-type-only.js +0 -2
  411. package/dist/components/form/form-type-only.js.map +0 -1
  412. package/dist/components/form/use-form-handling.d.ts +0 -4
  413. package/dist/components/form/use-form-handling.d.ts.map +0 -1
  414. package/dist/components/form/use-form-handling.js +0 -37
  415. package/dist/components/form/use-form-handling.js.map +0 -1
  416. package/dist/dev-ui.d.ts +0 -7
  417. package/dist/dev-ui.d.ts.map +0 -1
  418. package/dist/dev-ui.js +0 -118
  419. package/dist/dev-ui.js.map +0 -1
  420. package/dist/environment.d.ts +0 -63
  421. package/dist/environment.d.ts.map +0 -1
  422. package/dist/environment.js +0 -189
  423. package/dist/environment.js.map +0 -1
  424. package/dist/examples/datepicker.d.ts +0 -2
  425. package/dist/examples/datepicker.d.ts.map +0 -1
  426. package/dist/examples/datepicker.js +0 -344
  427. package/dist/examples/datepicker.js.map +0 -1
  428. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +0 -2
  429. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +0 -1
  430. package/dist/examples/form-basic-arrow-keys.vitest.js +0 -46
  431. package/dist/examples/form-basic-arrow-keys.vitest.js.map +0 -1
  432. package/dist/examples/form-basic.vitest.d.ts +0 -2
  433. package/dist/examples/form-basic.vitest.d.ts.map +0 -1
  434. package/dist/examples/form-basic.vitest.js +0 -995
  435. package/dist/examples/form-basic.vitest.js.map +0 -1
  436. package/dist/examples/form-dropdown-with-sections.d.ts +0 -2
  437. package/dist/examples/form-dropdown-with-sections.d.ts.map +0 -1
  438. package/dist/examples/form-dropdown-with-sections.js +0 -13
  439. package/dist/examples/form-dropdown-with-sections.js.map +0 -1
  440. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +0 -2
  441. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +0 -1
  442. package/dist/examples/form-dropdown-with-sections.vitest.js +0 -75
  443. package/dist/examples/form-dropdown-with-sections.vitest.js.map +0 -1
  444. package/dist/examples/form-dropdown.vitest.d.ts +0 -2
  445. package/dist/examples/form-dropdown.vitest.d.ts.map +0 -1
  446. package/dist/examples/form-dropdown.vitest.js +0 -722
  447. package/dist/examples/form-dropdown.vitest.js.map +0 -1
  448. package/dist/examples/form-multiselect-dropdown.d.ts +0 -2
  449. package/dist/examples/form-multiselect-dropdown.d.ts.map +0 -1
  450. package/dist/examples/form-multiselect-dropdown.js +0 -13
  451. package/dist/examples/form-multiselect-dropdown.js.map +0 -1
  452. package/dist/examples/form-tagpicker.vitest.d.ts +0 -2
  453. package/dist/examples/form-tagpicker.vitest.d.ts.map +0 -1
  454. package/dist/examples/form-tagpicker.vitest.js +0 -491
  455. package/dist/examples/form-tagpicker.vitest.js.map +0 -1
  456. package/dist/examples/internal/nested-boxes.d.ts +0 -2
  457. package/dist/examples/internal/nested-boxes.d.ts.map +0 -1
  458. package/dist/examples/internal/nested-boxes.js +0 -7
  459. package/dist/examples/internal/nested-boxes.js.map +0 -1
  460. package/dist/examples/internal/unicode-square-repro.d.ts +0 -2
  461. package/dist/examples/internal/unicode-square-repro.d.ts.map +0 -1
  462. package/dist/examples/internal/unicode-square-repro.js +0 -7
  463. package/dist/examples/internal/unicode-square-repro.js.map +0 -1
  464. package/dist/examples/list-dropdown-default.vitest.d.ts +0 -2
  465. package/dist/examples/list-dropdown-default.vitest.d.ts.map +0 -1
  466. package/dist/examples/list-dropdown-default.vitest.js +0 -164
  467. package/dist/examples/list-dropdown-default.vitest.js.map +0 -1
  468. package/dist/examples/list-fetch-data.vitest.d.ts +0 -2
  469. package/dist/examples/list-fetch-data.vitest.d.ts.map +0 -1
  470. package/dist/examples/list-fetch-data.vitest.js +0 -103
  471. package/dist/examples/list-fetch-data.vitest.js.map +0 -1
  472. package/dist/examples/list-filter-navigation.d.ts +0 -2
  473. package/dist/examples/list-filter-navigation.d.ts.map +0 -1
  474. package/dist/examples/list-filter-navigation.js +0 -8
  475. package/dist/examples/list-filter-navigation.js.map +0 -1
  476. package/dist/examples/list-with-detail.vitest.d.ts +0 -2
  477. package/dist/examples/list-with-detail.vitest.d.ts.map +0 -1
  478. package/dist/examples/list-with-detail.vitest.js +0 -438
  479. package/dist/examples/list-with-detail.vitest.js.map +0 -1
  480. package/dist/examples/list-with-dropdown.vitest.d.ts +0 -2
  481. package/dist/examples/list-with-dropdown.vitest.d.ts.map +0 -1
  482. package/dist/examples/list-with-dropdown.vitest.js +0 -297
  483. package/dist/examples/list-with-dropdown.vitest.js.map +0 -1
  484. package/dist/examples/list-with-sections.vitest.d.ts +0 -2
  485. package/dist/examples/list-with-sections.vitest.d.ts.map +0 -1
  486. package/dist/examples/list-with-sections.vitest.js +0 -441
  487. package/dist/examples/list-with-sections.vitest.js.map +0 -1
  488. package/dist/examples/simple-file-picker.vitest.d.ts +0 -2
  489. package/dist/examples/simple-file-picker.vitest.d.ts.map +0 -1
  490. package/dist/examples/simple-file-picker.vitest.js +0 -277
  491. package/dist/examples/simple-file-picker.vitest.js.map +0 -1
  492. package/dist/examples/simple-grid.vitest.d.ts +0 -2
  493. package/dist/examples/simple-grid.vitest.d.ts.map +0 -1
  494. package/dist/examples/simple-grid.vitest.js +0 -498
  495. package/dist/examples/simple-grid.vitest.js.map +0 -1
  496. package/dist/examples/simple-navigation.vitest.d.ts +0 -2
  497. package/dist/examples/simple-navigation.vitest.d.ts.map +0 -1
  498. package/dist/examples/simple-navigation.vitest.js +0 -522
  499. package/dist/examples/simple-navigation.vitest.js.map +0 -1
  500. package/dist/examples/store.vitest.d.ts +0 -2
  501. package/dist/examples/store.vitest.d.ts.map +0 -1
  502. package/dist/examples/store.vitest.js +0 -52
  503. package/dist/examples/store.vitest.js.map +0 -1
  504. package/dist/home-command.d.ts +0 -8
  505. package/dist/home-command.d.ts.map +0 -1
  506. package/dist/home-command.js +0 -181
  507. package/dist/home-command.js.map +0 -1
  508. package/dist/hooks/hooks.test.d.ts +0 -2
  509. package/dist/hooks/hooks.test.d.ts.map +0 -1
  510. package/dist/hooks/hooks.test.js +0 -37
  511. package/dist/hooks/hooks.test.js.map +0 -1
  512. package/dist/hover-repro.d.ts +0 -2
  513. package/dist/hover-repro.d.ts.map +0 -1
  514. package/dist/hover-repro.js +0 -20
  515. package/dist/hover-repro.js.map +0 -1
  516. package/dist/localstorage.d.ts +0 -13
  517. package/dist/localstorage.d.ts.map +0 -1
  518. package/dist/localstorage.js +0 -190
  519. package/dist/localstorage.js.map +0 -1
  520. package/dist/localstorage.test.d.ts +0 -2
  521. package/dist/localstorage.test.d.ts.map +0 -1
  522. package/dist/localstorage.test.js +0 -131
  523. package/dist/localstorage.test.js.map +0 -1
  524. package/dist/oauth.d.ts +0 -142
  525. package/dist/oauth.d.ts.map +0 -1
  526. package/dist/oauth.js +0 -551
  527. package/dist/oauth.js.map +0 -1
  528. package/dist/preferences.d.ts +0 -23
  529. package/dist/preferences.d.ts.map +0 -1
  530. package/dist/preferences.js +0 -105
  531. package/dist/preferences.js.map +0 -1
  532. package/dist/store-api/download.test.d.ts +0 -2
  533. package/dist/store-api/download.test.d.ts.map +0 -1
  534. package/dist/store-api/download.test.js +0 -36
  535. package/dist/store-api/download.test.js.map +0 -1
  536. package/dist/store-api/extension.test.d.ts +0 -2
  537. package/dist/store-api/extension.test.d.ts.map +0 -1
  538. package/dist/store-api/extension.test.js +0 -22
  539. package/dist/store-api/extension.test.js.map +0 -1
  540. package/dist/store-api/search.test.d.ts +0 -2
  541. package/dist/store-api/search.test.d.ts.map +0 -1
  542. package/dist/store-api/search.test.js +0 -45
  543. package/dist/store-api/search.test.js.map +0 -1
  544. package/dist/store.d.ts +0 -21
  545. package/dist/store.d.ts.map +0 -1
  546. package/dist/store.js +0 -84
  547. package/dist/store.js.map +0 -1
  548. package/dist/toast.d.ts +0 -44
  549. package/dist/toast.d.ts.map +0 -1
  550. package/dist/toast.js +0 -221
  551. package/dist/toast.js.map +0 -1
  552. package/dist/utils.test.d.ts +0 -2
  553. package/dist/utils.test.d.ts.map +0 -1
  554. package/dist/utils.test.js +0 -152
  555. package/dist/utils.test.js.map +0 -1
  556. package/dist/window.d.ts +0 -12
  557. package/dist/window.d.ts.map +0 -1
  558. package/dist/window.js +0 -48
  559. package/dist/window.js.map +0 -1
@@ -1,14 +1,14 @@
1
- import React from 'react'
2
- import { TextAttributes } from '@opentui/core'
1
+ import React, { useRef } from 'react'
2
+ import { BoxRenderable } from '@opentui/core'
3
3
  import { useKeyboard } from '@opentui/react'
4
4
  import { useFormContext, Controller } from 'react-hook-form'
5
- import { useFocusContext } from './index'
5
+ import { useFocusContext, useFormFieldDescendant } from './index'
6
6
  import { FormItemProps, FormItemRef } from './types'
7
- import { logger } from 'termcast/src/logger'
8
7
  import { Theme } from 'termcast/src/theme'
9
8
  import { WithLeftBorder } from './with-left-border'
10
9
  import { DatePickerWidget } from 'termcast/src/internal/date-picker-widget'
11
10
  import { useIsInFocus } from 'termcast/src/internal/focus-context'
11
+ import { useFormNavigationHelpers } from './use-form-navigation'
12
12
 
13
13
  export enum DatePickerType {
14
14
  Date = 'date',
@@ -29,32 +29,20 @@ interface DatePickerComponentType {
29
29
  }
30
30
 
31
31
  const DatePickerComponent = (props: DatePickerProps): any => {
32
- const { control, getValues } = useFormContext()
32
+ const { control } = useFormContext()
33
33
  const { focusedField, setFocusedField } = useFocusContext()
34
34
  const isFocused = focusedField === props.id
35
35
  const isInFocus = useIsInFocus()
36
36
 
37
- const handleNavigateUp = () => {
38
- // Find previous field and focus it
39
- const fieldNames = Object.keys(getValues())
40
- const currentIndex = fieldNames.indexOf(props.id)
41
- if (currentIndex > 0) {
42
- setFocusedField(fieldNames[currentIndex - 1])
43
- } else {
44
- setFocusedField(fieldNames[fieldNames.length - 1])
45
- }
46
- }
37
+ const elementRef = useRef<BoxRenderable>(null)
47
38
 
48
- const handleNavigateDown = () => {
49
- // Find next field and focus it
50
- const fieldNames = Object.keys(getValues())
51
- const currentIndex = fieldNames.indexOf(props.id)
52
- if (currentIndex < fieldNames.length - 1) {
53
- setFocusedField(fieldNames[currentIndex + 1])
54
- } else {
55
- setFocusedField(fieldNames[0])
56
- }
57
- }
39
+ // Register as form field descendant for scroll support
40
+ useFormFieldDescendant({
41
+ id: props.id,
42
+ elementRef: elementRef.current,
43
+ })
44
+
45
+ const { navigateToPrevious, navigateToNext } = useFormNavigationHelpers(props.id)
58
46
 
59
47
  // Handle tab navigation only
60
48
  useKeyboard((evt) => {
@@ -62,9 +50,9 @@ const DatePickerComponent = (props: DatePickerProps): any => {
62
50
 
63
51
  if (evt.name === 'tab') {
64
52
  if (evt.shift) {
65
- handleNavigateUp()
53
+ navigateToPrevious()
66
54
  } else {
67
- handleNavigateDown()
55
+ navigateToNext()
68
56
  }
69
57
  }
70
58
  })
@@ -76,10 +64,10 @@ const DatePickerComponent = (props: DatePickerProps): any => {
76
64
  defaultValue={props.defaultValue || props.value || null}
77
65
  render={({ field, fieldState, formState }) => {
78
66
  return (
79
- <box flexDirection='column'>
67
+ <box ref={elementRef} flexDirection='column'>
80
68
  <WithLeftBorder withDiamond isFocused={isFocused}>
81
69
  <text
82
- fg={Theme.text}
70
+ fg={isFocused ? Theme.primary : Theme.text}
83
71
  onMouseDown={() => {
84
72
  setFocusedField(props.id)
85
73
  }}
@@ -100,6 +88,13 @@ const DatePickerComponent = (props: DatePickerProps): any => {
100
88
  focused={isFocused}
101
89
  />
102
90
  </WithLeftBorder>
91
+ {field.value && (
92
+ <WithLeftBorder isFocused={isFocused}>
93
+ <text fg={Theme.accent}>
94
+ Selected: {field.value.toISOString().split('T')[0]}
95
+ </text>
96
+ </WithLeftBorder>
97
+ )}
103
98
  {(fieldState.error || props.error) && (
104
99
  <WithLeftBorder isFocused={isFocused}>
105
100
  <text fg={Theme.error}>
@@ -1,30 +1,58 @@
1
- import React from 'react'
2
- import { TextAttributes } from '@opentui/core'
1
+ import React, { useRef, useId } from 'react'
2
+ import { BoxRenderable, TextAttributes } from '@opentui/core'
3
3
  import { Theme } from 'termcast/src/theme'
4
4
  import { WithLeftBorder } from './with-left-border'
5
+ import { useFocusContext, useFormFieldDescendant } from './index'
6
+ import { useFormNavigation } from './use-form-navigation'
5
7
 
6
8
  export interface DescriptionProps {
9
+ id?: string
7
10
  title?: string
8
11
  text: string
9
12
  isFormTitle?: boolean
10
13
  }
11
14
 
15
+ export const FORM_MAX_WIDTH = 70
16
+
12
17
  export const Description = (props: DescriptionProps): any => {
18
+ const elementRef = useRef<BoxRenderable>(null)
19
+ const autoId = useId()
20
+ const id = props.id || autoId
21
+
22
+ const focusContext = useFocusContext()
23
+ const isFocused = focusContext.focusedField === id
24
+
25
+ // Register as form field descendant for scroll and navigation support
26
+ useFormFieldDescendant({
27
+ id,
28
+ elementRef: elementRef.current,
29
+ })
30
+
31
+ // Use form navigation for tab/arrow key support
32
+ useFormNavigation(id)
33
+
13
34
  return (
14
- <>
35
+ <box
36
+ ref={elementRef}
37
+ flexDirection='column'
38
+ maxWidth={FORM_MAX_WIDTH}
39
+ onMouseDown={() => {
40
+ focusContext.setFocusedField(id)
41
+ }}
42
+ >
15
43
  {props.title && (
16
44
  <WithLeftBorder
17
- customCharacter={{ focused: '', unfocused: '▪︎' }}
18
- isFocused={false}
45
+ customCharacter={{ focused: '', unfocused: '▪︎' }}
46
+ isFocused={isFocused}
19
47
  >
20
48
  <text fg={Theme.text} attributes={TextAttributes.BOLD}>
21
49
  {props.title}
22
50
  </text>
23
51
  </WithLeftBorder>
24
52
  )}
25
- <WithLeftBorder isFocused={false}>
53
+ <WithLeftBorder isFocused={isFocused}>
26
54
  <text fg={Theme.textMuted}>{props.text}</text>
27
55
  </WithLeftBorder>
28
- </>
56
+ </box>
29
57
  )
30
58
  }
@@ -5,10 +5,8 @@ import React, {
5
5
  useMemo,
6
6
  useRef,
7
7
  useLayoutEffect,
8
- useEffect,
9
- Children,
10
8
  } from 'react'
11
- import { TextAttributes } from '@opentui/core'
9
+ import { BoxRenderable } from '@opentui/core'
12
10
  import { useKeyboard } from '@opentui/react'
13
11
  import {
14
12
  useFormContext,
@@ -16,7 +14,7 @@ import {
16
14
  ControllerRenderProps,
17
15
  ControllerFieldState,
18
16
  } from 'react-hook-form'
19
- import { useFocusContext } from './index'
17
+ import { useFocusContext, useFormFieldDescendant } from './index'
20
18
  import { FormItemProps, FormItemRef } from './types'
21
19
  import { logger } from 'termcast/src/logger'
22
20
  import { Theme } from 'termcast/src/theme'
@@ -26,6 +24,7 @@ import {
26
24
  } from 'termcast/src/descendants'
27
25
  import { WithLeftBorder } from './with-left-border'
28
26
  import { useIsInFocus } from 'termcast/src/internal/focus-context'
27
+ import { useFormNavigationHelpers } from './use-form-navigation'
29
28
 
30
29
  export interface DropdownProps extends FormItemProps<string | string[]> {
31
30
  placeholder?: string
@@ -233,36 +232,23 @@ const DropdownContent = ({
233
232
  }: DropdownContentProps) => {
234
233
  const descendantsContext = useFormDropdownDescendants()
235
234
  const isInFocus = useIsInFocus()
236
- const { getValues } = useFormContext()
237
235
  const { focusedField, setFocusedField } = useFocusContext()
238
236
  const isFocused = focusedField === props.id
239
237
  const [focusedIndex, setFocusedIndex] = useState(0)
240
238
  const [offset, setOffset] = useState(0)
241
239
 
240
+ const elementRef = useRef<BoxRenderable>(null)
241
+
242
+ // Register as form field descendant for scroll support
243
+ useFormFieldDescendant({
244
+ id: props.id,
245
+ elementRef: elementRef.current,
246
+ })
247
+
242
248
  const [selectedTitles, setSelectedTitles] = useState<string[]>([])
243
249
  const [itemsCount, setItemsCount] = useState(0)
244
250
 
245
- const handleNavigateUp = () => {
246
- // Find previous field and focus it
247
- const fieldNames = Object.keys(getValues())
248
- const currentIndex = fieldNames.indexOf(props.id)
249
- if (currentIndex > 0) {
250
- setFocusedField(fieldNames[currentIndex - 1])
251
- } else {
252
- setFocusedField(fieldNames[fieldNames.length - 1])
253
- }
254
- }
255
-
256
- const handleNavigateDown = () => {
257
- // Find next field and focus it
258
- const fieldNames = Object.keys(getValues())
259
- const currentIndex = fieldNames.indexOf(props.id)
260
- if (currentIndex < fieldNames.length - 1) {
261
- setFocusedField(fieldNames[currentIndex + 1])
262
- } else {
263
- setFocusedField(fieldNames[0])
264
- }
265
- }
251
+ const { navigateToPrevious, navigateToNext } = useFormNavigationHelpers(props.id)
266
252
 
267
253
  // Helper to get value for a descendantId
268
254
  const getValueForDescendantId = (
@@ -367,9 +353,9 @@ const DropdownContent = ({
367
353
  // Handle tab navigation
368
354
  if (evt.name === 'tab') {
369
355
  if (evt.shift) {
370
- handleNavigateUp()
356
+ navigateToPrevious()
371
357
  } else {
372
- handleNavigateDown()
358
+ navigateToNext()
373
359
  }
374
360
  }
375
361
  })
@@ -430,10 +416,10 @@ const DropdownContent = ({
430
416
  return (
431
417
  <FormDropdownDescendantsProvider value={descendantsContext}>
432
418
  <FormDropdownContext.Provider value={contextValue}>
433
- <box flexDirection='column'>
419
+ <box ref={elementRef} flexDirection='column'>
434
420
  <WithLeftBorder withDiamond isFocused={isFocused}>
435
421
  <text
436
- fg={Theme.text}
422
+ fg={isFocused ? Theme.primary : Theme.text}
437
423
  onMouseDown={() => {
438
424
  setFocusedField(props.id)
439
425
  }}
@@ -1,59 +1,63 @@
1
- import React, { useState, useEffect, useRef } from 'react'
1
+ import React, { useState } from 'react'
2
+ import { useQuery } from '@tanstack/react-query'
2
3
  import { Theme } from 'termcast/src/theme'
3
- import { FileSystemItem, searchFiles, parsePath } from '../../utils/file-system'
4
+ import { TextareaRenderable, RGBA } from '@opentui/core'
5
+ import { searchFiles, parsePath } from '../../utils/file-system'
4
6
  import { useKeyboard } from '@opentui/react'
5
7
  import { useIsInFocus } from 'termcast/src/internal/focus-context'
6
8
 
9
+ const backgroundPanel = RGBA.fromHex(Theme.backgroundPanel)
10
+ const primary = RGBA.fromHex(Theme.primary)
11
+ const border = RGBA.fromHex(Theme.border)
12
+
7
13
  export interface FileAutocompleteProps {
8
- value: string
9
- onChange: (value: string) => void
10
14
  onSelect: (path: string) => void
11
15
  visible: boolean
12
16
  onVisibilityChange: (visible: boolean) => void
13
- inputRef: React.RefObject<any>
17
+ inputRef: React.RefObject<TextareaRenderable | null>
14
18
  anchorRef: React.RefObject<any>
19
+ searchTrigger: number
20
+ canChooseFiles?: boolean
21
+ canChooseDirectories?: boolean
22
+ initialDirectory?: string
15
23
  }
16
24
 
17
25
  export const FileAutocomplete = ({
18
- value,
19
- onChange,
20
26
  onSelect,
21
27
  visible,
22
28
  onVisibilityChange,
23
29
  inputRef,
24
30
  anchorRef,
31
+ searchTrigger,
32
+ canChooseFiles = true,
33
+ canChooseDirectories = false,
34
+ initialDirectory,
25
35
  }: FileAutocompleteProps): any => {
26
36
  const [selectedIndex, setSelectedIndex] = useState(0)
27
- const [items, setItems] = useState<FileSystemItem[]>([])
28
- const [loading, setLoading] = useState(false)
29
37
  const isInFocus = useIsInFocus()
30
38
 
31
- // Parse the input to get base path and prefix
32
- const { basePath, prefix } = value
33
- ? parsePath(value)
34
- : { basePath: '.', prefix: '' }
35
-
36
- // Search for files when value changes or visibility changes
37
- useEffect(() => {
38
- if (!visible) return
39
+ const inputValue = inputRef.current?.plainText || ''
40
+ const defaultBasePath = initialDirectory || '.'
41
+ const { basePath, prefix } = inputValue
42
+ ? parsePath(inputValue)
43
+ : { basePath: defaultBasePath, prefix: '' }
39
44
 
40
- const searchForFiles = async () => {
41
- setLoading(true)
42
- try {
43
- const results = await searchFiles(basePath, prefix)
44
- setItems(results)
45
- setSelectedIndex(0)
46
- } catch (error) {
47
- setItems([])
48
- } finally {
49
- setLoading(false)
50
- }
51
- }
45
+ const { data: items = [], isLoading: loading } = useQuery({
46
+ queryKey: ['file-autocomplete', basePath, prefix, searchTrigger, canChooseFiles, canChooseDirectories],
47
+ queryFn: async () => {
48
+ const results = await searchFiles(basePath, prefix)
49
+ const filtered = results.filter((item) => {
50
+ if (item.isDirectory) return true
51
+ return canChooseFiles
52
+ })
53
+ setSelectedIndex(0)
54
+ return filtered
55
+ },
56
+ enabled: visible,
57
+ })
52
58
 
53
- searchForFiles()
54
- }, [value, visible, basePath, prefix])
59
+ const directoryOnlyMode = canChooseDirectories && !canChooseFiles
55
60
 
56
- // Handle keyboard navigation
57
61
  useKeyboard((evt) => {
58
62
  if (!visible || !isInFocus) return
59
63
 
@@ -65,77 +69,83 @@ export const FileAutocomplete = ({
65
69
  onVisibilityChange(false)
66
70
  } else if (evt.name === 'return') {
67
71
  if (items[selectedIndex]) {
72
+ const value = inputRef.current?.plainText || ''
68
73
  const selectedItem = items[selectedIndex]
69
74
  const newValue =
70
75
  value.substring(0, value.lastIndexOf('/') + 1) + selectedItem.name
71
76
 
72
77
  if (selectedItem.isDirectory) {
73
- // Add trailing slash for directories
74
- onChange(newValue + '/')
75
- // Keep autocomplete open for directories
78
+ const fullPath = newValue + '/'
79
+ inputRef.current?.setText(fullPath)
80
+ inputRef.current!.cursorOffset = fullPath.length
76
81
  } else {
77
82
  onSelect(newValue)
78
83
  onVisibilityChange(false)
79
84
  }
80
85
  }
86
+ } else if (evt.name === 'right') {
87
+ if (items[selectedIndex]) {
88
+ const value = inputRef.current?.plainText || ''
89
+ const selectedItem = items[selectedIndex]
90
+ const newValue =
91
+ value.substring(0, value.lastIndexOf('/') + 1) + selectedItem.name
92
+ onSelect(newValue)
93
+ onVisibilityChange(false)
94
+ }
81
95
  }
82
96
  })
83
97
 
84
98
  if (!visible || items.length === 0) return null
85
99
 
86
- // Calculate position based on anchor element
87
100
  const anchorElement = anchorRef.current
88
101
  if (!anchorElement) return null
89
102
 
103
+ const maxVisible = 8
104
+ const visibleItems = items.slice(0, maxVisible)
105
+ const displayHeight = visibleItems.length + 1
106
+
107
+ const contentWidth = anchorElement.width - 2
108
+
109
+ const hintText = directoryOnlyMode
110
+ ? '↑↓ navigate ⏎ open folder → select folder esc close'
111
+ : '↑↓ navigate ⏎ open/select → select esc close'
112
+
90
113
  return (
91
114
  <box
92
115
  position='absolute'
93
- top={anchorElement.y + anchorElement.height}
116
+ top={anchorElement.y - displayHeight - 2}
94
117
  left={anchorElement.x}
95
118
  width={anchorElement.width}
119
+ height={displayHeight + 2}
96
120
  zIndex={1000}
97
121
  borderStyle='single'
98
- borderColor={Theme.border}
99
- backgroundColor={Theme.backgroundPanel}
100
- maxHeight={10}
122
+ borderColor={border}
123
+ backgroundColor={backgroundPanel}
124
+ shouldFill
101
125
  >
102
- {loading ? (
103
- <text fg={Theme.textMuted} padding={1}>
104
- Loading...
105
- </text>
106
- ) : (
107
- <box flexDirection='column'>
108
- {items.map((item, index) => (
109
- <box
110
- key={item.path}
111
- paddingLeft={1}
112
- paddingRight={1}
113
- backgroundColor={
114
- index === selectedIndex ? Theme.primary : undefined
115
- }
116
- onMouseDown={() => {
117
- setSelectedIndex(index)
118
- const newValue =
119
- value.substring(0, value.lastIndexOf('/') + 1) + item.name
120
- if (item.isDirectory) {
121
- onChange(newValue + '/')
122
- // Keep autocomplete open for directories
123
- } else {
124
- onSelect(newValue)
125
- onVisibilityChange(false)
126
- }
127
- }}
128
- >
129
- <text
130
- fg={index === selectedIndex ? Theme.background : Theme.text}
131
- >
132
- {item.isDirectory ? '📁 ' : '📄 '}
133
- {item.name}
134
- </text>
135
- </box>
136
- ))}
137
- </box>
138
- )}
126
+ <box flexDirection='column' backgroundColor={backgroundPanel} shouldFill>
127
+ {loading ? (
128
+ <text fg={Theme.textMuted}> Loading...</text>
129
+ ) : (
130
+ <>
131
+ {visibleItems.map((item, index) => {
132
+ const icon = item.isDirectory ? '📁 ' : '📄 '
133
+ const text = ' ' + icon + item.name
134
+ const padded = text.padEnd(contentWidth, ' ')
135
+ return (
136
+ <text
137
+ key={item.path}
138
+ fg={index === selectedIndex ? Theme.background : Theme.text}
139
+ bg={index === selectedIndex ? Theme.primary : Theme.backgroundPanel}
140
+ >
141
+ {padded}
142
+ </text>
143
+ )
144
+ })}
145
+ <text fg={Theme.textMuted}> {hintText}</text>
146
+ </>
147
+ )}
148
+ </box>
139
149
  </box>
140
150
  )
141
151
  }