@visulima/tui 1.0.0-alpha.2 → 1.0.0-alpha.4

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 (325) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/LICENSE.md +63 -9
  3. package/README.md +6 -6
  4. package/dist/core/index.js +3 -3
  5. package/dist/ink/canvas/braille.d.ts +22 -0
  6. package/dist/ink/canvas/buffer.d.ts +67 -0
  7. package/dist/ink/components/accordion.d.ts +52 -0
  8. package/dist/ink/components/animate-presence.d.ts +15 -0
  9. package/dist/ink/components/approval-prompt.d.ts +55 -0
  10. package/dist/ink/components/area-chart.d.ts +54 -0
  11. package/dist/ink/components/bar-chart.d.ts +57 -0
  12. package/dist/ink/components/blink-dot.d.ts +30 -0
  13. package/dist/ink/components/breadcrumb.d.ts +28 -0
  14. package/dist/ink/components/button.d.ts +38 -0
  15. package/dist/ink/components/calendar.d.ts +60 -0
  16. package/dist/ink/components/canvas.d.ts +38 -0
  17. package/dist/ink/components/card.d.ts +46 -0
  18. package/dist/ink/components/chart-utils.d.ts +54 -0
  19. package/dist/ink/components/checkbox.d.ts +39 -0
  20. package/dist/ink/components/collapsible.d.ts +43 -0
  21. package/dist/ink/components/command-block.d.ts +38 -0
  22. package/dist/ink/components/command-palette.d.ts +72 -0
  23. package/dist/ink/components/confirm-dialog.d.ts +63 -0
  24. package/dist/ink/components/content-switcher.d.ts +49 -0
  25. package/dist/ink/components/date-picker.d.ts +53 -0
  26. package/dist/ink/components/definition-list.d.ts +37 -0
  27. package/dist/ink/components/divider.d.ts +40 -0
  28. package/dist/ink/components/file-picker/{FilePicker.d.ts → file-picker.d.ts} +2 -19
  29. package/dist/ink/components/file-picker/types.d.ts +1 -4
  30. package/dist/ink/components/file-picker/use-file-system.d.ts +1 -1
  31. package/dist/ink/components/form.d.ts +74 -0
  32. package/dist/ink/components/gauge.d.ts +75 -0
  33. package/dist/ink/components/heading.d.ts +27 -0
  34. package/dist/ink/components/heatmap.d.ts +51 -0
  35. package/dist/ink/components/{Help.d.ts → help.d.ts} +4 -9
  36. package/dist/ink/components/histogram.d.ts +52 -0
  37. package/dist/ink/components/kbd.d.ts +27 -0
  38. package/dist/ink/components/line-chart.d.ts +94 -0
  39. package/dist/ink/components/loading-indicator.d.ts +24 -0
  40. package/dist/ink/components/masked-input.d.ts +41 -0
  41. package/dist/ink/components/menu.d.ts +70 -0
  42. package/dist/ink/components/message-bubble.d.ts +35 -0
  43. package/dist/ink/components/model-badge.d.ts +32 -0
  44. package/dist/ink/components/operation-tree.d.ts +46 -0
  45. package/dist/ink/components/option-list.d.ts +41 -0
  46. package/dist/ink/components/{Paginator.d.ts → paginator.d.ts} +4 -20
  47. package/dist/ink/components/paragraph.d.ts +31 -0
  48. package/dist/ink/components/placeholder.d.ts +47 -0
  49. package/dist/ink/components/{ProgressBar.d.ts → progress-bar.d.ts} +1 -1
  50. package/dist/ink/components/radio-group.d.ts +62 -0
  51. package/dist/ink/components/scatter-plot.d.ts +23 -0
  52. package/dist/ink/components/scroll/{ControlledScrollView.d.ts → controlled-scroll-view.d.ts} +1 -1
  53. package/dist/ink/components/scroll/index.d.ts +10 -10
  54. package/dist/ink/components/scroll/{ScrollBarBox.d.ts → scroll-bar-box.d.ts} +1 -1
  55. package/dist/ink/components/scroll/{ScrollBar.d.ts → scroll-bar.d.ts} +1 -1
  56. package/dist/ink/components/scroll/{ScrollList.d.ts → scroll-list.d.ts} +1 -1
  57. package/dist/ink/components/scroll/{ScrollView.d.ts → scroll-view.d.ts} +1 -1
  58. package/dist/ink/components/search-input.d.ts +46 -0
  59. package/dist/ink/components/{SelectInput.d.ts → select-input.d.ts} +2 -2
  60. package/dist/ink/components/shimmer-text.d.ts +39 -0
  61. package/dist/ink/components/sparkline.d.ts +30 -0
  62. package/dist/ink/components/{Spinner.d.ts → spinner.d.ts} +2 -4
  63. package/dist/ink/components/{StaticRender.d.ts → static-render.d.ts} +14 -2
  64. package/dist/ink/components/status-line.d.ts +30 -0
  65. package/dist/ink/components/stepper.d.ts +42 -0
  66. package/dist/ink/components/{Stopwatch.d.ts → stopwatch.d.ts} +5 -7
  67. package/dist/ink/components/streaming-text.d.ts +38 -0
  68. package/dist/ink/components/switch.d.ts +46 -0
  69. package/dist/ink/components/{Tabs.d.ts → tabs.d.ts} +1 -1
  70. package/dist/ink/components/tag.d.ts +30 -0
  71. package/dist/ink/components/{Timer.d.ts → timer.d.ts} +5 -7
  72. package/dist/ink/components/toast.d.ts +41 -0
  73. package/dist/ink/components/tooltip.d.ts +36 -0
  74. package/dist/ink/components/transition.d.ts +53 -0
  75. package/dist/ink/components/tree-view/theme.d.ts +2 -2
  76. package/dist/ink/cursor-helpers.d.ts +0 -3
  77. package/dist/ink/dom.d.ts +9 -8
  78. package/dist/ink/hooks/use-animation.d.ts +0 -2
  79. package/dist/ink/hooks/use-app.d.ts +1 -1
  80. package/dist/ink/hooks/use-focus-manager.d.ts +1 -1
  81. package/dist/ink/hooks/use-form.d.ts +70 -0
  82. package/dist/ink/hooks/use-hotkey.d.ts +37 -0
  83. package/dist/ink/hooks/use-interval.d.ts +25 -0
  84. package/dist/ink/hooks/use-key-bindings.d.ts +4 -6
  85. package/dist/ink/hooks/use-key-chord.d.ts +26 -0
  86. package/dist/ink/hooks/use-linked-scroll.d.ts +1 -1
  87. package/dist/ink/hooks/use-persistent-state.d.ts +56 -0
  88. package/dist/ink/hooks/use-stderr.d.ts +1 -1
  89. package/dist/ink/hooks/use-stdin.d.ts +1 -1
  90. package/dist/ink/hooks/use-stdout.d.ts +1 -1
  91. package/dist/ink/hooks/use-stopwatch.d.ts +1 -3
  92. package/dist/ink/hooks/use-timeout.d.ts +24 -0
  93. package/dist/ink/hooks/use-timer.d.ts +0 -2
  94. package/dist/ink/index.d.ts +228 -92
  95. package/dist/ink/index.js +132 -77
  96. package/dist/ink/ink.d.ts +7 -6
  97. package/dist/ink/mouse/constants.d.ts +5 -50
  98. package/dist/ink/mouse/index.d.ts +2 -2
  99. package/dist/ink/output.d.ts +2 -1
  100. package/dist/ink/styled-line.d.ts +10 -0
  101. package/dist/ink/write-synchronized.d.ts +2 -2
  102. package/dist/packem_shared/Accordion-BG-yfIkV.js +80 -0
  103. package/dist/packem_shared/{Alert-Dr3s_LD9.js → Alert-BLcwIW8V.js} +2 -2
  104. package/dist/packem_shared/AnimatePresence-D8nEOr_B.js +98 -0
  105. package/dist/packem_shared/ApprovalPrompt-BXdPros1.js +104 -0
  106. package/dist/packem_shared/AreaChart-CmTcxLum.js +116 -0
  107. package/dist/packem_shared/{Badge-Dk7EGGM6.js → Badge-CUfbXwAB.js} +1 -1
  108. package/dist/packem_shared/BarChart-DWRae67P.js +87 -0
  109. package/dist/packem_shared/{BigText-CjMdY63X.js → BigText-CVq2X7B5.js} +1 -1
  110. package/dist/packem_shared/BlinkDot-CrbHMR3L.js +11 -0
  111. package/dist/packem_shared/{Box-D_pSJ9Jp.js → Box-W1w_NGin.js} +4 -6
  112. package/dist/packem_shared/Breadcrumb-CPdNxVYs.js +26 -0
  113. package/dist/packem_shared/Button-CBmTbJ_D.js +57 -0
  114. package/dist/packem_shared/Calendar-C2Qxt-LA.js +139 -0
  115. package/dist/packem_shared/Canvas-COttmLPX.js +246 -0
  116. package/dist/packem_shared/Card-D3tGkNCm.js +24 -0
  117. package/dist/packem_shared/Checkbox-Dpy_4Lws.js +49 -0
  118. package/dist/packem_shared/{Code-DjQvPBD9.js → Code-CwzzbsLx.js} +3 -3
  119. package/dist/packem_shared/Collapsible-BMDrXf5C.js +45 -0
  120. package/dist/packem_shared/CommandBlock-jdOGJPjY.js +80 -0
  121. package/dist/packem_shared/CommandPalette-B5IfUQwi.js +146 -0
  122. package/dist/packem_shared/ConfirmDialog-5XJv3Cc4.js +67 -0
  123. package/dist/packem_shared/{ConfirmInput-85Y4kRQW.js → ConfirmInput-CxUS0XAA.js} +3 -3
  124. package/dist/packem_shared/{ConsoleOverlay-DBNa4vtj.js → ConsoleOverlay-BvnCEgjG.js} +2 -2
  125. package/dist/packem_shared/ContentSwitcher-BHFpO5Za.js +81 -0
  126. package/dist/packem_shared/ControlledScrollView-C2wOOlJO.js +5 -0
  127. package/dist/packem_shared/DatePicker-CPejKoqS.js +73 -0
  128. package/dist/packem_shared/DefinitionList-BAwr0l5J.js +18 -0
  129. package/dist/packem_shared/{DevTools-aMPIsaHx.js → DevTools-BdxRSkhL.js} +6 -4
  130. package/dist/packem_shared/{Dialog-DsSNAVgC.js → Dialog-S9r7Izff.js} +5 -5
  131. package/dist/packem_shared/{DiffView-hqaw-2S6.js → DiffView-BR4T6-Sj.js} +4 -4
  132. package/dist/packem_shared/Divider-DocXIqNn.js +30 -0
  133. package/dist/packem_shared/{FilePicker-DNwFxRhq.js → FilePicker-BZ55oF_n.js} +39 -32
  134. package/dist/packem_shared/FormField-BSG16cnA.js +29 -0
  135. package/dist/packem_shared/{Fullscreen-DrElAE1o.js → Fullscreen-DO7voOq5.js} +2 -2
  136. package/dist/packem_shared/Gauge-CKXUXxft.js +122 -0
  137. package/dist/packem_shared/{Gradient-Ql5P0GUd.js → Gradient-Dg0NezWc.js} +3 -3
  138. package/dist/packem_shared/Heading-BnR7McmP.js +29 -0
  139. package/dist/packem_shared/Heatmap-_jqISOU0.js +79 -0
  140. package/dist/packem_shared/{Help-6wanGG38.js → Help-0yZ_IcQg.js} +4 -11
  141. package/dist/packem_shared/Histogram-cgAjY5AJ.js +92 -0
  142. package/dist/packem_shared/{InputParser-BKHpWfvN.js → InputParser-BlsfeY9J.js} +8 -6
  143. package/dist/packem_shared/KEY-STOdi-nc.js +74 -0
  144. package/dist/packem_shared/Kbd-BNDXQgey.js +19 -0
  145. package/dist/packem_shared/{LayoutNode-Cjnsodiy.js → LayoutNode-DAkKg9TE.js} +5 -7
  146. package/dist/packem_shared/LineChart-ef3HF816.js +7 -0
  147. package/dist/packem_shared/{Link-COcKYfGT.js → Link-DZ2Tiq1m.js} +2 -2
  148. package/dist/packem_shared/LoadingIndicator-DzbLGfyJ.js +13 -0
  149. package/dist/packem_shared/{Markdown-y1ISztof.js → Markdown-33bpCUoe.js} +8 -8
  150. package/dist/packem_shared/MaskedInput-Ctr6v2dO.js +119 -0
  151. package/dist/packem_shared/Menu-CeKxhEix.js +112 -0
  152. package/dist/packem_shared/MessageBubble-BMoU8L2Q.js +26 -0
  153. package/dist/packem_shared/ModelBadge-CNIxPs7v.js +40 -0
  154. package/dist/packem_shared/{MouseProvider-Y9TSSEGl.js → MouseProvider-CekPbXCh.js} +3 -3
  155. package/dist/packem_shared/{MultiSelect-ChoLUcDI.js → MultiSelect-yz7-w0Zv.js} +4 -4
  156. package/dist/packem_shared/{NAMED_COLORS-a4QBvb5r.js → NAMED_COLORS-DcI3erCu.js} +79 -41
  157. package/dist/packem_shared/OperationTree-Dudx5o1o.js +67 -0
  158. package/dist/packem_shared/OptionList-CTyqQaZ1.js +24 -0
  159. package/dist/packem_shared/{OrderedList-Cp7pXr6m.js → OrderedList-VsvSmHUC.js} +2 -2
  160. package/dist/packem_shared/{Paginator-D1AuD-kj.js → Paginator-DmGogvEI.js} +44 -44
  161. package/dist/packem_shared/Paragraph-CNNhfepo.js +9 -0
  162. package/dist/packem_shared/Placeholder-DkM69Q8Z.js +29 -0
  163. package/dist/packem_shared/{ProgressBar-DOfpVagn.js → ProgressBar-B7cS4uQm.js} +2 -2
  164. package/dist/packem_shared/RadioGroup-B4F9PUyL.js +108 -0
  165. package/dist/packem_shared/{ResizeObserverEntry-Br4seLeQ.js → ResizeObserverEntry-Vr8GZ74x.js} +4 -4
  166. package/dist/packem_shared/ScatterPlot-CWOg4G5h.js +63 -0
  167. package/dist/packem_shared/{ScrollBar-EWAs2Uc7.js → ScrollBar-DFeWH43I.js} +2 -2
  168. package/dist/packem_shared/{ScrollBarBox-DTNNlh7R.js → ScrollBarBox-C7VL6Izd.js} +2 -2
  169. package/dist/packem_shared/{ScrollList-DCeIFL8M.js → ScrollList-DRcr_RrN.js} +2 -2
  170. package/dist/packem_shared/{ScrollView-v3MCNIyX.js → ScrollView-C6rdlGwU.js} +4 -4
  171. package/dist/packem_shared/SearchInput-cB8zFhSg.js +32 -0
  172. package/dist/packem_shared/{SelectInput-BN2TMyxp.js → SelectInput-WzZSqp72.js} +6 -6
  173. package/dist/packem_shared/{SelectInputIndicator-DkRMoH_b.js → SelectInputIndicator-DKeN6v5Z.js} +2 -2
  174. package/dist/packem_shared/{SelectInputItem-BF9LQgKu.js → SelectInputItem-CxFL3spM.js} +1 -1
  175. package/dist/packem_shared/ShimmerText-B2VbPUSB.js +34 -0
  176. package/dist/packem_shared/{Slider-BWD7xZX6.js → Slider-BOrNTOQe.js} +3 -3
  177. package/dist/packem_shared/{Spacer-Bs4ER-HK.js → Spacer-DhmXyTb8.js} +1 -1
  178. package/dist/packem_shared/Sparkline-BSbjPrwK.js +44 -0
  179. package/dist/packem_shared/Spinner-BcO5BCAa.js +1942 -0
  180. package/dist/packem_shared/StaticRender-C3XWvJdC.js +69 -0
  181. package/dist/packem_shared/StatusLine-DQNUstN9.js +22 -0
  182. package/dist/packem_shared/{StatusMessage-BtSYxzwb.js → StatusMessage-BYTL6Pl-.js} +2 -2
  183. package/dist/packem_shared/Stepper-CmUPRK3z.js +60 -0
  184. package/dist/packem_shared/Stopwatch-zqLQAxXC.js +21 -0
  185. package/dist/packem_shared/StreamingText-BmuoJtGu.js +38 -0
  186. package/dist/packem_shared/Switch-DcPdy8nm.js +59 -0
  187. package/dist/packem_shared/{Table-D-rSVlzb.js → Table-Bgxo87Df.js} +11 -5
  188. package/dist/packem_shared/{Tabs-hki-KRnx.js → Tabs-DubuHdYV.js} +30 -19
  189. package/dist/packem_shared/Tag-CCqM7Ee9.js +35 -0
  190. package/dist/packem_shared/{Text-DvAUdZcK.js → Text-CtUwV89_.js} +2 -2
  191. package/dist/packem_shared/{TextInput-C79WEQ5U.js → TextInput-C9r7zT0U.js} +3 -3
  192. package/dist/packem_shared/{Textarea-Dj06R6Zd.js → Textarea-CGmgt-Nl.js} +5 -5
  193. package/dist/packem_shared/Timer-D7ZZ0_wz.js +20 -0
  194. package/dist/packem_shared/Toast-DXSCXFPY.js +37 -0
  195. package/dist/packem_shared/Tooltip-SvVjj-2k.js +32 -0
  196. package/dist/packem_shared/{Transform-BHxY_dAM.js → Transform-Cfyva2wd.js} +1 -1
  197. package/dist/packem_shared/Transition-CbNfKhaj.js +108 -0
  198. package/dist/packem_shared/{TreeView-C2062dtj.js → TreeView-DGlZeSsK.js} +4 -4
  199. package/dist/packem_shared/{TuiApp-DfxOnXqi.js → TuiApp-DtdgNRWa.js} +4 -2
  200. package/dist/packem_shared/{TuiContext-CqEjMyXd.js → TuiContext-lXmJFd-x.js} +6 -3
  201. package/dist/packem_shared/{UnorderedList-DhnadWjX.js → UnorderedList-D8RPaEAW.js} +2 -2
  202. package/dist/packem_shared/{ansi-parser-0BdVTKho.js → ansi-parser-BOP8fNdT.js} +6 -4
  203. package/dist/packem_shared/braille-BoEWoH2I.js +93 -0
  204. package/dist/packem_shared/{comparePoints-CGMDnd3_.js → comparePoints-CAAlhiMS.js} +2 -2
  205. package/dist/packem_shared/{ControlledScrollView-BlOaxcsN.js → controlled-scroll-view-DJXfdWMm.js} +2 -2
  206. package/dist/packem_shared/{createInlineLoop-BxMmcq9D.js → createInlineLoop-Dnfm1ZSJ.js} +19 -13
  207. package/dist/packem_shared/createMemoryStorage-esFJ61La.js +115 -0
  208. package/dist/packem_shared/createScreen-Dh0sZlQ0.js +38 -0
  209. package/dist/packem_shared/{dom-DvzhsAez.js → dom-CrbpQgat.js} +17 -14
  210. package/dist/packem_shared/{getPathToRoot-a1wbwxfL.js → getPathToRoot-BbvlppLC.js} +2 -2
  211. package/dist/packem_shared/{getScrollHeight-BubfU_df.js → getScrollHeight-Cz3CDQN2.js} +5 -5
  212. package/dist/packem_shared/line-chart-VGU2l7pu.js +139 -0
  213. package/dist/packem_shared/{measure-element-Reza_yfC.js → measure-element-Bc6PEaIe.js} +26 -17
  214. package/dist/packem_shared/{measure-text-DItZYotK.js → measure-text-BdOhbOeh.js} +74 -7
  215. package/dist/packem_shared/{measureElement-CTgFCmKd.js → measureElement-DTELRaij.js} +2 -2
  216. package/dist/packem_shared/parseSgrMouse-4hpBJBsW.js +1 -0
  217. package/dist/packem_shared/{processLayout-BQ9kXfd3.js → processLayout-B0Coz0Ua.js} +1 -1
  218. package/dist/packem_shared/{reconciler-gfmqURLy.js → reconciler-Dd7Z0A97.js} +21 -5
  219. package/dist/packem_shared/{reconciler-BXf6miSS.js → reconciler-mzMwSOft.js} +23 -13
  220. package/dist/packem_shared/{render-BAwdjfki.js → render-Bm9Oa1sG.js} +72 -79
  221. package/dist/packem_shared/{render-Bpjhf0lD.js → render-CjlKdg4m.js} +15 -11
  222. package/dist/packem_shared/{renderToString-ClIaXgrC.js → renderToString-CWYS1ZXE.js} +4 -4
  223. package/dist/packem_shared/{renderToString-Cfg55DRD.js → renderToString-DB3ILWFm.js} +4 -4
  224. package/dist/packem_shared/{renderTreeToBuffer-D3mo7M7m.js → renderTreeToBuffer-CDDTGyZn.js} +8 -5
  225. package/dist/packem_shared/{renderer-B3wROkeg.js → renderer-GE9OLNNM.js} +47 -41
  226. package/dist/packem_shared/{setEnableStyledLineCache-BpskngSJ.js → setEnableStyledLineCache-D5f4favX.js} +1 -1
  227. package/dist/packem_shared/{text-width-DhuarWcB.js → text-width-Db-AxMea.js} +2 -1
  228. package/dist/packem_shared/{token-to-elements-BRFl_rzw.js → token-to-elements-CK4s8MJd.js} +2 -2
  229. package/dist/packem_shared/{useAnimation-kj31sA-T.js → useAnimation-DV22qxiJ.js} +2 -2
  230. package/dist/packem_shared/{useApp-DPQlRzi5.js → useApp-Cbi788rV.js} +1 -1
  231. package/dist/packem_shared/{useBoxMetrics-rBjKc-g4.js → useBoxMetrics-_5icypir.js} +2 -2
  232. package/dist/packem_shared/{useClipboard-B_9-adw1.js → useClipboard-MNj6MNR-.js} +1 -1
  233. package/dist/packem_shared/{useCursor-BIJzc8k9.js → useCursor-DS6LjIgv.js} +1 -1
  234. package/dist/packem_shared/{useFocus-CNl5QHHf.js → useFocus-DLoGQJd9.js} +2 -2
  235. package/dist/packem_shared/{useFocusManager-BPYaUuKQ.js → useFocusManager-UeZWtnNc.js} +1 -1
  236. package/dist/packem_shared/useForm-sQENbEuv.js +88 -0
  237. package/dist/packem_shared/useHotkey-D9giUX3q.js +112 -0
  238. package/dist/packem_shared/{useInput-Cfp5zB2s.js → useInput-DKZbqMRc.js} +2 -2
  239. package/dist/packem_shared/useInterval-CSXM8c2I.js +32 -0
  240. package/dist/packem_shared/{useIsScreenReaderEnabled-CnGKCe0f.js → useIsScreenReaderEnabled-BeoVqo1R.js} +1 -1
  241. package/dist/packem_shared/{useKeyBindings-B78l1E1n.js → useKeyBindings-S4fSIEAk.js} +2 -2
  242. package/dist/packem_shared/useKeyChord-BmXGNuEO.js +114 -0
  243. package/dist/packem_shared/{usePaste-Ct8J4AGR.js → usePaste-png73gvT.js} +2 -2
  244. package/dist/packem_shared/{useScrollInput-D3CpBq_a.js → useScrollInput-DfzRGQFe.js} +2 -2
  245. package/dist/packem_shared/{useStderr-CAOVUh4E.js → useStderr-BSWerMZ7.js} +1 -1
  246. package/dist/packem_shared/{useStdin-X-O0kd-n.js → useStdin-Rf0zPzVA.js} +1 -1
  247. package/dist/packem_shared/{useStdout-DyF6DSH0.js → useStdout-B5yRcg9N.js} +1 -1
  248. package/dist/packem_shared/{useStopwatch-qC4Beai4.js → useStopwatch-C__Zu6hd.js} +2 -2
  249. package/dist/packem_shared/{useTerminalPalette-BaWO2c4Q.js → useTerminalPalette-CtFG2JTq.js} +2 -2
  250. package/dist/packem_shared/{useTextSelection-mXtxgsPK.js → useTextSelection-ChrYZXsn.js} +2 -2
  251. package/dist/packem_shared/useTimeout-DuCqgWPX.js +34 -0
  252. package/dist/packem_shared/{useTimer-CPQ7j827.js → useTimer-DnBtbhB5.js} +1 -1
  253. package/dist/packem_shared/{useTreeView-BT57P3Kx.js → useTreeView-mkN5Di7w.js} +1 -1
  254. package/dist/packem_shared/{useWindowSize-ugEmGZJm.js → useWindowSize-D3UU41mv.js} +1 -1
  255. package/dist/packem_shared/waitFor-Cv9M2jKA.js +39 -0
  256. package/dist/packem_shared/{wrapOrTruncateStyledLine-DN3Nogoc.js → wrapOrTruncateStyledLine-49Mne3t3.js} +1 -1
  257. package/dist/react/index.js +7 -7
  258. package/dist/react/layout.d.ts +0 -2
  259. package/dist/testing/index.d.ts +4 -4
  260. package/dist/testing/index.js +6 -114
  261. package/dist/testing/wait-for.d.ts +0 -1
  262. package/index.js +691 -539
  263. package/package.json +17 -17
  264. package/dist/ink/components/file-picker/index.d.ts +0 -3
  265. package/dist/ink/components/tree-view/index.d.ts +0 -11
  266. package/dist/packem_shared/ControlledScrollView-DfAhcufF.js +0 -5
  267. package/dist/packem_shared/Spinner-BuI-kN4p.js +0 -1799
  268. package/dist/packem_shared/StaticRender-tYwH6QXl.js +0 -33
  269. package/dist/packem_shared/Stopwatch-DjtTCyHn.js +0 -23
  270. package/dist/packem_shared/Timer-wi9zuh4n.js +0 -22
  271. package/dist/packem_shared/parseSgrMouse-BHVBPP9G.js +0 -1
  272. /package/dist/ink/components/{AccessibilityContext.d.ts → accessibility-context.d.ts} +0 -0
  273. /package/dist/ink/components/{Alert.d.ts → alert.d.ts} +0 -0
  274. /package/dist/ink/components/{AnimationContext.d.ts → animation-context.d.ts} +0 -0
  275. /package/dist/ink/components/{AppContext.d.ts → app-context.d.ts} +0 -0
  276. /package/dist/ink/components/{App.d.ts → app.d.ts} +0 -0
  277. /package/dist/ink/components/{BackgroundContext.d.ts → background-context.d.ts} +0 -0
  278. /package/dist/ink/components/{Badge.d.ts → badge.d.ts} +0 -0
  279. /package/dist/ink/components/{BigText.d.ts → big-text.d.ts} +0 -0
  280. /package/dist/ink/components/{Box.d.ts → box.d.ts} +0 -0
  281. /package/dist/ink/components/{Code.d.ts → code.d.ts} +0 -0
  282. /package/dist/ink/components/{ConfirmInput.d.ts → confirm-input.d.ts} +0 -0
  283. /package/dist/ink/components/{ConsoleOverlay.d.ts → console-overlay.d.ts} +0 -0
  284. /package/dist/ink/components/{CursorContext.d.ts → cursor-context.d.ts} +0 -0
  285. /package/dist/ink/components/{Cursor.d.ts → cursor.d.ts} +0 -0
  286. /package/dist/ink/components/{Dialog.d.ts → dialog.d.ts} +0 -0
  287. /package/dist/ink/components/{DiffView.d.ts → diff-view.d.ts} +0 -0
  288. /package/dist/ink/components/{ErrorBoundary.d.ts → error-boundary.d.ts} +0 -0
  289. /package/dist/ink/components/{ErrorOverview.d.ts → error-overview.d.ts} +0 -0
  290. /package/dist/ink/components/{FocusContext.d.ts → focus-context.d.ts} +0 -0
  291. /package/dist/ink/components/{Gradient.d.ts → gradient.d.ts} +0 -0
  292. /package/dist/ink/components/{Link.d.ts → link.d.ts} +0 -0
  293. /package/dist/ink/components/{Markdown.d.ts → markdown.d.ts} +0 -0
  294. /package/dist/ink/components/{MultiSelect.d.ts → multi-select.d.ts} +0 -0
  295. /package/dist/ink/components/{Newline.d.ts → newline.d.ts} +0 -0
  296. /package/dist/ink/components/{OrderedList.d.ts → ordered-list.d.ts} +0 -0
  297. /package/dist/ink/components/{SelectInputIndicator.d.ts → select-input-indicator.d.ts} +0 -0
  298. /package/dist/ink/components/{SelectInputItem.d.ts → select-input-item.d.ts} +0 -0
  299. /package/dist/ink/components/{Slider.d.ts → slider.d.ts} +0 -0
  300. /package/dist/ink/components/{Spacer.d.ts → spacer.d.ts} +0 -0
  301. /package/dist/ink/components/{Static.d.ts → static.d.ts} +0 -0
  302. /package/dist/ink/components/{StatusMessage.d.ts → status-message.d.ts} +0 -0
  303. /package/dist/ink/components/{StderrContext.d.ts → stderr-context.d.ts} +0 -0
  304. /package/dist/ink/components/{StdinContext.d.ts → stdin-context.d.ts} +0 -0
  305. /package/dist/ink/components/{StdoutContext.d.ts → stdout-context.d.ts} +0 -0
  306. /package/dist/ink/components/{Tab.d.ts → tab.d.ts} +0 -0
  307. /package/dist/ink/components/{Table.d.ts → table.d.ts} +0 -0
  308. /package/dist/ink/components/{TextInput.d.ts → text-input.d.ts} +0 -0
  309. /package/dist/ink/components/{Text.d.ts → text.d.ts} +0 -0
  310. /package/dist/ink/components/{Textarea.d.ts → textarea.d.ts} +0 -0
  311. /package/dist/ink/components/{Transform.d.ts → transform.d.ts} +0 -0
  312. /package/dist/ink/components/tree-view/{TreeViewNode.d.ts → tree-view-node.d.ts} +0 -0
  313. /package/dist/ink/components/tree-view/{TreeView.d.ts → tree-view.d.ts} +0 -0
  314. /package/dist/ink/components/{UnorderedList.d.ts → unordered-list.d.ts} +0 -0
  315. /package/dist/ink/mouse/{Fullscreen.d.ts → fullscreen.d.ts} +0 -0
  316. /package/dist/ink/mouse/{MouseProvider.d.ts → mouse-provider.d.ts} +0 -0
  317. /package/dist/packem_shared/{AccessibilityContext-BLelHhNU.js → accessibility-context-BLelHhNU.js} +0 -0
  318. /package/dist/packem_shared/{AnimationContext-BcJg8Jr6.js → animation-context-BcJg8Jr6.js} +0 -0
  319. /package/dist/packem_shared/{AppContext-CP0U6H7O.js → app-context-CP0U6H7O.js} +0 -0
  320. /package/dist/packem_shared/{BackgroundContext-BAUaxfOb.js → background-context-BAUaxfOb.js} +0 -0
  321. /package/dist/packem_shared/{CursorContext-JxRzlqAx.js → cursor-context-JxRzlqAx.js} +0 -0
  322. /package/dist/packem_shared/{FocusContext-CWkYtgcm.js → focus-context-CWkYtgcm.js} +0 -0
  323. /package/dist/packem_shared/{StderrContext-Bj4Mf7v7.js → stderr-context-Bj4Mf7v7.js} +0 -0
  324. /package/dist/packem_shared/{StdinContext-Bq_GNJ3z.js → stdin-context-Bq_GNJ3z.js} +0 -0
  325. /package/dist/packem_shared/{StdoutContext-CgjWeCdO.js → stdout-context-CgjWeCdO.js} +0 -0
@@ -0,0 +1,246 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useRef, useMemo, Fragment } from 'react';
3
+ import { c as colorize } from './colorize-88_Vk8cn.js';
4
+ import Box from './Box-W1w_NGin.js';
5
+ import Text from './Text-CtUwV89_.js';
6
+
7
+ const STYLE_BOLD = Math.trunc(1);
8
+ const STYLE_DIM = 1 << 1;
9
+ const SPACE_CODEPOINT = 32;
10
+ const EMPTY_COLOR = 0;
11
+ const createColorCoders = () => {
12
+ const encoded = /* @__PURE__ */ new Map();
13
+ const decoded = [void 0];
14
+ return {
15
+ decode: (id) => decoded[id],
16
+ encode: (color) => {
17
+ if (color === void 0 || color === null) {
18
+ return EMPTY_COLOR;
19
+ }
20
+ const key = typeof color === "number" ? `n:${color}` : `s:${color}`;
21
+ const existing = encoded.get(key);
22
+ if (existing !== void 0) {
23
+ return existing;
24
+ }
25
+ const next = decoded.length;
26
+ decoded.push(color);
27
+ encoded.set(key, next);
28
+ return next;
29
+ }
30
+ };
31
+ };
32
+ const V_BAR_GLYPHS = [9601, 9602, 9603, 9604, 9605, 9606, 9607, 9608];
33
+ const H_BAR_GLYPHS = [9615, 9614, 9613, 9612, 9611, 9610, 9609, 9608];
34
+ const FULL_BLOCK = 9608;
35
+ const flagsFromStyle = (style) => {
36
+ if (!style) {
37
+ return 0;
38
+ }
39
+ let flags = 0;
40
+ if (style.bold) {
41
+ flags |= STYLE_BOLD;
42
+ }
43
+ if (style.dim) {
44
+ flags |= STYLE_DIM;
45
+ }
46
+ return flags;
47
+ };
48
+ const toCodepoint = (char) => {
49
+ if (typeof char === "number") {
50
+ return char;
51
+ }
52
+ return char.codePointAt(0) ?? SPACE_CODEPOINT;
53
+ };
54
+ const createCanvasBuffer = (width, height) => {
55
+ const cells = Math.max(0, width * height);
56
+ const chars = new Uint32Array(cells);
57
+ const styles = new Uint32Array(cells);
58
+ const fg = new Int32Array(cells);
59
+ const bg = new Int32Array(cells);
60
+ const dirty = new Uint8Array(height);
61
+ const { decode, encode } = createColorCoders();
62
+ chars.fill(SPACE_CODEPOINT);
63
+ const markDirty = (y) => {
64
+ if (y >= 0 && y < height) {
65
+ dirty[y] = 1;
66
+ }
67
+ };
68
+ const setCellImpl = (x, y, char, style) => {
69
+ if (x < 0 || x >= width || y < 0 || y >= height) {
70
+ return;
71
+ }
72
+ const index = y * width + x;
73
+ const codepoint = toCodepoint(char);
74
+ const fgId = encode(style?.color);
75
+ const bgId = encode(style?.background);
76
+ const flags = flagsFromStyle(style);
77
+ if (chars[index] === codepoint && styles[index] === flags && fg[index] === fgId && bg[index] === bgId) {
78
+ return;
79
+ }
80
+ chars[index] = codepoint;
81
+ styles[index] = flags;
82
+ fg[index] = fgId;
83
+ bg[index] = bgId;
84
+ dirty[y] = 1;
85
+ };
86
+ const context = {
87
+ clear: () => {
88
+ chars.fill(SPACE_CODEPOINT);
89
+ styles.fill(0);
90
+ fg.fill(0);
91
+ bg.fill(0);
92
+ dirty.fill(1);
93
+ },
94
+ drawHBar: (x, y, w, fillRatio, style) => {
95
+ if (w <= 0 || y < 0 || y >= height) {
96
+ return;
97
+ }
98
+ const ratio = Math.max(0, Math.min(1, fillRatio));
99
+ const total = w * H_BAR_GLYPHS.length;
100
+ const filled = Math.round(ratio * total);
101
+ const fullChars = Math.floor(filled / H_BAR_GLYPHS.length);
102
+ const remainder = filled % H_BAR_GLYPHS.length;
103
+ for (let column = 0; column < w; column += 1) {
104
+ const px = x + column;
105
+ if (column < fullChars) {
106
+ setCellImpl(px, y, FULL_BLOCK, style);
107
+ } else if (column === fullChars && remainder > 0) {
108
+ setCellImpl(px, y, H_BAR_GLYPHS[remainder - 1], style);
109
+ } else {
110
+ setCellImpl(px, y, SPACE_CODEPOINT, style);
111
+ }
112
+ }
113
+ markDirty(y);
114
+ },
115
+ drawRect: (x, y, w, h, char, style) => {
116
+ if (w <= 0 || h <= 0) {
117
+ return;
118
+ }
119
+ const codepoint = toCodepoint(char);
120
+ for (let dy = 0; dy < h; dy += 1) {
121
+ for (let dx = 0; dx < w; dx += 1) {
122
+ setCellImpl(x + dx, y + dy, codepoint, style);
123
+ }
124
+ markDirty(y + dy);
125
+ }
126
+ },
127
+ drawText: (x, y, text, style) => {
128
+ if (y < 0 || y >= height || text.length === 0) {
129
+ return;
130
+ }
131
+ let column = 0;
132
+ for (const char of text) {
133
+ setCellImpl(x + column, y, char, style);
134
+ column += 1;
135
+ }
136
+ markDirty(y);
137
+ },
138
+ drawVBar: (x, y, h, fillRatio, style) => {
139
+ if (h <= 0 || x < 0 || x >= width) {
140
+ return;
141
+ }
142
+ const ratio = Math.max(0, Math.min(1, fillRatio));
143
+ const total = h * V_BAR_GLYPHS.length;
144
+ const filled = Math.round(ratio * total);
145
+ const fullRows = Math.floor(filled / V_BAR_GLYPHS.length);
146
+ const remainder = filled % V_BAR_GLYPHS.length;
147
+ for (let row = 0; row < h; row += 1) {
148
+ const distanceFromBottom = h - row - 1;
149
+ const py = y + row;
150
+ if (distanceFromBottom < fullRows) {
151
+ setCellImpl(x, py, FULL_BLOCK, style);
152
+ } else if (distanceFromBottom === fullRows && remainder > 0) {
153
+ setCellImpl(x, py, V_BAR_GLYPHS[remainder - 1], style);
154
+ } else {
155
+ setCellImpl(x, py, SPACE_CODEPOINT, style);
156
+ }
157
+ markDirty(py);
158
+ }
159
+ },
160
+ height,
161
+ setCell: setCellImpl,
162
+ width
163
+ };
164
+ return {
165
+ bg,
166
+ chars,
167
+ colorDecoder: decode,
168
+ context,
169
+ dirty,
170
+ fg,
171
+ height,
172
+ styles,
173
+ width
174
+ };
175
+ };
176
+ const serializeRow = (buffer, row) => {
177
+ const { bg, chars, colorDecoder, fg, styles, width } = buffer;
178
+ const base = row * width;
179
+ let output = "";
180
+ let spanStart = 0;
181
+ let spanStyles = styles[base];
182
+ let spanFg = fg[base];
183
+ let spanBg = bg[base];
184
+ const flush = (end) => {
185
+ let text = "";
186
+ for (let index = spanStart; index < end; index += 1) {
187
+ text += String.fromCodePoint(chars[base + index]);
188
+ }
189
+ const fgColor = colorDecoder(spanFg);
190
+ const bgColor = colorDecoder(spanBg);
191
+ let rendered = text;
192
+ if (fgColor !== void 0 && fgColor !== null) {
193
+ rendered = colorize(rendered, typeof fgColor === "number" ? String(fgColor) : fgColor, "foreground");
194
+ }
195
+ if (bgColor !== void 0 && bgColor !== null) {
196
+ rendered = colorize(rendered, typeof bgColor === "number" ? String(bgColor) : bgColor, "background");
197
+ }
198
+ if ((spanStyles & STYLE_BOLD) !== 0) {
199
+ rendered = `\x1B[1m${rendered}\x1B[22m`;
200
+ }
201
+ if ((spanStyles & STYLE_DIM) !== 0) {
202
+ rendered = `\x1B[2m${rendered}\x1B[22m`;
203
+ }
204
+ output += rendered;
205
+ };
206
+ for (let column = 1; column < width; column += 1) {
207
+ const nextStyles = styles[base + column];
208
+ const nextFg = fg[base + column];
209
+ const nextBg = bg[base + column];
210
+ if (nextStyles !== spanStyles || nextFg !== spanFg || nextBg !== spanBg) {
211
+ flush(column);
212
+ spanStart = column;
213
+ spanStyles = nextStyles;
214
+ spanFg = nextFg;
215
+ spanBg = nextBg;
216
+ }
217
+ }
218
+ flush(width);
219
+ return output;
220
+ };
221
+
222
+ function Canvas({ draw, height, version, width }) {
223
+ const bufferRef = useRef(void 0);
224
+ const rowCacheRef = useRef(void 0);
225
+ if (bufferRef.current?.width !== width || bufferRef.current.height !== height) {
226
+ bufferRef.current = createCanvasBuffer(width, height);
227
+ rowCacheRef.current = { hasRendered: false, lines: new Array(height).fill("") };
228
+ }
229
+ const buffer = bufferRef.current;
230
+ const cache = rowCacheRef.current;
231
+ const rows = useMemo(() => {
232
+ draw(buffer.context);
233
+ for (let row = 0; row < buffer.height; row += 1) {
234
+ if (cache.hasRendered && buffer.dirty[row] === 0) {
235
+ continue;
236
+ }
237
+ cache.lines[row] = serializeRow(buffer, row);
238
+ buffer.dirty[row] = 0;
239
+ }
240
+ cache.hasRendered = true;
241
+ return [...cache.lines];
242
+ }, [version, width, height]);
243
+ return jsx(Box, { flexDirection: "column", flexShrink: 0, height, width, children: rows.map((line, index) => jsx(Fragment, { children: jsx(Text, { wrap: "truncate-end", children: line }) }, index)) });
244
+ }
245
+
246
+ export { Canvas as default };
@@ -0,0 +1,24 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from './Box-W1w_NGin.js';
3
+ import Divider from './Divider-DocXIqNn.js';
4
+ import Text from './Text-CtUwV89_.js';
5
+
6
+ function Card({ borderColor, borderStyle = "round", children, footer, headerRight, subtitle, title, titleColor, width }) {
7
+ const hasHeader = title !== void 0 || subtitle !== void 0 || headerRight !== void 0;
8
+ return jsxs(Box, { borderColor, borderStyle, flexDirection: "column", paddingX: 1, width, children: [
9
+ hasHeader ? jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
10
+ jsxs(Box, { justifyContent: "space-between", children: [
11
+ jsx(Box, { children: title === void 0 ? void 0 : jsx(Text, { bold: true, color: titleColor, children: title }) }),
12
+ headerRight === void 0 ? void 0 : jsx(Box, { children: headerRight })
13
+ ] }),
14
+ subtitle === void 0 ? void 0 : jsx(Text, { dimColor: true, children: subtitle })
15
+ ] }) : void 0,
16
+ jsx(Box, { flexDirection: "column", children }),
17
+ footer === void 0 ? void 0 : jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
18
+ jsx(Divider, { dimColor: true, length: typeof width === "number" ? Math.max(1, width - 4) : void 0 }),
19
+ jsx(Box, { marginTop: 1, children: footer })
20
+ ] })
21
+ ] });
22
+ }
23
+
24
+ export { Card as default };
@@ -0,0 +1,49 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback } from 'react';
3
+ import useFocus from './useFocus-DLoGQJd9.js';
4
+ import useInput from './useInput-DKZbqMRc.js';
5
+ import Box from './Box-W1w_NGin.js';
6
+ import Text from './Text-CtUwV89_.js';
7
+
8
+ const CHECKED_ICON = "☒";
9
+ const UNCHECKED_ICON = "☐";
10
+ function Checkbox({
11
+ accentColor = "blue",
12
+ autoFocus = false,
13
+ children,
14
+ defaultChecked = false,
15
+ isChecked,
16
+ isDisabled = false,
17
+ onChange
18
+ }) {
19
+ const { isFocused } = useFocus({ autoFocus, isActive: !isDisabled });
20
+ const [internalChecked, setInternalChecked] = useState(defaultChecked);
21
+ const checked = isChecked ?? internalChecked;
22
+ useInput(
23
+ useCallback(
24
+ (input, key) => {
25
+ if (!isFocused) {
26
+ return;
27
+ }
28
+ if (key.return || input === " ") {
29
+ const next = !checked;
30
+ if (isChecked === void 0) {
31
+ setInternalChecked(next);
32
+ }
33
+ onChange?.(next);
34
+ }
35
+ },
36
+ [isFocused, checked, isChecked, onChange]
37
+ ),
38
+ { isActive: !isDisabled && isFocused }
39
+ );
40
+ return jsxs(Box, { gap: 1, children: [
41
+ jsxs(Text, { color: isFocused ? accentColor : void 0, dimColor: isDisabled, children: [
42
+ isFocused ? "▸ " : " ",
43
+ checked ? CHECKED_ICON : UNCHECKED_ICON
44
+ ] }),
45
+ children === void 0 ? void 0 : jsx(Text, { color: isFocused ? accentColor : void 0, dimColor: isDisabled, children })
46
+ ] });
47
+ }
48
+
49
+ export { Checkbox as default };
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useRef, useEffect } from 'react';
3
- import { r as resolveLanguage, i as isLanguageSupported, g as getHighlighter, a as getCachedTokens, t as tokenLinesToElements } from './token-to-elements-BRFl_rzw.js';
4
- import Box from './Box-D_pSJ9Jp.js';
5
- import Text from './Text-DvAUdZcK.js';
3
+ import { r as resolveLanguage, i as isLanguageSupported, g as getHighlighter, a as getCachedTokens, t as tokenLinesToElements } from './token-to-elements-CK4s8MJd.js';
4
+ import Box from './Box-W1w_NGin.js';
5
+ import Text from './Text-CtUwV89_.js';
6
6
 
7
7
  function Code({ code, highlightLines, language, showLineNumbers = false, startLine = 1, theme = "github-dark-default" }) {
8
8
  const [tokens, setTokens] = useState(null);
@@ -0,0 +1,45 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback } from 'react';
3
+ import useFocus from './useFocus-DLoGQJd9.js';
4
+ import useInput from './useInput-DKZbqMRc.js';
5
+ import Box from './Box-W1w_NGin.js';
6
+ import Text from './Text-CtUwV89_.js';
7
+
8
+ function Collapsible({
9
+ accentColor = "blue",
10
+ autoFocus = false,
11
+ children,
12
+ defaultOpen = false,
13
+ isDisabled = false,
14
+ isOpen,
15
+ onToggle,
16
+ title
17
+ }) {
18
+ const { isFocused } = useFocus({ autoFocus, isActive: !isDisabled });
19
+ const [internal, setInternal] = useState(defaultOpen);
20
+ const open = isOpen ?? internal;
21
+ useInput(
22
+ useCallback(
23
+ (input, key) => {
24
+ if (key.return || input === " ") {
25
+ const next = !open;
26
+ if (isOpen === void 0) {
27
+ setInternal(next);
28
+ }
29
+ onToggle?.(next);
30
+ }
31
+ },
32
+ [open, isOpen, onToggle]
33
+ ),
34
+ { isActive: !isDisabled && isFocused }
35
+ );
36
+ return jsxs(Box, { flexDirection: "column", children: [
37
+ jsxs(Box, { children: [
38
+ jsx(Text, { color: isFocused ? accentColor : void 0, dimColor: isDisabled, children: open ? "▼ " : "▶ " }),
39
+ jsx(Text, { bold: isFocused, color: isFocused ? accentColor : void 0, dimColor: isDisabled, children: title })
40
+ ] }),
41
+ open ? jsx(Box, { flexDirection: "column", marginLeft: 2, children }) : void 0
42
+ ] });
43
+ }
44
+
45
+ export { Collapsible as default };
@@ -0,0 +1,80 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from './Box-W1w_NGin.js';
3
+ import Spinner from './Spinner-BcO5BCAa.js';
4
+ import Text from './Text-CtUwV89_.js';
5
+
6
+ const STATUS_COLOR = {
7
+ error: "red",
8
+ idle: "gray",
9
+ running: "cyan",
10
+ success: "green"
11
+ };
12
+ const formatDuration = (ms) => {
13
+ if (ms < 1e3) {
14
+ return `${Math.round(ms)}ms`;
15
+ }
16
+ return `${(ms / 1e3).toFixed(2)}s`;
17
+ };
18
+ const resolveStatusIcon = (status) => {
19
+ if (status === "running") {
20
+ return jsx(Spinner, { type: "dots" });
21
+ }
22
+ const ICONS = {
23
+ error: "✖",
24
+ idle: "$",
25
+ success: "✔"
26
+ };
27
+ return ICONS[status];
28
+ };
29
+ const truncateOutput = (output, maxRows) => {
30
+ if (!Number.isFinite(maxRows)) {
31
+ return output;
32
+ }
33
+ const rows = output.split("\n");
34
+ if (rows.length <= maxRows) {
35
+ return output;
36
+ }
37
+ const kept = rows.slice(0, maxRows).join("\n");
38
+ const hidden = rows.length - maxRows;
39
+ return `${kept}
40
+ … ${hidden} more line${hidden === 1 ? "" : "s"}`;
41
+ };
42
+ function CommandBlock({ command, cwd, durationMs, exitCode, maxOutputRows = 12, output, status = "idle" }) {
43
+ const color = STATUS_COLOR[status];
44
+ const statusIcon = resolveStatusIcon(status);
45
+ const trailing = [];
46
+ if (durationMs !== void 0) {
47
+ trailing.push(
48
+ jsxs(Text, { dimColor: true, children: [
49
+ " ",
50
+ formatDuration(durationMs)
51
+ ] }, "duration")
52
+ );
53
+ }
54
+ if (exitCode !== void 0 && status !== "running") {
55
+ trailing.push(
56
+ jsxs(Text, { color: exitCode === 0 ? "green" : "red", children: [
57
+ " ",
58
+ "exit",
59
+ " ",
60
+ exitCode
61
+ ] }, "exit")
62
+ );
63
+ }
64
+ return jsxs(Box, { borderColor: color, borderStyle: "round", flexDirection: "column", paddingX: 1, children: [
65
+ jsxs(Box, { children: [
66
+ jsx(Text, { color, children: statusIcon }),
67
+ jsx(Text, { children: " " }),
68
+ jsx(Box, { flexGrow: 1, flexShrink: 1, minWidth: 0, children: jsx(Text, { bold: true, wrap: "truncate-end", children: command }) }),
69
+ cwd === void 0 ? void 0 : jsxs(Text, { dimColor: true, children: [
70
+ " ",
71
+ "@",
72
+ cwd
73
+ ] }),
74
+ trailing.length === 0 ? void 0 : jsx(Box, { flexShrink: 0, children: trailing })
75
+ ] }),
76
+ output === void 0 ? void 0 : jsx(Box, { flexDirection: "column", marginTop: 1, children: typeof output === "string" ? jsx(Text, { children: truncateOutput(output, maxOutputRows) }) : output })
77
+ ] });
78
+ }
79
+
80
+ export { CommandBlock as default };
@@ -0,0 +1,146 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useRef, useMemo, useEffect, useCallback } from 'react';
3
+ import useFocus from './useFocus-DLoGQJd9.js';
4
+ import useInput from './useInput-DKZbqMRc.js';
5
+ import { i as isInsertableInput } from './input-utils-ViAEXa0Z.js';
6
+ import Box from './Box-W1w_NGin.js';
7
+ import Text from './Text-CtUwV89_.js';
8
+
9
+ const scoreCommand = (query, command) => {
10
+ if (query.length === 0) {
11
+ return 1;
12
+ }
13
+ const haystacks = [command.label, command.description ?? "", ...command.keywords ?? []].map((text) => text.toLowerCase()).filter((text) => text.length > 0);
14
+ const needle = query.toLowerCase();
15
+ let best = 0;
16
+ for (const haystack of haystacks) {
17
+ if (haystack.includes(needle)) {
18
+ const index = haystack.indexOf(needle);
19
+ best = Math.max(best, 100 - index);
20
+ continue;
21
+ }
22
+ let haystackIndex = 0;
23
+ let matched = 0;
24
+ for (const char of needle) {
25
+ const found = haystack.indexOf(char, haystackIndex);
26
+ if (found === -1) {
27
+ matched = 0;
28
+ break;
29
+ }
30
+ matched += 1;
31
+ haystackIndex = found + 1;
32
+ }
33
+ if (matched === needle.length) {
34
+ best = Math.max(best, 20);
35
+ }
36
+ }
37
+ return best;
38
+ };
39
+ function CommandPalette({
40
+ accentColor = "cyan",
41
+ autoFocus = true,
42
+ commands,
43
+ emptyText = "No results",
44
+ limit = 8,
45
+ onCancel,
46
+ onSelect,
47
+ placeholder = "Type a command or search..."
48
+ }) {
49
+ const { isFocused } = useFocus({ autoFocus });
50
+ const [query, setQuery] = useState("");
51
+ const [focusedIndex, setFocusedIndex] = useState(0);
52
+ const focusedIndexRef = useRef(focusedIndex);
53
+ focusedIndexRef.current = focusedIndex;
54
+ const filtered = useMemo(() => {
55
+ const scored = commands.map((command) => {
56
+ return { command, score: scoreCommand(query, command) };
57
+ }).filter(({ score }) => score > 0);
58
+ scored.sort((a, b) => b.score - a.score);
59
+ return scored.slice(0, limit).map(({ command }) => command);
60
+ }, [commands, query, limit]);
61
+ useEffect(() => {
62
+ const maxIndex = Math.max(0, filtered.length - 1);
63
+ if (focusedIndexRef.current > maxIndex) {
64
+ focusedIndexRef.current = maxIndex;
65
+ setFocusedIndex(maxIndex);
66
+ }
67
+ }, [filtered]);
68
+ useInput(
69
+ useCallback(
70
+ (input, key) => {
71
+ if (!isFocused) {
72
+ return;
73
+ }
74
+ if (key.escape) {
75
+ onCancel?.();
76
+ return;
77
+ }
78
+ if (key.downArrow) {
79
+ if (filtered.length === 0) {
80
+ return;
81
+ }
82
+ setFocusedIndex((previous) => Math.min(filtered.length - 1, previous + 1));
83
+ return;
84
+ }
85
+ if (key.upArrow) {
86
+ setFocusedIndex((previous) => Math.max(0, previous - 1));
87
+ return;
88
+ }
89
+ if (key.return) {
90
+ const target = filtered[focusedIndexRef.current];
91
+ if (target) {
92
+ onSelect(target.id, query);
93
+ }
94
+ return;
95
+ }
96
+ if (key.backspace || key.delete) {
97
+ setQuery((previous) => previous.slice(0, -1));
98
+ setFocusedIndex(0);
99
+ return;
100
+ }
101
+ if (isInsertableInput(input, key)) {
102
+ setQuery((previous) => previous + input);
103
+ setFocusedIndex(0);
104
+ }
105
+ },
106
+ [isFocused, filtered, query, onSelect, onCancel]
107
+ ),
108
+ { isActive: isFocused }
109
+ );
110
+ return jsxs(Box, { borderColor: accentColor, borderStyle: "round", flexDirection: "column", paddingX: 1, children: [
111
+ jsxs(Box, { children: [
112
+ jsx(Text, { color: accentColor, children: "❯" }),
113
+ jsxs(Text, { children: [
114
+ " ",
115
+ query.length === 0 ? jsx(Text, { dimColor: true, children: placeholder }) : query
116
+ ] }),
117
+ jsx(Text, { inverse: true, children: " " })
118
+ ] }),
119
+ jsx(Box, { marginTop: 1, children: jsxs(Text, { dimColor: true, children: [
120
+ filtered.length,
121
+ " of ",
122
+ commands.length
123
+ ] }) }),
124
+ jsx(Box, { flexDirection: "column", marginTop: 1, children: filtered.length === 0 ? jsx(Text, { dimColor: true, children: emptyText }) : filtered.map((command, index) => {
125
+ const isRowFocused = index === focusedIndex;
126
+ const color = isRowFocused ? accentColor : void 0;
127
+ return jsxs(Box, { flexDirection: "column", children: [
128
+ jsxs(Box, { children: [
129
+ jsx(Text, { color, children: isRowFocused ? "▸ " : " " }),
130
+ command.icon === void 0 ? void 0 : jsxs(Text, { color, children: [
131
+ command.icon,
132
+ " "
133
+ ] }),
134
+ jsx(Box, { flexGrow: 1, flexShrink: 1, minWidth: 0, children: jsx(Text, { bold: isRowFocused, color, wrap: "truncate-end", children: command.label }) }),
135
+ command.hotkey === void 0 ? void 0 : jsx(Box, { flexShrink: 0, children: jsxs(Text, { dimColor: true, children: [
136
+ " ",
137
+ command.hotkey
138
+ ] }) })
139
+ ] }),
140
+ command.description === void 0 ? void 0 : jsx(Box, { marginLeft: 2, children: jsx(Text, { dimColor: true, wrap: "truncate-end", children: command.description }) })
141
+ ] }, command.id);
142
+ }) })
143
+ ] });
144
+ }
145
+
146
+ export { CommandPalette as default };
@@ -0,0 +1,67 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback } from 'react';
3
+ import useFocus from './useFocus-DLoGQJd9.js';
4
+ import useInput from './useInput-DKZbqMRc.js';
5
+ import Box from './Box-W1w_NGin.js';
6
+ import Text from './Text-CtUwV89_.js';
7
+
8
+ const TONE_COLOR = {
9
+ danger: "red",
10
+ info: "blue",
11
+ warning: "yellow"
12
+ };
13
+ const ButtonLabel = ({ color, isFocused, label }) => jsx(Box, { backgroundColor: isFocused ? color : void 0, borderColor: isFocused ? color : void 0, borderStyle: "round", paddingX: 1, children: jsx(Text, { bold: isFocused, color: isFocused ? "black" : void 0, children: label }) });
14
+ function ConfirmDialog({
15
+ autoFocus = true,
16
+ cancelLabel = "Cancel",
17
+ children,
18
+ confirmLabel = "Confirm",
19
+ defaultFocus = "confirm",
20
+ isDisabled = false,
21
+ onCancel,
22
+ onConfirm,
23
+ title,
24
+ tone = "info",
25
+ width
26
+ }) {
27
+ const [focus, setFocus] = useState(defaultFocus);
28
+ const color = TONE_COLOR[tone];
29
+ const { isFocused } = useFocus({ autoFocus, isActive: !isDisabled });
30
+ useInput(
31
+ useCallback(
32
+ (input, key) => {
33
+ if (key.leftArrow || key.rightArrow || input === "h" || input === "l") {
34
+ setFocus((previous) => previous === "confirm" ? "cancel" : "confirm");
35
+ return;
36
+ }
37
+ if (key.return) {
38
+ if (focus === "confirm") {
39
+ onConfirm();
40
+ } else {
41
+ onCancel();
42
+ }
43
+ return;
44
+ }
45
+ if (key.escape || input === "n") {
46
+ onCancel();
47
+ return;
48
+ }
49
+ if (input === "y") {
50
+ onConfirm();
51
+ }
52
+ },
53
+ [focus, onConfirm, onCancel]
54
+ ),
55
+ { isActive: !isDisabled && isFocused }
56
+ );
57
+ return jsxs(Box, { borderColor: color, borderStyle: "round", flexDirection: "column", paddingX: 1, paddingY: 1, width, children: [
58
+ title === void 0 ? void 0 : jsx(Box, { marginBottom: 1, children: jsx(Text, { bold: true, color, children: title }) }),
59
+ children === void 0 ? void 0 : jsx(Box, { flexDirection: "column", marginBottom: 1, children: typeof children === "string" ? jsx(Text, { children }) : children }),
60
+ jsxs(Box, { gap: 2, justifyContent: "flex-end", children: [
61
+ jsx(ButtonLabel, { color, isFocused: focus === "cancel", label: cancelLabel }),
62
+ jsx(ButtonLabel, { color, isFocused: focus === "confirm", label: confirmLabel })
63
+ ] })
64
+ ] });
65
+ }
66
+
67
+ export { ConfirmDialog as default };
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useRef, useCallback } from 'react';
3
- import useInput from './useInput-Cfp5zB2s.js';
4
- import Box from './Box-D_pSJ9Jp.js';
5
- import Text from './Text-DvAUdZcK.js';
3
+ import useInput from './useInput-DKZbqMRc.js';
4
+ import Box from './Box-W1w_NGin.js';
5
+ import Text from './Text-CtUwV89_.js';
6
6
 
7
7
  function ConfirmInput({ defaultChoice = "confirm", isDisabled = false, onCancel, onConfirm, submitOnEnter = true }) {
8
8
  const onConfirmRef = useRef(onConfirm);