@visulima/tui 0.0.1 → 1.0.0-alpha.2
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 +200 -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 +104 -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-hki-KRnx.js +153 -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
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { S as StyledLine, d as styledLineWidth, i as inkCharacterWidth } from './measure-text-DItZYotK.js';
|
|
2
|
+
|
|
3
|
+
const truncateStyledLine = (line, columns, position = "end") => {
|
|
4
|
+
if (columns < 1) {
|
|
5
|
+
return new StyledLine();
|
|
6
|
+
}
|
|
7
|
+
const textWidth = styledLineWidth(line);
|
|
8
|
+
if (textWidth <= columns) {
|
|
9
|
+
return line;
|
|
10
|
+
}
|
|
11
|
+
const ellipsis = new StyledLine();
|
|
12
|
+
ellipsis.pushChar("…", 0);
|
|
13
|
+
if (columns === 1) {
|
|
14
|
+
return ellipsis;
|
|
15
|
+
}
|
|
16
|
+
if (position === "start") {
|
|
17
|
+
let width = 0;
|
|
18
|
+
let startIndex = line.length;
|
|
19
|
+
for (let i = line.length - 1; i >= 0; i--) {
|
|
20
|
+
width += inkCharacterWidth(line.getValue(i));
|
|
21
|
+
if (width > columns - 1) {
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
startIndex = i;
|
|
25
|
+
}
|
|
26
|
+
return ellipsis.combine(line.slice(startIndex));
|
|
27
|
+
}
|
|
28
|
+
if (position === "middle") {
|
|
29
|
+
const leftWidth = Math.ceil(columns / 2);
|
|
30
|
+
const rightWidth = columns - leftWidth;
|
|
31
|
+
let leftEnd = 0;
|
|
32
|
+
let w2 = 0;
|
|
33
|
+
for (let i = 0; i < line.length; i++) {
|
|
34
|
+
const cw = inkCharacterWidth(line.getValue(i));
|
|
35
|
+
if (w2 + cw > leftWidth - 1) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
w2 += cw;
|
|
39
|
+
leftEnd = i + 1;
|
|
40
|
+
}
|
|
41
|
+
let rightStart = line.length;
|
|
42
|
+
w2 = 0;
|
|
43
|
+
for (let i = line.length - 1; i >= 0; i--) {
|
|
44
|
+
w2 += inkCharacterWidth(line.getValue(i));
|
|
45
|
+
if (w2 > rightWidth) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
rightStart = i;
|
|
49
|
+
}
|
|
50
|
+
return line.slice(0, leftEnd).combine(ellipsis, line.slice(rightStart));
|
|
51
|
+
}
|
|
52
|
+
let endIndex = 0;
|
|
53
|
+
let w = 0;
|
|
54
|
+
for (let i = 0; i < line.length; i++) {
|
|
55
|
+
const cw = inkCharacterWidth(line.getValue(i));
|
|
56
|
+
if (w + cw > columns - 1) {
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
w += cw;
|
|
60
|
+
endIndex = i + 1;
|
|
61
|
+
}
|
|
62
|
+
return line.slice(0, endIndex).combine(ellipsis);
|
|
63
|
+
};
|
|
64
|
+
const wrapStyledLine = (line, columns) => {
|
|
65
|
+
const rows = [];
|
|
66
|
+
let currentRowStart = 0;
|
|
67
|
+
let currentRowWidth = 0;
|
|
68
|
+
let isAtStartOfLogicalLine = true;
|
|
69
|
+
let i = 0;
|
|
70
|
+
while (i < line.length) {
|
|
71
|
+
const firstValue = line.getValue(i);
|
|
72
|
+
if (firstValue === "\n") {
|
|
73
|
+
rows.push(line.slice(currentRowStart, i));
|
|
74
|
+
currentRowStart = i + 1;
|
|
75
|
+
currentRowWidth = 0;
|
|
76
|
+
isAtStartOfLogicalLine = true;
|
|
77
|
+
i++;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
let j = i;
|
|
81
|
+
let wordWidth = 0;
|
|
82
|
+
if (firstValue === " ") {
|
|
83
|
+
wordWidth = inkCharacterWidth(" ");
|
|
84
|
+
j = i + 1;
|
|
85
|
+
} else {
|
|
86
|
+
while (j < line.length && line.getValue(j) !== " " && line.getValue(j) !== "\n") {
|
|
87
|
+
wordWidth += inkCharacterWidth(line.getValue(j));
|
|
88
|
+
j++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (currentRowWidth + wordWidth > columns && currentRowWidth > 0) {
|
|
92
|
+
if (firstValue === " " && !isAtStartOfLogicalLine && !line.hasStyles(i)) {
|
|
93
|
+
i = j;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
let trimEnd = i;
|
|
97
|
+
while (trimEnd > currentRowStart && line.getValue(trimEnd - 1) === " " && !line.hasStyles(trimEnd - 1)) {
|
|
98
|
+
trimEnd--;
|
|
99
|
+
}
|
|
100
|
+
rows.push(line.slice(currentRowStart, trimEnd));
|
|
101
|
+
currentRowStart = i;
|
|
102
|
+
currentRowWidth = 0;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (currentRowWidth === 0 && wordWidth > columns) {
|
|
106
|
+
let k = i;
|
|
107
|
+
let chunkWidth = 0;
|
|
108
|
+
while (k < j) {
|
|
109
|
+
const cw = inkCharacterWidth(line.getValue(k));
|
|
110
|
+
if (chunkWidth + cw > columns && chunkWidth > 0) {
|
|
111
|
+
rows.push(line.slice(currentRowStart, k));
|
|
112
|
+
currentRowStart = k;
|
|
113
|
+
chunkWidth = 0;
|
|
114
|
+
}
|
|
115
|
+
chunkWidth += cw;
|
|
116
|
+
k++;
|
|
117
|
+
}
|
|
118
|
+
currentRowWidth = chunkWidth;
|
|
119
|
+
i = j;
|
|
120
|
+
isAtStartOfLogicalLine = false;
|
|
121
|
+
} else {
|
|
122
|
+
currentRowWidth += wordWidth;
|
|
123
|
+
i = j;
|
|
124
|
+
if (firstValue !== " ") {
|
|
125
|
+
isAtStartOfLogicalLine = false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (currentRowStart < line.length || rows.length === 0) {
|
|
130
|
+
rows.push(line.slice(currentRowStart));
|
|
131
|
+
}
|
|
132
|
+
return rows;
|
|
133
|
+
};
|
|
134
|
+
const wrapOrTruncateStyledLine = (line, maxWidth, textWrap = "wrap") => {
|
|
135
|
+
if (textWrap.startsWith("truncate")) {
|
|
136
|
+
let position = "end";
|
|
137
|
+
if (textWrap === "truncate-middle") {
|
|
138
|
+
position = "middle";
|
|
139
|
+
} else if (textWrap === "truncate-start") {
|
|
140
|
+
position = "start";
|
|
141
|
+
}
|
|
142
|
+
return [truncateStyledLine(line, maxWidth, position)];
|
|
143
|
+
}
|
|
144
|
+
return wrapStyledLine(line, maxWidth);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export { wrapOrTruncateStyledLine };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools — optional development overlay for TUI apps.
|
|
3
|
+
*
|
|
4
|
+
* Wraps your app and renders a HUD in the bottom-right corner.
|
|
5
|
+
* Render rate is measured from actual render events (not a timer guess).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { DevTools } from '@visulima/tui/react'
|
|
9
|
+
*
|
|
10
|
+
* render(
|
|
11
|
+
* <DevTools>
|
|
12
|
+
* <MyApp />
|
|
13
|
+
* </DevTools>
|
|
14
|
+
* )
|
|
15
|
+
*
|
|
16
|
+
* Props:
|
|
17
|
+
* enabled? boolean — show/hide without removing from tree (default: true)
|
|
18
|
+
*
|
|
19
|
+
* Future slots: render count, memory usage, custom metrics via props.
|
|
20
|
+
*/
|
|
21
|
+
import React from "react";
|
|
22
|
+
export interface DevToolsProps {
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
/** Show/hide the HUD without unmounting (default: true) */
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare const DevTools: ({ children, enabled }: DevToolsProps) => React.ReactElement;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Context } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export type FocusContextProps = {
|
|
4
|
+
activate: (id: string) => void;
|
|
5
|
+
activeId: string | undefined;
|
|
6
|
+
add: (id: string, options: {
|
|
7
|
+
autoFocus: boolean;
|
|
8
|
+
}) => void;
|
|
9
|
+
deactivate: (id: string) => void;
|
|
10
|
+
disableFocus: () => void;
|
|
11
|
+
enableFocus: () => void;
|
|
12
|
+
focus: (id: string) => void;
|
|
13
|
+
focusNext: () => void;
|
|
14
|
+
focusPrevious: () => void;
|
|
15
|
+
remove: (id: string) => void;
|
|
16
|
+
};
|
|
17
|
+
export declare const FocusContext: Context<FocusContextProps>;
|
|
18
|
+
export declare const FocusProvider: React.FC<{
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
}>;
|
|
21
|
+
export type UseFocusOptions = {
|
|
22
|
+
autoFocus?: boolean;
|
|
23
|
+
id?: string;
|
|
24
|
+
isActive?: boolean;
|
|
25
|
+
};
|
|
26
|
+
export type UseFocusResult = {
|
|
27
|
+
focus: (id: string) => void;
|
|
28
|
+
isFocused: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare const useFocus: ({ autoFocus, id: customId, isActive }?: UseFocusOptions) => UseFocusResult;
|
|
31
|
+
export type UseFocusManagerResult = {
|
|
32
|
+
activeId: string | undefined;
|
|
33
|
+
disableFocus: () => void;
|
|
34
|
+
enableFocus: () => void;
|
|
35
|
+
focus: (id: string) => void;
|
|
36
|
+
focusNext: () => void;
|
|
37
|
+
focusPrevious: () => void;
|
|
38
|
+
};
|
|
39
|
+
export declare const useFocusManager: () => UseFocusManagerResult;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import type { Context, RefObject } from "react";
|
|
2
|
+
import type { InputParser, MouseEvent, TuiApp } from "../core/index.d.ts";
|
|
3
|
+
import type { LayoutNode } from "./layout.d.ts";
|
|
4
|
+
export interface TuiContextProps {
|
|
5
|
+
app: TuiApp;
|
|
6
|
+
input: InputParser;
|
|
7
|
+
writeStderr: (text: string) => void;
|
|
8
|
+
writeStdout: (text: string) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare const TuiContext: Context<TuiContextProps | null>;
|
|
11
|
+
export interface Key {
|
|
12
|
+
backspace: boolean;
|
|
13
|
+
ctrl: boolean;
|
|
14
|
+
delete: boolean;
|
|
15
|
+
downArrow: boolean;
|
|
16
|
+
end: boolean;
|
|
17
|
+
escape: boolean;
|
|
18
|
+
home: boolean;
|
|
19
|
+
leftArrow: boolean;
|
|
20
|
+
meta: boolean;
|
|
21
|
+
pageDown: boolean;
|
|
22
|
+
pageUp: boolean;
|
|
23
|
+
return: boolean;
|
|
24
|
+
rightArrow: boolean;
|
|
25
|
+
shift: boolean;
|
|
26
|
+
tab: boolean;
|
|
27
|
+
upArrow: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type InputHandler = (input: string, key: Key) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Subscribes to keyboard input. Uses a stable ref so the effect runs
|
|
32
|
+
* exactly once (on mount) regardless of how often the component re-renders.
|
|
33
|
+
* Always invokes the latest handler passed by the caller.
|
|
34
|
+
*/
|
|
35
|
+
export declare const useInput: (handler: InputHandler) => void;
|
|
36
|
+
export interface UsePasteOptions {
|
|
37
|
+
/**
|
|
38
|
+
* Enable or disable capturing pasted text.
|
|
39
|
+
* Useful when multiple components use usePaste and only one should be active.
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
isActive?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export type PasteHandler = (text: string) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Subscribe to bracketed paste events.
|
|
47
|
+
*
|
|
48
|
+
* `usePaste` and `useInput` can be used together. Paste content is delivered
|
|
49
|
+
* through this hook and not forwarded to useInput while at least one paste
|
|
50
|
+
* listener is active.
|
|
51
|
+
*/
|
|
52
|
+
export declare const usePaste: (handler: PasteHandler, options?: UsePasteOptions) => void;
|
|
53
|
+
/**
|
|
54
|
+
* Raw access to the TuiContext — app instance + input parser.
|
|
55
|
+
* Useful for advanced integrations (e.g. DevTools, custom hooks).
|
|
56
|
+
*/
|
|
57
|
+
export declare const useTuiContext: () => TuiContextProps;
|
|
58
|
+
/**
|
|
59
|
+
* Access app controls. Returns { exit } for Ink compatibility.
|
|
60
|
+
* exit() triggers a clean shutdown (restores terminal, stops input, exits process).
|
|
61
|
+
*/
|
|
62
|
+
export declare const useApp: () => {
|
|
63
|
+
exit: () => void;
|
|
64
|
+
quit: () => void;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Returns current terminal dimensions and re-renders on resize (SIGWINCH).
|
|
68
|
+
* Ink-compatible: const { columns, rows } = useWindowSize()
|
|
69
|
+
*/
|
|
70
|
+
export declare const useWindowSize: () => {
|
|
71
|
+
columns: number;
|
|
72
|
+
rows: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Write to stdout without disturbing the TUI.
|
|
76
|
+
* Ink-compatible: const { write, stdout } = useStdout()
|
|
77
|
+
* Output is buffered while the alternate screen is active and flushed on exit.
|
|
78
|
+
*/
|
|
79
|
+
export declare const useStdout: () => {
|
|
80
|
+
stdout: NodeJS.WriteStream & {
|
|
81
|
+
fd: 1;
|
|
82
|
+
};
|
|
83
|
+
write: (text: string) => void;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Write to stderr without disturbing the TUI.
|
|
87
|
+
* Ink-compatible: const { write, stderr } = useStderr()
|
|
88
|
+
* Output is buffered while the alternate screen is active and flushed on exit.
|
|
89
|
+
*/
|
|
90
|
+
export declare const useStderr: () => {
|
|
91
|
+
stderr: NodeJS.WriteStream & {
|
|
92
|
+
fd: 2;
|
|
93
|
+
};
|
|
94
|
+
write: (text: string) => void;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Access raw stdin stream and raw mode controls.
|
|
98
|
+
* Ink-compatible: const { stdin, setRawMode, isRawModeSupported } = useStdin()
|
|
99
|
+
*/
|
|
100
|
+
export declare const useStdin: () => {
|
|
101
|
+
isRawModeSupported: boolean;
|
|
102
|
+
setRawMode: (value: boolean) => void;
|
|
103
|
+
stdin: NodeJS.ReadStream & {
|
|
104
|
+
fd: 0;
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Measure the dimensions of a Box element.
|
|
109
|
+
* Returns { width, height } after layout has been calculated.
|
|
110
|
+
* Returns { width: 0, height: 0 } when called during render (before layout).
|
|
111
|
+
* Ink-compatible: measureElement(ref.current)
|
|
112
|
+
*/
|
|
113
|
+
export declare const measureElement: (node: LayoutNode | null) => {
|
|
114
|
+
height: number;
|
|
115
|
+
width: number;
|
|
116
|
+
};
|
|
117
|
+
export interface BoxMetrics {
|
|
118
|
+
readonly height: number;
|
|
119
|
+
readonly left: number;
|
|
120
|
+
readonly top: number;
|
|
121
|
+
readonly width: number;
|
|
122
|
+
}
|
|
123
|
+
export interface UseBoxMetricsResult extends BoxMetrics {
|
|
124
|
+
readonly hasMeasured: boolean;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Returns the current layout metrics for a Box ref, updating on every render
|
|
128
|
+
* and on terminal resize.
|
|
129
|
+
* Ink-compatible: const { width, height, left, top, hasMeasured } = useBoxMetrics(ref)
|
|
130
|
+
*/
|
|
131
|
+
export declare const useBoxMetrics: (ref: RefObject<LayoutNode | null>) => UseBoxMetricsResult;
|
|
132
|
+
/**
|
|
133
|
+
* Returns whether a screen reader is enabled.
|
|
134
|
+
* Stub: always returns false — no screen reader support.
|
|
135
|
+
* Ink-compatible: const isEnabled = useIsScreenReaderEnabled()
|
|
136
|
+
*/
|
|
137
|
+
export declare const useIsScreenReaderEnabled: () => boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Returns cursor positioning controls.
|
|
140
|
+
* Stub: the native renderer hides the cursor during rendering (alternate screen).
|
|
141
|
+
* setCursorPosition is a no-op — provided for Ink API compatibility only.
|
|
142
|
+
* Ink-compatible: const { setCursorPosition } = useCursor()
|
|
143
|
+
*/
|
|
144
|
+
export declare const useCursor: () => {
|
|
145
|
+
setCursorPosition: (position: {
|
|
146
|
+
x: number;
|
|
147
|
+
y: number;
|
|
148
|
+
} | undefined) => void;
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Scroll state for a fixed-height viewport over variable-height content.
|
|
152
|
+
*
|
|
153
|
+
* Usage:
|
|
154
|
+
* const scroll = useScrollable({ viewportHeight: 20, contentHeight: totalRows })
|
|
155
|
+
*
|
|
156
|
+
* <Box height={20}>
|
|
157
|
+
* <Box marginTop={-scroll.offset}>
|
|
158
|
+
* {items}
|
|
159
|
+
* </Box>
|
|
160
|
+
* </Box>
|
|
161
|
+
*
|
|
162
|
+
* contentHeight can be updated as content grows. The offset is automatically
|
|
163
|
+
* clamped so it never scrolls past the end.
|
|
164
|
+
*
|
|
165
|
+
* scrollToBottom() is idempotent — safe to call on every new message append.
|
|
166
|
+
*/
|
|
167
|
+
export interface UseScrollableOptions {
|
|
168
|
+
/** Total height of the content in rows — update as content grows */
|
|
169
|
+
contentHeight: number;
|
|
170
|
+
/** Height of the visible window in rows */
|
|
171
|
+
viewportHeight: number;
|
|
172
|
+
}
|
|
173
|
+
export interface UseScrollableResult {
|
|
174
|
+
/** True when already at the bottom */
|
|
175
|
+
atBottom: boolean;
|
|
176
|
+
/** True when already at the top */
|
|
177
|
+
atTop: boolean;
|
|
178
|
+
/** Current scroll offset in rows (0 = top) */
|
|
179
|
+
offset: number;
|
|
180
|
+
/** Scroll down N rows */
|
|
181
|
+
scrollBy: (n: number) => void;
|
|
182
|
+
/** Scroll down one row */
|
|
183
|
+
scrollDown: () => void;
|
|
184
|
+
/** Jump to the very bottom */
|
|
185
|
+
scrollToBottom: () => void;
|
|
186
|
+
/** Jump to the very top */
|
|
187
|
+
scrollToTop: () => void;
|
|
188
|
+
/** Scroll up one row */
|
|
189
|
+
scrollUp: () => void;
|
|
190
|
+
}
|
|
191
|
+
export declare const useScrollable: ({ contentHeight, viewportHeight }: UseScrollableOptions) => UseScrollableResult;
|
|
192
|
+
export type MouseHandler = (event: MouseEvent) => void;
|
|
193
|
+
/**
|
|
194
|
+
* Subscribe to mouse events. Requires mouse tracking to be enabled (it is by
|
|
195
|
+
* default — TerminalGuard enables SGR 1006 mouse tracking on start).
|
|
196
|
+
*
|
|
197
|
+
* Usage:
|
|
198
|
+
* useMouse((event) => {
|
|
199
|
+
* if (event.button === 'left') { ... }
|
|
200
|
+
* if (event.button === 'scrollUp') { ... }
|
|
201
|
+
* // event: { x, y, button, shift, ctrl, meta }
|
|
202
|
+
* })
|
|
203
|
+
*
|
|
204
|
+
* button values: 'left' | 'right' | 'middle' | 'scrollUp' | 'scrollDown'
|
|
205
|
+
*/
|
|
206
|
+
export declare const useMouse: (handler: MouseHandler) => void;
|
|
207
|
+
export interface UseTextInputOptions {
|
|
208
|
+
/** Initial value (default: '') */
|
|
209
|
+
initialValue?: string;
|
|
210
|
+
/** When false, the hook ignores all input (default: true) */
|
|
211
|
+
isActive?: boolean;
|
|
212
|
+
/** Called on every keystroke with the new value */
|
|
213
|
+
onChange?: (value: string) => void;
|
|
214
|
+
/** Called when the user presses Enter */
|
|
215
|
+
onSubmit?: (value: string) => void;
|
|
216
|
+
}
|
|
217
|
+
export interface UseTextInputResult {
|
|
218
|
+
/** Clear the input */
|
|
219
|
+
clear: () => void;
|
|
220
|
+
/** Cursor position (0 = before first char, value.length = after last char) */
|
|
221
|
+
cursor: number;
|
|
222
|
+
/** Set value programmatically */
|
|
223
|
+
setValue: (value: string) => void;
|
|
224
|
+
/** Current text value */
|
|
225
|
+
value: string;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Managed text input with cursor, backspace, delete, left/right navigation,
|
|
229
|
+
* home/end, bracketed paste, and submit on Enter.
|
|
230
|
+
*
|
|
231
|
+
* Usage:
|
|
232
|
+
* const { value, cursor } = useTextInput({ onSubmit: (v) => console.log(v) })
|
|
233
|
+
* <Text>{value.slice(0, cursor)}<Text inverse> </Text>{value.slice(cursor)}</Text>
|
|
234
|
+
*
|
|
235
|
+
* Renders a block cursor by inverting the character at cursor position.
|
|
236
|
+
* When cursor is at end, renders a trailing space as the cursor block.
|
|
237
|
+
*/
|
|
238
|
+
export declare const useTextInput: ({ initialValue, isActive, onChange, onSubmit }?: UseTextInputOptions) => UseTextInputResult;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./devtools.d.ts";
|
|
2
|
+
export * from "./focus.d.ts";
|
|
3
|
+
export * from "./hooks.d.ts";
|
|
4
|
+
export type { InlineInstance, Instance, RenderOptions } from "./react/react.d.ts";
|
|
5
|
+
export { render, renderInline } from "./react/react.d.ts";
|
|
6
|
+
export * from "./render-to-string.d.ts";
|
|
7
|
+
export * from "./scene.d.ts";
|
|
8
|
+
export * from "./static.d.ts";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { DevTools } from '../packem_shared/DevTools-aMPIsaHx.js';
|
|
2
|
+
export { FocusContext, FocusProvider, useFocus, useFocusManager } from '../packem_shared/FocusContext-D5wFxSRz.js';
|
|
3
|
+
export { TuiContext, measureElement, useApp, useBoxMetrics, useCursor, useInput, useIsScreenReaderEnabled, useMouse, usePaste, useScrollable, useStderr, useStdin, useStdout, useTextInput, useTuiContext, useWindowSize } from '../packem_shared/TuiContext-CqEjMyXd.js';
|
|
4
|
+
export { render, renderInline } from '../packem_shared/render-Bpjhf0lD.js';
|
|
5
|
+
export { renderToString } from '../packem_shared/renderToString-Cfg55DRD.js';
|
|
6
|
+
export { Static } from '../packem_shared/Static-xmD9giJj.js';
|
|
7
|
+
export { LayoutNode } from '../packem_shared/LayoutNode-Cjnsodiy.js';
|
|
8
|
+
export { NAMED_COLORS, applyStyles, resolveColor } from '../packem_shared/NAMED_COLORS-a4QBvb5r.js';
|
|
9
|
+
export { renderTreeToBuffer } from '../packem_shared/renderTreeToBuffer-D3mo7M7m.js';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import Yoga from "yoga-layout";
|
|
2
|
+
type YogaNode = ReturnType<typeof Yoga.Node.create>;
|
|
3
|
+
export declare class LayoutNode {
|
|
4
|
+
yogaNode: YogaNode;
|
|
5
|
+
children: LayoutNode[];
|
|
6
|
+
parent: LayoutNode | null;
|
|
7
|
+
private _destroyed;
|
|
8
|
+
_hidden: boolean;
|
|
9
|
+
transform?: (s: string, index: number) => string;
|
|
10
|
+
private _text?;
|
|
11
|
+
fg: number;
|
|
12
|
+
bg: number;
|
|
13
|
+
styles: number;
|
|
14
|
+
_style?: any;
|
|
15
|
+
set text(value: string | undefined);
|
|
16
|
+
get text(): string | undefined;
|
|
17
|
+
constructor();
|
|
18
|
+
insertChild(child: LayoutNode, index: number): void;
|
|
19
|
+
remove(): void;
|
|
20
|
+
removeChild(child: LayoutNode): void;
|
|
21
|
+
/**
|
|
22
|
+
* Free this node's Yoga allocation. Called via detachDeletedInstance
|
|
23
|
+
* in the reconciler after React has permanently removed this node.
|
|
24
|
+
*
|
|
25
|
+
* Does NOT recurse — React calls detachDeletedInstance on every node
|
|
26
|
+
* in a deleted subtree individually, so each node frees only itself.
|
|
27
|
+
* The _destroyed guard prevents double-free if free() is also called.
|
|
28
|
+
*/
|
|
29
|
+
destroy(): void;
|
|
30
|
+
calculateLayout(width: number, height: number): void;
|
|
31
|
+
getLayout(): ReturnType<YogaNode["getComputedLayout"]>;
|
|
32
|
+
/** @deprecated use destroy() */
|
|
33
|
+
free(): void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { InlineOptions } from "../core/index.d.ts";
|
|
3
|
+
import { InputParser, TuiApp } from "../core/index.d.ts";
|
|
4
|
+
/** @internal */
|
|
5
|
+
export declare const _Box: React.FC<Record<string, any>>;
|
|
6
|
+
/** @internal */
|
|
7
|
+
export declare const _Text: React.FC<Record<string, any>>;
|
|
8
|
+
/** @internal */
|
|
9
|
+
export declare const _Spacer: React.FC;
|
|
10
|
+
/** Ink-compat render options */
|
|
11
|
+
export interface RenderOptions {
|
|
12
|
+
/** Ignored — the native renderer is always concurrent */
|
|
13
|
+
concurrent?: boolean;
|
|
14
|
+
/** Ignored */
|
|
15
|
+
debug?: boolean;
|
|
16
|
+
/** Ignored — Ctrl+C always exits */
|
|
17
|
+
exitOnCtrlC?: boolean;
|
|
18
|
+
/** Ignored */
|
|
19
|
+
incrementalRendering?: boolean;
|
|
20
|
+
/** Target frames per second for the render loop. Default: 60 */
|
|
21
|
+
maxFps?: number;
|
|
22
|
+
/** Ignored — the native renderer always patches console */
|
|
23
|
+
patchConsole?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Return value of render() — Ink-compatible instance handle */
|
|
26
|
+
export interface Instance {
|
|
27
|
+
/** Internal: direct app access */
|
|
28
|
+
app: TuiApp;
|
|
29
|
+
/** Internal: input parser */
|
|
30
|
+
input: InputParser;
|
|
31
|
+
rerender: (element: React.ReactElement) => void;
|
|
32
|
+
unmount: () => void;
|
|
33
|
+
waitUntilExit: () => Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export declare function render(element: React.ReactElement, options?: RenderOptions): Instance;
|
|
36
|
+
export interface InlineInstance {
|
|
37
|
+
/** Unmount the React tree and stop the render loop */
|
|
38
|
+
unmount: () => void;
|
|
39
|
+
/** Resolves when the loop exits */
|
|
40
|
+
waitUntilExit: () => Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Render a React element inline — no alternate screen. The UI appears
|
|
44
|
+
* directly below the current shell prompt and stays in terminal scrollback
|
|
45
|
+
* on exit (or is destroyed if `onExit: 'destroy'` is set).
|
|
46
|
+
*
|
|
47
|
+
* The root Box is sized to `cols × rows`. Use `useInput` and `useApp`
|
|
48
|
+
* exactly as in a full-screen render.
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* const { waitUntilExit } = renderInline(<Picker />, { rows: 12, onExit: 'destroy' })
|
|
52
|
+
* await waitUntilExit()
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function renderInline(element: React.ReactElement, options?: InlineOptions & {
|
|
56
|
+
maxFps?: number;
|
|
57
|
+
}): InlineInstance;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface RenderToStringOptions {
|
|
3
|
+
/** Width of the virtual terminal in columns. @default 80 */
|
|
4
|
+
columns?: number;
|
|
5
|
+
/** Height of the virtual terminal in rows. @default 24 */
|
|
6
|
+
rows?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Render a React element to a plain string synchronously.
|
|
10
|
+
* No TTY, no stdin, no alternate screen — pure layout + buffer read-back.
|
|
11
|
+
*
|
|
12
|
+
* Useful for testing, documentation generation, and any scenario where
|
|
13
|
+
* you need rendered output as a string without a live terminal.
|
|
14
|
+
*
|
|
15
|
+
* Notes:
|
|
16
|
+
* - Terminal hooks (useInput, useApp, useStdin, useStdout, useStderr,
|
|
17
|
+
* useFocus, useFocusManager) return safe no-op defaults — they do not throw.
|
|
18
|
+
* - useEffect callbacks run but state updates they trigger do not affect output.
|
|
19
|
+
* - useLayoutEffect callbacks fire synchronously and DO affect output.
|
|
20
|
+
*/
|
|
21
|
+
export declare function renderToString(element: React.ReactElement, options?: RenderToStringOptions): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export type StaticProps<T> = {
|
|
4
|
+
/**
|
|
5
|
+
* Render function called for each item. Must assign a unique `key` to the
|
|
6
|
+
* root element returned.
|
|
7
|
+
*/
|
|
8
|
+
readonly children: (item: T, index: number) => ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* Array of items to render. Only newly-added items are rendered into the layout —
|
|
11
|
+
* previously rendered items are frozen (never re-rendered or cleared).
|
|
12
|
+
* Ideal for streaming output: completed tasks, log lines, test results.
|
|
13
|
+
*/
|
|
14
|
+
readonly items: T[];
|
|
15
|
+
/**
|
|
16
|
+
* Optional styles for the static container Box.
|
|
17
|
+
*/
|
|
18
|
+
readonly style?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* `<Static>` permanently renders its output above the dynamic UI.
|
|
22
|
+
*
|
|
23
|
+
* Items are rendered once and frozen — they are never re-rendered or cleared.
|
|
24
|
+
* New items appended to `items` are rendered incrementally and accumulate
|
|
25
|
+
* in the layout above the dynamic content.
|
|
26
|
+
*
|
|
27
|
+
* Matches the Ink `<Static>` API exactly.
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <Static items={completedTasks}>
|
|
31
|
+
* {task => (
|
|
32
|
+
* <Box key={task.id}>
|
|
33
|
+
* <Text color="green">✔ {task.title}</Text>
|
|
34
|
+
* </Box>
|
|
35
|
+
* )}
|
|
36
|
+
* </Static>
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function Static<T>({ children: renderItem, items, style }: StaticProps<T>): React.ReactElement;
|