@visulima/tui 0.0.1 → 1.0.0-alpha.1
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.
- package/CHANGELOG.md +194 -0
- package/LICENSE.md +303 -0
- package/README.md +173 -29
- package/dist/core/app.d.ts +50 -0
- package/dist/core/cell.d.ts +33 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +5 -0
- package/dist/core/inline.d.ts +22 -0
- package/dist/core/input.d.ts +18 -0
- package/dist/core/native-binding.d.ts +22 -0
- package/dist/ink/ansi-to-cell.d.ts +5 -0
- package/dist/ink/ansi-tokenizer.d.ts +38 -0
- package/dist/ink/clipboard.d.ts +29 -0
- package/dist/ink/color-matrix.d.ts +49 -0
- package/dist/ink/color-utils.d.ts +30 -0
- package/dist/ink/colorize.d.ts +4 -0
- package/dist/ink/components/AccessibilityContext.d.ts +4 -0
- package/dist/ink/components/Alert.d.ts +30 -0
- package/dist/ink/components/AnimationContext.d.ts +10 -0
- package/dist/ink/components/App.d.ts +19 -0
- package/dist/ink/components/AppContext.d.ts +38 -0
- package/dist/ink/components/BackgroundContext.d.ts +5 -0
- package/dist/ink/components/Badge.d.ts +27 -0
- package/dist/ink/components/BigText.d.ts +71 -0
- package/dist/ink/components/Box.d.ts +58 -0
- package/dist/ink/components/Code.d.ts +46 -0
- package/dist/ink/components/ConfirmInput.d.ts +40 -0
- package/dist/ink/components/ConsoleOverlay.d.ts +52 -0
- package/dist/ink/components/Cursor.d.ts +43 -0
- package/dist/ink/components/CursorContext.d.ts +12 -0
- package/dist/ink/components/Dialog.d.ts +93 -0
- package/dist/ink/components/DiffView.d.ts +71 -0
- package/dist/ink/components/ErrorBoundary.d.ts +17 -0
- package/dist/ink/components/ErrorOverview.d.ts +6 -0
- package/dist/ink/components/FocusContext.d.ts +17 -0
- package/dist/ink/components/Gradient.d.ts +38 -0
- package/dist/ink/components/Help.d.ts +49 -0
- package/dist/ink/components/Link.d.ts +34 -0
- package/dist/ink/components/Markdown.d.ts +34 -0
- package/dist/ink/components/MultiSelect.d.ts +63 -0
- package/dist/ink/components/Newline.d.ts +12 -0
- package/dist/ink/components/OrderedList.d.ts +30 -0
- package/dist/ink/components/Paginator.d.ts +75 -0
- package/dist/ink/components/ProgressBar.d.ts +51 -0
- package/dist/ink/components/SelectInput.d.ts +96 -0
- package/dist/ink/components/SelectInputIndicator.d.ts +36 -0
- package/dist/ink/components/SelectInputItem.d.ts +43 -0
- package/dist/ink/components/Slider.d.ts +92 -0
- package/dist/ink/components/Spacer.d.ts +7 -0
- package/dist/ink/components/Spinner.d.ts +42 -0
- package/dist/ink/components/Static.d.ts +24 -0
- package/dist/ink/components/StaticRender.d.ts +28 -0
- package/dist/ink/components/StatusMessage.d.ts +26 -0
- package/dist/ink/components/StderrContext.d.ts +16 -0
- package/dist/ink/components/StdinContext.d.ts +29 -0
- package/dist/ink/components/StdoutContext.d.ts +16 -0
- package/dist/ink/components/Stopwatch.d.ts +44 -0
- package/dist/ink/components/Tab.d.ts +25 -0
- package/dist/ink/components/Table.d.ts +80 -0
- package/dist/ink/components/Tabs.d.ts +97 -0
- package/dist/ink/components/Text.d.ts +63 -0
- package/dist/ink/components/TextInput.d.ts +48 -0
- package/dist/ink/components/Textarea.d.ts +62 -0
- package/dist/ink/components/Timer.d.ts +52 -0
- package/dist/ink/components/Transform.d.ts +16 -0
- package/dist/ink/components/UnorderedList.d.ts +35 -0
- package/dist/ink/components/file-picker/FilePicker.d.ts +75 -0
- package/dist/ink/components/file-picker/index.d.ts +3 -0
- package/dist/ink/components/file-picker/types.d.ts +38 -0
- package/dist/ink/components/file-picker/use-file-system.d.ts +16 -0
- package/dist/ink/components/scroll/ControlledScrollView.d.ts +43 -0
- package/dist/ink/components/scroll/ScrollBar.d.ts +20 -0
- package/dist/ink/components/scroll/ScrollBarBox.d.ts +15 -0
- package/dist/ink/components/scroll/ScrollList.d.ts +12 -0
- package/dist/ink/components/scroll/ScrollView.d.ts +98 -0
- package/dist/ink/components/scroll/index.d.ts +10 -0
- package/dist/ink/components/scroll/use-state-ref.d.ts +8 -0
- package/dist/ink/components/tree-view/TreeView.d.ts +89 -0
- package/dist/ink/components/tree-view/TreeViewNode.d.ts +29 -0
- package/dist/ink/components/tree-view/index.d.ts +11 -0
- package/dist/ink/components/tree-view/theme.d.ts +24 -0
- package/dist/ink/components/tree-view/tree-node-map.d.ts +72 -0
- package/dist/ink/components/tree-view/types.d.ts +55 -0
- package/dist/ink/components/tree-view/use-tree-view-state.d.ts +135 -0
- package/dist/ink/components/tree-view/use-tree-view.d.ts +26 -0
- package/dist/ink/components/variant-config.d.ts +10 -0
- package/dist/ink/cursor-helpers.d.ts +38 -0
- package/dist/ink/data-limited-lru-map.d.ts +21 -0
- package/dist/ink/devtools-window-polyfill.d.ts +1 -0
- package/dist/ink/devtools.d.ts +1 -0
- package/dist/ink/dom.d.ts +213 -0
- package/dist/ink/get-max-width.d.ts +3 -0
- package/dist/ink/highlighter.d.ts +28 -0
- package/dist/ink/hooks/use-animation.d.ts +43 -0
- package/dist/ink/hooks/use-app.d.ts +6 -0
- package/dist/ink/hooks/use-box-metrics.d.ts +58 -0
- package/dist/ink/hooks/use-clipboard.d.ts +29 -0
- package/dist/ink/hooks/use-color-blindness.d.ts +33 -0
- package/dist/ink/hooks/use-console-capture.d.ts +43 -0
- package/dist/ink/hooks/use-cursor.d.ts +12 -0
- package/dist/ink/hooks/use-focus-manager.d.ts +42 -0
- package/dist/ink/hooks/use-focus.d.ts +30 -0
- package/dist/ink/hooks/use-input.d.ts +149 -0
- package/dist/ink/hooks/use-is-screen-reader-enabled.d.ts +6 -0
- package/dist/ink/hooks/use-key-bindings.d.ts +61 -0
- package/dist/ink/hooks/use-linked-scroll.d.ts +41 -0
- package/dist/ink/hooks/use-paste.d.ts +44 -0
- package/dist/ink/hooks/use-scroll-acceleration.d.ts +47 -0
- package/dist/ink/hooks/use-scroll-input.d.ts +34 -0
- package/dist/ink/hooks/use-stderr.d.ts +6 -0
- package/dist/ink/hooks/use-stdin.d.ts +7 -0
- package/dist/ink/hooks/use-stdout.d.ts +6 -0
- package/dist/ink/hooks/use-stopwatch.d.ts +40 -0
- package/dist/ink/hooks/use-terminal-palette.d.ts +19 -0
- package/dist/ink/hooks/use-text-buffer.d.ts +42 -0
- package/dist/ink/hooks/use-text-selection.d.ts +45 -0
- package/dist/ink/hooks/use-timer.d.ts +49 -0
- package/dist/ink/hooks/use-window-size.d.ts +18 -0
- package/dist/ink/ime-utils.d.ts +25 -0
- package/dist/ink/index.d.ts +159 -0
- package/dist/ink/index.js +100 -0
- package/dist/ink/ink.d.ts +189 -0
- package/dist/ink/input-parser.d.ts +10 -0
- package/dist/ink/input-utils.d.ts +16 -0
- package/dist/ink/instances.d.ts +3 -0
- package/dist/ink/kitty-keyboard.d.ts +23 -0
- package/dist/ink/layout.d.ts +26 -0
- package/dist/ink/log-update-native.d.ts +14 -0
- package/dist/ink/log-update.d.ts +21 -0
- package/dist/ink/measure-element.d.ts +147 -0
- package/dist/ink/measure-text.d.ts +56 -0
- package/dist/ink/mouse/Fullscreen.d.ts +8 -0
- package/dist/ink/mouse/MouseProvider.d.ts +11 -0
- package/dist/ink/mouse/ansi-parser.d.ts +37 -0
- package/dist/ink/mouse/constants.d.ts +59 -0
- package/dist/ink/mouse/index.d.ts +20 -0
- package/dist/ink/mouse/is-intersecting.d.ts +18 -0
- package/dist/ink/mouse/mouse-context.d.ts +36 -0
- package/dist/ink/mouse/use-element-position.d.ts +29 -0
- package/dist/ink/mouse/use-mouse-action.d.ts +7 -0
- package/dist/ink/mouse/use-mouse-position.d.ts +7 -0
- package/dist/ink/mouse/use-mouse.d.ts +7 -0
- package/dist/ink/mouse/use-on-mouse-click.d.ts +14 -0
- package/dist/ink/mouse/use-on-mouse-hover.d.ts +8 -0
- package/dist/ink/mouse/use-on-mouse-state.d.ts +11 -0
- package/dist/ink/output.d.ts +74 -0
- package/dist/ink/parse-keypress.d.ts +22 -0
- package/dist/ink/reconciler.d.ts +3 -0
- package/dist/ink/region.d.ts +99 -0
- package/dist/ink/render-background.d.ts +4 -0
- package/dist/ink/render-border.d.ts +4 -0
- package/dist/ink/render-node-to-output.d.ts +38 -0
- package/dist/ink/render-scrollbar.d.ts +9 -0
- package/dist/ink/render-sticky.d.ts +44 -0
- package/dist/ink/render-to-string.d.ts +37 -0
- package/dist/ink/render.d.ts +191 -0
- package/dist/ink/renderer.d.ts +17 -0
- package/dist/ink/resize-observer.d.ts +44 -0
- package/dist/ink/sanitize-ansi.d.ts +2 -0
- package/dist/ink/scroll.d.ts +23 -0
- package/dist/ink/selection.d.ts +70 -0
- package/dist/ink/squash-text-nodes.d.ts +18 -0
- package/dist/ink/style-flags.d.ts +17 -0
- package/dist/ink/styled-line-factory.d.ts +25 -0
- package/dist/ink/styled-line-serializer.d.ts +18 -0
- package/dist/ink/styled-line.d.ts +109 -0
- package/dist/ink/styles.d.ts +369 -0
- package/dist/ink/terminal-palette.d.ts +25 -0
- package/dist/ink/text-wrap.d.ts +10 -0
- package/dist/ink/token-to-elements.d.ts +22 -0
- package/dist/ink/utils/format-time.d.ts +4 -0
- package/dist/ink/utils.d.ts +9 -0
- package/dist/ink/wrap-text.d.ts +3 -0
- package/dist/ink/write-synchronized.d.ts +4 -0
- package/dist/packem_chunks/devtools.js +27 -0
- package/dist/packem_shared/AccessibilityContext-BLelHhNU.js +7 -0
- package/dist/packem_shared/Alert-Dr3s_LD9.js +17 -0
- package/dist/packem_shared/AnimationContext-BcJg8Jr6.js +15 -0
- package/dist/packem_shared/AppContext-CP0U6H7O.js +11 -0
- package/dist/packem_shared/BackgroundContext-BAUaxfOb.js +5 -0
- package/dist/packem_shared/Badge-Dk7EGGM6.js +13 -0
- package/dist/packem_shared/BigText-CjMdY63X.js +24 -0
- package/dist/packem_shared/Box-D_pSJ9Jp.js +73 -0
- package/dist/packem_shared/COLOR_BLINDNESS_SIMULATION-BsMy5Ewl.js +81 -0
- package/dist/packem_shared/Cell-DCg1kJY-.js +48 -0
- package/dist/packem_shared/Code-DjQvPBD9.js +53 -0
- package/dist/packem_shared/ConfirmInput-85Y4kRQW.js +44 -0
- package/dist/packem_shared/ConsoleOverlay-DBNa4vtj.js +57 -0
- package/dist/packem_shared/ControlledScrollView-BlOaxcsN.js +286 -0
- package/dist/packem_shared/ControlledScrollView-DfAhcufF.js +5 -0
- package/dist/packem_shared/Cursor-DiW7YoSK.js +18 -0
- package/dist/packem_shared/CursorContext-JxRzlqAx.js +9 -0
- package/dist/packem_shared/DevTools-aMPIsaHx.js +61 -0
- package/dist/packem_shared/Dialog-DsSNAVgC.js +71 -0
- package/dist/packem_shared/DiffView-hqaw-2S6.js +329 -0
- package/dist/packem_shared/FilePicker-DNwFxRhq.js +254 -0
- package/dist/packem_shared/FocusContext-CWkYtgcm.js +26 -0
- package/dist/packem_shared/FocusContext-D5wFxSRz.js +153 -0
- package/dist/packem_shared/Fullscreen-DrElAE1o.js +11 -0
- package/dist/packem_shared/Gradient-Ql5P0GUd.js +136 -0
- package/dist/packem_shared/Help-6wanGG38.js +112 -0
- package/dist/packem_shared/IMECompositionBuffer-Dl3S0KnF.js +55 -0
- package/dist/packem_shared/InputParser-BKHpWfvN.js +156 -0
- package/dist/packem_shared/LayoutNode-Cjnsodiy.js +131 -0
- package/dist/packem_shared/Link-COcKYfGT.js +66 -0
- package/dist/packem_shared/Markdown-y1ISztof.js +212 -0
- package/dist/packem_shared/MouseProvider-Y9TSSEGl.js +136 -0
- package/dist/packem_shared/MultiSelect-ChoLUcDI.js +129 -0
- package/dist/packem_shared/NAMED_COLORS-a4QBvb5r.js +262 -0
- package/dist/packem_shared/Newline-DBtYEg8x.js +7 -0
- package/dist/packem_shared/OrderedList-Cp7pXr6m.js +26 -0
- package/dist/packem_shared/Paginator-D1AuD-kj.js +104 -0
- package/dist/packem_shared/ProgressBar-DOfpVagn.js +22 -0
- package/dist/packem_shared/Renderer-zZ5O3vxc.js +31 -0
- package/dist/packem_shared/ResizeObserverEntry-Br4seLeQ.js +102 -0
- package/dist/packem_shared/ScrollBar-EWAs2Uc7.js +106 -0
- package/dist/packem_shared/ScrollBarBox-DTNNlh7R.js +72 -0
- package/dist/packem_shared/ScrollList-DCeIFL8M.js +227 -0
- package/dist/packem_shared/ScrollView-v3MCNIyX.js +196 -0
- package/dist/packem_shared/SelectInput-BN2TMyxp.js +260 -0
- package/dist/packem_shared/SelectInputIndicator-DkRMoH_b.js +9 -0
- package/dist/packem_shared/SelectInputItem-BF9LQgKu.js +8 -0
- package/dist/packem_shared/Slider-BWD7xZX6.js +116 -0
- package/dist/packem_shared/Spacer-Bs4ER-HK.js +8 -0
- package/dist/packem_shared/Spinner-BuI-kN4p.js +1799 -0
- package/dist/packem_shared/Static-DpTd6Eed.js +22 -0
- package/dist/packem_shared/Static-xmD9giJj.js +18 -0
- package/dist/packem_shared/StaticRender-tYwH6QXl.js +33 -0
- package/dist/packem_shared/StatusMessage-BtSYxzwb.js +14 -0
- package/dist/packem_shared/StderrContext-Bj4Mf7v7.js +17 -0
- package/dist/packem_shared/StdinContext-Bq_GNJ3z.js +38 -0
- package/dist/packem_shared/StdoutContext-CgjWeCdO.js +17 -0
- package/dist/packem_shared/Stopwatch-DjtTCyHn.js +23 -0
- package/dist/packem_shared/Tab-C6r5q4hR.js +7 -0
- package/dist/packem_shared/Table-D-rSVlzb.js +82 -0
- package/dist/packem_shared/Tabs-BXpZwLWo.js +146 -0
- package/dist/packem_shared/Text-DvAUdZcK.js +65 -0
- package/dist/packem_shared/TextInput-C79WEQ5U.js +137 -0
- package/dist/packem_shared/Textarea-Dj06R6Zd.js +272 -0
- package/dist/packem_shared/Timer-wi9zuh4n.js +22 -0
- package/dist/packem_shared/Transform-BHxY_dAM.js +14 -0
- package/dist/packem_shared/TreeNodeMap-CtJUvBnd.js +155 -0
- package/dist/packem_shared/TreeView-C2062dtj.js +148 -0
- package/dist/packem_shared/TuiApp-DfxOnXqi.js +120 -0
- package/dist/packem_shared/TuiContext-CqEjMyXd.js +415 -0
- package/dist/packem_shared/UnorderedList-DhnadWjX.js +33 -0
- package/dist/packem_shared/ansi-parser-0BdVTKho.js +41 -0
- package/dist/packem_shared/ansi-tokenizer-LHq2LUWA.js +307 -0
- package/dist/packem_shared/boxes-oi3WUbyR.js +92 -0
- package/dist/packem_shared/colorize-88_Vk8cn.js +48 -0
- package/dist/packem_shared/comparePoints-CGMDnd3_.js +287 -0
- package/dist/packem_shared/createInlineLoop-BxMmcq9D.js +93 -0
- package/dist/packem_shared/createLinkedScrollGroup-Djw4Ceo0.js +44 -0
- package/dist/packem_shared/dom-DvzhsAez.js +225 -0
- package/dist/packem_shared/format-time-BGmnDukX.js +12 -0
- package/dist/packem_shared/getPathToRoot-a1wbwxfL.js +4 -0
- package/dist/packem_shared/getScrollHeight-BubfU_df.js +63 -0
- package/dist/packem_shared/input-utils-ViAEXa0Z.js +19 -0
- package/dist/packem_shared/isIntersecting-fEXHJN5R.js +10 -0
- package/dist/packem_shared/isOsc52Supported-G0k4sXJx.js +36 -0
- package/dist/packem_shared/isTerminalPaletteQuerySupported-EeiwMKbr.js +93 -0
- package/dist/packem_shared/kittyFlags-bNNf_9kX.js +26 -0
- package/dist/packem_shared/measure-element-Reza_yfC.js +396 -0
- package/dist/packem_shared/measure-text-DItZYotK.js +1189 -0
- package/dist/packem_shared/measureElement-CTgFCmKd.js +4 -0
- package/dist/packem_shared/mouse-context-BUHWKEIe.js +6 -0
- package/dist/packem_shared/parseSgrMouse-BHVBPP9G.js +1 -0
- package/dist/packem_shared/processLayout-BQ9kXfd3.js +2 -0
- package/dist/packem_shared/reconciler-BXf6miSS.js +211 -0
- package/dist/packem_shared/reconciler-gfmqURLy.js +680 -0
- package/dist/packem_shared/render-BAwdjfki.js +2806 -0
- package/dist/packem_shared/render-Bpjhf0lD.js +195 -0
- package/dist/packem_shared/renderToString-Cfg55DRD.js +62 -0
- package/dist/packem_shared/renderToString-ClIaXgrC.js +86 -0
- package/dist/packem_shared/renderTreeToBuffer-D3mo7M7m.js +308 -0
- package/dist/packem_shared/renderer-B3wROkeg.js +1431 -0
- package/dist/packem_shared/setEnableStyledLineCache-BpskngSJ.js +2 -0
- package/dist/packem_shared/squashTextNodesWithMap-iqm6OMMT.js +100 -0
- package/dist/packem_shared/text-width-DhuarWcB.js +42 -0
- package/dist/packem_shared/token-to-elements-BRFl_rzw.js +249 -0
- package/dist/packem_shared/treeViewTheme-BpSw9TMf.js +52 -0
- package/dist/packem_shared/useAnimation-kj31sA-T.js +62 -0
- package/dist/packem_shared/useApp-DPQlRzi5.js +6 -0
- package/dist/packem_shared/useBoxMetrics-rBjKc-g4.js +54 -0
- package/dist/packem_shared/useClipboard-B_9-adw1.js +23 -0
- package/dist/packem_shared/useColorBlindness-D_sTIhcb.js +30 -0
- package/dist/packem_shared/useConsoleCapture-Dvt7G1W1.js +61 -0
- package/dist/packem_shared/useCursor-BIJzc8k9.js +19 -0
- package/dist/packem_shared/useElementDimensions-CAoKitVD.js +67 -0
- package/dist/packem_shared/useFocus-CNl5QHHf.js +37 -0
- package/dist/packem_shared/useFocusManager-BPYaUuKQ.js +16 -0
- package/dist/packem_shared/useInput-Cfp5zB2s.js +594 -0
- package/dist/packem_shared/useIsScreenReaderEnabled-CnGKCe0f.js +9 -0
- package/dist/packem_shared/useKeyBindings-B78l1E1n.js +66 -0
- package/dist/packem_shared/useMouseAction-C5gZ2nj7.js +29 -0
- package/dist/packem_shared/useMouseContext-D-rFy60Q.js +12 -0
- package/dist/packem_shared/useMousePosition-BHBJ-kBk.js +25 -0
- package/dist/packem_shared/useOnMouseClick--ZIyBOBO.js +35 -0
- package/dist/packem_shared/useOnMouseHover-26diuXUC.js +32 -0
- package/dist/packem_shared/useOnMouseState-NO_Kda_C.js +13 -0
- package/dist/packem_shared/usePaste-Ct8J4AGR.js +35 -0
- package/dist/packem_shared/useScrollAcceleration-R9LfrPVG.js +73 -0
- package/dist/packem_shared/useScrollInput-D3CpBq_a.js +72 -0
- package/dist/packem_shared/useStderr-CAOVUh4E.js +6 -0
- package/dist/packem_shared/useStdin-X-O0kd-n.js +7 -0
- package/dist/packem_shared/useStdout-DyF6DSH0.js +6 -0
- package/dist/packem_shared/useStopwatch-qC4Beai4.js +33 -0
- package/dist/packem_shared/useTerminalPalette-BaWO2c4Q.js +38 -0
- package/dist/packem_shared/useTextBuffer-C8fEe9Ly.js +398 -0
- package/dist/packem_shared/useTextSelection-mXtxgsPK.js +50 -0
- package/dist/packem_shared/useTimer-CPQ7j827.js +46 -0
- package/dist/packem_shared/useTreeView-BT57P3Kx.js +101 -0
- package/dist/packem_shared/useTreeViewState-BpS_KZ-K.js +502 -0
- package/dist/packem_shared/useWindowSize-ugEmGZJm.js +20 -0
- package/dist/packem_shared/utils-BgdlrbOH.js +140 -0
- package/dist/packem_shared/variant-config-DSZoX5TM.js +8 -0
- package/dist/packem_shared/wrapOrTruncateStyledLine-DN3Nogoc.js +147 -0
- package/dist/react/devtools.d.ts +27 -0
- package/dist/react/focus.d.ts +39 -0
- package/dist/react/hooks.d.ts +238 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +9 -0
- package/dist/react/layout.d.ts +35 -0
- package/dist/react/react.d.ts +57 -0
- package/dist/react/reconciler.d.ts +4 -0
- package/dist/react/render-to-string.d.ts +21 -0
- package/dist/react/renderer.d.ts +2 -0
- package/dist/react/scene.d.ts +3 -0
- package/dist/react/static.d.ts +39 -0
- package/dist/react/styles.d.ts +83 -0
- package/dist/react/text-width.d.ts +20 -0
- package/dist/testing/index.d.ts +144 -0
- package/dist/testing/index.js +260 -0
- package/dist/testing/keys.d.ts +89 -0
- package/dist/testing/screen.d.ts +35 -0
- package/dist/testing/wait-for.d.ts +21 -0
- package/index.js +585 -0
- package/package.json +117 -7
package/README.md
CHANGED
|
@@ -1,45 +1,189 @@
|
|
|
1
|
-
|
|
1
|
+
<!-- START_PACKAGE_OG_IMAGE_PLACEHOLDER -->
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<a href="https://www.anolilab.com/open-source" align="center">
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
<img src="__assets__/package-og.svg" alt="tui" />
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
</a>
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
<h3 align="center">React-based TUI library powered by a native Rust diff engine, drop-in Ink-compatible API</h3>
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
1. Configure OIDC trusted publishing for the package name `@visulima/tui`
|
|
13
|
-
2. Enable secure, token-less publishing from CI/CD workflows
|
|
14
|
-
3. Establish provenance for packages published under this name
|
|
11
|
+
<!-- END_PACKAGE_OG_IMAGE_PLACEHOLDER -->
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
<br />
|
|
17
14
|
|
|
18
|
-
|
|
15
|
+
<div align="center">
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
[![typescript-image][typescript-badge]][typescript-url]
|
|
18
|
+
[![mit licence][license-badge]][license]
|
|
19
|
+
[![npm downloads][npm-downloads-badge]][npm-downloads]
|
|
20
|
+
[![Chat][chat-badge]][chat]
|
|
21
|
+
[![PRs Welcome][prs-welcome-badge]][prs-welcome]
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
</div>
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
2. Configure the trusted publisher (e.g., GitHub Actions)
|
|
26
|
-
3. Specify the repository and workflow that should be allowed to publish
|
|
27
|
-
4. Use the configured workflow to publish your actual package
|
|
25
|
+
---
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
<div align="center">
|
|
28
|
+
<p>
|
|
29
|
+
<sup>
|
|
30
|
+
Daniel Bannert's open source work is supported by the community on <a href="https://github.com/sponsors/prisis">GitHub Sponsors</a>
|
|
31
|
+
</sup>
|
|
32
|
+
</p>
|
|
33
|
+
</div>
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
- Contains no executable code
|
|
33
|
-
- Provides no functionality
|
|
34
|
-
- Should not be installed as a dependency
|
|
35
|
-
- Exists only for administrative purposes
|
|
35
|
+
---
|
|
36
36
|
|
|
37
|
-
##
|
|
37
|
+
## Overview
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
- [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
|
|
41
|
-
- [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
39
|
+
`@visulima/tui` is a React-based terminal UI library with a native Rust diff engine and drop-in [Ink](https://github.com/vadimdemedes/ink)-compatible API. Build rich, interactive CLI applications with React components, hooks, and a familiar developer experience.
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
Based on [ratatat](https://github.com/geoffmiller/ratatat) by Geoff Miller.
|
|
42
|
+
|
|
43
|
+
## Features
|
|
44
|
+
|
|
45
|
+
- **Faster than Ink** on mount (1.3-2.3x), competitive on rerender
|
|
46
|
+
- **Drop-in Ink-compatible** React API
|
|
47
|
+
- **Native Rust diff engine** via NAPI for high-throughput rendering
|
|
48
|
+
- **React hooks** for input, focus, clipboard, mouse, scroll, animation, and window size
|
|
49
|
+
- **Rich component library** - Box, Text, Spinner, Select, TextInput, Tabs, ScrollView, and more
|
|
50
|
+
- **Cross-platform** native bindings (macOS, Linux glibc/musl, Windows x64/arm64)
|
|
51
|
+
- **Server-side rendering** via `renderToString`
|
|
52
|
+
- **Testing utilities** with mock streams and frame capture
|
|
53
|
+
|
|
54
|
+
## Install
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
npm install @visulima/tui
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
yarn add @visulima/tui
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
pnpm add @visulima/tui
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Quick Start
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { render, Box, Text } from "@visulima/tui";
|
|
72
|
+
|
|
73
|
+
const App = () => (
|
|
74
|
+
<Box flexDirection="column" padding={1}>
|
|
75
|
+
<Text bold>Hello, world!</Text>
|
|
76
|
+
<Text color="green">Powered by a native Rust diff engine</Text>
|
|
77
|
+
</Box>
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
render(<App />);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Hooks
|
|
84
|
+
|
|
85
|
+
### `useAnimation(options?)`
|
|
86
|
+
|
|
87
|
+
Drive frame-based or time-based animations with a shared timer. Multiple `useAnimation` calls consolidate into one render cycle.
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
import { Text, useAnimation } from "@visulima/tui";
|
|
91
|
+
|
|
92
|
+
const Spinner = () => {
|
|
93
|
+
const { frame } = useAnimation({ interval: 80 });
|
|
94
|
+
const characters = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
95
|
+
|
|
96
|
+
return <Text>{characters[frame % characters.length]}</Text>;
|
|
97
|
+
};
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
| Option | Type | Default | Description |
|
|
101
|
+
| ---------- | --------- | ------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
102
|
+
| `interval` | `number` | `100` | Time between ticks in milliseconds. |
|
|
103
|
+
| `isActive` | `boolean` | `true` | Whether the animation is running. When set to `false`, the animation stops. When toggled back to `true`, values reset to 0. |
|
|
104
|
+
|
|
105
|
+
Returns `{ frame, time, delta, reset }`. See the [full hooks reference](https://visulima.com/packages/tui/hooks#useanimation) for detailed return values, more examples (sine waves, physics, pausable, reset), and `maxFps` interaction.
|
|
106
|
+
|
|
107
|
+
## Documentation
|
|
108
|
+
|
|
109
|
+
Full documentation, API reference, component gallery, and guides are available at:
|
|
110
|
+
|
|
111
|
+
**[visulima.com/packages/tui](https://visulima.com/packages/tui)**
|
|
112
|
+
|
|
113
|
+
- [Getting Started](https://visulima.com/packages/tui/getting-started)
|
|
114
|
+
- [Package Map](https://visulima.com/packages/tui/package-map) - Entry points and what they export
|
|
115
|
+
- [Components](https://visulima.com/packages/tui/components) - Box, Text, Spinner, Select, TextInput, and more
|
|
116
|
+
- [Hooks](https://visulima.com/packages/tui/hooks) - useInput, useFocus, useApp, useStdout, and more
|
|
117
|
+
- [Mouse Support](https://visulima.com/packages/tui/mouse) - Click, hover, drag, and scroll events
|
|
118
|
+
- [Scroll](https://visulima.com/packages/tui/scroll) - ScrollView, ScrollList, and overflow handling
|
|
119
|
+
- [Rendering Modes](https://visulima.com/packages/tui/rendering-modes) - Ink-compatible, React, and raw buffer
|
|
120
|
+
- [Ink Compatibility](https://visulima.com/packages/tui/ink-compat) - Migration guide from Ink
|
|
121
|
+
- [Testing](https://visulima.com/packages/tui/testing) - Testing utilities with mock streams
|
|
122
|
+
- [Troubleshooting](https://visulima.com/packages/tui/troubleshooting)
|
|
123
|
+
|
|
124
|
+
## Performance
|
|
125
|
+
|
|
126
|
+
| Scenario | @visulima/tui | Ink 6.8 | Speedup |
|
|
127
|
+
| -------------------------- | ------------: | -----------: | --------------: |
|
|
128
|
+
| Mount + render (simple) | 3,221 ops/s | 2,694 ops/s | **1.2x faster** |
|
|
129
|
+
| Mount + render (dashboard) | 1,659 ops/s | 718 ops/s | **2.3x faster** |
|
|
130
|
+
| Rerender (simple) | 19,111 ops/s | 25,743 ops/s | 0.74x |
|
|
131
|
+
|
|
132
|
+
> Benchmarks use production builds. Run: `pnpm --filter @visulima/tui run build:prod && pnpm vitest bench`
|
|
133
|
+
|
|
134
|
+
### Kitchen Sink Demo
|
|
135
|
+
|
|
136
|
+
| Layout | Focus | Graph | Live |
|
|
137
|
+
| ----------------------------------- | --------------------------------- | --------------------------------- | ------------------------------- |
|
|
138
|
+
|  |  |  |  |
|
|
139
|
+
|
|
140
|
+
| Incremental | UI | Static | Mouse |
|
|
141
|
+
| --------------------------------------------- | --------------------------- | ----------------------------------- | --------------------------------- |
|
|
142
|
+
|  |  |  |  |
|
|
143
|
+
|
|
144
|
+
## Related
|
|
145
|
+
|
|
146
|
+
- [ink](https://github.com/vadimdemedes/ink) - React for interactive command-line apps
|
|
147
|
+
- [ratatat](https://github.com/geoffmiller/ratatat) - The project this library is based on
|
|
148
|
+
- [jacob314/ink](https://github.com/jacob314/ink) - Fork with StyledLine, Region model, and render caching (ported features)
|
|
149
|
+
|
|
150
|
+
## Supported Node.js Versions
|
|
151
|
+
|
|
152
|
+
Libraries in this ecosystem make the best effort to track [Node.js' release schedule](https://github.com/nodejs/release#release-schedule).
|
|
153
|
+
Here's [a post on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a).
|
|
154
|
+
|
|
155
|
+
## Contributing
|
|
156
|
+
|
|
157
|
+
If you would like to help take a look at the [list of issues](https://github.com/visulima/visulima/issues) and check our [Contributing](.github/CONTRIBUTING.md) guidelines.
|
|
158
|
+
|
|
159
|
+
> **Note:** please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
|
|
160
|
+
|
|
161
|
+
## Credits
|
|
162
|
+
|
|
163
|
+
- [Daniel Bannert](https://github.com/prisis)
|
|
164
|
+
- [Geoff Miller](https://github.com/geoffmiller) - Original [ratatat](https://github.com/geoffmiller/ratatat) library
|
|
165
|
+
- [Vadym Demedes](https://github.com/vadimdemedes) - [Ink](https://github.com/vadimdemedes/ink) (MIT)
|
|
166
|
+
- [Google LLC / jacob314](https://github.com/jacob314/ink) - StyledLine, Region model, render caching (Apache-2.0)
|
|
167
|
+
- [Zeno Jiricek](https://github.com/nickhudkins/ink-mouse) - Mouse event system (Apache-2.0)
|
|
168
|
+
- [All Contributors](https://github.com/visulima/visulima/graphs/contributors)
|
|
169
|
+
|
|
170
|
+
## Made with ❤️ at Anolilab
|
|
171
|
+
|
|
172
|
+
This is an open source project and will always remain free to use. If you think it's cool, please star it 🌟. [Anolilab](https://www.anolilab.com/open-source) is a Development and AI Studio. Contact us at [hello@anolilab.com](mailto:hello@anolilab.com) if you need any help with these technologies or just want to say hi!
|
|
173
|
+
|
|
174
|
+
## License
|
|
175
|
+
|
|
176
|
+
The visulima tui is open-sourced software licensed under the [MIT][license]
|
|
177
|
+
|
|
178
|
+
<!-- badges -->
|
|
44
179
|
|
|
45
|
-
|
|
180
|
+
[license-badge]: https://img.shields.io/npm/l/@visulima/tui?style=for-the-badge
|
|
181
|
+
[license]: https://github.com/visulima/visulima/blob/main/LICENSE
|
|
182
|
+
[npm-downloads-badge]: https://img.shields.io/npm/dm/@visulima/tui?style=for-the-badge
|
|
183
|
+
[npm-downloads]: https://www.npmjs.com/package/@visulima/tui
|
|
184
|
+
[prs-welcome-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge
|
|
185
|
+
[prs-welcome]: https://github.com/visulima/visulima/blob/main/.github/CONTRIBUTING.md
|
|
186
|
+
[chat-badge]: https://img.shields.io/discord/932323359193186354.svg?style=for-the-badge
|
|
187
|
+
[chat]: https://discord.gg/TtFJY8xkFK
|
|
188
|
+
[typescript-badge]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript
|
|
189
|
+
[typescript-url]: https://www.typescriptlang.org/
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import EventEmitter from "eventemitter3";
|
|
2
|
+
export declare class TuiApp extends EventEmitter {
|
|
3
|
+
private renderer;
|
|
4
|
+
private terminal;
|
|
5
|
+
private backBuffer;
|
|
6
|
+
private width;
|
|
7
|
+
private height;
|
|
8
|
+
private isRunning;
|
|
9
|
+
private stdoutBuffer;
|
|
10
|
+
private stderrBuffer;
|
|
11
|
+
constructor();
|
|
12
|
+
/** Enters raw mode + alternate screen. Does NOT start any render loop. */
|
|
13
|
+
start(): void;
|
|
14
|
+
/** Request a clean exit — restores terminal, stops input, exits the process. */
|
|
15
|
+
quit(): void;
|
|
16
|
+
/** Exits raw mode + alternate screen, then flushes any buffered stdout/stderr. */
|
|
17
|
+
stop(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Buffer a write to stdout. While the alternate screen is active, writing
|
|
20
|
+
* directly would corrupt the TUI. Buffered output is flushed on stop().
|
|
21
|
+
*/
|
|
22
|
+
writeStdout(text: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Buffer a write to stderr. While the alternate screen is active, writing
|
|
25
|
+
* directly would corrupt the TUI. Buffered output is flushed on stop().
|
|
26
|
+
*/
|
|
27
|
+
writeStderr(text: string): void;
|
|
28
|
+
/** Returns the shared Uint32Array back-buffer (width * height * 2 u32 cells). */
|
|
29
|
+
getBuffer(): Uint32Array;
|
|
30
|
+
/** Returns current terminal dimensions. */
|
|
31
|
+
getSize(): {
|
|
32
|
+
height: number;
|
|
33
|
+
width: number;
|
|
34
|
+
};
|
|
35
|
+
/** Update terminal dimensions (called on SIGWINCH). */
|
|
36
|
+
resize(width: number, height: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Callbacks fired on every frame after React paints the buffer but before
|
|
39
|
+
* the Rust diff engine flushes to stdout. Use for direct buffer painting
|
|
40
|
+
* that needs to overlay React output (animated graphs, overlays, FPS counters).
|
|
41
|
+
* Multiple listeners are supported — they fire in registration order.
|
|
42
|
+
*/
|
|
43
|
+
private beforeFlushListeners;
|
|
44
|
+
onBeforeFlush(function_: (buffer: Uint32Array, width: number, height: number) => void): () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Layout + paint synchronously. Called from the render loop on every dirty frame,
|
|
47
|
+
* and directly on resize for immediate response.
|
|
48
|
+
*/
|
|
49
|
+
paintNow(calculateLayout: (w: number, h: number) => void, renderToBuffer: (buf: Uint32Array, w: number, h: number) => void): void;
|
|
50
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2×u32 per-cell back-buffer layout:
|
|
3
|
+
* buffer[idx * 2] = charCode (Unicode codepoint, u32)
|
|
4
|
+
* buffer[idx * 2 + 1] = attrCode = (styles << 16) | (bg << 8) | fg
|
|
5
|
+
*/
|
|
6
|
+
export declare const Cell: {
|
|
7
|
+
/** Read bg color from an attr slot value (buffer[idx*2+1]) — bits 15:8 */
|
|
8
|
+
getBg(attributeSlot: number): number;
|
|
9
|
+
/** Read the char character from a raw char slot value (buffer[idx*2]) */
|
|
10
|
+
getChar(charSlot: number): string;
|
|
11
|
+
/** Read fg color from an attr slot value (buffer[idx*2+1]) — bits 7:0 */
|
|
12
|
+
getFg(attributeSlot: number): number;
|
|
13
|
+
/** Read styles bitmask from an attr slot value (buffer[idx*2+1]) — bits 23:16 */
|
|
14
|
+
getStyles(attributeSlot: number): number;
|
|
15
|
+
/**
|
|
16
|
+
* Pack a cell into a [charCode, attrCode] tuple.
|
|
17
|
+
* charCode = char.codePointAt(0)
|
|
18
|
+
* attrCode = (styles & 0xFF) << 16 | (bg & 0xFF) << 8 | (fg & 0xFF)
|
|
19
|
+
*
|
|
20
|
+
* Write to buffer as: buffer[idx*2] = charCode; buffer[idx*2+1] = attrCode
|
|
21
|
+
*/
|
|
22
|
+
pack(char: string, fg?: number, bg?: number, styles?: number): [number, number];
|
|
23
|
+
};
|
|
24
|
+
export declare const StyleMasks: {
|
|
25
|
+
BLINK: number;
|
|
26
|
+
BOLD: number;
|
|
27
|
+
DIM: number;
|
|
28
|
+
HIDDEN: number;
|
|
29
|
+
INVERT: number;
|
|
30
|
+
ITALIC: number;
|
|
31
|
+
STRIKETHROUGH: number;
|
|
32
|
+
UNDERLINE: number;
|
|
33
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { TuiApp } from '../packem_shared/TuiApp-DfxOnXqi.js';
|
|
2
|
+
export { Cell, StyleMasks } from '../packem_shared/Cell-DCg1kJY-.js';
|
|
3
|
+
export { createInlineLoop } from '../packem_shared/createInlineLoop-BxMmcq9D.js';
|
|
4
|
+
export { InputParser } from '../packem_shared/InputParser-BKHpWfvN.js';
|
|
5
|
+
export { Renderer, TerminalGuard, terminalSize } from '../packem_shared/Renderer-zZ5O3vxc.js';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface InlineOptions {
|
|
2
|
+
/** Frames per second. Default: 60 */
|
|
3
|
+
fps?: number;
|
|
4
|
+
/**
|
|
5
|
+
* What to do with the rendered content when the loop stops.
|
|
6
|
+
* - 'preserve' (default) — content stays in terminal scrollback
|
|
7
|
+
* - 'destroy' — content is cleared, terminal looks untouched
|
|
8
|
+
*/
|
|
9
|
+
onExit?: "preserve" | "destroy";
|
|
10
|
+
/** Number of terminal rows to reserve. Default: 10 */
|
|
11
|
+
rows?: number;
|
|
12
|
+
}
|
|
13
|
+
export type InlinePaintFn = (buf: Uint32Array, cols: number, rows: number, frame: number) => void;
|
|
14
|
+
export interface InlineLoop {
|
|
15
|
+
start: () => void;
|
|
16
|
+
stop: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create an inline render loop. Renders `rows` lines immediately below the
|
|
20
|
+
* current cursor position (no alternate screen).
|
|
21
|
+
*/
|
|
22
|
+
export declare function createInlineLoop(paint: InlinePaintFn, options?: InlineOptions): InlineLoop;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import EventEmitter from "eventemitter3";
|
|
2
|
+
export interface MouseEvent {
|
|
3
|
+
button: "left" | "right" | "middle" | "scrollUp" | "scrollDown";
|
|
4
|
+
ctrl: boolean;
|
|
5
|
+
meta: boolean;
|
|
6
|
+
shift: boolean;
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class InputParser extends EventEmitter {
|
|
11
|
+
private stdin;
|
|
12
|
+
private _boundHandleData;
|
|
13
|
+
private _pasteBuffer;
|
|
14
|
+
constructor(stdin: NodeJS.ReadStream);
|
|
15
|
+
start(): void;
|
|
16
|
+
stop(): void;
|
|
17
|
+
private handleData;
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface TerminalSize {
|
|
2
|
+
cols: number;
|
|
3
|
+
rows: number;
|
|
4
|
+
}
|
|
5
|
+
export interface RendererInstance {
|
|
6
|
+
readonly height: number;
|
|
7
|
+
render: (backBuffer: Uint32Array) => void;
|
|
8
|
+
renderDiff: (backBuffer: Uint32Array) => string;
|
|
9
|
+
resize: (width: number, height: number) => void;
|
|
10
|
+
setRowOffset: (offset: number) => void;
|
|
11
|
+
readonly width: number;
|
|
12
|
+
writeRaw: (data: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export type RendererConstructor = new (width: number, height: number) => RendererInstance;
|
|
15
|
+
export interface TerminalGuardInstance {
|
|
16
|
+
getSize: () => TerminalSize;
|
|
17
|
+
leave: () => void;
|
|
18
|
+
}
|
|
19
|
+
export type TerminalGuardConstructor = new (mouse?: boolean | undefined | null) => TerminalGuardInstance;
|
|
20
|
+
export declare const Renderer: RendererConstructor;
|
|
21
|
+
export declare const TerminalGuard: TerminalGuardConstructor;
|
|
22
|
+
export declare const terminalSize: () => TerminalSize;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
type ControlStringType = "osc" | "dcs" | "pm" | "apc" | "sos";
|
|
2
|
+
type CsiToken = {
|
|
3
|
+
readonly finalCharacter: string;
|
|
4
|
+
readonly intermediateString: string;
|
|
5
|
+
readonly parameterString: string;
|
|
6
|
+
readonly type: "csi";
|
|
7
|
+
readonly value: string;
|
|
8
|
+
};
|
|
9
|
+
type EscToken = {
|
|
10
|
+
readonly finalCharacter: string;
|
|
11
|
+
readonly intermediateString: string;
|
|
12
|
+
readonly type: "esc";
|
|
13
|
+
readonly value: string;
|
|
14
|
+
};
|
|
15
|
+
type ControlStringToken = {
|
|
16
|
+
readonly type: ControlStringType;
|
|
17
|
+
readonly value: string;
|
|
18
|
+
};
|
|
19
|
+
type TextToken = {
|
|
20
|
+
readonly type: "text";
|
|
21
|
+
readonly value: string;
|
|
22
|
+
};
|
|
23
|
+
type StToken = {
|
|
24
|
+
readonly type: "st";
|
|
25
|
+
readonly value: string;
|
|
26
|
+
};
|
|
27
|
+
type C1Token = {
|
|
28
|
+
readonly type: "c1";
|
|
29
|
+
readonly value: string;
|
|
30
|
+
};
|
|
31
|
+
type InvalidToken = {
|
|
32
|
+
readonly type: "invalid";
|
|
33
|
+
readonly value: string;
|
|
34
|
+
};
|
|
35
|
+
export type AnsiToken = TextToken | CsiToken | EscToken | ControlStringToken | StToken | C1Token | InvalidToken;
|
|
36
|
+
export declare const hasAnsiControlCharacters: (text: string) => boolean;
|
|
37
|
+
export declare const tokenizeAnsi: (text: string) => AnsiToken[];
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSC 52 clipboard protocol utilities.
|
|
3
|
+
*
|
|
4
|
+
* OSC 52 allows terminal applications to read/write the system clipboard
|
|
5
|
+
* via escape sequences. Format: ESC ] 52 ; <target> ; <base64-data> BEL
|
|
6
|
+
* @see https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
|
|
7
|
+
*/
|
|
8
|
+
import type { Writable } from "node:stream";
|
|
9
|
+
/**
|
|
10
|
+
* Clipboard targets as defined by the OSC 52 spec.
|
|
11
|
+
* - `c` — system clipboard
|
|
12
|
+
* - `p` — primary selection (X11 only)
|
|
13
|
+
* - `s` — secondary selection (X11 only)
|
|
14
|
+
*/
|
|
15
|
+
export type ClipboardTarget = "c" | "p" | "s";
|
|
16
|
+
/**
|
|
17
|
+
* Check whether the current terminal likely supports OSC 52.
|
|
18
|
+
*
|
|
19
|
+
* Detection is best-effort based on `TERM_PROGRAM` and other env vars.
|
|
20
|
+
* Returns `true` for known-supported terminals, `false` otherwise.
|
|
21
|
+
*/
|
|
22
|
+
export declare const isOsc52Supported: () => boolean;
|
|
23
|
+
export declare const writeOsc52: (stream: Writable, text: string, target?: ClipboardTarget) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Clear the clipboard via OSC 52.
|
|
26
|
+
* @param stream The writable stream to write the escape sequence to.
|
|
27
|
+
* @param target The clipboard target. Defaults to `"c"`.
|
|
28
|
+
*/
|
|
29
|
+
export declare const clearOsc52: (stream: Writable, target?: ClipboardTarget) => void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color matrix transforms for color blindness simulation and compensation.
|
|
3
|
+
*
|
|
4
|
+
* Matrices sourced from research by Brettel, Viénot, and Mollon (1997)
|
|
5
|
+
* and Machado, Oliveira, and Fernandes (2009).
|
|
6
|
+
* @see https://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 3x3 color transformation matrix operating on linear RGB values (0-255).
|
|
10
|
+
*/
|
|
11
|
+
export type ColorMatrix = readonly [readonly [number, number, number], readonly [number, number, number], readonly [number, number, number]];
|
|
12
|
+
export type ColorBlindnessType = "achromatopsia" | "deuteranopia" | "protanopia" | "tritanopia";
|
|
13
|
+
/**
|
|
14
|
+
* Simulation matrices — show how colors appear to users with color vision deficiency.
|
|
15
|
+
*/
|
|
16
|
+
export declare const COLOR_BLINDNESS_SIMULATION: Record<ColorBlindnessType, ColorMatrix>;
|
|
17
|
+
/**
|
|
18
|
+
* Compensation matrices — shift colors into a distinguishable range for affected users.
|
|
19
|
+
* These remap problematic colors to alternatives the user can perceive.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Compensation matrices — enhance distinguishability for affected users
|
|
23
|
+
* by redistributing the lost channel's energy into perceivable channels.
|
|
24
|
+
* Based on Daltonization approach (Fidaner et al., 2005).
|
|
25
|
+
*/
|
|
26
|
+
export declare const COLOR_BLINDNESS_COMPENSATION: Record<Exclude<ColorBlindnessType, "achromatopsia">, ColorMatrix>;
|
|
27
|
+
/**
|
|
28
|
+
* Identity matrix (no transformation).
|
|
29
|
+
*/
|
|
30
|
+
export declare const IDENTITY_MATRIX: ColorMatrix;
|
|
31
|
+
/**
|
|
32
|
+
* Apply a 3x3 color matrix to an RGB triplet.
|
|
33
|
+
* @param r Red channel (0-255)
|
|
34
|
+
* @param g Green channel (0-255)
|
|
35
|
+
* @param b Blue channel (0-255)
|
|
36
|
+
* @param matrix The 3x3 transformation matrix
|
|
37
|
+
* @returns Transformed [r, g, b] triplet, clamped to 0-255
|
|
38
|
+
*/
|
|
39
|
+
export declare const applyColorMatrix: (r: number, g: number, b: number, matrix: ColorMatrix) => [number, number, number];
|
|
40
|
+
export declare const hexToRgb: (hex: string) => [number, number, number] | null;
|
|
41
|
+
/**
|
|
42
|
+
* Convert RGB components to a hex color string.
|
|
43
|
+
*/
|
|
44
|
+
export declare const rgbToHex: (r: number, g: number, b: number) => string;
|
|
45
|
+
/**
|
|
46
|
+
* Transform a hex color through a color blindness simulation or compensation matrix.
|
|
47
|
+
* Returns the original color if parsing fails.
|
|
48
|
+
*/
|
|
49
|
+
export declare const transformHexColor: (hex: string, matrix: ColorMatrix) => string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared color lookup tables and parsing utilities.
|
|
3
|
+
*
|
|
4
|
+
* Used by styled-line-serializer.ts, styled-line-factory.ts, and output.ts
|
|
5
|
+
* to avoid triplicate color mapping code.
|
|
6
|
+
*/
|
|
7
|
+
/** Standard ANSI color names to 0-7 index */
|
|
8
|
+
export declare const NAMED_COLORS: Readonly<Record<string, number>>;
|
|
9
|
+
/** Bright ANSI color names to 8-15 index */
|
|
10
|
+
export declare const BRIGHT_COLORS: Readonly<Record<string, number>>;
|
|
11
|
+
/**
|
|
12
|
+
* Parse a color string into an ANSI 256-color index (0-255).
|
|
13
|
+
* Returns 255 (default) for unrecognized colors.
|
|
14
|
+
*/
|
|
15
|
+
export declare const colorToAnsi256: (color: string) => number;
|
|
16
|
+
/**
|
|
17
|
+
* Convert a color string to SGR parameter array for escape sequences.
|
|
18
|
+
* @param color the color string to convert
|
|
19
|
+
* @param isFg true for foreground (30-based), false for background (40-based)
|
|
20
|
+
*/
|
|
21
|
+
export declare const colorToSgrParams: (color: string, isFg: boolean) => number[];
|
|
22
|
+
/**
|
|
23
|
+
* Convert a color string to a raw ANSI escape code string.
|
|
24
|
+
*/
|
|
25
|
+
export declare const colorToAnsiCode: (color: string, isFg: boolean) => string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Convert an ANSI 256-color index to a named color string.
|
|
28
|
+
* Standard colors (0-7) use names; everything else uses ansi256(N).
|
|
29
|
+
*/
|
|
30
|
+
export declare const ansi256ToColorName: (index: number) => string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert component for Ink.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by ink-ui Alert by Vadim Demedes.
|
|
5
|
+
* @see https://github.com/vadimdemedes/ink-ui
|
|
6
|
+
*
|
|
7
|
+
* MIT License
|
|
8
|
+
* Copyright (c) Vadym Demedes (github.com/vadimdemedes)
|
|
9
|
+
*/
|
|
10
|
+
import type { ReactElement, ReactNode } from "react";
|
|
11
|
+
import type { Variant } from "./variant-config.d.ts";
|
|
12
|
+
export type AlertVariant = Variant;
|
|
13
|
+
export type Props = {
|
|
14
|
+
/**
|
|
15
|
+
* Alert message content.
|
|
16
|
+
*/
|
|
17
|
+
readonly children: ReactNode;
|
|
18
|
+
/**
|
|
19
|
+
* Optional heading displayed above the message.
|
|
20
|
+
*/
|
|
21
|
+
readonly title?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Determines the border color and icon.
|
|
24
|
+
*/
|
|
25
|
+
readonly variant: AlertVariant;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Renders a bordered alert box with a variant-specific icon, optional title, and message.
|
|
29
|
+
*/
|
|
30
|
+
export default function Alert({ children, title, variant }: Props): ReactElement;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Context } from "react";
|
|
2
|
+
type AnimationContextValue = {
|
|
3
|
+
readonly renderThrottleMs: number;
|
|
4
|
+
readonly subscribe: (callback: (currentTime: number) => void, interval: number) => {
|
|
5
|
+
readonly startTime: number;
|
|
6
|
+
readonly unsubscribe: () => void;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
declare const animationContext: Context<AnimationContextValue>;
|
|
10
|
+
export default animationContext;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import type { CursorPosition } from "../log-update.d.ts";
|
|
4
|
+
type Props = {
|
|
5
|
+
readonly children: ReactNode;
|
|
6
|
+
readonly exitOnCtrlC: boolean;
|
|
7
|
+
readonly interactive: boolean;
|
|
8
|
+
readonly onExit: (errorOrResult?: unknown) => void;
|
|
9
|
+
readonly onWaitUntilRenderFlush: () => Promise<void>;
|
|
10
|
+
readonly renderThrottleMs: number;
|
|
11
|
+
readonly setCursorPosition: (position: CursorPosition | undefined) => void;
|
|
12
|
+
readonly stderr: NodeJS.WriteStream;
|
|
13
|
+
readonly stdin: NodeJS.ReadStream;
|
|
14
|
+
readonly stdout: NodeJS.WriteStream;
|
|
15
|
+
readonly writeToStderr: (data: string) => void;
|
|
16
|
+
readonly writeToStdout: (data: string) => void;
|
|
17
|
+
};
|
|
18
|
+
declare const _default: React.FC<Props>;
|
|
19
|
+
export default _default;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Context } from "react";
|
|
2
|
+
export type Props = {
|
|
3
|
+
/**
|
|
4
|
+
* Exit (unmount) the whole Ink app.
|
|
5
|
+
*
|
|
6
|
+
* - `exit()` — resolves `waitUntilExit()` with `undefined`.
|
|
7
|
+
* - `exit(new Error('…'))` — rejects `waitUntilExit()` with the error.
|
|
8
|
+
* - `exit(value)` — resolves `waitUntilExit()` with `value`.
|
|
9
|
+
*/
|
|
10
|
+
readonly exit: (errorOrResult?: Error | unknown) => void;
|
|
11
|
+
/**
|
|
12
|
+
* Returns a promise that settles after pending render output is flushed to stdout.
|
|
13
|
+
* @example
|
|
14
|
+
* ```jsx
|
|
15
|
+
* import {useEffect} from 'react';
|
|
16
|
+
* import {useApp} from 'ink';
|
|
17
|
+
|
|
18
|
+
const Example = () => {
|
|
19
|
+
const {waitUntilRenderFlush} = useApp();
|
|
20
|
+
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
void (async () => {
|
|
23
|
+
await waitUntilRenderFlush();
|
|
24
|
+
runNextCommand();
|
|
25
|
+
})();
|
|
26
|
+
}, [waitUntilRenderFlush]);
|
|
27
|
+
|
|
28
|
+
return …;
|
|
29
|
+
};
|
|
30
|
+
```
|
|
31
|
+
*/
|
|
32
|
+
readonly waitUntilRenderFlush: () => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* `AppContext` is a React context that exposes lifecycle methods for the app.
|
|
36
|
+
*/
|
|
37
|
+
declare const AppContext: Context<Props>;
|
|
38
|
+
export default AppContext;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AnsiColors } from "@visulima/colorize";
|
|
2
|
+
import type { Context } from "react";
|
|
3
|
+
import type { LiteralUnion } from "type-fest";
|
|
4
|
+
export type BackgroundColor = LiteralUnion<AnsiColors, string>;
|
|
5
|
+
export declare const backgroundContext: Context<BackgroundColor | undefined>;
|