@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,79 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useMemo } from 'react';
3
+ import Box from './Box-W1w_NGin.js';
4
+ import Canvas from './Canvas-COttmLPX.js';
5
+ import Text from './Text-CtUwV89_.js';
6
+
7
+ const DEFAULT_PALETTE = ["#0b1e4f", "#1f3b96", "#3258c8", "#4e84ec", "#78b0ff"];
8
+ function Heatmap({
9
+ cellWidth = 2,
10
+ character = "█",
11
+ columnLabels,
12
+ data,
13
+ max: maxOverride,
14
+ min: minOverride,
15
+ palette = DEFAULT_PALETTE,
16
+ rowLabels,
17
+ textColor
18
+ }) {
19
+ const { cols, colWidth, extent, rows } = useMemo(() => {
20
+ const rowCount = data.length;
21
+ const colCount = data.reduce((widest, row) => Math.max(widest, row.length), 0);
22
+ let min = minOverride ?? Infinity;
23
+ let max = maxOverride ?? -Infinity;
24
+ if (minOverride === void 0 || maxOverride === void 0) {
25
+ for (const row of data) {
26
+ for (const value of row) {
27
+ if (minOverride === void 0 && value < min) {
28
+ min = value;
29
+ }
30
+ if (maxOverride === void 0 && value > max) {
31
+ max = value;
32
+ }
33
+ }
34
+ }
35
+ }
36
+ return {
37
+ cols: colCount,
38
+ colWidth: cellWidth,
39
+ extent: { max, min },
40
+ rows: rowCount
41
+ };
42
+ }, [data, minOverride, maxOverride, cellWidth]);
43
+ const width = cols * colWidth;
44
+ const height = rows;
45
+ return jsxs(Box, { children: [
46
+ rowLabels === void 0 ? void 0 : jsx(Box, { flexDirection: "column", marginRight: 1, children: Array.from({ length: rows }, (_, index) => jsx(Text, { dimColor: true, children: rowLabels[index] ?? "" }, index)) }),
47
+ jsxs(Box, { flexDirection: "column", children: [
48
+ jsx(
49
+ Canvas,
50
+ {
51
+ draw: (context) => {
52
+ context.clear();
53
+ const { max, min } = extent;
54
+ const range = max - min || 1;
55
+ const paletteLast = palette.length - 1;
56
+ for (let row = 0; row < rows; row += 1) {
57
+ for (let col = 0; col < cols; col += 1) {
58
+ const value = data[row]?.[col];
59
+ const background = value === void 0 ? void 0 : palette[Math.max(0, Math.min(paletteLast, Math.round((value - min) / range * paletteLast)))];
60
+ for (let offset = 0; offset < colWidth; offset += 1) {
61
+ context.setCell(col * colWidth + offset, row, character, {
62
+ background,
63
+ color: textColor
64
+ });
65
+ }
66
+ }
67
+ }
68
+ },
69
+ height,
70
+ version: [data, palette, cellWidth, minOverride, maxOverride],
71
+ width
72
+ }
73
+ ),
74
+ columnLabels === void 0 ? void 0 : jsx(Box, { children: columnLabels.map((label, index) => jsx(Box, { width: colWidth, children: jsx(Text, { dimColor: true, wrap: "truncate-end", children: label }) }, index)) })
75
+ ] })
76
+ ] });
77
+ }
78
+
79
+ export { Heatmap as default };
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import useWindowSize from './useWindowSize-ugEmGZJm.js';
3
- import Box from './Box-D_pSJ9Jp.js';
4
- import Text from './Text-DvAUdZcK.js';
2
+ import useWindowSize from './useWindowSize-D3UU41mv.js';
3
+ import Box from './Box-W1w_NGin.js';
4
+ import Text from './Text-CtUwV89_.js';
5
5
 
6
6
  const keyLabels = {
7
7
  backspace: "backspace",
@@ -31,14 +31,7 @@ function formatKeys(key) {
31
31
  const keys = typeof key === "string" ? [key] : key;
32
32
  return keys.map((k) => formatKeyLabel(k)).join("/");
33
33
  }
34
- function Help({
35
- bindings,
36
- descriptionColor,
37
- keyColor = "cyan",
38
- maxColumns = 3,
39
- mode = "short",
40
- separator = " · "
41
- }) {
34
+ function Help({ bindings, descriptionColor, keyColor = "cyan", maxColumns = 3, mode = "short", separator = " · " }) {
42
35
  const { columns } = useWindowSize();
43
36
  if (mode === "full") {
44
37
  return renderFull(bindings, { columns, descriptionColor, keyColor, maxColumns });
@@ -0,0 +1,92 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useMemo } from 'react';
3
+ import BarChart from './BarChart-DWRae67P.js';
4
+
5
+ const computeThresholds = (min, max, bins) => {
6
+ if (bins <= 0 || min >= max) {
7
+ return [min, max];
8
+ }
9
+ const step = (max - min) / bins;
10
+ return Array.from({ length: bins + 1 }, (_, index) => min + index * step);
11
+ };
12
+ const binData = (data, thresholds) => {
13
+ if (thresholds.length < 2) {
14
+ return [];
15
+ }
16
+ const counts = Array.from({ length: thresholds.length - 1 }, () => 0);
17
+ const lowerBound = thresholds[0];
18
+ const upperBound = thresholds[thresholds.length - 1];
19
+ for (const value of data) {
20
+ if (value < lowerBound || value > upperBound) {
21
+ continue;
22
+ }
23
+ for (let index = 0; index < thresholds.length - 1; index += 1) {
24
+ const isLastBin = index === thresholds.length - 2;
25
+ const upper = thresholds[index + 1];
26
+ const withinBin = value < upper || isLastBin && value <= upper;
27
+ if (withinBin) {
28
+ counts[index] = (counts[index] ?? 0) + 1;
29
+ break;
30
+ }
31
+ }
32
+ }
33
+ return counts.map((count, index) => {
34
+ const low = thresholds[index];
35
+ const high = thresholds[index + 1];
36
+ return {
37
+ count,
38
+ label: `${Math.round(low)}-${Math.round(high)}`
39
+ };
40
+ });
41
+ };
42
+ function Histogram({
43
+ bins = 10,
44
+ color,
45
+ data,
46
+ height = 10,
47
+ max: maxOverride,
48
+ min: minOverride,
49
+ showValues = false,
50
+ thresholds,
51
+ width
52
+ }) {
53
+ const buckets = useMemo(() => {
54
+ if (thresholds && thresholds.length >= 2) {
55
+ return binData(data, thresholds);
56
+ }
57
+ if (data.length === 0) {
58
+ return [];
59
+ }
60
+ let min = minOverride ?? Infinity;
61
+ let max = maxOverride ?? -Infinity;
62
+ if (minOverride === void 0 || maxOverride === void 0) {
63
+ for (const value of data) {
64
+ if (minOverride === void 0 && value < min) {
65
+ min = value;
66
+ }
67
+ if (maxOverride === void 0 && value > max) {
68
+ max = value;
69
+ }
70
+ }
71
+ }
72
+ if (min === max) {
73
+ return [{ count: data.length, label: `${min}` }];
74
+ }
75
+ return binData(data, computeThresholds(min, max, bins));
76
+ }, [data, thresholds, bins, minOverride, maxOverride]);
77
+ return jsx(
78
+ BarChart,
79
+ {
80
+ data: buckets.map((bucket) => {
81
+ return { color, label: bucket.label, value: bucket.count };
82
+ }),
83
+ height,
84
+ orientation: "vertical",
85
+ showLabels: true,
86
+ showValues,
87
+ width
88
+ }
89
+ );
90
+ }
91
+
92
+ export { Histogram as default };
@@ -130,21 +130,23 @@ class InputParser extends EventEmitter {
130
130
  const ctrl = (buttonCode & 16) !== 0;
131
131
  const base = buttonCode & -29;
132
132
  let button = null;
133
- if (base === 0 && !isRelease)
133
+ if (base === 0 && !isRelease) {
134
134
  button = "left";
135
- else if (base === 1 && !isRelease)
135
+ } else if (base === 1 && !isRelease) {
136
136
  button = "middle";
137
- else if (base === 2 && !isRelease)
137
+ } else if (base === 2 && !isRelease) {
138
138
  button = "right";
139
- else if (base === 64)
139
+ } else if (base === 64) {
140
140
  button = "scrollUp";
141
- else if (base === 65)
141
+ } else if (base === 65) {
142
142
  button = "scrollDown";
143
+ }
143
144
  if (button) {
144
145
  const event = { button, ctrl, meta, shift, x, y };
145
146
  this.emit("mouse", event);
146
- if (button === "left")
147
+ if (button === "left") {
147
148
  this.emit("click", { x, y });
149
+ }
148
150
  }
149
151
  }
150
152
  return;
@@ -0,0 +1,74 @@
1
+ const KEY = {
2
+ backspace: "",
3
+ ctrlC: "",
4
+ delete: "\x1B[3~",
5
+ down: "\x1B[B",
6
+ end: "\x1B[F",
7
+ escape: "\x1B",
8
+ home: "\x1B[H",
9
+ left: "\x1B[D",
10
+ pageDown: "\x1B[6~",
11
+ pageUp: "\x1B[5~",
12
+ return: "\r",
13
+ right: "\x1B[C",
14
+ space: " ",
15
+ tab: " ",
16
+ up: "\x1B[A"
17
+ };
18
+ const createKeySender = (write) => {
19
+ return {
20
+ backspace: () => {
21
+ write(KEY.backspace);
22
+ },
23
+ delete: () => {
24
+ write(KEY.delete);
25
+ },
26
+ down: () => {
27
+ write(KEY.down);
28
+ },
29
+ end: () => {
30
+ write(KEY.end);
31
+ },
32
+ enter: () => {
33
+ write(KEY.return);
34
+ },
35
+ escape: () => {
36
+ write(KEY.escape);
37
+ },
38
+ home: () => {
39
+ write(KEY.home);
40
+ },
41
+ left: () => {
42
+ write(KEY.left);
43
+ },
44
+ pageDown: () => {
45
+ write(KEY.pageDown);
46
+ },
47
+ pageUp: () => {
48
+ write(KEY.pageUp);
49
+ },
50
+ press(char) {
51
+ write(char);
52
+ },
53
+ raw: write,
54
+ right: () => {
55
+ write(KEY.right);
56
+ },
57
+ space: () => {
58
+ write(KEY.space);
59
+ },
60
+ tab: () => {
61
+ write(KEY.tab);
62
+ },
63
+ type(text) {
64
+ for (const char of text) {
65
+ write(char);
66
+ }
67
+ },
68
+ up: () => {
69
+ write(KEY.up);
70
+ }
71
+ };
72
+ };
73
+
74
+ export { KEY, createKeySender };
@@ -0,0 +1,19 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from './Box-W1w_NGin.js';
3
+ import Text from './Text-CtUwV89_.js';
4
+
5
+ function Kbd({ children, color = "gray", variant = "solid" }) {
6
+ if (variant === "solid") {
7
+ return jsxs(Text, { backgroundColor: color, color: "black", children: [
8
+ " ",
9
+ children,
10
+ " "
11
+ ] });
12
+ }
13
+ if (variant === "outline") {
14
+ return jsx(Box, { borderColor: color, borderStyle: "round", paddingX: 1, children: jsx(Text, { color, children }) });
15
+ }
16
+ return jsx(Text, { dimColor: true, children });
17
+ }
18
+
19
+ export { Kbd as default };
@@ -1,5 +1,5 @@
1
1
  import Yoga from 'yoga-layout';
2
- import { m as measureTextBlock } from './text-width-DhuarWcB.js';
2
+ import { m as measureTextBlock } from './text-width-Db-AxMea.js';
3
3
 
4
4
  const yogaOwner = /* @__PURE__ */ new Map();
5
5
  class LayoutNode {
@@ -23,8 +23,9 @@ class LayoutNode {
23
23
  this.yogaNode.unsetMeasureFunc();
24
24
  } else {
25
25
  this.yogaNode.setMeasureFunc((width, widthMode, height, heightMode) => {
26
- if (value.length === 0)
26
+ if (value.length === 0) {
27
27
  return { height: 0, width: 0 };
28
+ }
28
29
  const unconstrained = measureTextBlock(value, Number.MAX_SAFE_INTEGER);
29
30
  let targetWidth = unconstrained.maxLineWidth;
30
31
  if (widthMode === Yoga.MEASURE_MODE_EXACTLY) {
@@ -103,8 +104,9 @@ class LayoutNode {
103
104
  }
104
105
  this._destroyed = true;
105
106
  for (const child of this.children) {
106
- if (child.parent === this)
107
+ if (child.parent === this) {
107
108
  child.parent = null;
109
+ }
108
110
  }
109
111
  this.children = [];
110
112
  yogaOwner.delete(this.yogaNode);
@@ -122,10 +124,6 @@ class LayoutNode {
122
124
  getLayout() {
123
125
  return this.yogaNode.getComputedLayout();
124
126
  }
125
- /** @deprecated use destroy() */
126
- free() {
127
- this.destroy();
128
- }
129
127
  }
130
128
 
131
129
  export { LayoutNode };
@@ -0,0 +1,7 @@
1
+ import 'react/jsx-runtime';
2
+ import 'react';
3
+ import './braille-BoEWoH2I.js';
4
+ import './Box-W1w_NGin.js';
5
+ import './Canvas-COttmLPX.js';
6
+ export { L as default, d as drawSeriesOnCanvas, a as projectPoint } from './line-chart-VGU2l7pu.js';
7
+ import './Text-CtUwV89_.js';
@@ -1,8 +1,8 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { hyperlink } from '@visulima/ansi';
3
3
  import { useCallback } from 'react';
4
- import Text from './Text-DvAUdZcK.js';
5
- import Transform from './Transform-BHxY_dAM.js';
4
+ import Text from './Text-CtUwV89_.js';
5
+ import Transform from './Transform-Cfyva2wd.js';
6
6
 
7
7
  let cachedSupportsHyperlinks;
8
8
  const detectHyperlinkSupport = () => {
@@ -0,0 +1,13 @@
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
+ function LoadingIndicator({ children, color = "cyan", type = "dots" }) {
7
+ return jsxs(Box, { gap: 1, children: [
8
+ jsx(Text, { color, children: jsx(Spinner, { type }) }),
9
+ children === void 0 ? void 0 : jsx(Text, { color, children })
10
+ ] });
11
+ }
12
+
13
+ export { LoadingIndicator as default };
@@ -1,15 +1,15 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Lexer } from 'marked';
3
3
  import React, { useMemo } from 'react';
4
- import useWindowSize from './useWindowSize-ugEmGZJm.js';
5
- import Box from './Box-D_pSJ9Jp.js';
6
- import Code from './Code-DjQvPBD9.js';
7
- import Link from './Link-COcKYfGT.js';
4
+ import useWindowSize from './useWindowSize-D3UU41mv.js';
5
+ import Box from './Box-W1w_NGin.js';
6
+ import Code from './Code-CwzzbsLx.js';
7
+ import Link from './Link-DZ2Tiq1m.js';
8
8
  import Newline from './Newline-DBtYEg8x.js';
9
- import OrderedList from './OrderedList-Cp7pXr6m.js';
10
- import TableComponent from './Table-D-rSVlzb.js';
11
- import Text from './Text-DvAUdZcK.js';
12
- import UnorderedList from './UnorderedList-DhnadWjX.js';
9
+ import OrderedList from './OrderedList-VsvSmHUC.js';
10
+ import TableComponent from './Table-Bgxo87Df.js';
11
+ import Text from './Text-CtUwV89_.js';
12
+ import UnorderedList from './UnorderedList-D8RPaEAW.js';
13
13
 
14
14
  const HEADING_COLORS = {
15
15
  1: "cyan",
@@ -0,0 +1,119 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useMemo, useState, useCallback } from 'react';
3
+ import useInput from './useInput-DKZbqMRc.js';
4
+ import Box from './Box-W1w_NGin.js';
5
+ import Text from './Text-CtUwV89_.js';
6
+
7
+ const buildTokenIndex = (mask, token) => {
8
+ const indices = [];
9
+ let rawPosition = 0;
10
+ for (const [maskColumn, maskChar] of [...mask].entries()) {
11
+ if (maskChar === token) {
12
+ indices.push({ maskColumn, rawPosition });
13
+ rawPosition += 1;
14
+ }
15
+ }
16
+ return indices;
17
+ };
18
+ const formatValue = (raw, mask, token, placeholderChar) => {
19
+ let rawIndex = 0;
20
+ let output = "";
21
+ for (const maskChar of mask) {
22
+ if (maskChar === token) {
23
+ const rawChar = raw[rawIndex];
24
+ if (rawChar === void 0) {
25
+ output += placeholderChar;
26
+ } else {
27
+ output += rawChar;
28
+ rawIndex += 1;
29
+ }
30
+ } else {
31
+ output += maskChar;
32
+ }
33
+ }
34
+ return output;
35
+ };
36
+ function MaskedInput({
37
+ defaultValue = "",
38
+ isDisabled = false,
39
+ mask,
40
+ onChange,
41
+ onSubmit,
42
+ placeholderChar = "_",
43
+ token = "#"
44
+ }) {
45
+ const tokenIndex = useMemo(() => buildTokenIndex(mask, token), [mask, token]);
46
+ const maxLength = tokenIndex.length;
47
+ const clampedDefault = defaultValue.slice(0, maxLength);
48
+ const [raw, setRaw] = useState(clampedDefault);
49
+ const [cursor, setCursor] = useState(clampedDefault.length);
50
+ const emit = useCallback(
51
+ (next, nextCursor) => {
52
+ setRaw(next);
53
+ setCursor(Math.max(0, Math.min(maxLength, nextCursor)));
54
+ onChange?.(next);
55
+ },
56
+ [maxLength, onChange]
57
+ );
58
+ useInput(
59
+ useCallback(
60
+ (input, key) => {
61
+ if (key.return) {
62
+ onSubmit?.(raw);
63
+ return;
64
+ }
65
+ if (key.leftArrow) {
66
+ setCursor((previous) => Math.max(0, previous - 1));
67
+ return;
68
+ }
69
+ if (key.rightArrow) {
70
+ setCursor((previous) => Math.min(raw.length, previous + 1));
71
+ return;
72
+ }
73
+ if (key.home || key.ctrl && input === "a") {
74
+ setCursor(0);
75
+ return;
76
+ }
77
+ if (key.end || key.ctrl && input === "e") {
78
+ setCursor(raw.length);
79
+ return;
80
+ }
81
+ if (key.backspace) {
82
+ if (cursor === 0) {
83
+ return;
84
+ }
85
+ const next2 = raw.slice(0, cursor - 1) + raw.slice(cursor);
86
+ emit(next2, cursor - 1);
87
+ return;
88
+ }
89
+ if (key.delete) {
90
+ if (cursor >= raw.length) {
91
+ return;
92
+ }
93
+ const next2 = raw.slice(0, cursor) + raw.slice(cursor + 1);
94
+ emit(next2, cursor);
95
+ return;
96
+ }
97
+ if (input?.length !== 1 || raw.length >= maxLength) {
98
+ return;
99
+ }
100
+ const next = raw.slice(0, cursor) + input + raw.slice(cursor);
101
+ emit(next, cursor + 1);
102
+ },
103
+ [raw, cursor, maxLength, emit, onSubmit]
104
+ ),
105
+ { isActive: !isDisabled }
106
+ );
107
+ const display = formatValue(raw, mask, token, placeholderChar);
108
+ const cursorMaskColumn = tokenIndex[cursor]?.maskColumn ?? mask.length;
109
+ const before = display.slice(0, cursorMaskColumn);
110
+ const atCursor = display.charAt(cursorMaskColumn) || " ";
111
+ const after = display.slice(cursorMaskColumn + 1);
112
+ return jsxs(Box, { children: [
113
+ jsx(Text, { dimColor: isDisabled, children: before }),
114
+ jsx(Text, { dimColor: isDisabled, inverse: !isDisabled, children: atCursor }),
115
+ jsx(Text, { dimColor: isDisabled, children: after })
116
+ ] });
117
+ }
118
+
119
+ export { MaskedInput as default };
@@ -0,0 +1,112 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useMemo, useState, useRef, useEffect, 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 flatten = (items, sections) => {
9
+ if (sections && sections.length > 0) {
10
+ const rows = [];
11
+ for (const section of sections) {
12
+ if (section.title !== void 0) {
13
+ rows.push({ kind: "section-header", sectionId: section.id, title: section.title });
14
+ }
15
+ for (const item of section.items) {
16
+ rows.push({ item, kind: "item", sectionId: section.id });
17
+ }
18
+ }
19
+ return rows;
20
+ }
21
+ return (items ?? []).map((item) => ({ item, kind: "item", sectionId: void 0 }));
22
+ };
23
+ const findNextIndex = (rows, from, direction) => {
24
+ const total = rows.length;
25
+ if (total === 0) {
26
+ return from;
27
+ }
28
+ for (let step = 1; step <= total; step += 1) {
29
+ const candidate = (from + direction * step + total * step) % total;
30
+ const row = rows[candidate];
31
+ if (row?.kind === "item" && !row.item.isDisabled) {
32
+ return candidate;
33
+ }
34
+ }
35
+ return from;
36
+ };
37
+ const firstEnabledIndex = (rows) => {
38
+ for (const [index, row] of rows.entries()) {
39
+ if (row.kind === "item" && !row.item.isDisabled) {
40
+ return index;
41
+ }
42
+ }
43
+ return 0;
44
+ };
45
+ function Menu({ accentColor = "blue", autoFocus = false, bordered = true, items, onSelect, sections, title }) {
46
+ const { isFocused } = useFocus({ autoFocus });
47
+ const rows = useMemo(() => flatten(items, sections), [items, sections]);
48
+ const initialIndex = useMemo(() => firstEnabledIndex(rows), [rows]);
49
+ const [focusedIndex, setFocusedIndex] = useState(initialIndex);
50
+ const focusedIndexRef = useRef(focusedIndex);
51
+ focusedIndexRef.current = focusedIndex;
52
+ useEffect(() => {
53
+ const { current } = focusedIndexRef;
54
+ const row = rows[current];
55
+ const stillValid = row?.kind === "item" && !row.item.isDisabled;
56
+ if (!stillValid) {
57
+ const next = firstEnabledIndex(rows);
58
+ setFocusedIndex(next);
59
+ focusedIndexRef.current = next;
60
+ }
61
+ }, [rows]);
62
+ useInput(
63
+ useCallback(
64
+ (input, key) => {
65
+ if (!isFocused) {
66
+ return;
67
+ }
68
+ if (key.downArrow || input === "j") {
69
+ setFocusedIndex(findNextIndex(rows, focusedIndexRef.current, 1));
70
+ } else if (key.upArrow || input === "k") {
71
+ setFocusedIndex(findNextIndex(rows, focusedIndexRef.current, -1));
72
+ } else if (key.return) {
73
+ const row = rows[focusedIndexRef.current];
74
+ if (row?.kind === "item" && !row.item.isDisabled) {
75
+ onSelect(row.item.id);
76
+ }
77
+ }
78
+ },
79
+ [isFocused, rows, onSelect]
80
+ ),
81
+ { isActive: isFocused }
82
+ );
83
+ const content = jsxs(Box, { flexDirection: "column", children: [
84
+ title === void 0 ? void 0 : jsx(Box, { marginBottom: 1, children: jsx(Text, { bold: true, color: accentColor, children: title }) }),
85
+ rows.map((row, index) => {
86
+ if (row.kind === "section-header") {
87
+ return jsx(Box, { marginTop: index === 0 ? 0 : 1, children: jsx(Text, { dimColor: true, children: row.title.toUpperCase() }) }, `header:${row.sectionId}`);
88
+ }
89
+ const { item } = row;
90
+ const isRowFocused = isFocused && index === focusedIndex;
91
+ const color = isRowFocused ? accentColor : void 0;
92
+ return jsxs(Box, { children: [
93
+ jsx(Text, { color, dimColor: item.isDisabled, children: isRowFocused ? "▸ " : " " }),
94
+ item.icon === void 0 ? void 0 : jsxs(Text, { color, dimColor: item.isDisabled, children: [
95
+ item.icon,
96
+ " "
97
+ ] }),
98
+ jsx(Box, { flexGrow: 1, flexShrink: 1, minWidth: 0, children: jsx(Text, { bold: isRowFocused, color, dimColor: item.isDisabled, wrap: "truncate-end", children: item.label }) }),
99
+ item.hotkey === void 0 ? void 0 : jsx(Box, { flexShrink: 0, children: jsxs(Text, { dimColor: true, children: [
100
+ " ",
101
+ item.hotkey
102
+ ] }) })
103
+ ] }, `item:${item.id}`);
104
+ })
105
+ ] });
106
+ if (!bordered) {
107
+ return content;
108
+ }
109
+ return jsx(Box, { borderColor: isFocused ? accentColor : void 0, borderStyle: "round", paddingX: 1, children: content });
110
+ }
111
+
112
+ export { Menu as default };
@@ -0,0 +1,26 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from './Box-W1w_NGin.js';
3
+ import Text from './Text-CtUwV89_.js';
4
+
5
+ const ROLE_CONFIG = {
6
+ assistant: { align: "flex-start", color: "blueBright", icon: "" },
7
+ system: { align: "flex-start", color: "gray", icon: "" },
8
+ tool: { align: "flex-start", color: "magentaBright", icon: "" },
9
+ user: { align: "flex-end", color: "greenBright", icon: "" }
10
+ };
11
+ function MessageBubble({ children, color, flat = false, label, meta, role = "assistant" }) {
12
+ const preset = ROLE_CONFIG[role];
13
+ const accent = color ?? preset.color;
14
+ return jsxs(Box, { alignSelf: preset.align, flexDirection: "column", marginBottom: 1, children: [
15
+ label === void 0 && meta === void 0 ? void 0 : jsxs(Box, { gap: 1, paddingX: 1, children: [
16
+ label === void 0 ? void 0 : jsx(Text, { bold: true, color: accent, children: label }),
17
+ meta === void 0 ? void 0 : jsx(Text, { dimColor: true, children: meta })
18
+ ] }),
19
+ flat ? jsxs(Box, { paddingX: 1, children: [
20
+ jsx(Text, { color: accent, children: "│ " }),
21
+ jsx(Box, { flexDirection: "column", flexGrow: 1, children: typeof children === "string" ? jsx(Text, { children }) : children })
22
+ ] }) : jsx(Box, { borderColor: accent, borderStyle: "round", flexDirection: "column", paddingX: 1, children: typeof children === "string" ? jsx(Text, { children }) : children })
23
+ ] });
24
+ }
25
+
26
+ export { MessageBubble as default };