From 02c6c0b349ebf27e211cefad1504cc699a86a920 Mon Sep 17 00:00:00 2001 From: Simon Klee Date: Thu, 5 Feb 2026 11:50:33 +0100 Subject: [PATCH] core: switch to yoga ffi bindings --- bun.lock | 18 +++++++++++++++--- packages/core/package.json | 4 ++-- packages/core/scripts/build.ts | 1 + packages/core/src/Renderable.ts | 2 +- packages/core/src/index.ts | 2 +- packages/core/src/lib/yoga.options.test.ts | 2 +- packages/core/src/lib/yoga.options.ts | 2 +- packages/core/src/renderables/Box.ts | 2 +- .../src/renderables/EditBufferRenderable.ts | 2 +- .../src/renderables/LineNumberRenderable.ts | 2 +- .../src/renderables/TextBufferRenderable.ts | 2 +- 11 files changed, 26 insertions(+), 13 deletions(-) diff --git a/bun.lock b/bun.lock index c88952bc5..bfcb503b5 100644 --- a/bun.lock +++ b/bun.lock @@ -12,11 +12,11 @@ "name": "@opentui/core", "version": "0.1.77", "dependencies": { + "@simonklee/yoga": "0.2.30", "bun-ffi-structs": "0.1.2", "diff": "8.0.2", "jimp": "1.6.0", "marked": "17.0.1", - "yoga-layout": "3.2.1", }, "devDependencies": { "@types/bun": "latest", @@ -354,6 +354,18 @@ "@opentui/core": ["@opentui/core@workspace:packages/core"], + "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.1.77", "", { "os": "darwin", "cpu": "arm64" }, "sha512-SNqmygCMEsPCW7xWjzCZ5caBf36xaprwVdAnFijGDOuIzLA4iaDa6um8cj3TJh7awenN3NTRsuRc7OuH42UH+g=="], + + "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.1.77", "", { "os": "darwin", "cpu": "x64" }, "sha512-/8fsa03swEHTQt/9NrGm98kemlU+VuTURI/OFZiH53vPDRrOYIYoa4Jyga/H7ZMcG+iFhkq97zIe+0Kw95LGmA=="], + + "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.1.77", "", { "os": "linux", "cpu": "arm64" }, "sha512-QfUXZJPc69OvqoMu+AlLgjqXrwu4IeqcBuUWYMuH8nPTeLsVUc3CBbXdV2lv9UDxWzxzrxdS4ALPaxvmEv9lsQ=="], + + "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.1.77", "", { "os": "linux", "cpu": "x64" }, "sha512-Kmfx0yUKnPj67AoXYIgL7qQo0QVsUG5Iw8aRtv6XFzXqa5SzBPhaKkKZ9yHPjOmTalZquUs+9zcCRNKpYYuL7A=="], + + "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.1.77", "", { "os": "win32", "cpu": "arm64" }, "sha512-HGTscPXc7gdd23Nh1DbzUNjog1I+5IZp95XPtLftGTpjrWs60VcetXcyJqK2rQcXNxewJK5yDyaa5QyMjfEhCQ=="], + + "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.1.77", "", { "os": "win32", "cpu": "x64" }, "sha512-c7GijsbvVgnlzd2murIbwuwrGbcv76KdUw6WlVv7a0vex50z6xJCpv1keGzpe0QfxrZ/6fFEFX7JnwGLno0wjA=="], + "@opentui/react": ["@opentui/react@workspace:packages/react"], "@opentui/solid": ["@opentui/solid@workspace:packages/solid"], @@ -428,6 +440,8 @@ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + "@simonklee/yoga": ["@simonklee/yoga@0.2.30", "", {}, "sha512-bkVgBu/QTveOFNKqds0racoeRmiX/uo96o7yEth36YQpoCOHzyE/8gO34/IHBHPHqT9VIVK/6+s4ug/Hw2u8CQ=="], + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="], @@ -1228,8 +1242,6 @@ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], - "yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="], - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], diff --git a/packages/core/package.json b/packages/core/package.json index 57bda9c5e..42a3ac993 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -34,11 +34,11 @@ "web-tree-sitter": "0.25.10" }, "dependencies": { + "@simonklee/yoga": "0.2.30", "bun-ffi-structs": "0.1.2", "diff": "8.0.2", "jimp": "1.6.0", - "marked": "17.0.1", - "yoga-layout": "3.2.1" + "marked": "17.0.1" }, "peerDependencies": { "web-tree-sitter": "0.25.10" diff --git a/packages/core/scripts/build.ts b/packages/core/scripts/build.ts index 021990776..936c1ea81 100644 --- a/packages/core/scripts/build.ts +++ b/packages/core/scripts/build.ts @@ -179,6 +179,7 @@ if (buildLib) { mkdirSync(distDir, { recursive: true }) const externalDeps: string[] = [ + ...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.optionalDependencies || {}), ...Object.keys(packageJson.peerDependencies || {}), ] diff --git a/packages/core/src/Renderable.ts b/packages/core/src/Renderable.ts index d6a202fe6..908f4718b 100644 --- a/packages/core/src/Renderable.ts +++ b/packages/core/src/Renderable.ts @@ -1,5 +1,5 @@ import { EventEmitter } from "events" -import Yoga, { Direction, Display, Edge, FlexDirection, type Config, type Node as YogaNode } from "yoga-layout" +import Yoga, { Direction, Display, Edge, FlexDirection, type Config, type Node as YogaNode } from "@simonklee/yoga" import { OptimizedBuffer } from "./buffer" import type { KeyEvent, PasteEvent } from "./lib/KeyHandler" import type { MouseEventType } from "./lib/parse.mouse" diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 434c0ff84..80d28f1c4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -15,4 +15,4 @@ export * from "./renderer" export * from "./renderables" export * from "./zig" export * from "./console" -export * as Yoga from "yoga-layout" +export * as Yoga from "@simonklee/yoga" diff --git a/packages/core/src/lib/yoga.options.test.ts b/packages/core/src/lib/yoga.options.test.ts index 4c599b544..28529f1a5 100644 --- a/packages/core/src/lib/yoga.options.test.ts +++ b/packages/core/src/lib/yoga.options.test.ts @@ -33,7 +33,7 @@ import { PositionType, Unit, Wrap, -} from "yoga-layout" +} from "@simonklee/yoga" describe("parseBoxSizing", () => { test("parses border-box", () => { diff --git a/packages/core/src/lib/yoga.options.ts b/packages/core/src/lib/yoga.options.ts index d5566b1a1..c2f9a5a79 100644 --- a/packages/core/src/lib/yoga.options.ts +++ b/packages/core/src/lib/yoga.options.ts @@ -14,7 +14,7 @@ import { PositionType, Unit, Wrap, -} from "yoga-layout" +} from "@simonklee/yoga" export type AlignString = | "auto" diff --git a/packages/core/src/renderables/Box.ts b/packages/core/src/renderables/Box.ts index 8507418af..c4836d4c5 100644 --- a/packages/core/src/renderables/Box.ts +++ b/packages/core/src/renderables/Box.ts @@ -1,4 +1,4 @@ -import { Edge, Gutter } from "yoga-layout" +import { Edge, Gutter } from "@simonklee/yoga" import { type RenderableOptions, Renderable } from "../Renderable" import type { OptimizedBuffer } from "../buffer" import { diff --git a/packages/core/src/renderables/EditBufferRenderable.ts b/packages/core/src/renderables/EditBufferRenderable.ts index 35b2e7e78..1e090f4f9 100644 --- a/packages/core/src/renderables/EditBufferRenderable.ts +++ b/packages/core/src/renderables/EditBufferRenderable.ts @@ -5,7 +5,7 @@ import { EditorView, type VisualCursor } from "../editor-view" import { RGBA, parseColor } from "../lib/RGBA" import type { RenderContext, Highlight, CursorStyleOptions, LineInfoProvider, LineInfo } from "../types" import type { OptimizedBuffer } from "../buffer" -import { MeasureMode } from "yoga-layout" +import { MeasureMode } from "@simonklee/yoga" import type { SyntaxStyle } from "../syntax-style" export interface CursorChangeEvent { diff --git a/packages/core/src/renderables/LineNumberRenderable.ts b/packages/core/src/renderables/LineNumberRenderable.ts index e7ddd55d5..9f2a0894a 100644 --- a/packages/core/src/renderables/LineNumberRenderable.ts +++ b/packages/core/src/renderables/LineNumberRenderable.ts @@ -2,7 +2,7 @@ import { Renderable, type RenderableOptions } from "../Renderable" import { OptimizedBuffer } from "../buffer" import type { RenderContext, LineInfoProvider } from "../types" import { RGBA, parseColor } from "../lib/RGBA" -import { MeasureMode } from "yoga-layout" +import { MeasureMode } from "@simonklee/yoga" export interface LineSign { before?: string diff --git a/packages/core/src/renderables/TextBufferRenderable.ts b/packages/core/src/renderables/TextBufferRenderable.ts index a4243a029..458f27240 100644 --- a/packages/core/src/renderables/TextBufferRenderable.ts +++ b/packages/core/src/renderables/TextBufferRenderable.ts @@ -5,7 +5,7 @@ import { TextBufferView } from "../text-buffer-view" import { RGBA, parseColor } from "../lib/RGBA" import { type RenderContext, type LineInfoProvider } from "../types" import type { OptimizedBuffer } from "../buffer" -import { MeasureMode } from "yoga-layout" +import { MeasureMode } from "@simonklee/yoga" import type { LineInfo } from "../zig" import { SyntaxStyle } from "../syntax-style"