termcast 1.3.10 → 1.3.18

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 (500) hide show
  1. package/dist/apis/toast.d.ts +1 -5
  2. package/dist/apis/toast.d.ts.map +1 -1
  3. package/dist/apis/toast.js +23 -17
  4. package/dist/apis/toast.js.map +1 -1
  5. package/dist/build.d.ts +2 -0
  6. package/dist/build.d.ts.map +1 -1
  7. package/dist/build.js +4 -3
  8. package/dist/build.js.map +1 -1
  9. package/dist/cli.js +42 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/colors.d.ts +8 -1
  12. package/dist/colors.d.ts.map +1 -1
  13. package/dist/colors.js +12 -0
  14. package/dist/colors.js.map +1 -1
  15. package/dist/compile.d.ts +30 -0
  16. package/dist/compile.d.ts.map +1 -0
  17. package/dist/compile.js +156 -0
  18. package/dist/compile.js.map +1 -0
  19. package/dist/components/actions.d.ts +1 -0
  20. package/dist/components/actions.d.ts.map +1 -1
  21. package/dist/components/actions.js +5 -2
  22. package/dist/components/actions.js.map +1 -1
  23. package/dist/components/command-arguments.d.ts +9 -0
  24. package/dist/components/command-arguments.d.ts.map +1 -0
  25. package/dist/components/command-arguments.js +21 -0
  26. package/dist/components/command-arguments.js.map +1 -0
  27. package/dist/components/detail.d.ts +1 -1
  28. package/dist/components/detail.d.ts.map +1 -1
  29. package/dist/components/detail.js +17 -39
  30. package/dist/components/detail.js.map +1 -1
  31. package/dist/components/dropdown.d.ts +1 -0
  32. package/dist/components/dropdown.d.ts.map +1 -1
  33. package/dist/components/dropdown.js +77 -21
  34. package/dist/components/dropdown.js.map +1 -1
  35. package/dist/components/extension-preferences.d.ts.map +1 -1
  36. package/dist/components/extension-preferences.js +19 -29
  37. package/dist/components/extension-preferences.js.map +1 -1
  38. package/dist/components/form/checkbox.d.ts.map +1 -1
  39. package/dist/components/form/checkbox.js +9 -2
  40. package/dist/components/form/checkbox.js.map +1 -1
  41. package/dist/components/form/date-picker.d.ts.map +1 -1
  42. package/dist/components/form/date-picker.js +15 -28
  43. package/dist/components/form/date-picker.js.map +1 -1
  44. package/dist/components/form/description.d.ts +2 -0
  45. package/dist/components/form/description.d.ts.map +1 -1
  46. package/dist/components/form/description.js +20 -2
  47. package/dist/components/form/description.js.map +1 -1
  48. package/dist/components/form/dropdown.d.ts.map +1 -1
  49. package/dist/components/form/dropdown.js +13 -28
  50. package/dist/components/form/dropdown.js.map +1 -1
  51. package/dist/components/form/file-autocomplete.d.ts +7 -4
  52. package/dist/components/form/file-autocomplete.d.ts.map +1 -1
  53. package/dist/components/form/file-autocomplete.js +54 -46
  54. package/dist/components/form/file-autocomplete.js.map +1 -1
  55. package/dist/components/form/file-picker.d.ts +5 -0
  56. package/dist/components/form/file-picker.d.ts.map +1 -1
  57. package/dist/components/form/file-picker.js +46 -49
  58. package/dist/components/form/file-picker.js.map +1 -1
  59. package/dist/components/form/form-ref.d.ts +43 -0
  60. package/dist/components/form/form-ref.d.ts.map +1 -0
  61. package/dist/components/form/form-ref.js +53 -0
  62. package/dist/components/form/form-ref.js.map +1 -0
  63. package/dist/components/form/index.d.ts +16 -0
  64. package/dist/components/form/index.d.ts.map +1 -1
  65. package/dist/components/form/index.js +86 -23
  66. package/dist/components/form/index.js.map +1 -1
  67. package/dist/components/form/password-field.d.ts.map +1 -1
  68. package/dist/components/form/password-field.js +32 -16
  69. package/dist/components/form/password-field.js.map +1 -1
  70. package/dist/components/form/text-area.d.ts.map +1 -1
  71. package/dist/components/form/text-area.js +32 -15
  72. package/dist/components/form/text-area.js.map +1 -1
  73. package/dist/components/form/text-field.d.ts.map +1 -1
  74. package/dist/components/form/text-field.js +37 -17
  75. package/dist/components/form/text-field.js.map +1 -1
  76. package/dist/components/form/use-form-navigation.d.ts +4 -0
  77. package/dist/components/form/use-form-navigation.d.ts.map +1 -1
  78. package/dist/components/form/use-form-navigation.js +35 -18
  79. package/dist/components/form/use-form-navigation.js.map +1 -1
  80. package/dist/components/form/with-left-border.d.ts.map +1 -1
  81. package/dist/components/form/with-left-border.js +2 -2
  82. package/dist/components/form/with-left-border.js.map +1 -1
  83. package/dist/components/icon.d.ts +3 -1
  84. package/dist/components/icon.d.ts.map +1 -1
  85. package/dist/components/icon.js +494 -469
  86. package/dist/components/icon.js.map +1 -1
  87. package/dist/components/list.d.ts +11 -7
  88. package/dist/components/list.d.ts.map +1 -1
  89. package/dist/components/list.js +170 -38
  90. package/dist/components/list.js.map +1 -1
  91. package/dist/components/loading-bar.js +1 -1
  92. package/dist/components/loading-bar.js.map +1 -1
  93. package/dist/descendants.d.ts.map +1 -1
  94. package/dist/descendants.js +8 -5
  95. package/dist/descendants.js.map +1 -1
  96. package/dist/examples/action-show-in-finder.js +1 -1
  97. package/dist/examples/action-show-in-finder.js.map +1 -1
  98. package/dist/examples/environment-test.js +1 -1
  99. package/dist/examples/environment-test.js.map +1 -1
  100. package/dist/examples/error-boundary.js +1 -1
  101. package/dist/examples/error-boundary.js.map +1 -1
  102. package/dist/examples/form-basic.d.ts.map +1 -1
  103. package/dist/examples/form-basic.js +2 -2
  104. package/dist/examples/form-basic.js.map +1 -1
  105. package/dist/examples/form-dropdown.js +1 -1
  106. package/dist/examples/form-dropdown.js.map +1 -1
  107. package/dist/examples/form-scroll.d.ts +2 -0
  108. package/dist/examples/form-scroll.d.ts.map +1 -0
  109. package/dist/examples/form-scroll.js +8 -0
  110. package/dist/examples/form-scroll.js.map +1 -0
  111. package/dist/examples/form-tagpicker.js +1 -1
  112. package/dist/examples/form-tagpicker.js.map +1 -1
  113. package/dist/examples/internal/descendants-filtering.js +8 -3
  114. package/dist/examples/internal/descendants-filtering.js.map +1 -1
  115. package/dist/examples/internal/descendants.js +10 -3
  116. package/dist/examples/internal/descendants.js.map +1 -1
  117. package/dist/examples/internal/rhf-custom-ref.d.ts +2 -0
  118. package/dist/examples/internal/rhf-custom-ref.d.ts.map +1 -0
  119. package/dist/examples/internal/rhf-custom-ref.js +67 -0
  120. package/dist/examples/internal/rhf-custom-ref.js.map +1 -0
  121. package/dist/examples/internal/scrollbox-demo.js +3 -7
  122. package/dist/examples/internal/scrollbox-demo.js.map +1 -1
  123. package/dist/examples/internal/scrollbox-with-descendants.d.ts +2 -0
  124. package/dist/examples/internal/scrollbox-with-descendants.d.ts.map +1 -0
  125. package/dist/examples/internal/scrollbox-with-descendants.js +63 -0
  126. package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -0
  127. package/dist/examples/internal/simple-dialog.js +1 -1
  128. package/dist/examples/internal/simple-dialog.js.map +1 -1
  129. package/dist/examples/internal/simple-scrollbox.js +2 -3
  130. package/dist/examples/internal/simple-scrollbox.js.map +1 -1
  131. package/dist/examples/internal/text-stacking.js +4 -2
  132. package/dist/examples/internal/text-stacking.js.map +1 -1
  133. package/dist/examples/list-dropdown-default.js +1 -1
  134. package/dist/examples/list-dropdown-default.js.map +1 -1
  135. package/dist/examples/list-fetch-data.js +1 -1
  136. package/dist/examples/list-fetch-data.js.map +1 -1
  137. package/dist/examples/list-scrollbox.d.ts +2 -0
  138. package/dist/examples/list-scrollbox.d.ts.map +1 -0
  139. package/dist/examples/list-scrollbox.js +29 -0
  140. package/dist/examples/list-scrollbox.js.map +1 -0
  141. package/dist/examples/list-with-detail.js +1 -1
  142. package/dist/examples/list-with-detail.js.map +1 -1
  143. package/dist/examples/list-with-dropdown.js +1 -1
  144. package/dist/examples/list-with-dropdown.js.map +1 -1
  145. package/dist/examples/list-with-sections.js +3 -3
  146. package/dist/examples/list-with-sections.js.map +1 -1
  147. package/dist/examples/miscellaneous.js +1 -1
  148. package/dist/examples/miscellaneous.js.map +1 -1
  149. package/dist/examples/nested-navigation.js +4 -2
  150. package/dist/examples/nested-navigation.js.map +1 -1
  151. package/dist/examples/preferences-test.js +1 -1
  152. package/dist/examples/preferences-test.js.map +1 -1
  153. package/dist/examples/simple-dropdown.js +1 -1
  154. package/dist/examples/simple-dropdown.js.map +1 -1
  155. package/dist/examples/simple-file-picker.js +1 -1
  156. package/dist/examples/simple-file-picker.js.map +1 -1
  157. package/dist/examples/simple-grid.js +1 -1
  158. package/dist/examples/simple-grid.js.map +1 -1
  159. package/dist/examples/simple-hud.js +1 -1
  160. package/dist/examples/simple-hud.js.map +1 -1
  161. package/dist/examples/simple-list-search.js +1 -1
  162. package/dist/examples/simple-list-search.js.map +1 -1
  163. package/dist/examples/simple-list.js +1 -1
  164. package/dist/examples/simple-list.js.map +1 -1
  165. package/dist/examples/simple-navigation.js +4 -2
  166. package/dist/examples/simple-navigation.js.map +1 -1
  167. package/dist/examples/store.js +1 -1
  168. package/dist/examples/store.js.map +1 -1
  169. package/dist/examples/submodule-diff.d.ts +2 -0
  170. package/dist/examples/submodule-diff.d.ts.map +1 -0
  171. package/dist/examples/submodule-diff.js +99 -0
  172. package/dist/examples/submodule-diff.js.map +1 -0
  173. package/dist/examples/tanstack-demo.js +1 -1
  174. package/dist/examples/tanstack-demo.js.map +1 -1
  175. package/dist/examples/use-promise-demo.js +1 -1
  176. package/dist/examples/use-promise-demo.js.map +1 -1
  177. package/dist/extensions/dev.d.ts +8 -0
  178. package/dist/extensions/dev.d.ts.map +1 -1
  179. package/dist/extensions/dev.js +53 -28
  180. package/dist/extensions/dev.js.map +1 -1
  181. package/dist/extensions/home.d.ts.map +1 -1
  182. package/dist/extensions/home.js +16 -91
  183. package/dist/extensions/home.js.map +1 -1
  184. package/dist/globals.js +1 -1
  185. package/dist/globals.js.map +1 -1
  186. package/dist/index.d.ts +3 -1
  187. package/dist/index.d.ts.map +1 -1
  188. package/dist/index.js +5 -1
  189. package/dist/index.js.map +1 -1
  190. package/dist/internal/date-picker-widget.d.ts.map +1 -1
  191. package/dist/internal/date-picker-widget.js +56 -48
  192. package/dist/internal/date-picker-widget.js.map +1 -1
  193. package/dist/internal/dialog.d.ts.map +1 -1
  194. package/dist/internal/dialog.js +7 -7
  195. package/dist/internal/dialog.js.map +1 -1
  196. package/dist/internal/scrollbox.d.ts +2 -1
  197. package/dist/internal/scrollbox.d.ts.map +1 -1
  198. package/dist/internal/scrollbox.js +13 -7
  199. package/dist/internal/scrollbox.js.map +1 -1
  200. package/dist/release.d.ts +11 -0
  201. package/dist/release.d.ts.map +1 -0
  202. package/dist/release.js +113 -0
  203. package/dist/release.js.map +1 -0
  204. package/dist/state.d.ts +1 -0
  205. package/dist/state.d.ts.map +1 -1
  206. package/dist/state.js +1 -0
  207. package/dist/state.js.map +1 -1
  208. package/dist/theme.d.ts +11 -8
  209. package/dist/theme.d.ts.map +1 -1
  210. package/dist/theme.js +31 -8
  211. package/dist/theme.js.map +1 -1
  212. package/dist/utils/run-command.d.ts +22 -0
  213. package/dist/utils/run-command.d.ts.map +1 -0
  214. package/dist/utils/run-command.js +127 -0
  215. package/dist/utils/run-command.js.map +1 -0
  216. package/dist/utils.d.ts +1 -1
  217. package/dist/utils.d.ts.map +1 -1
  218. package/dist/utils.js +5 -3
  219. package/dist/utils.js.map +1 -1
  220. package/package.json +10 -7
  221. package/src/apis/toast.tsx +38 -17
  222. package/src/build.tsx +5 -3
  223. package/src/cli.tsx +46 -0
  224. package/src/colors.tsx +22 -1
  225. package/src/compile.tsx +219 -0
  226. package/src/components/actions.tsx +7 -1
  227. package/src/components/command-arguments.tsx +81 -0
  228. package/src/components/detail.tsx +26 -58
  229. package/src/components/dropdown.tsx +108 -23
  230. package/src/components/extension-preferences.tsx +55 -35
  231. package/src/components/form/checkbox.tsx +13 -5
  232. package/src/components/form/date-picker.tsx +24 -29
  233. package/src/components/form/description.tsx +35 -7
  234. package/src/components/form/dropdown.tsx +16 -30
  235. package/src/components/form/file-autocomplete.tsx +87 -77
  236. package/src/components/form/file-picker.tsx +69 -57
  237. package/src/components/form/form-ref.tsx +68 -0
  238. package/src/components/form/index.tsx +152 -41
  239. package/src/components/form/password-field.tsx +35 -22
  240. package/src/components/form/text-area.tsx +78 -58
  241. package/src/components/form/text-field.tsx +82 -61
  242. package/src/components/form/use-form-navigation.tsx +43 -23
  243. package/src/components/form/with-left-border.tsx +2 -1
  244. package/src/components/icon.tsx +497 -469
  245. package/src/components/list.tsx +279 -112
  246. package/src/components/loading-bar.tsx +1 -1
  247. package/src/descendants.tsx +15 -5
  248. package/src/examples/action-show-in-finder.tsx +1 -1
  249. package/src/examples/environment-test.tsx +1 -1
  250. package/src/examples/error-boundary.tsx +1 -1
  251. package/src/examples/file-autocomplete.vitest.tsx +245 -0
  252. package/src/examples/form-basic.tsx +12 -12
  253. package/src/examples/form-basic.vitest.tsx +297 -671
  254. package/src/examples/form-dropdown.tsx +1 -1
  255. package/src/examples/form-dropdown.vitest.tsx +353 -221
  256. package/src/examples/form-scroll.tsx +56 -0
  257. package/src/examples/form-scroll.vitest.tsx +228 -0
  258. package/src/examples/form-tagpicker.tsx +1 -1
  259. package/src/examples/form-tagpicker.vitest.tsx +438 -193
  260. package/src/examples/internal/descendants-filtering.tsx +13 -5
  261. package/src/examples/internal/descendants.tsx +17 -5
  262. package/src/examples/internal/rhf-custom-ref.tsx +152 -0
  263. package/src/examples/internal/scrollbox-demo.tsx +15 -7
  264. package/src/examples/internal/scrollbox-with-descendants.tsx +94 -0
  265. package/src/examples/internal/simple-dialog.tsx +1 -1
  266. package/src/examples/internal/simple-scrollbox.tsx +8 -5
  267. package/src/examples/internal/simple-scrollbox.vitest.tsx +47 -37
  268. package/src/examples/internal/text-stacking.tsx +4 -2
  269. package/src/examples/list-dropdown-default.tsx +1 -1
  270. package/src/examples/list-dropdown-default.vitest.tsx +136 -71
  271. package/src/examples/list-fetch-data.tsx +1 -1
  272. package/src/examples/list-fetch-data.vitest.tsx +42 -33
  273. package/src/examples/list-scrollbox.tsx +46 -0
  274. package/src/examples/list-scrollbox.vitest.tsx +103 -0
  275. package/src/examples/list-with-detail.tsx +1 -1
  276. package/src/examples/list-with-detail.vitest.tsx +290 -294
  277. package/src/examples/list-with-dropdown.tsx +1 -1
  278. package/src/examples/list-with-dropdown.vitest.tsx +190 -150
  279. package/src/examples/list-with-sections.tsx +12 -1
  280. package/src/examples/list-with-sections.vitest.tsx +390 -218
  281. package/src/examples/miscellaneous.tsx +1 -1
  282. package/src/examples/nested-navigation.tsx +4 -2
  283. package/src/examples/preferences-test.tsx +1 -1
  284. package/src/examples/simple-dropdown.tsx +1 -1
  285. package/src/examples/simple-file-picker.tsx +1 -1
  286. package/src/examples/simple-file-picker.vitest.tsx +538 -132
  287. package/src/examples/simple-grid.tsx +1 -1
  288. package/src/examples/simple-grid.vitest.tsx +258 -234
  289. package/src/examples/simple-hud.tsx +1 -1
  290. package/src/examples/simple-list-search.tsx +1 -1
  291. package/src/examples/simple-list.tsx +1 -1
  292. package/src/examples/simple-navigation.tsx +4 -2
  293. package/src/examples/simple-navigation.vitest.tsx +434 -238
  294. package/src/examples/store.tsx +1 -1
  295. package/src/examples/store.vitest.tsx +31 -10
  296. package/src/examples/submodule-diff.tsx +153 -0
  297. package/src/examples/tanstack-demo.tsx +1 -1
  298. package/src/examples/use-promise-demo.tsx +1 -1
  299. package/src/extensions/dev.tsx +74 -36
  300. package/src/extensions/dev.vitest.tsx +220 -0
  301. package/src/extensions/home.tsx +17 -118
  302. package/src/globals.ts +1 -1
  303. package/src/index.tsx +7 -1
  304. package/src/internal/date-picker-widget.tsx +56 -46
  305. package/src/internal/dialog.tsx +6 -6
  306. package/src/internal/scrollbox.tsx +15 -5
  307. package/src/release.tsx +159 -0
  308. package/src/state.tsx +2 -0
  309. package/src/store-api/search.test.tsx +4 -13
  310. package/src/theme.tsx +33 -8
  311. package/src/utils/run-command.tsx +204 -0
  312. package/src/utils.tsx +5 -3
  313. package/dist/ai.d.ts +0 -104
  314. package/dist/ai.d.ts.map +0 -1
  315. package/dist/ai.js +0 -135
  316. package/dist/ai.js.map +0 -1
  317. package/dist/apis/cache.test.d.ts +0 -2
  318. package/dist/apis/cache.test.d.ts.map +0 -1
  319. package/dist/apis/cache.test.js +0 -246
  320. package/dist/apis/cache.test.js.map +0 -1
  321. package/dist/apis/localstorage.test.d.ts +0 -2
  322. package/dist/apis/localstorage.test.d.ts.map +0 -1
  323. package/dist/apis/localstorage.test.js +0 -131
  324. package/dist/apis/localstorage.test.js.map +0 -1
  325. package/dist/apis/toast.test.d.ts +0 -2
  326. package/dist/apis/toast.test.d.ts.map +0 -1
  327. package/dist/apis/toast.test.js +0 -67
  328. package/dist/apis/toast.test.js.map +0 -1
  329. package/dist/build.test.d.ts +0 -2
  330. package/dist/build.test.d.ts.map +0 -1
  331. package/dist/build.test.js +0 -73
  332. package/dist/build.test.js.map +0 -1
  333. package/dist/cache.d.ts +0 -32
  334. package/dist/cache.d.ts.map +0 -1
  335. package/dist/cache.js +0 -205
  336. package/dist/cache.js.map +0 -1
  337. package/dist/cache.test.d.ts +0 -2
  338. package/dist/cache.test.d.ts.map +0 -1
  339. package/dist/cache.test.js +0 -246
  340. package/dist/cache.test.js.map +0 -1
  341. package/dist/clipboard.d.ts +0 -36
  342. package/dist/clipboard.d.ts.map +0 -1
  343. package/dist/clipboard.js +0 -154
  344. package/dist/clipboard.js.map +0 -1
  345. package/dist/components/form/form-type-only.d.ts +0 -174
  346. package/dist/components/form/form-type-only.d.ts.map +0 -1
  347. package/dist/components/form/form-type-only.js +0 -2
  348. package/dist/components/form/form-type-only.js.map +0 -1
  349. package/dist/components/form/use-form-handling.d.ts +0 -4
  350. package/dist/components/form/use-form-handling.d.ts.map +0 -1
  351. package/dist/components/form/use-form-handling.js +0 -37
  352. package/dist/components/form/use-form-handling.js.map +0 -1
  353. package/dist/dev-ui.d.ts +0 -7
  354. package/dist/dev-ui.d.ts.map +0 -1
  355. package/dist/dev-ui.js +0 -118
  356. package/dist/dev-ui.js.map +0 -1
  357. package/dist/environment.d.ts +0 -63
  358. package/dist/environment.d.ts.map +0 -1
  359. package/dist/environment.js +0 -189
  360. package/dist/environment.js.map +0 -1
  361. package/dist/examples/datepicker.d.ts +0 -2
  362. package/dist/examples/datepicker.d.ts.map +0 -1
  363. package/dist/examples/datepicker.js +0 -344
  364. package/dist/examples/datepicker.js.map +0 -1
  365. package/dist/examples/form-basic-arrow-keys.vitest.d.ts +0 -2
  366. package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +0 -1
  367. package/dist/examples/form-basic-arrow-keys.vitest.js +0 -46
  368. package/dist/examples/form-basic-arrow-keys.vitest.js.map +0 -1
  369. package/dist/examples/form-basic.vitest.d.ts +0 -2
  370. package/dist/examples/form-basic.vitest.d.ts.map +0 -1
  371. package/dist/examples/form-basic.vitest.js +0 -995
  372. package/dist/examples/form-basic.vitest.js.map +0 -1
  373. package/dist/examples/form-dropdown-with-sections.d.ts +0 -2
  374. package/dist/examples/form-dropdown-with-sections.d.ts.map +0 -1
  375. package/dist/examples/form-dropdown-with-sections.js +0 -13
  376. package/dist/examples/form-dropdown-with-sections.js.map +0 -1
  377. package/dist/examples/form-dropdown-with-sections.vitest.d.ts +0 -2
  378. package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +0 -1
  379. package/dist/examples/form-dropdown-with-sections.vitest.js +0 -75
  380. package/dist/examples/form-dropdown-with-sections.vitest.js.map +0 -1
  381. package/dist/examples/form-dropdown.vitest.d.ts +0 -2
  382. package/dist/examples/form-dropdown.vitest.d.ts.map +0 -1
  383. package/dist/examples/form-dropdown.vitest.js +0 -722
  384. package/dist/examples/form-dropdown.vitest.js.map +0 -1
  385. package/dist/examples/form-multiselect-dropdown.d.ts +0 -2
  386. package/dist/examples/form-multiselect-dropdown.d.ts.map +0 -1
  387. package/dist/examples/form-multiselect-dropdown.js +0 -13
  388. package/dist/examples/form-multiselect-dropdown.js.map +0 -1
  389. package/dist/examples/form-tagpicker.vitest.d.ts +0 -2
  390. package/dist/examples/form-tagpicker.vitest.d.ts.map +0 -1
  391. package/dist/examples/form-tagpicker.vitest.js +0 -491
  392. package/dist/examples/form-tagpicker.vitest.js.map +0 -1
  393. package/dist/examples/internal/nested-boxes.d.ts +0 -2
  394. package/dist/examples/internal/nested-boxes.d.ts.map +0 -1
  395. package/dist/examples/internal/nested-boxes.js +0 -7
  396. package/dist/examples/internal/nested-boxes.js.map +0 -1
  397. package/dist/examples/internal/simple-scrollbox.vitest.d.ts +0 -2
  398. package/dist/examples/internal/simple-scrollbox.vitest.d.ts.map +0 -1
  399. package/dist/examples/internal/simple-scrollbox.vitest.js +0 -88
  400. package/dist/examples/internal/simple-scrollbox.vitest.js.map +0 -1
  401. package/dist/examples/internal/unicode-square-repro.d.ts +0 -2
  402. package/dist/examples/internal/unicode-square-repro.d.ts.map +0 -1
  403. package/dist/examples/internal/unicode-square-repro.js +0 -7
  404. package/dist/examples/internal/unicode-square-repro.js.map +0 -1
  405. package/dist/examples/list-dropdown-default.vitest.d.ts +0 -2
  406. package/dist/examples/list-dropdown-default.vitest.d.ts.map +0 -1
  407. package/dist/examples/list-dropdown-default.vitest.js +0 -164
  408. package/dist/examples/list-dropdown-default.vitest.js.map +0 -1
  409. package/dist/examples/list-fetch-data.vitest.d.ts +0 -2
  410. package/dist/examples/list-fetch-data.vitest.d.ts.map +0 -1
  411. package/dist/examples/list-fetch-data.vitest.js +0 -103
  412. package/dist/examples/list-fetch-data.vitest.js.map +0 -1
  413. package/dist/examples/list-filter-navigation.d.ts +0 -2
  414. package/dist/examples/list-filter-navigation.d.ts.map +0 -1
  415. package/dist/examples/list-filter-navigation.js +0 -8
  416. package/dist/examples/list-filter-navigation.js.map +0 -1
  417. package/dist/examples/list-with-detail.vitest.d.ts +0 -2
  418. package/dist/examples/list-with-detail.vitest.d.ts.map +0 -1
  419. package/dist/examples/list-with-detail.vitest.js +0 -438
  420. package/dist/examples/list-with-detail.vitest.js.map +0 -1
  421. package/dist/examples/list-with-dropdown.vitest.d.ts +0 -2
  422. package/dist/examples/list-with-dropdown.vitest.d.ts.map +0 -1
  423. package/dist/examples/list-with-dropdown.vitest.js +0 -297
  424. package/dist/examples/list-with-dropdown.vitest.js.map +0 -1
  425. package/dist/examples/list-with-sections.vitest.d.ts +0 -2
  426. package/dist/examples/list-with-sections.vitest.d.ts.map +0 -1
  427. package/dist/examples/list-with-sections.vitest.js +0 -441
  428. package/dist/examples/list-with-sections.vitest.js.map +0 -1
  429. package/dist/examples/simple-file-picker.vitest.d.ts +0 -2
  430. package/dist/examples/simple-file-picker.vitest.d.ts.map +0 -1
  431. package/dist/examples/simple-file-picker.vitest.js +0 -277
  432. package/dist/examples/simple-file-picker.vitest.js.map +0 -1
  433. package/dist/examples/simple-grid.vitest.d.ts +0 -2
  434. package/dist/examples/simple-grid.vitest.d.ts.map +0 -1
  435. package/dist/examples/simple-grid.vitest.js +0 -498
  436. package/dist/examples/simple-grid.vitest.js.map +0 -1
  437. package/dist/examples/simple-navigation.vitest.d.ts +0 -2
  438. package/dist/examples/simple-navigation.vitest.d.ts.map +0 -1
  439. package/dist/examples/simple-navigation.vitest.js +0 -522
  440. package/dist/examples/simple-navigation.vitest.js.map +0 -1
  441. package/dist/examples/store.vitest.d.ts +0 -2
  442. package/dist/examples/store.vitest.d.ts.map +0 -1
  443. package/dist/examples/store.vitest.js +0 -48
  444. package/dist/examples/store.vitest.js.map +0 -1
  445. package/dist/home-command.d.ts +0 -8
  446. package/dist/home-command.d.ts.map +0 -1
  447. package/dist/home-command.js +0 -181
  448. package/dist/home-command.js.map +0 -1
  449. package/dist/hooks/hooks.test.d.ts +0 -2
  450. package/dist/hooks/hooks.test.d.ts.map +0 -1
  451. package/dist/hooks/hooks.test.js +0 -37
  452. package/dist/hooks/hooks.test.js.map +0 -1
  453. package/dist/hover-repro.d.ts +0 -2
  454. package/dist/hover-repro.d.ts.map +0 -1
  455. package/dist/hover-repro.js +0 -20
  456. package/dist/hover-repro.js.map +0 -1
  457. package/dist/localstorage.d.ts +0 -13
  458. package/dist/localstorage.d.ts.map +0 -1
  459. package/dist/localstorage.js +0 -190
  460. package/dist/localstorage.js.map +0 -1
  461. package/dist/localstorage.test.d.ts +0 -2
  462. package/dist/localstorage.test.d.ts.map +0 -1
  463. package/dist/localstorage.test.js +0 -131
  464. package/dist/localstorage.test.js.map +0 -1
  465. package/dist/oauth.d.ts +0 -142
  466. package/dist/oauth.d.ts.map +0 -1
  467. package/dist/oauth.js +0 -551
  468. package/dist/oauth.js.map +0 -1
  469. package/dist/preferences.d.ts +0 -23
  470. package/dist/preferences.d.ts.map +0 -1
  471. package/dist/preferences.js +0 -105
  472. package/dist/preferences.js.map +0 -1
  473. package/dist/store-api/download.test.d.ts +0 -2
  474. package/dist/store-api/download.test.d.ts.map +0 -1
  475. package/dist/store-api/download.test.js +0 -36
  476. package/dist/store-api/download.test.js.map +0 -1
  477. package/dist/store-api/extension.test.d.ts +0 -2
  478. package/dist/store-api/extension.test.d.ts.map +0 -1
  479. package/dist/store-api/extension.test.js +0 -22
  480. package/dist/store-api/extension.test.js.map +0 -1
  481. package/dist/store-api/search.test.d.ts +0 -2
  482. package/dist/store-api/search.test.d.ts.map +0 -1
  483. package/dist/store-api/search.test.js +0 -45
  484. package/dist/store-api/search.test.js.map +0 -1
  485. package/dist/store.d.ts +0 -21
  486. package/dist/store.d.ts.map +0 -1
  487. package/dist/store.js +0 -84
  488. package/dist/store.js.map +0 -1
  489. package/dist/toast.d.ts +0 -44
  490. package/dist/toast.d.ts.map +0 -1
  491. package/dist/toast.js +0 -221
  492. package/dist/toast.js.map +0 -1
  493. package/dist/utils.test.d.ts +0 -2
  494. package/dist/utils.test.d.ts.map +0 -1
  495. package/dist/utils.test.js +0 -152
  496. package/dist/utils.test.js.map +0 -1
  497. package/dist/window.d.ts +0 -12
  498. package/dist/window.d.ts.map +0 -1
  499. package/dist/window.js +0 -48
  500. 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
  }