@effect-tui/react 0.15.2 → 2.0.0
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/README.md +11 -2
- package/dist/src/codeblock.d.ts +1 -1
- package/dist/src/codeblock.d.ts.map +1 -1
- package/dist/src/codeblock.js +2 -2
- package/dist/src/codeblock.js.map +1 -1
- package/dist/src/components/ListView.d.ts +4 -4
- package/dist/src/components/ListView.d.ts.map +1 -1
- package/dist/src/components/ListView.js +16 -17
- package/dist/src/components/ListView.js.map +1 -1
- package/dist/src/components/Markdown.js +3 -3
- package/dist/src/components/Markdown.js.map +1 -1
- package/dist/src/components/MultilineTextInput.d.ts.map +1 -1
- package/dist/src/components/MultilineTextInput.js +133 -305
- package/dist/src/components/MultilineTextInput.js.map +1 -1
- package/dist/src/components/TextInput.d.ts.map +1 -1
- package/dist/src/components/TextInput.js +51 -98
- package/dist/src/components/TextInput.js.map +1 -1
- package/dist/src/components/text-editing.d.ts +61 -0
- package/dist/src/components/text-editing.d.ts.map +1 -1
- package/dist/src/components/text-editing.js +131 -0
- package/dist/src/components/text-editing.js.map +1 -1
- package/dist/src/console/ConsolePopover.d.ts +7 -1
- package/dist/src/console/ConsolePopover.d.ts.map +1 -1
- package/dist/src/console/ConsolePopover.js +55 -74
- package/dist/src/console/ConsolePopover.js.map +1 -1
- package/dist/src/debug/DebugOverlay.d.ts.map +1 -1
- package/dist/src/debug/DebugOverlay.js +3 -57
- package/dist/src/debug/DebugOverlay.js.map +1 -1
- package/dist/src/debug/DiagnosticsPanel.js +1 -1
- package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
- package/dist/src/dev.d.ts +5 -117
- package/dist/src/dev.d.ts.map +1 -1
- package/dist/src/dev.js +3 -333
- package/dist/src/dev.js.map +1 -1
- package/dist/src/hooks/use-scroll.d.ts +31 -35
- package/dist/src/hooks/use-scroll.d.ts.map +1 -1
- package/dist/src/hooks/use-scroll.js +51 -90
- package/dist/src/hooks/use-scroll.js.map +1 -1
- package/dist/src/hosts/base.d.ts +13 -2
- package/dist/src/hosts/base.d.ts.map +1 -1
- package/dist/src/hosts/base.js +74 -2
- package/dist/src/hosts/base.js.map +1 -1
- package/dist/src/hosts/box.d.ts +2 -2
- package/dist/src/hosts/box.d.ts.map +1 -1
- package/dist/src/hosts/box.js +29 -2
- package/dist/src/hosts/box.js.map +1 -1
- package/dist/src/hosts/canvas.d.ts +24 -4
- package/dist/src/hosts/canvas.d.ts.map +1 -1
- package/dist/src/hosts/canvas.js +107 -41
- package/dist/src/hosts/canvas.js.map +1 -1
- package/dist/src/hosts/codeblock.d.ts +10 -12
- package/dist/src/hosts/codeblock.d.ts.map +1 -1
- package/dist/src/hosts/codeblock.js +38 -35
- package/dist/src/hosts/codeblock.js.map +1 -1
- package/dist/src/hosts/flex-container.d.ts +3 -3
- package/dist/src/hosts/flex-container.d.ts.map +1 -1
- package/dist/src/hosts/flex-container.js +20 -5
- package/dist/src/hosts/flex-container.js.map +1 -1
- package/dist/src/hosts/index.d.ts +3 -2
- package/dist/src/hosts/index.d.ts.map +1 -1
- package/dist/src/hosts/index.js +2 -1
- package/dist/src/hosts/index.js.map +1 -1
- package/dist/src/hosts/layout-helpers.d.ts +10 -0
- package/dist/src/hosts/layout-helpers.d.ts.map +1 -0
- package/dist/src/hosts/layout-helpers.js +10 -0
- package/dist/src/hosts/layout-helpers.js.map +1 -0
- package/dist/src/hosts/leaf.d.ts +14 -0
- package/dist/src/hosts/leaf.d.ts.map +1 -0
- package/dist/src/hosts/leaf.js +31 -0
- package/dist/src/hosts/leaf.js.map +1 -0
- package/dist/src/hosts/overlay-item.d.ts +2 -2
- package/dist/src/hosts/overlay-item.d.ts.map +1 -1
- package/dist/src/hosts/overlay-item.js +7 -2
- package/dist/src/hosts/overlay-item.js.map +1 -1
- package/dist/src/hosts/overlay.d.ts +2 -2
- package/dist/src/hosts/overlay.d.ts.map +1 -1
- package/dist/src/hosts/overlay.js +6 -9
- package/dist/src/hosts/overlay.js.map +1 -1
- package/dist/src/hosts/scroll.d.ts +54 -26
- package/dist/src/hosts/scroll.d.ts.map +1 -1
- package/dist/src/hosts/scroll.js +185 -87
- package/dist/src/hosts/scroll.js.map +1 -1
- package/dist/src/hosts/single-child.d.ts.map +1 -1
- package/dist/src/hosts/single-child.js +2 -0
- package/dist/src/hosts/single-child.js.map +1 -1
- package/dist/src/hosts/spacer.d.ts +3 -3
- package/dist/src/hosts/spacer.d.ts.map +1 -1
- package/dist/src/hosts/spacer.js +8 -3
- package/dist/src/hosts/spacer.js.map +1 -1
- package/dist/src/hosts/text.d.ts +22 -18
- package/dist/src/hosts/text.d.ts.map +1 -1
- package/dist/src/hosts/text.js +108 -131
- package/dist/src/hosts/text.js.map +1 -1
- package/dist/src/hosts/vstack.js +1 -1
- package/dist/src/hosts/vstack.js.map +1 -1
- package/dist/src/hosts/zstack.d.ts +3 -3
- package/dist/src/hosts/zstack.d.ts.map +1 -1
- package/dist/src/hosts/zstack.js +13 -8
- package/dist/src/hosts/zstack.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/internal/dev/hmr.d.ts +20 -0
- package/dist/src/internal/dev/hmr.d.ts.map +1 -0
- package/dist/src/internal/dev/hmr.js +93 -0
- package/dist/src/internal/dev/hmr.js.map +1 -0
- package/dist/src/internal/dev/runtime.d.ts +24 -0
- package/dist/src/internal/dev/runtime.d.ts.map +1 -0
- package/dist/src/internal/dev/runtime.js +135 -0
- package/dist/src/internal/dev/runtime.js.map +1 -0
- package/dist/src/internal/dev/ui.d.ts +13 -0
- package/dist/src/internal/dev/ui.d.ts.map +1 -0
- package/dist/src/internal/dev/ui.js +51 -0
- package/dist/src/internal/dev/ui.js.map +1 -0
- package/dist/src/internal/renderer/context.d.ts +9 -0
- package/dist/src/internal/renderer/context.d.ts.map +1 -0
- package/dist/src/internal/renderer/context.js +22 -0
- package/dist/src/internal/renderer/context.js.map +1 -0
- package/dist/src/internal/renderer/core/FrameBuilder.d.ts +18 -0
- package/dist/src/internal/renderer/core/FrameBuilder.d.ts.map +1 -0
- package/dist/src/internal/renderer/core/FrameBuilder.js +40 -0
- package/dist/src/internal/renderer/core/FrameBuilder.js.map +1 -0
- package/dist/src/internal/renderer/core/RendererState.d.ts +41 -0
- package/dist/src/internal/renderer/core/RendererState.d.ts.map +1 -0
- package/dist/src/internal/renderer/core/RendererState.js +70 -0
- package/dist/src/internal/renderer/core/RendererState.js.map +1 -0
- package/dist/src/internal/renderer/core/index.d.ts +3 -0
- package/dist/src/internal/renderer/core/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/core/index.js +3 -0
- package/dist/src/internal/renderer/core/index.js.map +1 -0
- package/dist/src/internal/renderer/index.d.ts +40 -0
- package/dist/src/internal/renderer/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/index.js +543 -0
- package/dist/src/internal/renderer/index.js.map +1 -0
- package/dist/src/internal/renderer/input/InputProcessor.d.ts +30 -0
- package/dist/src/internal/renderer/input/InputProcessor.d.ts.map +1 -0
- package/dist/src/internal/renderer/input/InputProcessor.js +122 -0
- package/dist/src/internal/renderer/input/InputProcessor.js.map +1 -0
- package/dist/src/internal/renderer/input/index.d.ts +2 -0
- package/dist/src/internal/renderer/input/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/input/index.js +2 -0
- package/dist/src/internal/renderer/input/index.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.d.ts +42 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.js +97 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.d.ts +13 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.js +111 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.d.ts +3 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.js +9 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/index.d.ts +4 -0
- package/dist/src/internal/renderer/lifecycle/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/index.js +4 -0
- package/dist/src/internal/renderer/lifecycle/index.js.map +1 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.d.ts +12 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.js +54 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.js.map +1 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.d.ts +25 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.js +166 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.js.map +1 -0
- package/dist/src/internal/renderer/modes/RendererMode.d.ts +42 -0
- package/dist/src/internal/renderer/modes/RendererMode.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/RendererMode.js +2 -0
- package/dist/src/internal/renderer/modes/RendererMode.js.map +1 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.d.ts +25 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.js +49 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.js.map +1 -0
- package/dist/src/internal/renderer/modes/index.d.ts +5 -0
- package/dist/src/internal/renderer/modes/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/index.js +4 -0
- package/dist/src/internal/renderer/modes/index.js.map +1 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.d.ts +13 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.d.ts.map +1 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.js +75 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.js.map +1 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.d.ts +29 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.d.ts.map +1 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.js +82 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.js.map +1 -0
- package/dist/src/internal/renderer/terminal/index.d.ts +3 -0
- package/dist/src/internal/renderer/terminal/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/terminal/index.js +3 -0
- package/dist/src/internal/renderer/terminal/index.js.map +1 -0
- package/dist/src/internal/renderer/types.d.ts +122 -0
- package/dist/src/internal/renderer/types.d.ts.map +1 -0
- package/dist/src/internal/renderer/types.js +2 -0
- package/dist/src/internal/renderer/types.js.map +1 -0
- package/dist/src/motion/hooks.d.ts +1 -1
- package/dist/src/motion/hooks.js +1 -1
- package/dist/src/reconciler/host-config.js +2 -2
- package/dist/src/reconciler/host-config.js.map +1 -1
- package/dist/src/reconciler/types.d.ts +5 -1
- package/dist/src/reconciler/types.d.ts.map +1 -1
- package/dist/src/renderer-context.d.ts +1 -8
- package/dist/src/renderer-context.d.ts.map +1 -1
- package/dist/src/renderer-context.js +1 -21
- package/dist/src/renderer-context.js.map +1 -1
- package/dist/src/renderer-types.d.ts +1 -115
- package/dist/src/renderer-types.d.ts.map +1 -1
- package/dist/src/renderer.d.ts +1 -31
- package/dist/src/renderer.d.ts.map +1 -1
- package/dist/src/renderer.js +1 -495
- package/dist/src/renderer.js.map +1 -1
- package/dist/src/test/render-tui.d.ts +3 -3
- package/dist/src/test/render-tui.d.ts.map +1 -1
- package/dist/src/test/render-tui.js +16 -9
- package/dist/src/test/render-tui.js.map +1 -1
- package/dist/src/utils/alignment.d.ts +1 -1
- package/dist/src/utils/alignment.d.ts.map +1 -1
- package/dist/src/utils/alignment.js +0 -2
- package/dist/src/utils/alignment.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 +2 -0
- package/dist/src/utils/border.js.map +1 -1
- package/dist/src/utils/console-helpers.d.ts +19 -0
- package/dist/src/utils/console-helpers.d.ts.map +1 -0
- package/dist/src/utils/console-helpers.js +61 -0
- package/dist/src/utils/console-helpers.js.map +1 -0
- package/dist/src/utils/index.d.ts +2 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +2 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/styles.d.ts +8 -1
- package/dist/src/utils/styles.d.ts.map +1 -1
- package/dist/src/utils/styles.js +10 -8
- package/dist/src/utils/styles.js.map +1 -1
- package/dist/src/utils/text-layout.d.ts +22 -0
- package/dist/src/utils/text-layout.d.ts.map +1 -0
- package/dist/src/utils/text-layout.js +37 -0
- package/dist/src/utils/text-layout.js.map +1 -0
- package/dist/src/utils/text-wrap.d.ts +31 -1
- package/dist/src/utils/text-wrap.d.ts.map +1 -1
- package/dist/src/utils/text-wrap.js +205 -48
- package/dist/src/utils/text-wrap.js.map +1 -1
- package/dist/src/visualize/index.js +1 -1
- package/dist/src/visualize/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/codeblock.tsx +2 -2
- package/src/components/ListView.tsx +21 -23
- package/src/components/Markdown.tsx +3 -3
- package/src/components/MultilineTextInput.tsx +138 -344
- package/src/components/TextInput.tsx +54 -99
- package/src/components/text-editing.ts +180 -0
- package/src/console/ConsolePopover.tsx +124 -107
- package/src/debug/DebugOverlay.ts +15 -74
- package/src/debug/DiagnosticsPanel.tsx +1 -1
- package/src/dev.tsx +5 -458
- package/src/hooks/use-scroll.ts +85 -145
- package/src/hosts/base.ts +86 -3
- package/src/hosts/box.ts +37 -2
- package/src/hosts/canvas.ts +128 -42
- package/src/hosts/codeblock.ts +48 -35
- package/src/hosts/flex-container.ts +25 -6
- package/src/hosts/index.ts +11 -2
- package/src/hosts/layout-helpers.ts +20 -0
- package/src/hosts/leaf.ts +36 -0
- package/src/hosts/overlay-item.ts +8 -2
- package/src/hosts/overlay.ts +13 -11
- package/src/hosts/scroll.ts +228 -106
- package/src/hosts/single-child.ts +2 -0
- package/src/hosts/spacer.ts +8 -3
- package/src/hosts/text.ts +126 -132
- package/src/hosts/vstack.ts +1 -1
- package/src/hosts/zstack.ts +14 -9
- package/src/index.ts +2 -2
- package/src/internal/dev/hmr.ts +101 -0
- package/src/internal/dev/runtime.ts +170 -0
- package/src/internal/dev/ui.tsx +87 -0
- package/src/internal/renderer/context.ts +27 -0
- package/src/{renderer → internal/renderer}/core/FrameBuilder.ts +2 -2
- package/src/internal/renderer/index.ts +689 -0
- package/src/{renderer → internal/renderer}/input/InputProcessor.ts +10 -1
- package/src/{renderer → internal/renderer}/lifecycle/EventBus.ts +9 -1
- package/src/internal/renderer/lifecycle/ProcessLifecycle.ts +125 -0
- package/src/internal/renderer/lifecycle/index.ts +3 -0
- package/src/{renderer → internal/renderer}/modes/InlineRenderer.ts +5 -2
- package/src/{renderer → internal/renderer}/modes/RendererMode.ts +1 -1
- package/src/{renderer → internal/renderer}/modes/StaticContentRenderer.ts +5 -2
- package/src/internal/renderer/terminal/KeyboardCapabilityProbe.ts +91 -0
- package/src/{renderer/lifecycle → internal/renderer/terminal}/TerminalSetup.ts +4 -22
- package/src/internal/renderer/terminal/index.ts +2 -0
- package/src/internal/renderer/types.ts +129 -0
- package/src/motion/hooks.ts +1 -1
- package/src/reconciler/host-config.ts +2 -2
- package/src/reconciler/types.ts +7 -1
- package/src/renderer-context.ts +1 -27
- package/src/renderer-types.ts +10 -123
- package/src/renderer.ts +1 -619
- package/src/test/render-tui.ts +16 -10
- package/src/utils/alignment.ts +1 -3
- package/src/utils/border.ts +11 -1
- package/src/utils/console-helpers.ts +86 -0
- package/src/utils/index.ts +15 -1
- package/src/utils/styles.ts +16 -4
- package/src/utils/text-layout.ts +65 -0
- package/src/utils/text-wrap.ts +261 -48
- package/src/visualize/index.tsx +1 -1
- package/src/renderer/lifecycle/ResizeManager.ts +0 -65
- package/src/renderer/lifecycle/index.ts +0 -4
- /package/src/{renderer → internal/renderer}/core/RendererState.ts +0 -0
- /package/src/{renderer → internal/renderer}/core/index.ts +0 -0
- /package/src/{renderer → internal/renderer}/input/index.ts +0 -0
- /package/src/{renderer → internal/renderer}/lifecycle/RenderCache.ts +0 -0
- /package/src/{renderer → internal/renderer}/modes/FullscreenRenderer.ts +0 -0
- /package/src/{renderer → internal/renderer}/modes/index.ts +0 -0
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAA;AAChC,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EACN,KAAK,WAAW,EAChB,QAAQ,EACR,KAAK,aAAa,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,OAAO,EACP,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,SAAS,EACT,KAAK,cAAc,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAE9D,OAAO,EACN,OAAO,EACP,KAAK,UAAU,EACf,KAAK,UAAU,EACf,UAAU,EACV,KAAK,eAAe,EACpB,GAAG,EACH,QAAQ,GACR,MAAM,UAAU,CAAA;AAEjB,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,aAAa,EACb,YAAY,GACZ,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,cAAc,GACd,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC7G,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC1D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeable combinator that makes an atom persist across hot reloads.
|
|
3
|
+
*
|
|
4
|
+
* This is the cleanest way to define HMR-persistent atoms - just pipe it!
|
|
5
|
+
* Combines globalValue (for persistence) + keepAlive (prevents registry cleanup).
|
|
6
|
+
*/
|
|
7
|
+
export declare function hmr(key: string): <A>(self: A) => A;
|
|
8
|
+
/**
|
|
9
|
+
* Wrap any value creation in HMR persistence.
|
|
10
|
+
*/
|
|
11
|
+
export declare function hmrState<T>(key: string, create: () => T): T;
|
|
12
|
+
/**
|
|
13
|
+
* Auto-keyed HMR persistence for atoms.
|
|
14
|
+
*
|
|
15
|
+
* When used with the HMR plugin (recommended), keys are injected at load time
|
|
16
|
+
* based on the variable name. Without the plugin, falls back to runtime
|
|
17
|
+
* stack trace parsing.
|
|
18
|
+
*/
|
|
19
|
+
export declare function autoHmr<A>(self: A): A;
|
|
20
|
+
//# sourceMappingURL=hmr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../../../src/internal/dev/hmr.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,EAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAanD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAE3D;AAmCD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CA6BrC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { globalValue } from "effect/GlobalValue";
|
|
3
|
+
/**
|
|
4
|
+
* Pipeable combinator that makes an atom persist across hot reloads.
|
|
5
|
+
*
|
|
6
|
+
* This is the cleanest way to define HMR-persistent atoms - just pipe it!
|
|
7
|
+
* Combines globalValue (for persistence) + keepAlive (prevents registry cleanup).
|
|
8
|
+
*/
|
|
9
|
+
export function hmr(key) {
|
|
10
|
+
return (self) => {
|
|
11
|
+
return globalValue(Symbol.for(`hmr/${key}`), () => {
|
|
12
|
+
// Apply keepAlive if it's an atom (just sets keepAlive: true)
|
|
13
|
+
if (typeof self === "object" && self !== null && "keepAlive" in self) {
|
|
14
|
+
return Object.assign(Object.create(Object.getPrototypeOf(self)), {
|
|
15
|
+
...self,
|
|
16
|
+
keepAlive: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return self;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wrap any value creation in HMR persistence.
|
|
25
|
+
*/
|
|
26
|
+
export function hmrState(key, create) {
|
|
27
|
+
return globalValue(Symbol.for(`hmr/${key}`), create);
|
|
28
|
+
}
|
|
29
|
+
// Cache for runtime key extraction
|
|
30
|
+
const keyCache = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Parse stack trace to get file path and line number.
|
|
33
|
+
* Returns null if parsing fails.
|
|
34
|
+
*/
|
|
35
|
+
function parseStack(stack) {
|
|
36
|
+
// Bun stack format: " at functionName (file:line:col)" or " at file:line:col"
|
|
37
|
+
const lines = stack.split("\n");
|
|
38
|
+
// Skip first line (Error message) and find caller (skip autoHmr itself)
|
|
39
|
+
for (let i = 2; i < lines.length; i++) {
|
|
40
|
+
const match = lines[i].match(/\((.+?):(\d+):(\d+)\)/) || lines[i].match(/at\s+(.+?):(\d+):(\d+)/);
|
|
41
|
+
if (match) {
|
|
42
|
+
return { file: match[1], line: parseInt(match[2], 10), col: parseInt(match[3], 10) };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extract variable name from source line using regex.
|
|
49
|
+
* Returns null if extraction fails.
|
|
50
|
+
*/
|
|
51
|
+
function extractVarName(source, line) {
|
|
52
|
+
const lines = source.split("\n");
|
|
53
|
+
if (line < 1 || line > lines.length)
|
|
54
|
+
return null;
|
|
55
|
+
const sourceLine = lines[line - 1];
|
|
56
|
+
const match = sourceLine.match(/(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=/);
|
|
57
|
+
return match?.[1] ?? null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Auto-keyed HMR persistence for atoms.
|
|
61
|
+
*
|
|
62
|
+
* When used with the HMR plugin (recommended), keys are injected at load time
|
|
63
|
+
* based on the variable name. Without the plugin, falls back to runtime
|
|
64
|
+
* stack trace parsing.
|
|
65
|
+
*/
|
|
66
|
+
export function autoHmr(self) {
|
|
67
|
+
// Get stack trace for caller location
|
|
68
|
+
const stack = new Error().stack ?? "";
|
|
69
|
+
const location = parseStack(stack);
|
|
70
|
+
if (!location) {
|
|
71
|
+
// Fallback: use a hash of the stack trace
|
|
72
|
+
const fallbackKey = `unknown:${stack.slice(0, 100)}`;
|
|
73
|
+
return hmr(fallbackKey)(self);
|
|
74
|
+
}
|
|
75
|
+
const cacheKey = `${location.file}:${location.line}:${location.col}`;
|
|
76
|
+
// Check cache first
|
|
77
|
+
let key = keyCache.get(cacheKey);
|
|
78
|
+
if (!key) {
|
|
79
|
+
try {
|
|
80
|
+
// Read source file and extract variable name
|
|
81
|
+
const source = readFileSync(location.file, "utf-8");
|
|
82
|
+
const varName = extractVarName(source, location.line);
|
|
83
|
+
key = `${location.file}:${varName ?? `line${location.line}`}`;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// File read failed, use line-based key
|
|
87
|
+
key = `${location.file}:line${location.line}`;
|
|
88
|
+
}
|
|
89
|
+
keyCache.set(cacheKey, key);
|
|
90
|
+
}
|
|
91
|
+
return hmr(key)(self);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=hmr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr.js","sourceRoot":"","sources":["../../../../src/internal/dev/hmr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,GAAW;IAC9B,OAAO,CAAK,IAAO,EAAK,EAAE;QACzB,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;YACjD,8DAA8D;YAC9D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE;oBAChE,GAAG,IAAI;oBACP,SAAS,EAAE,IAAI;iBACf,CAAC,CAAA;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACZ,CAAC,CAAM,CAAA;IACR,CAAC,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAI,GAAW,EAAE,MAAe;IACvD,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;AACrD,CAAC;AAED,mCAAmC;AACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;AAE1C;;;GAGG;AACH,SAAS,UAAU,CAAC,KAAa;IAChC,oFAAoF;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,wEAAwE;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QACjG,IAAI,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;QACrF,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAc,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAEhD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC7E,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAI,IAAO;IACjC,sCAAsC;IACtC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAElC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,0CAA0C;QAC1C,MAAM,WAAW,GAAG,WAAW,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;QACpD,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAA;IAEpE,oBAAoB;IACpB,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAChC,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,IAAI,CAAC;YACJ,6CAA6C;YAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YACnD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;YACrD,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,OAAO,IAAI,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;QAC9D,CAAC;QAAC,MAAM,CAAC;YACR,uCAAuC;YACvC,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9C,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { RendererOptions, TuiRenderer } from "../renderer/types.js";
|
|
3
|
+
export interface DevOptions {
|
|
4
|
+
/** Called before each hot reload */
|
|
5
|
+
onReload?: () => void;
|
|
6
|
+
/** Called on errors */
|
|
7
|
+
onError?: (error: Error) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface DevRuntime {
|
|
10
|
+
/** Promise that resolves after the first render + watcher setup. */
|
|
11
|
+
ready: Promise<void>;
|
|
12
|
+
/** Manually trigger a reload. */
|
|
13
|
+
reload: () => Promise<void>;
|
|
14
|
+
/** Stop watching and cleanup. */
|
|
15
|
+
stop: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
type DevRoot = {
|
|
18
|
+
render(element: React.ReactNode, sync?: boolean): void;
|
|
19
|
+
};
|
|
20
|
+
export declare function startDevRuntime(entryPath: string, renderer: TuiRenderer, root: DevRoot, options?: DevOptions & {
|
|
21
|
+
mode?: RendererOptions["mode"];
|
|
22
|
+
}): DevRuntime;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/internal/dev/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAExE,MAAM,WAAW,UAAU;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,uBAAuB;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAChC;AAED,MAAM,WAAW,UAAU;IAC1B,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,iCAAiC;IACjC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,iCAAiC;IACjC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAED,KAAK,OAAO,GAAG;IACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CACtD,CAAA;AA0CD,wBAAgB,eAAe,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;CAAE,GACvD,UAAU,CAgGZ"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { stat } from "node:fs/promises";
|
|
10
|
+
import { dirname } from "node:path";
|
|
11
|
+
import * as watcher from "@parcel/watcher";
|
|
12
|
+
import React from "react";
|
|
13
|
+
import { enableRemote } from "../../remote/index.js";
|
|
14
|
+
import { DevWrapper } from "./ui.js";
|
|
15
|
+
/**
|
|
16
|
+
* Clear require.cache for project files to ensure fresh imports.
|
|
17
|
+
* Bun uses require.cache internally even for ESM modules.
|
|
18
|
+
* This is necessary because query-string cache-busting only affects
|
|
19
|
+
* the entry point, not transitive dependencies.
|
|
20
|
+
*/
|
|
21
|
+
function clearProjectCache(projectRoot) {
|
|
22
|
+
for (const file of Object.keys(require.cache)) {
|
|
23
|
+
if (file.startsWith(projectRoot) && !file.includes("node_modules")) {
|
|
24
|
+
delete require.cache[file];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wait for a file to stabilize (no size changes) before proceeding.
|
|
30
|
+
* This avoids importing partially-written files.
|
|
31
|
+
*/
|
|
32
|
+
async function awaitWriteFinish(path, stabilityMs) {
|
|
33
|
+
let lastSize = -1;
|
|
34
|
+
let stableCount = 0;
|
|
35
|
+
const checkInterval = 10;
|
|
36
|
+
while (stableCount < stabilityMs / checkInterval) {
|
|
37
|
+
try {
|
|
38
|
+
const stats = await stat(path);
|
|
39
|
+
if (stats.size === lastSize) {
|
|
40
|
+
stableCount++;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
lastSize = stats.size;
|
|
44
|
+
stableCount = 0;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// File might be temporarily unavailable during write
|
|
49
|
+
stableCount = 0;
|
|
50
|
+
}
|
|
51
|
+
await new Promise((r) => setTimeout(r, checkInterval));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function startDevRuntime(entryPath, renderer, root, options) {
|
|
55
|
+
const watchExtensions = [".ts", ".tsx"];
|
|
56
|
+
const debounceMs = 150;
|
|
57
|
+
const stabilityMs = 50;
|
|
58
|
+
// Dev mode always enables remote control with entry path for identification
|
|
59
|
+
const stopRemote = enableRemote(renderer, { entryPath });
|
|
60
|
+
let debounceTimer = null;
|
|
61
|
+
let version = 0;
|
|
62
|
+
let subscription = null;
|
|
63
|
+
// Determine project root for cache clearing
|
|
64
|
+
const projectRoot = dirname(entryPath);
|
|
65
|
+
const reload = async () => {
|
|
66
|
+
const thisVersion = ++version;
|
|
67
|
+
try {
|
|
68
|
+
// Clear module cache for project files before re-importing
|
|
69
|
+
clearProjectCache(projectRoot);
|
|
70
|
+
// Cache-bust by adding query string with version
|
|
71
|
+
const mod = await import(__rewriteRelativeImportExtension(`${entryPath}?v=${thisVersion}`));
|
|
72
|
+
// Skip if a newer render was triggered
|
|
73
|
+
if (thisVersion !== version)
|
|
74
|
+
return;
|
|
75
|
+
const App = mod.default;
|
|
76
|
+
if (!App) {
|
|
77
|
+
const err = new Error(`No default export found in ${entryPath}`);
|
|
78
|
+
options?.onError?.(err);
|
|
79
|
+
console.error("[effect-tui] Dev render failed:", err.message);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Render the component wrapped in DevWrapper for console + stats
|
|
83
|
+
const appElement = typeof App === "function" ? React.createElement(App) : App;
|
|
84
|
+
const wrapped = React.createElement(DevWrapper, {
|
|
85
|
+
mode: options?.mode,
|
|
86
|
+
}, appElement);
|
|
87
|
+
root.render(wrapped);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
91
|
+
options?.onError?.(error);
|
|
92
|
+
console.error("[effect-tui] Dev render error:", error.message);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const ready = (async () => {
|
|
96
|
+
await reload();
|
|
97
|
+
try {
|
|
98
|
+
subscription = await watcher.subscribe(projectRoot, async (err, events) => {
|
|
99
|
+
if (err) {
|
|
100
|
+
options?.onError?.(err);
|
|
101
|
+
console.error("[effect-tui] Dev watcher error:", err);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Filter to relevant file extensions
|
|
105
|
+
const relevantEvents = events.filter((event) => watchExtensions.some((ext) => event.path.endsWith(ext)));
|
|
106
|
+
if (relevantEvents.length === 0)
|
|
107
|
+
return;
|
|
108
|
+
// Debounce rapid changes
|
|
109
|
+
if (debounceTimer)
|
|
110
|
+
clearTimeout(debounceTimer);
|
|
111
|
+
debounceTimer = setTimeout(async () => {
|
|
112
|
+
// Wait for file writes to stabilize
|
|
113
|
+
const changedPath = relevantEvents[0].path;
|
|
114
|
+
await awaitWriteFinish(changedPath, stabilityMs);
|
|
115
|
+
options?.onReload?.();
|
|
116
|
+
await reload();
|
|
117
|
+
}, debounceMs);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.error(`[effect-tui] Failed to watch ${projectRoot}:`, err);
|
|
122
|
+
}
|
|
123
|
+
})();
|
|
124
|
+
const stop = async () => {
|
|
125
|
+
if (debounceTimer)
|
|
126
|
+
clearTimeout(debounceTimer);
|
|
127
|
+
if (subscription) {
|
|
128
|
+
await subscription.unsubscribe();
|
|
129
|
+
}
|
|
130
|
+
stopRemote();
|
|
131
|
+
renderer.stop();
|
|
132
|
+
};
|
|
133
|
+
return { ready, reload, stop };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../src/internal/dev/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface DevWrapperProps {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
mode?: "fullscreen" | "inline";
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Wrapper component that provides dev mode features:
|
|
8
|
+
* - Debug console panel (` backtick to toggle)
|
|
9
|
+
* - Screenshot support (~ tilde) with toast notification
|
|
10
|
+
* - Auto-show console on errors
|
|
11
|
+
*/
|
|
12
|
+
export declare function DevWrapper({ children, mode }: DevWrapperProps): React.ReactNode;
|
|
13
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../src/internal/dev/ui.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwCzB,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,eAAe,mBAmC7D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@effect-tui/react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Overlay } from "../../components/Overlay.js";
|
|
4
|
+
import { ConsolePopover } from "../../console/ConsolePopover.js";
|
|
5
|
+
import { copyToClipboard, copyToClipboardSync } from "../../console/clipboard.js";
|
|
6
|
+
import { useConsole } from "../../console/useConsole.js";
|
|
7
|
+
import { ToastContainer, ToastProvider, useToast } from "../../dev/Toast.js";
|
|
8
|
+
import { useKeyboard } from "../../hooks/use-keyboard.js";
|
|
9
|
+
import { useRenderer } from "../renderer/context.js";
|
|
10
|
+
/**
|
|
11
|
+
* Internal component that handles screenshot with toast notification
|
|
12
|
+
*/
|
|
13
|
+
function ScreenshotHandler() {
|
|
14
|
+
const renderer = useRenderer();
|
|
15
|
+
const { show } = useToast();
|
|
16
|
+
useKeyboard((key) => {
|
|
17
|
+
// ~ (tilde) - screenshot
|
|
18
|
+
if (key.name === "char" && key.text === "~") {
|
|
19
|
+
const ansiOutput = renderer.getScreenshot();
|
|
20
|
+
if (!ansiOutput)
|
|
21
|
+
return;
|
|
22
|
+
// Copy actual content to clipboard
|
|
23
|
+
const copied = copyToClipboardSync(ansiOutput);
|
|
24
|
+
if (!copied) {
|
|
25
|
+
copyToClipboard(ansiOutput);
|
|
26
|
+
}
|
|
27
|
+
// Also save to file as backup
|
|
28
|
+
const tmpPath = `/tmp/tui-screenshot-${Date.now()}.txt`;
|
|
29
|
+
Bun.write(tmpPath, ansiOutput);
|
|
30
|
+
show("Screenshot copied!", "screenshot", 2500);
|
|
31
|
+
key.preventDefault?.();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Wrapper component that provides dev mode features:
|
|
38
|
+
* - Debug console panel (` backtick to toggle)
|
|
39
|
+
* - Screenshot support (~ tilde) with toast notification
|
|
40
|
+
* - Auto-show console on errors
|
|
41
|
+
*/
|
|
42
|
+
export function DevWrapper({ children, mode }) {
|
|
43
|
+
const { visible } = useConsole({ autoShowOnError: true, initiallyVisible: false });
|
|
44
|
+
// Inline mode: content flows naturally in vstack
|
|
45
|
+
if (mode === "inline") {
|
|
46
|
+
return (_jsx(ToastProvider, { children: _jsxs("vstack", { children: [_jsx(ScreenshotHandler, {}), _jsx(ToastContainer, {}), children, visible && _jsx(ConsolePopover, { fixedHeight: 5, mode: "inline", showStatsTab: true })] }) }));
|
|
47
|
+
}
|
|
48
|
+
// Fullscreen mode: Overlay with toast/console positioned by alignment
|
|
49
|
+
return (_jsx(ToastProvider, { children: _jsxs(Overlay, { children: [_jsx(ScreenshotHandler, {}), children, visible && (_jsx(Overlay.Item, { alignment: { v: "bottom" }, children: _jsx(ConsolePopover, { fixedHeight: 12, showStatsTab: true }) })), _jsx(Overlay.Item, { alignment: { v: "top" }, children: _jsx(ToastContainer, {}) })] }) }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../src/internal/dev/ui.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;GAEG;AACH,SAAS,iBAAiB;IACzB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE3B,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,yBAAyB;QACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAA;YAC3C,IAAI,CAAC,UAAU;gBAAE,OAAM;YAEvB,mCAAmC;YACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;YAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,eAAe,CAAC,UAAU,CAAC,CAAA;YAC5B,CAAC;YAED,8BAA8B;YAC9B,MAAM,OAAO,GAAG,uBAAuB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA;YACvD,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAE9B,IAAI,CAAC,oBAAoB,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;YAC9C,GAAG,CAAC,cAAc,EAAE,EAAE,CAAA;QACvB,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACZ,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAmB;IAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAA;IAElF,iDAAiD;IACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CACN,KAAC,aAAa,cACb,6BACC,KAAC,iBAAiB,KAAG,EACrB,KAAC,cAAc,KAAG,EACjB,QAAQ,EACR,OAAO,IAAI,KAAC,cAAc,IAAC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAC,QAAQ,EAAC,YAAY,SAAG,IACjE,GACM,CAChB,CAAA;IACF,CAAC;IAED,sEAAsE;IACtE,OAAO,CACN,KAAC,aAAa,cACb,MAAC,OAAO,eACP,KAAC,iBAAiB,KAAG,EACpB,QAAQ,EAER,OAAO,IAAI,CACX,KAAC,OAAO,CAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,YACvC,KAAC,cAAc,IAAC,WAAW,EAAE,EAAE,EAAE,YAAY,SAAG,GAClC,CACf,EACD,KAAC,OAAO,CAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,YACpC,KAAC,cAAc,KAAG,GACJ,IACN,GACK,CAChB,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TuiRenderer } from "./types.js";
|
|
2
|
+
export declare const RendererContext: import("react").Context<TuiRenderer | null>;
|
|
3
|
+
export declare function useRenderer(): TuiRenderer;
|
|
4
|
+
/** Hook that returns terminal size and re-renders on resize */
|
|
5
|
+
export declare function useTerminalSize(): {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/internal/renderer/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,eAAO,MAAM,eAAe,6CAA0C,CAAA;AAEtE,wBAAgB,WAAW,IAAI,WAAW,CAMzC;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAWnE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createContext, useContext, useEffect, useState } from "react";
|
|
2
|
+
// Context for accessing renderer in components
|
|
3
|
+
export const RendererContext = createContext(null);
|
|
4
|
+
export function useRenderer() {
|
|
5
|
+
const renderer = useContext(RendererContext);
|
|
6
|
+
if (!renderer) {
|
|
7
|
+
throw new Error("useRenderer must be used within a TUI renderer");
|
|
8
|
+
}
|
|
9
|
+
return renderer;
|
|
10
|
+
}
|
|
11
|
+
/** Hook that returns terminal size and re-renders on resize */
|
|
12
|
+
export function useTerminalSize() {
|
|
13
|
+
const renderer = useRenderer();
|
|
14
|
+
const [size, setSize] = useState({ width: renderer.width, height: renderer.height });
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
return renderer.onResize((width, height) => {
|
|
17
|
+
setSize({ width, height });
|
|
18
|
+
});
|
|
19
|
+
}, [renderer]);
|
|
20
|
+
return size;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/internal/renderer/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGtE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAA;AAEtE,MAAM,UAAU,WAAW;IAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe;IAC9B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAEpF,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1C,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,OAAO,IAAI,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CellBuffer, Palette } from "@effect-tui/core";
|
|
2
|
+
import type { HostInstance } from "../../../reconciler/types.js";
|
|
3
|
+
export interface FrameTimings {
|
|
4
|
+
clear: number;
|
|
5
|
+
layout: number;
|
|
6
|
+
render: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Handles the measure → layout → render pipeline for a single frame.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FrameBuilder {
|
|
12
|
+
/**
|
|
13
|
+
* Execute the frame pipeline: clear buffer, measure, layout, and render.
|
|
14
|
+
* Returns timing information for each phase.
|
|
15
|
+
*/
|
|
16
|
+
build(root: HostInstance, buffer: CellBuffer, palette: Palette, width: number, height: number): FrameTimings;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=FrameBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/core/FrameBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAEhE,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,qBAAa,YAAY;IACxB;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;CAgC5G"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { performance } from "node:perf_hooks";
|
|
2
|
+
import * as Prof from "../../../profiler.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handles the measure → layout → render pipeline for a single frame.
|
|
5
|
+
*/
|
|
6
|
+
export class FrameBuilder {
|
|
7
|
+
/**
|
|
8
|
+
* Execute the frame pipeline: clear buffer, measure, layout, and render.
|
|
9
|
+
* Returns timing information for each phase.
|
|
10
|
+
*/
|
|
11
|
+
build(root, buffer, palette, width, height) {
|
|
12
|
+
// Pre-frame cache prep (optional)
|
|
13
|
+
root.prepareFrame?.();
|
|
14
|
+
// Clear buffer
|
|
15
|
+
let t = Prof.startPhase();
|
|
16
|
+
const clearStart = performance.now();
|
|
17
|
+
buffer.clear(0);
|
|
18
|
+
const clearMs = performance.now() - clearStart;
|
|
19
|
+
Prof.endPhase("clear", t);
|
|
20
|
+
// Layout (measure + position)
|
|
21
|
+
t = Prof.startPhase();
|
|
22
|
+
const layoutStart = performance.now();
|
|
23
|
+
root.measure(width, height);
|
|
24
|
+
root.layout({ x: 0, y: 0, w: width, h: height });
|
|
25
|
+
const layoutMs = performance.now() - layoutStart;
|
|
26
|
+
Prof.endPhase("layout", t);
|
|
27
|
+
// Render
|
|
28
|
+
t = Prof.startPhase();
|
|
29
|
+
const renderStart = performance.now();
|
|
30
|
+
root.render(buffer, palette);
|
|
31
|
+
const renderMs = performance.now() - renderStart;
|
|
32
|
+
Prof.endPhase("render", t);
|
|
33
|
+
return {
|
|
34
|
+
clear: clearMs,
|
|
35
|
+
layout: layoutMs,
|
|
36
|
+
render: renderMs,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=FrameBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/core/FrameBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAA;AAS5C;;GAEG;AACH,MAAM,OAAO,YAAY;IACxB;;;OAGG;IACH,KAAK,CAAC,IAAkB,EAAE,MAAkB,EAAE,OAAgB,EAAE,KAAa,EAAE,MAAc;QAC5F,kCAAkC;QAClC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAA;QAErB,eAAe;QACf,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACf,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAA;QAC9C,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAEzB,8BAA8B;QAC9B,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACrB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACrC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAE1B,SAAS;QACT,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACrB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACrC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAE1B,OAAO;YACN,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;SAChB,CAAA;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CellBuffer, Palette } from "@effect-tui/core";
|
|
2
|
+
/**
|
|
3
|
+
* Mutable state for the renderer.
|
|
4
|
+
* Centralized to make state management explicit and easier to track.
|
|
5
|
+
*/
|
|
6
|
+
export declare class RendererState {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
lastWidth: number;
|
|
10
|
+
dirty: boolean;
|
|
11
|
+
running: boolean;
|
|
12
|
+
prevBuffer: CellBuffer | null;
|
|
13
|
+
nextBuffer: CellBuffer | null;
|
|
14
|
+
readonly palette: Palette;
|
|
15
|
+
loop: ReturnType<typeof setInterval> | null;
|
|
16
|
+
inputHandler: ((data: Buffer) => void) | null;
|
|
17
|
+
resizeHandler: (() => void) | null;
|
|
18
|
+
constructor(width: number, height: number);
|
|
19
|
+
/**
|
|
20
|
+
* Ensure buffers exist and are correctly sized.
|
|
21
|
+
* Call this at the start of each frame.
|
|
22
|
+
*/
|
|
23
|
+
ensureBuffers(width: number, height: number): void;
|
|
24
|
+
/**
|
|
25
|
+
* Swap prev and next buffers after rendering.
|
|
26
|
+
*/
|
|
27
|
+
swapBuffers(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Invalidate buffers (e.g., on resize).
|
|
30
|
+
*/
|
|
31
|
+
invalidateBuffers(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Mark as needing render.
|
|
34
|
+
*/
|
|
35
|
+
markDirty(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Update dimensions.
|
|
38
|
+
*/
|
|
39
|
+
updateDimensions(width: number, height: number): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=RendererState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RendererState.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/core/RendererState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;;GAGG;AACH,qBAAa,aAAa;IAEzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IAGjB,KAAK,UAAO;IACZ,OAAO,UAAO;IAGd,UAAU,EAAE,UAAU,GAAG,IAAI,CAAO;IACpC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAO;IACpC,QAAQ,CAAC,OAAO,UAAgB;IAGhC,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAO;IAGlD,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAO;IACpD,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAO;gBAE7B,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMzC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASlD;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAKrD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { CellBuffer, Palette } from "@effect-tui/core";
|
|
2
|
+
/**
|
|
3
|
+
* Mutable state for the renderer.
|
|
4
|
+
* Centralized to make state management explicit and easier to track.
|
|
5
|
+
*/
|
|
6
|
+
export class RendererState {
|
|
7
|
+
// Dimensions
|
|
8
|
+
width;
|
|
9
|
+
height;
|
|
10
|
+
lastWidth;
|
|
11
|
+
// Rendering flags
|
|
12
|
+
dirty = true;
|
|
13
|
+
running = true;
|
|
14
|
+
// Buffers (double-buffered for diffing)
|
|
15
|
+
prevBuffer = null;
|
|
16
|
+
nextBuffer = null;
|
|
17
|
+
palette = new Palette();
|
|
18
|
+
// Loop handle
|
|
19
|
+
loop = null;
|
|
20
|
+
// Event handler references for cleanup
|
|
21
|
+
inputHandler = null;
|
|
22
|
+
resizeHandler = null;
|
|
23
|
+
constructor(width, height) {
|
|
24
|
+
this.width = width;
|
|
25
|
+
this.height = height;
|
|
26
|
+
this.lastWidth = width;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Ensure buffers exist and are correctly sized.
|
|
30
|
+
* Call this at the start of each frame.
|
|
31
|
+
*/
|
|
32
|
+
ensureBuffers(width, height) {
|
|
33
|
+
if (!this.prevBuffer || !this.nextBuffer || this.prevBuffer.w !== width || this.prevBuffer.h !== height) {
|
|
34
|
+
this.prevBuffer = new CellBuffer(width, height);
|
|
35
|
+
this.nextBuffer = new CellBuffer(width, height);
|
|
36
|
+
this.prevBuffer.clear(0);
|
|
37
|
+
this.nextBuffer.clear(0);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Swap prev and next buffers after rendering.
|
|
42
|
+
*/
|
|
43
|
+
swapBuffers() {
|
|
44
|
+
const tmp = this.prevBuffer;
|
|
45
|
+
this.prevBuffer = this.nextBuffer;
|
|
46
|
+
this.nextBuffer = tmp;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Invalidate buffers (e.g., on resize).
|
|
50
|
+
*/
|
|
51
|
+
invalidateBuffers() {
|
|
52
|
+
this.prevBuffer = null;
|
|
53
|
+
this.nextBuffer = null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Mark as needing render.
|
|
57
|
+
*/
|
|
58
|
+
markDirty() {
|
|
59
|
+
this.dirty = true;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Update dimensions.
|
|
63
|
+
*/
|
|
64
|
+
updateDimensions(width, height) {
|
|
65
|
+
this.width = width;
|
|
66
|
+
this.height = height;
|
|
67
|
+
this.lastWidth = width;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=RendererState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RendererState.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/core/RendererState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;;GAGG;AACH,MAAM,OAAO,aAAa;IACzB,aAAa;IACb,KAAK,CAAQ;IACb,MAAM,CAAQ;IACd,SAAS,CAAQ;IAEjB,kBAAkB;IAClB,KAAK,GAAG,IAAI,CAAA;IACZ,OAAO,GAAG,IAAI,CAAA;IAEd,wCAAwC;IACxC,UAAU,GAAsB,IAAI,CAAA;IACpC,UAAU,GAAsB,IAAI,CAAA;IAC3B,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAEhC,cAAc;IACd,IAAI,GAA0C,IAAI,CAAA;IAElD,uCAAuC;IACvC,YAAY,GAAoC,IAAI,CAAA;IACpD,aAAa,GAAwB,IAAI,CAAA;IAEzC,YAAY,KAAa,EAAE,MAAc;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACvB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,KAAa,EAAE,MAAc;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACzG,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACxB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACzB,CAAC;IACF,CAAC;IAED;;OAEG;IACH,WAAW;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAA;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QACjC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,iBAAiB;QAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,SAAS;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAa,EAAE,MAAc;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACvB,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|