@effect-tui/react 0.1.3 → 0.1.5
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/dist/jsx-runtime.d.ts +13 -0
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/src/codeblock.d.ts.map +1 -1
- package/dist/src/codeblock.js.map +1 -1
- package/dist/src/components/Divider.d.ts +18 -0
- package/dist/src/components/Divider.d.ts.map +1 -0
- package/dist/src/components/Divider.js +17 -0
- package/dist/src/components/Divider.js.map +1 -0
- package/dist/src/components/Markdown.d.ts +66 -0
- package/dist/src/components/Markdown.d.ts.map +1 -0
- package/dist/src/components/Markdown.js +226 -0
- package/dist/src/components/Markdown.js.map +1 -0
- package/dist/src/components/MultilineTextInput.d.ts +65 -0
- package/dist/src/components/MultilineTextInput.d.ts.map +1 -0
- package/dist/src/components/MultilineTextInput.js +607 -0
- package/dist/src/components/MultilineTextInput.js.map +1 -0
- package/dist/src/components/Overlay.d.ts +46 -0
- package/dist/src/components/Overlay.d.ts.map +1 -0
- package/dist/src/components/Overlay.js +11 -0
- package/dist/src/components/Overlay.js.map +1 -0
- package/dist/src/components/Static.d.ts +44 -0
- package/dist/src/components/Static.d.ts.map +1 -0
- package/dist/src/components/Static.js +53 -0
- package/dist/src/components/Static.js.map +1 -0
- package/dist/src/components/TextInput.d.ts +55 -0
- package/dist/src/components/TextInput.d.ts.map +1 -0
- package/dist/src/components/TextInput.js +277 -0
- package/dist/src/components/TextInput.js.map +1 -0
- package/dist/src/components/index.d.ts +7 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js +7 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/components/text-editing.d.ts +62 -0
- package/dist/src/components/text-editing.d.ts.map +1 -0
- package/dist/src/components/text-editing.js +385 -0
- package/dist/src/components/text-editing.js.map +1 -0
- package/dist/src/console/ConsoleCapture.d.ts +36 -0
- package/dist/src/console/ConsoleCapture.d.ts.map +1 -0
- package/dist/src/console/ConsoleCapture.js +210 -0
- package/dist/src/console/ConsoleCapture.js.map +1 -0
- package/dist/src/console/ConsolePopover.d.ts +18 -0
- package/dist/src/console/ConsolePopover.d.ts.map +1 -0
- package/dist/src/console/ConsolePopover.js +324 -0
- package/dist/src/console/ConsolePopover.js.map +1 -0
- package/dist/src/console/clipboard.d.ts +10 -0
- package/dist/src/console/clipboard.d.ts.map +1 -0
- package/dist/src/console/clipboard.js +74 -0
- package/dist/src/console/clipboard.js.map +1 -0
- package/dist/src/console/index.d.ts +5 -0
- package/dist/src/console/index.d.ts.map +1 -0
- package/dist/src/console/index.js +33 -0
- package/dist/src/console/index.js.map +1 -0
- package/dist/src/console/useConsole.d.ts +44 -0
- package/dist/src/console/useConsole.d.ts.map +1 -0
- package/dist/src/console/useConsole.js +91 -0
- package/dist/src/console/useConsole.js.map +1 -0
- package/dist/src/debug/DebugOverlay.d.ts +49 -0
- package/dist/src/debug/DebugOverlay.d.ts.map +1 -0
- package/dist/src/debug/DebugOverlay.js +438 -0
- package/dist/src/debug/DebugOverlay.js.map +1 -0
- package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -1
- package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
- package/dist/src/dev/Toast.d.ts +19 -0
- package/dist/src/dev/Toast.d.ts.map +1 -0
- package/dist/src/dev/Toast.js +72 -0
- package/dist/src/dev/Toast.js.map +1 -0
- package/dist/src/dev/index.d.ts +2 -0
- package/dist/src/dev/index.d.ts.map +1 -0
- package/dist/src/dev/index.js +3 -0
- package/dist/src/dev/index.js.map +1 -0
- package/dist/src/dev.d.ts +114 -0
- package/dist/src/dev.d.ts.map +1 -0
- package/dist/src/dev.js +373 -0
- package/dist/src/dev.js.map +1 -0
- package/dist/src/highlight.d.ts +3 -3
- package/dist/src/highlight.d.ts.map +1 -1
- package/dist/src/highlight.js.map +1 -1
- package/dist/src/hmr-plugin.d.ts +2 -0
- package/dist/src/hmr-plugin.d.ts.map +1 -0
- package/dist/src/hmr-plugin.js +53 -0
- package/dist/src/hmr-plugin.js.map +1 -0
- package/dist/src/hooks/index.d.ts +4 -0
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +2 -0
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/use-keyboard.d.ts +11 -0
- package/dist/src/hooks/use-keyboard.d.ts.map +1 -1
- package/dist/src/hooks/use-keyboard.js +22 -4
- package/dist/src/hooks/use-keyboard.js.map +1 -1
- package/dist/src/hooks/use-mouse.d.ts +24 -0
- package/dist/src/hooks/use-mouse.d.ts.map +1 -0
- package/dist/src/hooks/use-mouse.js +41 -0
- package/dist/src/hooks/use-mouse.js.map +1 -0
- package/dist/src/hooks/use-paste.d.ts +11 -0
- package/dist/src/hooks/use-paste.d.ts.map +1 -1
- package/dist/src/hooks/use-paste.js +17 -3
- package/dist/src/hooks/use-paste.js.map +1 -1
- package/dist/src/hooks/use-scroll.d.ts +79 -0
- package/dist/src/hooks/use-scroll.d.ts.map +1 -0
- package/dist/src/hooks/use-scroll.js +239 -0
- package/dist/src/hooks/use-scroll.js.map +1 -0
- package/dist/src/hooks/useFrameStats.js.map +1 -1
- package/dist/src/hosts/base.d.ts +62 -1
- package/dist/src/hosts/base.d.ts.map +1 -1
- package/dist/src/hosts/base.js +118 -5
- package/dist/src/hosts/base.js.map +1 -1
- package/dist/src/hosts/box.d.ts +7 -7
- package/dist/src/hosts/box.d.ts.map +1 -1
- package/dist/src/hosts/box.js +30 -23
- package/dist/src/hosts/box.js.map +1 -1
- package/dist/src/hosts/canvas.d.ts +16 -8
- package/dist/src/hosts/canvas.d.ts.map +1 -1
- package/dist/src/hosts/canvas.js +27 -22
- package/dist/src/hosts/canvas.js.map +1 -1
- package/dist/src/hosts/codeblock.d.ts +7 -7
- package/dist/src/hosts/codeblock.d.ts.map +1 -1
- package/dist/src/hosts/codeblock.js +11 -20
- package/dist/src/hosts/codeblock.js.map +1 -1
- package/dist/src/hosts/flex-container.d.ts +45 -0
- package/dist/src/hosts/flex-container.d.ts.map +1 -0
- package/dist/src/hosts/flex-container.js +90 -0
- package/dist/src/hosts/flex-container.js.map +1 -0
- package/dist/src/hosts/hstack.d.ts +6 -11
- package/dist/src/hosts/hstack.d.ts.map +1 -1
- package/dist/src/hosts/hstack.js +6 -41
- package/dist/src/hosts/hstack.js.map +1 -1
- package/dist/src/hosts/index.d.ts +4 -0
- package/dist/src/hosts/index.d.ts.map +1 -1
- package/dist/src/hosts/index.js +10 -0
- package/dist/src/hosts/index.js.map +1 -1
- package/dist/src/hosts/overlay-item.d.ts +32 -0
- package/dist/src/hosts/overlay-item.d.ts.map +1 -0
- package/dist/src/hosts/overlay-item.js +54 -0
- package/dist/src/hosts/overlay-item.js.map +1 -0
- package/dist/src/hosts/overlay.d.ts +30 -0
- package/dist/src/hosts/overlay.d.ts.map +1 -0
- package/dist/src/hosts/overlay.js +105 -0
- package/dist/src/hosts/overlay.js.map +1 -0
- package/dist/src/hosts/scroll.d.ts +56 -0
- package/dist/src/hosts/scroll.d.ts.map +1 -0
- package/dist/src/hosts/scroll.js +204 -0
- package/dist/src/hosts/scroll.js.map +1 -0
- package/dist/src/hosts/single-child.d.ts +16 -0
- package/dist/src/hosts/single-child.d.ts.map +1 -0
- package/dist/src/hosts/single-child.js +45 -0
- package/dist/src/hosts/single-child.js.map +1 -0
- package/dist/src/hosts/spacer.d.ts.map +1 -1
- package/dist/src/hosts/spacer.js +7 -3
- package/dist/src/hosts/spacer.js.map +1 -1
- package/dist/src/hosts/text.d.ts +9 -6
- package/dist/src/hosts/text.d.ts.map +1 -1
- package/dist/src/hosts/text.js +49 -22
- package/dist/src/hosts/text.js.map +1 -1
- package/dist/src/hosts/vstack.d.ts +6 -11
- package/dist/src/hosts/vstack.d.ts.map +1 -1
- package/dist/src/hosts/vstack.js +6 -41
- package/dist/src/hosts/vstack.js.map +1 -1
- package/dist/src/hosts/zstack.d.ts.map +1 -1
- package/dist/src/hosts/zstack.js +16 -5
- package/dist/src/hosts/zstack.js.map +1 -1
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +10 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/inline/index.d.ts.map +1 -1
- package/dist/src/inline/index.js.map +1 -1
- package/dist/src/motion/color-motion-value.d.ts.map +1 -1
- package/dist/src/motion/color-motion-value.js.map +1 -1
- package/dist/src/motion/color.d.ts +1 -29
- package/dist/src/motion/color.d.ts.map +1 -1
- package/dist/src/motion/color.js +2 -170
- package/dist/src/motion/color.js.map +1 -1
- package/dist/src/motion/color.test.js.map +1 -1
- package/dist/src/motion/event-emitter.d.ts.map +1 -1
- package/dist/src/motion/event-emitter.js.map +1 -1
- package/dist/src/motion/frame.js.map +1 -1
- package/dist/src/motion/hooks.d.ts.map +1 -1
- package/dist/src/motion/hooks.js +8 -3
- package/dist/src/motion/hooks.js.map +1 -1
- package/dist/src/motion/index.d.ts.map +1 -1
- package/dist/src/motion/index.js.map +1 -1
- package/dist/src/motion/motion-value.d.ts.map +1 -1
- package/dist/src/motion/motion-value.js.map +1 -1
- package/dist/src/motion/motion-value.test.js.map +1 -1
- package/dist/src/motion/spring-math.d.ts +6 -1
- package/dist/src/motion/spring-math.d.ts.map +1 -1
- package/dist/src/motion/spring-math.js +6 -1
- package/dist/src/motion/spring-math.js.map +1 -1
- package/dist/src/motion/types.d.ts.map +1 -1
- package/dist/src/motion/types.js.map +1 -1
- package/dist/src/profiler.js.map +1 -1
- package/dist/src/reconciler/host-config.d.ts +5 -5
- package/dist/src/reconciler/host-config.d.ts.map +1 -1
- package/dist/src/reconciler/host-config.js +43 -51
- package/dist/src/reconciler/host-config.js.map +1 -1
- package/dist/src/reconciler/noop-methods.d.ts +29 -0
- package/dist/src/reconciler/noop-methods.d.ts.map +1 -0
- package/dist/src/reconciler/noop-methods.js +43 -0
- package/dist/src/reconciler/noop-methods.js.map +1 -0
- package/dist/src/reconciler/types.d.ts +68 -14
- package/dist/src/reconciler/types.d.ts.map +1 -1
- package/dist/src/remote/Procedures.d.ts +22 -0
- package/dist/src/remote/Procedures.d.ts.map +1 -0
- package/dist/src/remote/Procedures.js +42 -0
- package/dist/src/remote/Procedures.js.map +1 -0
- package/dist/src/remote/Router.d.ts +20 -0
- package/dist/src/remote/Router.d.ts.map +1 -0
- package/dist/src/remote/Router.js +26 -0
- package/dist/src/remote/Router.js.map +1 -0
- package/dist/src/remote/Server.d.ts +6 -0
- package/dist/src/remote/Server.d.ts.map +1 -0
- package/dist/src/remote/Server.js +53 -0
- package/dist/src/remote/Server.js.map +1 -0
- package/dist/src/remote/index.d.ts +18 -0
- package/dist/src/remote/index.d.ts.map +1 -0
- package/dist/src/remote/index.js +74 -0
- package/dist/src/remote/index.js.map +1 -0
- package/dist/src/renderer/core/FrameBuilder.d.ts +18 -0
- package/dist/src/renderer/core/FrameBuilder.d.ts.map +1 -0
- package/dist/src/renderer/core/FrameBuilder.js +38 -0
- package/dist/src/renderer/core/FrameBuilder.js.map +1 -0
- package/dist/src/renderer/core/RendererState.d.ts +41 -0
- package/dist/src/renderer/core/RendererState.d.ts.map +1 -0
- package/dist/src/renderer/core/RendererState.js +70 -0
- package/dist/src/renderer/core/RendererState.js.map +1 -0
- package/dist/src/renderer/core/index.d.ts +3 -0
- package/dist/src/renderer/core/index.d.ts.map +1 -0
- package/dist/src/renderer/core/index.js +3 -0
- package/dist/src/renderer/core/index.js.map +1 -0
- package/dist/src/renderer/input/InputProcessor.d.ts +25 -0
- package/dist/src/renderer/input/InputProcessor.d.ts.map +1 -0
- package/dist/src/renderer/input/InputProcessor.js +81 -0
- package/dist/src/renderer/input/InputProcessor.js.map +1 -0
- package/dist/src/renderer/input/index.d.ts +2 -0
- package/dist/src/renderer/input/index.d.ts.map +1 -0
- package/dist/src/renderer/input/index.js +2 -0
- package/dist/src/renderer/input/index.js.map +1 -0
- package/dist/src/renderer/lifecycle/EventBus.d.ts +41 -0
- package/dist/src/renderer/lifecycle/EventBus.d.ts.map +1 -0
- package/dist/src/renderer/lifecycle/EventBus.js +78 -0
- package/dist/src/renderer/lifecycle/EventBus.js.map +1 -0
- package/dist/src/renderer/lifecycle/ResizeManager.d.ts +34 -0
- package/dist/src/renderer/lifecycle/ResizeManager.d.ts.map +1 -0
- package/dist/src/renderer/lifecycle/ResizeManager.js +47 -0
- package/dist/src/renderer/lifecycle/ResizeManager.js.map +1 -0
- package/dist/src/renderer/lifecycle/TerminalSetup.d.ts +36 -0
- package/dist/src/renderer/lifecycle/TerminalSetup.d.ts.map +1 -0
- package/dist/src/renderer/lifecycle/TerminalSetup.js +82 -0
- package/dist/src/renderer/lifecycle/TerminalSetup.js.map +1 -0
- package/dist/src/renderer/lifecycle/index.d.ts +4 -0
- package/dist/src/renderer/lifecycle/index.d.ts.map +1 -0
- package/dist/src/renderer/lifecycle/index.js +4 -0
- package/dist/src/renderer/lifecycle/index.js.map +1 -0
- package/dist/src/renderer/modes/FullscreenRenderer.d.ts +12 -0
- package/dist/src/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
- package/dist/src/renderer/modes/FullscreenRenderer.js +52 -0
- package/dist/src/renderer/modes/FullscreenRenderer.js.map +1 -0
- package/dist/src/renderer/modes/InlineRenderer.d.ts +25 -0
- package/dist/src/renderer/modes/InlineRenderer.d.ts.map +1 -0
- package/dist/src/renderer/modes/InlineRenderer.js +161 -0
- package/dist/src/renderer/modes/InlineRenderer.js.map +1 -0
- package/dist/src/renderer/modes/RendererMode.d.ts +42 -0
- package/dist/src/renderer/modes/RendererMode.d.ts.map +1 -0
- package/dist/src/renderer/modes/RendererMode.js +2 -0
- package/dist/src/renderer/modes/RendererMode.js.map +1 -0
- package/dist/src/renderer/modes/StaticContentRenderer.d.ts +25 -0
- package/dist/src/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
- package/dist/src/renderer/modes/StaticContentRenderer.js +47 -0
- package/dist/src/renderer/modes/StaticContentRenderer.js.map +1 -0
- package/dist/src/renderer/modes/index.d.ts +5 -0
- package/dist/src/renderer/modes/index.d.ts.map +1 -0
- package/dist/src/renderer/modes/index.js +4 -0
- package/dist/src/renderer/modes/index.js.map +1 -0
- package/dist/src/renderer-context.d.ts +9 -0
- package/dist/src/renderer-context.d.ts.map +1 -0
- package/dist/src/renderer-context.js +22 -0
- package/dist/src/renderer-context.js.map +1 -0
- package/dist/src/renderer-types.d.ts +103 -0
- package/dist/src/renderer-types.d.ts.map +1 -0
- package/dist/src/renderer-types.js +2 -0
- package/dist/src/renderer-types.js.map +1 -0
- package/dist/src/renderer.d.ts +4 -86
- package/dist/src/renderer.d.ts.map +1 -1
- package/dist/src/renderer.js +214 -384
- package/dist/src/renderer.js.map +1 -1
- package/dist/src/test/index.d.ts.map +1 -1
- package/dist/src/test/index.js.map +1 -1
- package/dist/src/test/mock-streams.d.ts.map +1 -1
- package/dist/src/test/mock-streams.js.map +1 -1
- package/dist/src/test/render-tui.d.ts.map +1 -1
- package/dist/src/test/render-tui.js +2 -5
- package/dist/src/test/render-tui.js.map +1 -1
- package/dist/src/trace/SpanTree.d.ts.map +1 -1
- package/dist/src/trace/SpanTree.js +21 -11
- package/dist/src/trace/SpanTree.js.map +1 -1
- package/dist/src/trace/format-value.d.ts +15 -0
- package/dist/src/trace/format-value.d.ts.map +1 -0
- package/dist/src/trace/format-value.js +77 -0
- package/dist/src/trace/format-value.js.map +1 -0
- package/dist/src/trace/index.d.ts.map +1 -1
- package/dist/src/trace/index.js.map +1 -1
- package/dist/src/trace/location.js +1 -1
- package/dist/src/trace/location.js.map +1 -1
- package/dist/src/trace/span-processor.d.ts.map +1 -1
- package/dist/src/trace/span-processor.js.map +1 -1
- package/dist/src/trace/span-state.d.ts +19 -2
- package/dist/src/trace/span-state.d.ts.map +1 -1
- package/dist/src/trace/span-state.js +62 -31
- package/dist/src/trace/span-state.js.map +1 -1
- package/dist/src/trace/tui-logger.js.map +1 -1
- package/dist/src/utils/border.d.ts +1 -1
- package/dist/src/utils/border.d.ts.map +1 -1
- package/dist/src/utils/border.js +6 -0
- package/dist/src/utils/border.js.map +1 -1
- package/dist/src/utils/flex-layout.d.ts +2 -1
- package/dist/src/utils/flex-layout.d.ts.map +1 -1
- package/dist/src/utils/flex-layout.js +22 -33
- package/dist/src/utils/flex-layout.js.map +1 -1
- package/dist/src/utils/index.d.ts +1 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/padding.d.ts.map +1 -1
- package/dist/src/utils/padding.js.map +1 -1
- package/dist/src/utils/styles.d.ts +20 -1
- package/dist/src/utils/styles.d.ts.map +1 -1
- package/dist/src/utils/styles.js +36 -1
- package/dist/src/utils/styles.js.map +1 -1
- package/dist/src/visualize/index.d.ts +8 -19
- package/dist/src/visualize/index.d.ts.map +1 -1
- package/dist/src/visualize/index.js +11 -25
- package/dist/src/visualize/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/jsx-dev-runtime.ts +5 -0
- package/jsx-runtime.ts +54 -0
- package/package.json +124 -92
- package/src/codeblock.tsx +34 -34
- package/src/components/Divider.tsx +23 -0
- package/src/components/Markdown.tsx +380 -0
- package/src/components/MultilineTextInput.tsx +749 -0
- package/src/components/Overlay.tsx +56 -0
- package/src/components/Static.tsx +68 -0
- package/src/components/TextInput.tsx +356 -0
- package/src/components/index.ts +6 -0
- package/src/components/text-editing.ts +464 -0
- package/src/console/ConsoleCapture.ts +272 -0
- package/src/console/ConsolePopover.tsx +487 -0
- package/src/console/clipboard.ts +81 -0
- package/src/console/index.ts +42 -0
- package/src/console/useConsole.ts +129 -0
- package/src/debug/DebugOverlay.ts +557 -0
- package/src/debug/DiagnosticsPanel.tsx +27 -27
- package/src/dev/Toast.tsx +117 -0
- package/src/dev/index.ts +2 -0
- package/src/dev.tsx +489 -0
- package/src/highlight.ts +46 -46
- package/src/hmr-plugin.ts +61 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/use-keyboard.ts +44 -24
- package/src/hooks/use-mouse.ts +51 -0
- package/src/hooks/use-paste.ts +21 -6
- package/src/hooks/use-scroll.ts +386 -0
- package/src/hooks/useFrameStats.ts +17 -17
- package/src/hosts/base.ts +180 -59
- package/src/hosts/box.ts +117 -94
- package/src/hosts/canvas.ts +170 -141
- package/src/hosts/codeblock.ts +117 -133
- package/src/hosts/flex-container.ts +124 -0
- package/src/hosts/hstack.ts +11 -59
- package/src/hosts/index.ts +24 -14
- package/src/hosts/overlay-item.ts +72 -0
- package/src/hosts/overlay.ts +125 -0
- package/src/hosts/scroll.ts +255 -0
- package/src/hosts/single-child.ts +52 -0
- package/src/hosts/spacer.ts +30 -26
- package/src/hosts/text.ts +198 -164
- package/src/hosts/vstack.ts +11 -59
- package/src/hosts/zstack.ts +79 -67
- package/src/index.ts +44 -19
- package/src/inline/index.tsx +123 -123
- package/src/motion/color-motion-value.ts +67 -67
- package/src/motion/color.test.ts +107 -107
- package/src/motion/color.ts +9 -190
- package/src/motion/event-emitter.ts +20 -20
- package/src/motion/frame.ts +35 -35
- package/src/motion/hooks.ts +144 -139
- package/src/motion/index.ts +10 -10
- package/src/motion/motion-value.test.ts +207 -207
- package/src/motion/motion-value.ts +112 -112
- package/src/motion/spring-math.ts +88 -83
- package/src/motion/types.ts +25 -25
- package/src/profiler.ts +50 -50
- package/src/reconciler/host-config.ts +152 -174
- package/src/reconciler/noop-methods.ts +55 -0
- package/src/reconciler/types.ts +112 -46
- package/src/remote/Procedures.ts +52 -0
- package/src/remote/Router.ts +58 -0
- package/src/remote/Server.ts +76 -0
- package/src/remote/index.ts +90 -0
- package/src/renderer/core/FrameBuilder.ts +49 -0
- package/src/renderer/core/RendererState.ts +80 -0
- package/src/renderer/core/index.ts +2 -0
- package/src/renderer/input/InputProcessor.ts +94 -0
- package/src/renderer/input/index.ts +1 -0
- package/src/renderer/lifecycle/EventBus.ts +90 -0
- package/src/renderer/lifecycle/ResizeManager.ts +65 -0
- package/src/renderer/lifecycle/TerminalSetup.ts +105 -0
- package/src/renderer/lifecycle/index.ts +3 -0
- package/src/renderer/modes/FullscreenRenderer.ts +53 -0
- package/src/renderer/modes/InlineRenderer.ts +186 -0
- package/src/renderer/modes/RendererMode.ts +46 -0
- package/src/renderer/modes/StaticContentRenderer.ts +56 -0
- package/src/renderer/modes/index.ts +4 -0
- package/src/renderer-context.ts +27 -0
- package/src/renderer-types.ts +109 -0
- package/src/renderer.ts +392 -642
- package/src/test/index.ts +5 -5
- package/src/test/mock-streams.ts +115 -115
- package/src/test/render-tui.ts +84 -87
- package/src/utils/border.ts +79 -73
- package/src/utils/flex-layout.ts +80 -93
- package/src/utils/index.ts +1 -1
- package/src/utils/padding.ts +27 -27
- package/src/utils/styles.ts +50 -7
- package/src/visualize/index.tsx +225 -240
- package/dist/src/output.d.ts +0 -47
- package/dist/src/output.d.ts.map +0 -1
- package/dist/src/output.js +0 -125
- package/dist/src/output.js.map +0 -1
- package/dist/src/terminal.d.ts +0 -37
- package/dist/src/terminal.d.ts.map +0 -1
- package/dist/src/terminal.js +0 -65
- package/dist/src/terminal.js.map +0 -1
- package/src/output.ts +0 -156
- package/src/terminal.ts +0 -67
- package/src/trace/SpanTree.tsx +0 -195
- package/src/trace/index.tsx +0 -205
- package/src/trace/location.ts +0 -90
- package/src/trace/span-processor.ts +0 -65
- package/src/trace/span-state.ts +0 -286
- package/src/trace/tui-logger.ts +0 -72
package/dist/src/hooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -13,6 +13,17 @@ export type UseKeyboardOptions = {
|
|
|
13
13
|
/**
|
|
14
14
|
* Subscribe to keyboard events.
|
|
15
15
|
* Handler is called for every key press while mounted.
|
|
16
|
+
*
|
|
17
|
+
* Uses a ref internally so you don't need useCallback - the handler
|
|
18
|
+
* always sees the latest props/state without re-subscribing.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* // No useCallback needed - just pass your handler directly
|
|
23
|
+
* useKeyboard((key) => {
|
|
24
|
+
* if (key.name === "enter") submitForm(currentValue)
|
|
25
|
+
* })
|
|
26
|
+
* ```
|
|
16
27
|
*/
|
|
17
28
|
export declare function useKeyboard(handler: (key: KeyMsg) => void, opts?: UseKeyboardOptions): void;
|
|
18
29
|
//# sourceMappingURL=use-keyboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-keyboard.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,MAAM,MAAM,kBAAkB,GAAG;
|
|
1
|
+
{"version":3,"file":"use-keyboard.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,MAAM,MAAM,kBAAkB,GAAG;IAChC,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;IAC9C,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAyB3F"}
|
|
@@ -1,26 +1,44 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
2
|
import { useRenderer } from "../renderer.js";
|
|
3
3
|
/**
|
|
4
4
|
* Subscribe to keyboard events.
|
|
5
5
|
* Handler is called for every key press while mounted.
|
|
6
|
+
*
|
|
7
|
+
* Uses a ref internally so you don't need useCallback - the handler
|
|
8
|
+
* always sees the latest props/state without re-subscribing.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // No useCallback needed - just pass your handler directly
|
|
13
|
+
* useKeyboard((key) => {
|
|
14
|
+
* if (key.name === "enter") submitForm(currentValue)
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
6
17
|
*/
|
|
7
18
|
export function useKeyboard(handler, opts) {
|
|
8
19
|
const renderer = useRenderer();
|
|
9
20
|
const phase = opts?.phase ?? "press";
|
|
10
21
|
const filter = opts?.filter;
|
|
11
22
|
const stopPropagation = opts?.stopPropagation ?? false;
|
|
23
|
+
// Store handler in ref so we always call the latest version
|
|
24
|
+
// without needing to re-subscribe on every render
|
|
25
|
+
const handlerRef = useRef(handler);
|
|
26
|
+
handlerRef.current = handler;
|
|
27
|
+
// Store filter in ref too for same reason
|
|
28
|
+
const filterRef = useRef(filter);
|
|
29
|
+
filterRef.current = filter;
|
|
12
30
|
useEffect(() => {
|
|
13
31
|
const wrapped = (key) => {
|
|
14
32
|
const keyPhase = key.phase ?? "press";
|
|
15
33
|
if (phase !== "any" && phase !== keyPhase)
|
|
16
34
|
return;
|
|
17
|
-
if (
|
|
35
|
+
if (filterRef.current && !filterRef.current(key))
|
|
18
36
|
return;
|
|
19
37
|
if (stopPropagation && key.preventDefault)
|
|
20
38
|
key.preventDefault();
|
|
21
|
-
|
|
39
|
+
handlerRef.current(key);
|
|
22
40
|
};
|
|
23
41
|
return renderer.onKey(wrapped);
|
|
24
|
-
}, [renderer,
|
|
42
|
+
}, [renderer, phase, stopPropagation]);
|
|
25
43
|
}
|
|
26
44
|
//# sourceMappingURL=use-keyboard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-keyboard.js","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"use-keyboard.js","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAc5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,OAA8B,EAAE,IAAyB;IACpF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,OAAO,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAA;IAC3B,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,IAAI,KAAK,CAAA;IAEtD,4DAA4D;IAC5D,kDAAkD;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,0CAA0C;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAA;YACrC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAM;YACjD,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAM;YACxD,IAAI,eAAe,IAAI,GAAG,CAAC,cAAc;gBAAE,GAAG,CAAC,cAAc,EAAE,CAAA;YAC/D,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,CAAA;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MouseMsg, MouseButton } from "@effect-tui/core";
|
|
2
|
+
export type UseMouseOptions = {
|
|
3
|
+
/** Filter by action type */
|
|
4
|
+
action?: "press" | "release" | "drag" | "move" | "any";
|
|
5
|
+
/** Filter by button */
|
|
6
|
+
button?: MouseButton | MouseButton[];
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Subscribe to mouse events.
|
|
10
|
+
* Handler is called for mouse clicks, drags, and scroll while mounted.
|
|
11
|
+
*
|
|
12
|
+
* Uses a ref internally so you don't need useCallback - the handler
|
|
13
|
+
* always sees the latest props/state without re-subscribing.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* // No useCallback needed - just pass your handler directly
|
|
18
|
+
* useMouse((mouse) => {
|
|
19
|
+
* if (mouse.action === "press") handleClick(mouse.x, mouse.y)
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function useMouse(handler: (mouse: MouseMsg) => void, opts?: UseMouseOptions): void;
|
|
24
|
+
//# sourceMappingURL=use-mouse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mouse.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-mouse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG7D,MAAM,MAAM,eAAe,GAAG;IAC7B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IACtD,uBAAuB;IACvB,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAA;CACpC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAwBzF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import { useRenderer } from "../renderer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Subscribe to mouse events.
|
|
5
|
+
* Handler is called for mouse clicks, drags, and scroll while mounted.
|
|
6
|
+
*
|
|
7
|
+
* Uses a ref internally so you don't need useCallback - the handler
|
|
8
|
+
* always sees the latest props/state without re-subscribing.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // No useCallback needed - just pass your handler directly
|
|
13
|
+
* useMouse((mouse) => {
|
|
14
|
+
* if (mouse.action === "press") handleClick(mouse.x, mouse.y)
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function useMouse(handler, opts) {
|
|
19
|
+
const renderer = useRenderer();
|
|
20
|
+
const action = opts?.action ?? "any";
|
|
21
|
+
const button = opts?.button;
|
|
22
|
+
// Store handler in ref so we always call the latest version
|
|
23
|
+
const handlerRef = useRef(handler);
|
|
24
|
+
handlerRef.current = handler;
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const wrapped = (mouse) => {
|
|
27
|
+
// Filter by action
|
|
28
|
+
if (action !== "any" && action !== mouse.action)
|
|
29
|
+
return;
|
|
30
|
+
// Filter by button
|
|
31
|
+
if (button !== undefined) {
|
|
32
|
+
const buttons = Array.isArray(button) ? button : [button];
|
|
33
|
+
if (!buttons.includes(mouse.button))
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
handlerRef.current(mouse);
|
|
37
|
+
};
|
|
38
|
+
return renderer.onMouse(wrapped);
|
|
39
|
+
}, [renderer, action, button]);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=use-mouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mouse.js","sourceRoot":"","sources":["../../../src/hooks/use-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAS5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAkC,EAAE,IAAsB;IAClF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAA;IAE3B,4DAA4D;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE;YACnC,mBAAmB;YACnB,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAM;YAEvD,mBAAmB;YACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;gBACzD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;oBAAE,OAAM;YAC5C,CAAC;YAED,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC,CAAA;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Subscribe to bracketed paste events (if supported by renderer/terminal).
|
|
3
|
+
*
|
|
4
|
+
* Uses a ref internally so you don't need useCallback - the handler
|
|
5
|
+
* always sees the latest props/state without re-subscribing.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // No useCallback needed - just pass your handler directly
|
|
10
|
+
* usePaste((text) => {
|
|
11
|
+
* insertText(text, cursorPosition)
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
3
14
|
*/
|
|
4
15
|
export declare function usePaste(handler: (text: string) => void): void;
|
|
5
16
|
//# sourceMappingURL=use-paste.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-paste.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"use-paste.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAW9D"}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
2
|
import { useRenderer } from "../renderer.js";
|
|
3
3
|
/**
|
|
4
4
|
* Subscribe to bracketed paste events (if supported by renderer/terminal).
|
|
5
|
+
*
|
|
6
|
+
* Uses a ref internally so you don't need useCallback - the handler
|
|
7
|
+
* always sees the latest props/state without re-subscribing.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* // No useCallback needed - just pass your handler directly
|
|
12
|
+
* usePaste((text) => {
|
|
13
|
+
* insertText(text, cursorPosition)
|
|
14
|
+
* })
|
|
15
|
+
* ```
|
|
5
16
|
*/
|
|
6
17
|
export function usePaste(handler) {
|
|
7
18
|
const renderer = useRenderer();
|
|
19
|
+
// Store handler in ref so we always call the latest version
|
|
20
|
+
const handlerRef = useRef(handler);
|
|
21
|
+
handlerRef.current = handler;
|
|
8
22
|
useEffect(() => {
|
|
9
23
|
if (!renderer.onPaste)
|
|
10
24
|
return;
|
|
11
|
-
return renderer.onPaste(
|
|
12
|
-
}, [renderer
|
|
25
|
+
return renderer.onPaste((text) => handlerRef.current(text));
|
|
26
|
+
}, [renderer]);
|
|
13
27
|
}
|
|
14
28
|
//# sourceMappingURL=use-paste.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-paste.js","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"use-paste.js","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,OAA+B;IACvD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,4DAA4D;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5D,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export interface ScrollState {
|
|
2
|
+
/** Current scroll offset (pixels from start) */
|
|
3
|
+
offset: number;
|
|
4
|
+
/** Maximum scroll offset */
|
|
5
|
+
maxOffset: number;
|
|
6
|
+
/** Viewport height (or width for horizontal) */
|
|
7
|
+
viewportSize: number;
|
|
8
|
+
/** Total content size */
|
|
9
|
+
contentSize: number;
|
|
10
|
+
/** Whether we're at the start edge */
|
|
11
|
+
atStart: boolean;
|
|
12
|
+
/** Whether we're at the end edge */
|
|
13
|
+
atEnd: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface UseScrollOptions {
|
|
16
|
+
/** Scroll axis: "vertical" (default) or "horizontal" */
|
|
17
|
+
axis?: "vertical" | "horizontal";
|
|
18
|
+
/** Initial scroll offset */
|
|
19
|
+
initialOffset?: number;
|
|
20
|
+
/** Enable keyboard navigation (default: true) */
|
|
21
|
+
enableKeyboard?: boolean;
|
|
22
|
+
/** Enable mouse wheel (default: true) */
|
|
23
|
+
enableMouseWheel?: boolean;
|
|
24
|
+
/** Enable scroll acceleration (default: true) */
|
|
25
|
+
enableAcceleration?: boolean;
|
|
26
|
+
/** Sticky scroll - auto-scroll to end when content grows (default: false) */
|
|
27
|
+
sticky?: boolean;
|
|
28
|
+
/** Scroll speed for arrow keys (pixels, default: 1) */
|
|
29
|
+
arrowSpeed?: number;
|
|
30
|
+
/** Scroll speed for page up/down (fraction of viewport, default: 0.5) */
|
|
31
|
+
pageSpeed?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface UseScrollReturn {
|
|
34
|
+
/** Current scroll state */
|
|
35
|
+
state: ScrollState;
|
|
36
|
+
/** Set scroll offset directly */
|
|
37
|
+
setOffset: (offset: number) => void;
|
|
38
|
+
/** Scroll by delta pixels */
|
|
39
|
+
scrollBy: (delta: number) => void;
|
|
40
|
+
/** Scroll to start */
|
|
41
|
+
scrollToStart: () => void;
|
|
42
|
+
/** Scroll to end */
|
|
43
|
+
scrollToEnd: () => void;
|
|
44
|
+
/**
|
|
45
|
+
* Scroll to make a position visible in the viewport.
|
|
46
|
+
* Useful for keeping a selected item in view.
|
|
47
|
+
* @param position - The position (row/col index or pixel offset)
|
|
48
|
+
* @param itemSize - Size of each item (default: 1 for row-based lists)
|
|
49
|
+
* @param padding - Extra padding around the item (default: 0)
|
|
50
|
+
*/
|
|
51
|
+
scrollToVisible: (position: number, itemSize?: number, padding?: number) => void;
|
|
52
|
+
/** Props to spread on <scroll> element */
|
|
53
|
+
scrollProps: {
|
|
54
|
+
offset: number;
|
|
55
|
+
axis: "vertical" | "horizontal";
|
|
56
|
+
onContentSize: (width: number, height: number) => void;
|
|
57
|
+
onViewportSize: (width: number, height: number) => void;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Hook for managing scroll state with keyboard/mouse input.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```tsx
|
|
65
|
+
* function ScrollableList({ items }) {
|
|
66
|
+
* const { state, scrollProps } = useScroll({ sticky: true })
|
|
67
|
+
*
|
|
68
|
+
* return (
|
|
69
|
+
* <scroll {...scrollProps}>
|
|
70
|
+
* <vstack>
|
|
71
|
+
* {items.map(item => <text key={item.id}>{item.text}</text>)}
|
|
72
|
+
* </vstack>
|
|
73
|
+
* </scroll>
|
|
74
|
+
* )
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function useScroll(options?: UseScrollOptions): UseScrollReturn;
|
|
79
|
+
//# sourceMappingURL=use-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-scroll.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-scroll.ts"],"names":[],"mappings":"AAqFA,MAAM,WAAW,WAAW;IAC3B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,oCAAoC;IACpC,KAAK,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAChC,wDAAwD;IACxD,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IAChC,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iDAAiD;IACjD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAA;IAClB,iCAAiC;IACjC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,6BAA6B;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,sBAAsB;IACtB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,oBAAoB;IACpB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB;;;;;;OAMG;IACH,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAChF,0CAA0C;IAC1C,WAAW,EAAE;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,UAAU,GAAG,YAAY,CAAA;QAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;QACtD,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;KACvD,CAAA;CACD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA4NzE"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// use-scroll.ts — Hook for managing scroll state with keyboard/mouse input
|
|
2
|
+
import { useState, useCallback, useRef, useMemo, useLayoutEffect } from "react";
|
|
3
|
+
import { useKeyboard } from "./use-keyboard.js";
|
|
4
|
+
import { useTerminalSize } from "../renderer.js";
|
|
5
|
+
/**
|
|
6
|
+
* macOS-inspired scroll acceleration.
|
|
7
|
+
* Tracks velocity via moving window of tick intervals.
|
|
8
|
+
* Fast scrolling gets progressively faster.
|
|
9
|
+
*/
|
|
10
|
+
class MacOSScrollAccel {
|
|
11
|
+
opts;
|
|
12
|
+
lastTickTime = 0;
|
|
13
|
+
velocityHistory = [];
|
|
14
|
+
historySize = 3;
|
|
15
|
+
streakTimeout = 150;
|
|
16
|
+
// Some terminals send duplicate ticks ~4ms apart (Ghostty workaround)
|
|
17
|
+
minTickInterval = 6;
|
|
18
|
+
constructor(opts = {}) {
|
|
19
|
+
this.opts = opts;
|
|
20
|
+
}
|
|
21
|
+
tick(now = Date.now()) {
|
|
22
|
+
const A = this.opts.A ?? 0.8;
|
|
23
|
+
const tau = this.opts.tau ?? 3;
|
|
24
|
+
const maxMultiplier = this.opts.maxMultiplier ?? 6;
|
|
25
|
+
const dt = this.lastTickTime ? now - this.lastTickTime : Infinity;
|
|
26
|
+
// Reset if too much time passed
|
|
27
|
+
if (dt === Infinity || dt > this.streakTimeout) {
|
|
28
|
+
this.lastTickTime = now;
|
|
29
|
+
this.velocityHistory = [];
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
// Ignore duplicate ticks (terminal quirks)
|
|
33
|
+
if (dt < this.minTickInterval) {
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
this.lastTickTime = now;
|
|
37
|
+
this.velocityHistory.push(dt);
|
|
38
|
+
if (this.velocityHistory.length > this.historySize) {
|
|
39
|
+
this.velocityHistory.shift();
|
|
40
|
+
}
|
|
41
|
+
// Calculate average interval (lower = faster scrolling)
|
|
42
|
+
const avgInterval = this.velocityHistory.reduce((a, b) => a + b, 0) / this.velocityHistory.length;
|
|
43
|
+
// Convert to velocity: faster ticks = higher velocity
|
|
44
|
+
const referenceInterval = 100;
|
|
45
|
+
const velocity = referenceInterval / avgInterval;
|
|
46
|
+
// Apply exponential curve
|
|
47
|
+
const x = velocity / tau;
|
|
48
|
+
const multiplier = 1 + A * (Math.exp(x) - 1);
|
|
49
|
+
return Math.min(multiplier, maxMultiplier);
|
|
50
|
+
}
|
|
51
|
+
reset() {
|
|
52
|
+
this.lastTickTime = 0;
|
|
53
|
+
this.velocityHistory = [];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hook for managing scroll state with keyboard/mouse input.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```tsx
|
|
61
|
+
* function ScrollableList({ items }) {
|
|
62
|
+
* const { state, scrollProps } = useScroll({ sticky: true })
|
|
63
|
+
*
|
|
64
|
+
* return (
|
|
65
|
+
* <scroll {...scrollProps}>
|
|
66
|
+
* <vstack>
|
|
67
|
+
* {items.map(item => <text key={item.id}>{item.text}</text>)}
|
|
68
|
+
* </vstack>
|
|
69
|
+
* </scroll>
|
|
70
|
+
* )
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export function useScroll(options = {}) {
|
|
75
|
+
const { axis = "vertical", initialOffset = 0, enableKeyboard = true, enableMouseWheel = true, enableAcceleration = true, sticky = false, arrowSpeed = 1, pageSpeed = 0.5, } = options;
|
|
76
|
+
const { width: termWidth, height: termHeight } = useTerminalSize();
|
|
77
|
+
// Scroll state
|
|
78
|
+
const [offset, setOffsetRaw] = useState(initialOffset);
|
|
79
|
+
const [contentSize, setContentSize] = useState(0);
|
|
80
|
+
// Use terminal size as initial estimate, but scroll component will report actual size
|
|
81
|
+
const [viewportSize, setViewportSize] = useState(axis === "vertical" ? termHeight : termWidth);
|
|
82
|
+
// Refs for sticky scroll behavior
|
|
83
|
+
const wasAtEndRef = useRef(sticky);
|
|
84
|
+
const prevContentSizeRef = useRef(0);
|
|
85
|
+
// Scroll acceleration
|
|
86
|
+
const accel = useMemo(() => (enableAcceleration ? new MacOSScrollAccel() : { tick: () => 1, reset: () => { } }), [enableAcceleration]);
|
|
87
|
+
// Fractional accumulator for smooth sub-pixel scrolling
|
|
88
|
+
const accumulatorRef = useRef(0);
|
|
89
|
+
// Ref for scrollToVisible so it doesn't change on every scroll
|
|
90
|
+
const offsetRef = useRef(offset);
|
|
91
|
+
offsetRef.current = offset;
|
|
92
|
+
// Calculate derived state
|
|
93
|
+
const maxOffset = Math.max(0, contentSize - viewportSize);
|
|
94
|
+
const atStart = offset <= 0;
|
|
95
|
+
const atEnd = offset >= maxOffset;
|
|
96
|
+
// Clamp and set offset
|
|
97
|
+
const setOffset = useCallback((newOffset) => {
|
|
98
|
+
const clamped = Math.max(0, Math.min(maxOffset, newOffset));
|
|
99
|
+
setOffsetRaw(clamped);
|
|
100
|
+
// Track if we're at end for sticky behavior
|
|
101
|
+
wasAtEndRef.current = clamped >= maxOffset - 1;
|
|
102
|
+
}, [maxOffset]);
|
|
103
|
+
// Scroll by delta with accumulator for fractional scrolling
|
|
104
|
+
const scrollBy = useCallback((delta) => {
|
|
105
|
+
accumulatorRef.current += delta;
|
|
106
|
+
const integerDelta = Math.trunc(accumulatorRef.current);
|
|
107
|
+
if (integerDelta !== 0) {
|
|
108
|
+
setOffset(offset + integerDelta);
|
|
109
|
+
accumulatorRef.current -= integerDelta;
|
|
110
|
+
}
|
|
111
|
+
}, [offset, setOffset]);
|
|
112
|
+
const scrollToStart = useCallback(() => {
|
|
113
|
+
setOffset(0);
|
|
114
|
+
accumulatorRef.current = 0;
|
|
115
|
+
accel.reset();
|
|
116
|
+
}, [setOffset, accel]);
|
|
117
|
+
const scrollToEnd = useCallback(() => {
|
|
118
|
+
setOffset(maxOffset);
|
|
119
|
+
accumulatorRef.current = 0;
|
|
120
|
+
accel.reset();
|
|
121
|
+
}, [setOffset, maxOffset, accel]);
|
|
122
|
+
// Handle content size changes (for sticky scroll)
|
|
123
|
+
const handleContentSize = useCallback((width, height) => {
|
|
124
|
+
const newSize = axis === "vertical" ? height : width;
|
|
125
|
+
setContentSize(newSize);
|
|
126
|
+
prevContentSizeRef.current = newSize;
|
|
127
|
+
}, [axis]);
|
|
128
|
+
// Synchronous sticky scroll: snap to end when content grows
|
|
129
|
+
// useLayoutEffect runs synchronously after React commit but before paint
|
|
130
|
+
useLayoutEffect(() => {
|
|
131
|
+
if (!sticky)
|
|
132
|
+
return;
|
|
133
|
+
const newMaxOffset = Math.max(0, contentSize - viewportSize);
|
|
134
|
+
if (wasAtEndRef.current && contentSize > 0) {
|
|
135
|
+
setOffsetRaw(newMaxOffset);
|
|
136
|
+
}
|
|
137
|
+
}, [sticky, contentSize, viewportSize]);
|
|
138
|
+
// Handle viewport size changes (reported by scroll component)
|
|
139
|
+
const handleViewportSize = useCallback((width, height) => {
|
|
140
|
+
const newSize = axis === "vertical" ? height : width;
|
|
141
|
+
setViewportSize(newSize);
|
|
142
|
+
}, [axis]);
|
|
143
|
+
// Keyboard handler
|
|
144
|
+
const handleKey = useCallback((key) => {
|
|
145
|
+
// Mouse wheel comes as pageup/pagedown with meta=true
|
|
146
|
+
// Handle separately from keyboard since enableKeyboard shouldn't disable mouse
|
|
147
|
+
if (key.meta && enableMouseWheel && (key.name === "pageup" || key.name === "pagedown")) {
|
|
148
|
+
const multiplier = accel.tick();
|
|
149
|
+
const delta = Math.ceil(arrowSpeed * multiplier);
|
|
150
|
+
scrollBy(key.name === "pageup" ? -delta : delta);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!enableKeyboard)
|
|
154
|
+
return;
|
|
155
|
+
const isVertical = axis === "vertical";
|
|
156
|
+
const upKey = isVertical ? "up" : "left";
|
|
157
|
+
const downKey = isVertical ? "down" : "right";
|
|
158
|
+
switch (key.name) {
|
|
159
|
+
case upKey:
|
|
160
|
+
scrollBy(-arrowSpeed);
|
|
161
|
+
break;
|
|
162
|
+
case downKey:
|
|
163
|
+
scrollBy(arrowSpeed);
|
|
164
|
+
break;
|
|
165
|
+
case "pageup":
|
|
166
|
+
scrollBy(-Math.floor(viewportSize * pageSpeed));
|
|
167
|
+
break;
|
|
168
|
+
case "pagedown":
|
|
169
|
+
scrollBy(Math.floor(viewportSize * pageSpeed));
|
|
170
|
+
break;
|
|
171
|
+
case "home":
|
|
172
|
+
scrollToStart();
|
|
173
|
+
break;
|
|
174
|
+
case "end":
|
|
175
|
+
scrollToEnd();
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}, [
|
|
179
|
+
enableKeyboard,
|
|
180
|
+
axis,
|
|
181
|
+
arrowSpeed,
|
|
182
|
+
pageSpeed,
|
|
183
|
+
viewportSize,
|
|
184
|
+
enableMouseWheel,
|
|
185
|
+
accel,
|
|
186
|
+
scrollBy,
|
|
187
|
+
scrollToStart,
|
|
188
|
+
scrollToEnd,
|
|
189
|
+
]);
|
|
190
|
+
useKeyboard(handleKey);
|
|
191
|
+
// Scroll to make a position visible (for keeping selection in view)
|
|
192
|
+
// Uses refs to avoid changing on every scroll - only triggers when selection changes
|
|
193
|
+
const scrollToVisible = useCallback((position, itemSize = 1, padding = 0) => {
|
|
194
|
+
const currentOffset = offsetRef.current;
|
|
195
|
+
const itemStart = position * itemSize;
|
|
196
|
+
const itemEnd = itemStart + itemSize;
|
|
197
|
+
// If item is above viewport, scroll up to show it
|
|
198
|
+
if (itemStart < currentOffset + padding) {
|
|
199
|
+
setOffset(Math.max(0, itemStart - padding));
|
|
200
|
+
}
|
|
201
|
+
// If item is below viewport, scroll down to show it
|
|
202
|
+
else if (itemEnd > currentOffset + viewportSize - padding) {
|
|
203
|
+
const currentMaxOffset = Math.max(0, contentSize - viewportSize);
|
|
204
|
+
setOffset(Math.min(currentMaxOffset, itemEnd - viewportSize + padding));
|
|
205
|
+
}
|
|
206
|
+
}, [viewportSize, contentSize, setOffset]);
|
|
207
|
+
const state = {
|
|
208
|
+
offset,
|
|
209
|
+
maxOffset,
|
|
210
|
+
viewportSize,
|
|
211
|
+
contentSize,
|
|
212
|
+
atStart,
|
|
213
|
+
atEnd,
|
|
214
|
+
};
|
|
215
|
+
// Handle effective offset sync from host (when sticky adjusts the offset)
|
|
216
|
+
const handleEffectiveOffset = useCallback((effectiveOffset) => {
|
|
217
|
+
// Sync the ref so scrollToVisible uses the actual rendered position
|
|
218
|
+
offsetRef.current = effectiveOffset;
|
|
219
|
+
// Also update state to keep in sync (but don't trigger wasAtEnd change)
|
|
220
|
+
setOffsetRaw(effectiveOffset);
|
|
221
|
+
}, []);
|
|
222
|
+
const scrollProps = {
|
|
223
|
+
offset,
|
|
224
|
+
axis,
|
|
225
|
+
onContentSize: handleContentSize,
|
|
226
|
+
onViewportSize: handleViewportSize,
|
|
227
|
+
onEffectiveOffset: handleEffectiveOffset,
|
|
228
|
+
};
|
|
229
|
+
return {
|
|
230
|
+
state,
|
|
231
|
+
setOffset,
|
|
232
|
+
scrollBy,
|
|
233
|
+
scrollToStart,
|
|
234
|
+
scrollToEnd,
|
|
235
|
+
scrollToVisible,
|
|
236
|
+
scrollProps,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=use-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-scroll.js","sourceRoot":"","sources":["../../../src/hooks/use-scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFrameStats.js","sourceRoot":"","sources":["../../../src/hooks/useFrameStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,GAAG;
|
|
1
|
+
{"version":3,"file":"useFrameStats.js","sourceRoot":"","sources":["../../../src/hooks/useFrameStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,GAAG;IAC3C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAA;IAE3D,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,QAAQ,CAAC,YAAY;YAAE,OAAM;QAElC,IAAI,IAAI,GAAsB,IAAI,CAAA;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;YACzC,IAAI,GAAG,CAAC,CAAA;QACT,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC3B,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,EAAE,QAAQ,CAAC,CAAA;QAEZ,OAAO,GAAG,EAAE;YACX,aAAa,CAAC,EAAE,CAAC,CAAA;YACjB,KAAK,EAAE,EAAE,CAAA;QACV,CAAC,CAAA;IACF,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAExB,OAAO,KAAK,CAAA;AACb,CAAC"}
|
package/dist/src/hosts/base.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import type { CellBuffer, Palette } from "@effect-tui/core";
|
|
1
|
+
import type { CellBuffer, Palette, Color } from "@effect-tui/core";
|
|
2
2
|
import type { HostInstance, Rect, Size, HostContext, CommonProps } from "../reconciler/types.js";
|
|
3
|
+
/** Host that may have a background color (e.g., BoxHost) */
|
|
4
|
+
export interface HostWithBg extends HostInstance {
|
|
5
|
+
bg?: Color;
|
|
6
|
+
}
|
|
7
|
+
/** Walk up parent chain to find inherited background color */
|
|
8
|
+
export declare function getInheritedBg(startParent: HostInstance | null): Color | undefined;
|
|
3
9
|
export declare abstract class BaseHost implements HostInstance {
|
|
4
10
|
id: string;
|
|
5
11
|
type: string;
|
|
@@ -8,11 +14,66 @@ export declare abstract class BaseHost implements HostInstance {
|
|
|
8
14
|
rect: Rect | null;
|
|
9
15
|
flexGrow: number;
|
|
10
16
|
flexShrink: number;
|
|
17
|
+
frameWidth?: number;
|
|
18
|
+
frameHeight?: number;
|
|
19
|
+
frameMinWidth?: number;
|
|
20
|
+
frameMaxWidth?: number;
|
|
21
|
+
frameMinHeight?: number;
|
|
22
|
+
frameMaxHeight?: number;
|
|
23
|
+
/** @internal Marks this node as static content (for Static component) */
|
|
24
|
+
__static?: boolean;
|
|
11
25
|
protected ctx: HostContext;
|
|
12
26
|
constructor(type: string, props: CommonProps, ctx: HostContext);
|
|
13
27
|
abstract measure(maxW: number, maxH: number): Size;
|
|
14
28
|
abstract render(buffer: CellBuffer, palette: Palette): void;
|
|
15
29
|
layout(rect: Rect): void;
|
|
30
|
+
/**
|
|
31
|
+
* Apply frame constraints to a proposed size before passing to children.
|
|
32
|
+
*
|
|
33
|
+
* This is the first half of SwiftUI-style frame semantics. When a parent
|
|
34
|
+
* proposes a size to us, we modify it based on our constraints before
|
|
35
|
+
* passing it down to our children.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```
|
|
39
|
+
* Parent proposes: 100x100
|
|
40
|
+
* Our height constraint: 10
|
|
41
|
+
* We propose to children: 100x10
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* This prevents greedy children (like scroll) from measuring larger than
|
|
45
|
+
* our constrained size.
|
|
46
|
+
*
|
|
47
|
+
* @param maxW - Width proposed by parent
|
|
48
|
+
* @param maxH - Height proposed by parent
|
|
49
|
+
* @returns Constrained size to propose to children
|
|
50
|
+
*/
|
|
51
|
+
protected constrainProposal(maxW: number, maxH: number): {
|
|
52
|
+
w: number;
|
|
53
|
+
h: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Apply frame constraints to our measured size before returning to parent.
|
|
57
|
+
*
|
|
58
|
+
* This is the second half of SwiftUI-style frame semantics. After measuring
|
|
59
|
+
* our children, we modify our reported size based on our constraints before
|
|
60
|
+
* returning it to our parent.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```
|
|
64
|
+
* Children measured: 5x1 (small content)
|
|
65
|
+
* Our height constraint: 10
|
|
66
|
+
* We report to parent: 5x10
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* This ensures we report our constrained size regardless of children's
|
|
70
|
+
* natural size, which is essential for layout composition (e.g., spacer
|
|
71
|
+
* needs to know our fixed size to calculate remaining space).
|
|
72
|
+
*
|
|
73
|
+
* @param size - Natural size from measuring children
|
|
74
|
+
* @returns Constrained size to report to parent
|
|
75
|
+
*/
|
|
76
|
+
protected constrainResult(size: Size): Size;
|
|
16
77
|
updateProps(props: Record<string, unknown>): void;
|
|
17
78
|
destroy(): void;
|
|
18
79
|
appendChild(child: HostInstance): void;
|